diff --git a/Gopkg.lock b/Gopkg.lock new file mode 100644 index 00000000..826ebcf2 --- /dev/null +++ b/Gopkg.lock @@ -0,0 +1,157 @@ +# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. + + +[[projects]] + name = "github.com/codegangsta/negroni" + packages = ["."] + revision = "5dbbc83f748fc3ad38585842b0aedab546d0ea1e" + version = "v0.3.0" + +[[projects]] + name = "github.com/dgrijalva/jwt-go" + packages = ["."] + revision = "dbeaa9332f19a944acb5736b4456cfcc02140e29" + version = "v3.1.0" + +[[projects]] + name = "github.com/documize/blackfriday" + packages = ["."] + revision = "cadec560ec52d93835bf2f15bd794700d3a2473b" + version = "v2.0.0" + +[[projects]] + branch = "master" + name = "github.com/documize/glick" + packages = ["."] + revision = "a8ccbef88237fcafe9cef3c9aee7ad83d0e132f9" + +[[projects]] + branch = "master" + name = "github.com/documize/html-diff" + packages = ["."] + revision = "f61c192c7796644259832ef705c49259797e7fff" + +[[projects]] + name = "github.com/elazarl/go-bindata-assetfs" + packages = ["."] + revision = "30f82fa23fd844bd5bb1e5f216db87fd77b5eb43" + version = "v1.0.0" + +[[projects]] + name = "github.com/go-sql-driver/mysql" + packages = ["."] + revision = "a0583e0143b1624142adab07e0e97fe106d99561" + version = "v1.3" + +[[projects]] + name = "github.com/golang/protobuf" + packages = ["proto"] + revision = "925541529c1fa6821df4e44ce2723319eb2be768" + version = "v1.0.0" + +[[projects]] + name = "github.com/google/go-github" + packages = ["github"] + revision = "e48060a28fac52d0f1cb758bc8b87c07bac4a87d" + version = "v15.0.0" + +[[projects]] + branch = "master" + name = "github.com/google/go-querystring" + packages = ["query"] + revision = "53e6ce116135b80d037921a7fdd5138cf32d7a8a" + +[[projects]] + name = "github.com/gorilla/context" + packages = ["."] + revision = "1ea25387ff6f684839d82767c1733ff4d4d15d0a" + version = "v1.1" + +[[projects]] + name = "github.com/gorilla/mux" + packages = ["."] + revision = "53c1911da2b537f792e7cafcb446b05ffe33b996" + version = "v1.6.1" + +[[projects]] + branch = "master" + name = "github.com/jmoiron/sqlx" + packages = [ + ".", + "reflectx" + ] + revision = "05cef0741ade10ca668982355b3f3f0bcf0ff0a8" + +[[projects]] + branch = "master" + name = "github.com/mb0/diff" + packages = ["."] + revision = "d8d9a906c24d7b0ee77287e0463e5ca7f026032e" + +[[projects]] + branch = "master" + name = "github.com/nu7hatch/gouuid" + packages = ["."] + revision = "179d4d0c4d8d407a32af483c2354df1d2c91e6c3" + +[[projects]] + name = "github.com/pkg/errors" + packages = ["."] + revision = "645ef00459ed84a119197bfb8d8205042c6df63d" + version = "v0.8.0" + +[[projects]] + branch = "master" + name = "github.com/shurcooL/sanitized_anchor_name" + packages = ["."] + revision = "86672fcb3f950f35f2e675df2240550f2a50762f" + +[[projects]] + branch = "master" + name = "golang.org/x/crypto" + packages = [ + "bcrypt", + "blowfish" + ] + revision = "650f4a345ab4e5b245a3034b110ebc7299e68186" + +[[projects]] + branch = "master" + name = "golang.org/x/net" + packages = [ + "context", + "context/ctxhttp", + "html", + "html/atom" + ] + revision = "f5dfe339be1d06f81b22525fe34671ee7d2c8904" + +[[projects]] + branch = "master" + name = "golang.org/x/oauth2" + packages = [ + ".", + "internal" + ] + revision = "543e37812f10c46c622c9575afd7ad22f22a12ba" + +[[projects]] + name = "google.golang.org/appengine" + packages = [ + "internal", + "internal/base", + "internal/datastore", + "internal/log", + "internal/remote_api", + "internal/urlfetch", + "urlfetch" + ] + revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a" + version = "v1.0.0" + +[solve-meta] + analyzer-name = "dep" + analyzer-version = 1 + inputs-digest = "98ebdf85207168f55b51629c6c21eb1459881fa58c280503054994887cbde045" + solver-name = "gps-cdcl" + solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml new file mode 100644 index 00000000..387439e8 --- /dev/null +++ b/Gopkg.toml @@ -0,0 +1,90 @@ +# Gopkg.toml example +# +# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md +# for detailed Gopkg.toml documentation. +# +# required = ["github.com/user/thing/cmd/thing"] +# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] +# +# [[constraint]] +# name = "github.com/user/project" +# version = "1.0.0" +# +# [[constraint]] +# name = "github.com/user/project2" +# branch = "dev" +# source = "github.com/myfork/project2" +# +# [[override]] +# name = "github.com/x/y" +# version = "2.4.0" +# +# [prune] +# non-go = false +# go-tests = true +# unused-packages = true + + +[[constraint]] + name = "github.com/codegangsta/negroni" + version = "0.3.0" + +[[constraint]] + name = "github.com/dgrijalva/jwt-go" + version = "3.1.0" + +[[constraint]] + name = "github.com/documize/blackfriday" + version = "2.0.0" + +[[constraint]] + branch = "master" + name = "github.com/documize/glick" + +[[constraint]] + branch = "master" + name = "github.com/documize/html-diff" + +[[constraint]] + name = "github.com/elazarl/go-bindata-assetfs" + version = "1.0.0" + +[[constraint]] + name = "github.com/go-sql-driver/mysql" + version = "1.3.0" + +[[constraint]] + name = "github.com/google/go-github" + version = "15.0.0" + +[[constraint]] + name = "github.com/gorilla/mux" + version = "1.6.1" + +[[constraint]] + branch = "master" + name = "github.com/jmoiron/sqlx" + +[[constraint]] + branch = "master" + name = "github.com/nu7hatch/gouuid" + +[[constraint]] + name = "github.com/pkg/errors" + version = "0.8.0" + +[[constraint]] + branch = "master" + name = "golang.org/x/crypto" + +[[constraint]] + branch = "master" + name = "golang.org/x/net" + +[[constraint]] + branch = "master" + name = "golang.org/x/oauth2" + +[prune] + go-tests = true + unused-packages = true diff --git a/core/uniqueid/uniqueid.go b/core/uniqueid/uniqueid.go index 06389f5e..497c3d78 100644 --- a/core/uniqueid/uniqueid.go +++ b/core/uniqueid/uniqueid.go @@ -12,7 +12,7 @@ // Package uniqueid provides utility functions specific to the http-end-point component of Documize. package uniqueid -import "github.com/rs/xid" +import "github.com/documize/community/core/uniqueid/xid" // Generate creates a randomly generated string suitable for use as part of an URI. // It returns a string that is always 16 characters long. diff --git a/vendor/github.com/rs/xid/id.go b/core/uniqueid/xid/xid.go similarity index 100% rename from vendor/github.com/rs/xid/id.go rename to core/uniqueid/xid/xid.go diff --git a/domain/section/github/auth.go b/domain/section/github/auth.go index 2db20e7c..68c4a091 100644 --- a/domain/section/github/auth.go +++ b/domain/section/github/auth.go @@ -12,6 +12,7 @@ package github import ( + "context" "encoding/json" "net/http" "net/url" @@ -46,7 +47,7 @@ func validateToken(ctx provider.Context, s *domain.Store, ptoken string) error { Username: clientID(ctx.Request, s), Password: clientSecret(ctx.Request, s), }).Client()) - _, _, err := authClient.Authorizations.Check(clientID(ctx.Request, s), ptoken) + _, _, err := authClient.Authorizations.Check(context.Background(), clientID(ctx.Request, s), ptoken) return err } diff --git a/domain/section/github/commits.go b/domain/section/github/commits.go index 60069075..4da91c83 100644 --- a/domain/section/github/commits.go +++ b/domain/section/github/commits.go @@ -12,6 +12,7 @@ package github import ( + "context" "fmt" "html/template" "sort" @@ -96,7 +97,7 @@ func getCommits(client *gogithub.Client, config *githubConfig) ([]githubCommit, for _, orb := range config.Lists { if orb.Included { - branches, _, err := client.Repositories.ListBranches(orb.Owner, orb.Repo, + branches, _, err := client.Repositories.ListBranches(context.Background(), orb.Owner, orb.Repo, &gogithub.ListOptions{PerPage: 100}) if err == nil { render := make([]githubBranch, len(branches)) @@ -141,7 +142,7 @@ func getCommits(client *gogithub.Client, config *githubConfig) ([]githubCommit, opts.Since = *config.SincePtr } - guff, _, err := client.Repositories.ListCommits(orb.Owner, orb.Repo, opts) + guff, _, err := client.Repositories.ListCommits(context.Background(), orb.Owner, orb.Repo, opts) if err != nil { return nil, nil, err diff --git a/domain/section/github/issues.go b/domain/section/github/issues.go index cbfbd894..b503f9d5 100644 --- a/domain/section/github/issues.go +++ b/domain/section/github/issues.go @@ -12,6 +12,7 @@ package github import ( + "context" "html/template" "sort" "time" @@ -128,7 +129,7 @@ func getIssues(client *gogithub.Client, config *githubConfig) ([]githubIssue, er opts.Since = *config.SincePtr } - guff, _, err := client.Issues.ListByRepo(orb.Owner, orb.Repo, opts) + guff, _, err := client.Issues.ListByRepo(context.Background(), orb.Owner, orb.Repo, opts) if err != nil { return ret, err diff --git a/domain/section/github/lists.go b/domain/section/github/lists.go index 0c929905..9f32c94f 100644 --- a/domain/section/github/lists.go +++ b/domain/section/github/lists.go @@ -12,6 +12,7 @@ package github import ( + "context" "fmt" "net/http" @@ -25,14 +26,14 @@ func listFailed(rt *env.Runtime, method string, config githubConfig, client *gog case "owners": - me, _, err := client.Users.Get("") + me, _, err := client.Users.Get(context.Background(), "") if err != nil { rt.Log.Error("github get user details:", err) provider.WriteError(w, "github", err) return } - orgs, _, err := client.Organizations.List("", nil) + orgs, _, err := client.Organizations.List(context.Background(), "", nil) if err != nil { rt.Log.Error("github get user's organisations:", err) provider.WriteError(w, "github", err) @@ -56,7 +57,7 @@ func listFailed(rt *env.Runtime, method string, config githubConfig, client *gog var render []githubBranch if config.Owner != "" { - me, _, err := client.Users.Get("") + me, _, err := client.Users.Get(context.Background(), "") if err != nil { rt.Log.Error("github get user details:", err) provider.WriteError(w, "github", err) @@ -65,12 +66,12 @@ func listFailed(rt *env.Runtime, method string, config githubConfig, client *gog var repos []*gogithub.Repository if config.Owner == *me.Login { - repos, _, err = client.Repositories.List(config.Owner, nil) + repos, _, err = client.Repositories.List(context.Background(), config.Owner, nil) } else { opt := &gogithub.RepositoryListByOrgOptions{ ListOptions: gogithub.ListOptions{PerPage: 100}, } - repos, _, err = client.Repositories.ListByOrg(config.Owner, opt) + repos, _, err = client.Repositories.ListByOrg(context.Background(), config.Owner, opt) } if err != nil { rt.Log.Error("github get user/org repositories:", err) diff --git a/domain/section/github/milestones.go b/domain/section/github/milestones.go index 1705561b..311f352c 100644 --- a/domain/section/github/milestones.go +++ b/domain/section/github/milestones.go @@ -12,6 +12,7 @@ package github import ( + "context" "fmt" "html/template" "sort" @@ -98,7 +99,7 @@ func getMilestones(client *gogithub.Client, config *githubConfig) ([]githubMiles State: state, ListOptions: gogithub.ListOptions{PerPage: config.BranchLines}} - guff, _, err := client.Issues.ListMilestones(orb.Owner, orb.Repo, opts) + guff, _, err := client.Issues.ListMilestones(context.Background(), orb.Owner, orb.Repo, opts) if err != nil { return ret, err diff --git a/domain/section/github/model.go b/domain/section/github/model.go index 7adc1ecd..e1dfae38 100644 --- a/domain/section/github/model.go +++ b/domain/section/github/model.go @@ -12,6 +12,7 @@ package github import ( + "context" "sort" "strings" "time" @@ -181,7 +182,7 @@ func getUserName(client *gogithub.Client, config *githubConfig, login string) (f an = content } } else { - usr, _, err := client.Users.Get(login) + usr, _, err := client.Users.Get(context.Background(), login) if err == nil { if usr.Name != nil { if len(*usr.Name) > 0 { diff --git a/embed/bindata_assetfs.go b/embed/bindata_assetfs.go index 225938a0..788e5d9b 100644 --- a/embed/bindata_assetfs.go +++ b/embed/bindata_assetfs.go @@ -16,7 +16,7 @@ // bindata/manifest.json // bindata/offline.html // bindata/public/assets/.DS_Store -// bindata/public/assets/documize-9462f18402b546fde2d0d807281ae7ab.js +// bindata/public/assets/documize-918475c4ba74e809565c23e7f86ae36c.js // bindata/public/assets/documize-99dcfec5ca4e18d5f3bb1e1e911b86bb.css // bindata/public/assets/font/.DS_Store // bindata/public/assets/font/icons/MaterialIcons-Regular.eot @@ -746,7 +746,7 @@ func bindataCrossdomainXml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/crossdomain.xml", size: 585, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/crossdomain.xml", size: 585, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -766,7 +766,7 @@ func bindataDbErrorHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/db-error.html", size: 2985, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/db-error.html", size: 2985, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -786,7 +786,7 @@ func bindataFavicon32x32Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/favicon-32x32.png", size: 569, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/favicon-32x32.png", size: 569, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -806,12 +806,12 @@ func bindataFaviconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/favicon.ico", size: 5430, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/favicon.ico", size: 5430, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _bindataIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x5d\x6f\xe2\xba\x16\x7d\x9e\xf9\x15\x5c\xa4\x3e\xf5\x40\x3e\x20\x40\x24\x98\xab\x84\xef\x96\x01\x1a\xa0\x94\xbe\x8c\x1c\x7b\x27\x71\x71\xe2\x34\x76\x52\xc2\xd1\xf9\xef\x57\x99\xb4\x94\x7e\xcc\x9d\xa3\x7b\xae\x54\x29\xf5\xf6\x5a\xcb\x7b\xed\xed\x6d\xb5\xdd\x7f\x0d\x16\xfd\xf5\x6e\x39\xac\x04\x32\x64\xdf\xbe\x76\xcb\xcf\x97\x6e\x00\x88\x7c\xfb\xfa\xe5\xcb\xd7\x6e\x08\x12\x55\x22\x14\x42\xaf\x4a\x38\x4e\x43\x7a\x04\x05\xf3\xc8\xa3\xbe\x02\x51\x46\x13\x1e\x85\x10\xc9\x6a\x05\xf3\x48\x42\x24\x7b\xd5\x8b\xb6\x7d\xa1\xeb\x21\x27\x29\x83\x65\x02\x1e\x3d\x5c\xe8\xfa\x45\xc3\xba\xd0\xf5\x17\x81\x22\xa0\xf7\x2f\x74\x3d\xe6\xe4\xfb\x7f\x03\x2a\x31\x27\xe2\x84\x66\x1c\x23\x49\x79\xb4\xce\x63\x38\x41\x51\x2a\xf9\x09\x71\x96\xd1\x09\x10\x27\x9c\xa4\xb8\xe0\x9d\x60\x09\xe7\x72\xe3\xcc\x4e\x10\xe5\xb4\x83\x62\x3a\xe1\xe2\x95\x7c\xbe\x31\x47\x21\x88\x18\xe1\xb3\xb3\x63\x7a\x02\x3c\xfb\x5f\x01\x4e\x13\x2a\xf3\x25\x67\x14\xe7\x13\x40\x04\x92\x13\xbe\x5f\x62\x6a\x2f\xa0\x5a\x89\xaa\x39\x10\xf3\x44\xd6\x16\x11\xcb\x4f\x7a\xc3\xd0\x85\x64\x38\xbf\x7d\x26\xff\x2c\xea\x68\x68\xad\x37\xce\x70\xf5\x1a\x6b\x0f\x8a\x9f\xd2\x7b\x41\xa8\x61\x46\x6b\x21\x4d\x90\x0f\xe7\x44\x88\x90\xcb\x80\x94\x21\x0f\x31\x01\x25\x27\x15\x34\xf2\x97\x09\x3f\xe4\x9f\x6c\xc1\x00\x3c\x94\x32\xb9\x44\x42\xc8\x20\xe1\xa9\x1f\x88\x12\x26\x93\x14\xde\x9d\x2b\x68\x18\x33\xa8\xa1\x54\x06\xe7\x07\x17\x6b\x88\x24\x2d\x1b\xe7\xf0\x54\xbe\xe9\x5c\x50\x67\xdc\xa7\xe7\x8d\x49\x25\x58\x9e\x84\xc4\x7a\x43\x3c\x71\x3c\xce\x08\x24\xe2\x2d\x61\xea\x59\x2c\x01\x44\xf2\x33\xd2\x8b\xd9\xb7\x9c\x97\x9c\xad\xe5\xf2\x3c\xcb\xd9\x62\xfc\xc3\x19\xae\x16\xb3\xdb\xa1\xf3\xa1\x10\xc5\xa6\xd5\x5f\x4f\x6f\x87\x3f\xc6\xc3\xf9\xd0\xb1\xd6\xd3\xc5\xfc\x53\xd4\xed\x74\xb8\xfd\x31\x5b\x2c\xae\x37\xcb\xd5\xa7\x80\xb5\x63\xcd\x57\xd3\x82\xff\xdb\xfd\x1f\xd3\xf9\x7a\xe8\xcc\xad\xd9\x07\x60\x31\x8b\xbf\x9e\xa8\x0c\x12\x71\x5e\x30\xad\x6e\xb4\xeb\xea\xa5\xde\x22\xa0\x1a\x86\x76\x5e\x84\x4f\x6f\x6c\x49\x8c\x52\xc6\x9e\xbb\x7b\x28\xae\xa6\x15\xc7\xec\xb9\x15\x63\xc6\x5d\xc4\xce\xb3\x6a\x0f\xaa\x15\xa5\x78\x2c\xca\xb7\x02\x07\x28\x11\x20\x7b\xd5\x54\x7a\xb5\x4e\xf5\x75\x23\x90\x32\xae\xc1\x63\x4a\xb3\x5e\xf5\xae\xb6\xb1\x6a\x7d\x1e\xc6\x48\x52\x97\xc1\xd9\xf3\x31\x1d\xf6\x80\xf8\x50\xf2\x24\x95\x0c\xbe\x0d\x9e\x4d\x76\x95\x72\x7d\x52\x8c\x13\x1e\x43\x22\xf3\x5e\x95\xb8\x45\x59\xce\x64\xfe\xfc\xb3\x3e\xb0\x8b\xd8\x5f\x7f\xbd\xc9\xee\x9c\x12\x20\x11\xbc\xa7\x14\xb1\x77\x94\xf2\xf1\x2b\x6e\x2b\x4f\xce\xe0\x2f\x59\x7d\x82\x25\x20\x70\x42\xe3\xa2\x5c\x9f\x11\xde\xc3\x33\x0a\x4f\x45\x95\xcf\xb0\x4f\x94\xc8\xa0\x47\x20\xa3\x18\x6a\x3f\x17\x7f\x54\x68\x44\x25\x45\xac\x26\x30\x62\xd0\xd3\xea\xea\x1f\x95\x10\x1d\x68\x98\x86\xe7\xa1\x54\x14\xd3\x88\x11\x2b\x26\xbe\x17\xf1\x97\xf4\x18\x8d\xf6\x95\x04\x58\xaf\x1a\xa2\x88\x7a\x20\x64\xb5\x12\x24\xe0\xf5\xaa\xca\x4b\xa0\xfe\x20\x78\x54\x7d\x87\x16\x01\x4f\x24\x4e\x65\x85\xe2\xc2\xcd\x33\xc5\x43\x59\xb1\xae\x53\xcc\xff\x9d\xf5\xb4\xba\xf6\xf1\x98\x12\x2f\xf3\x18\x7a\x55\x1a\x22\x1f\x94\x38\xf2\xdf\x0b\xd4\x1a\xfa\xa1\xa1\xd7\xe3\xc8\x7f\x91\x11\xf4\x08\xa2\x57\xfd\x19\xff\x28\x2a\x64\xce\x40\x04\x00\xaf\xd9\x23\x21\x40\x0a\x25\x83\x88\xf0\xa4\x46\x9a\x1a\xe9\x60\x62\x76\x3c\x55\x75\x75\xb5\x09\x66\x47\x55\x4d\xb3\x03\xd8\xeb\x34\xf5\x36\xd4\xb1\x10\xd5\x0a\x8d\x24\xf8\xc5\xa5\x2f\xfc\x21\xdd\x68\xd5\x9a\xed\xc1\xf0\x26\x7e\xe8\x4c\xec\x15\xba\x54\xd6\xd3\x70\x7b\x69\x5c\xf5\x21\xbd\x01\x67\x1f\x1a\xf3\xef\xf1\xd5\xf6\x7e\xdc\x08\x56\xe9\x68\xd3\xab\x88\x00\x19\x9a\x5e\x3b\x36\x97\xc1\xfc\xae\x9d\xa5\xb3\xc6\xe1\xb6\x1f\xdc\x68\xa1\x6e\xd9\xe6\xce\x37\xac\xcd\xec\xf6\x70\x87\x7d\x65\x15\x4f\xc9\x5c\xb4\xb0\x31\x51\xe7\xc3\xce\xdd\xee\x2e\x17\xcb\xcb\xc1\x78\x7e\x3d\xf1\xd2\xa7\x6c\xd7\xde\x1f\xb2\x0d\xb1\x81\x8f\xd9\x62\x70\xd5\xba\x5c\x79\x68\xe9\xf7\x7a\xd5\xca\xdf\x76\xfd\x32\xff\x35\xd3\x24\xd8\x03\x6c\x60\xd4\x04\xad\x43\x0c\xaf\xe1\xba\x1a\x68\x60\x6a\x9a\xdb\x69\xb9\xee\xaf\x7c\x3f\xdc\x18\x46\x70\xcc\xc5\xb5\xad\x69\xf3\xc7\xeb\xf6\x6c\x6f\x53\x77\x75\xaf\x32\xaf\x7d\x6f\xf9\xd4\x59\x4f\xd7\xbb\x96\x1d\xc8\x58\x6d\x9e\x7c\x9b\xf2\x7a\xc4\x66\x8f\xf3\xc4\xba\xca\x57\x76\x20\xbc\x1b\x33\x93\x4f\xd9\xd1\xb6\xaf\x0e\x72\xd4\x0f\xf3\xd6\x3a\x0b\xc8\xb2\xbf\xcc\x0f\x64\x73\xb9\xd9\x59\xda\xde\x5e\x86\xfb\x49\x8c\x1b\x86\x42\x0e\xa9\x30\x6d\xf7\x10\xae\xc8\x8d\x3a\x6e\xee\xf6\xf3\xd5\x23\x0b\x0f\xee\xc9\xf7\xd7\x2f\x5d\xe5\xf9\xcf\x8f\xae\xcb\x49\x5e\xc6\xbe\x74\xcb\x91\xaa\x88\x04\x7f\x68\x3a\x52\x4d\xac\xb9\x9a\xaa\x7b\x86\x61\x18\x66\xbb\x61\xb8\x08\xab\x9e\x4e\x3c\xcf\xf4\x9a\x9d\x76\xfd\xe1\x73\xef\x13\xc8\xed\xfb\x61\x6c\x18\xeb\x95\xa7\xf8\xe6\xed\xa8\x61\x04\xce\xce\x6e\x8f\x46\xf3\xe6\xd6\x87\xad\xa7\x75\x72\xb7\xbd\x0b\x52\xff\xe4\x7d\xac\x8c\xc1\x39\x76\xb2\x0c\x26\x97\xa3\xc5\xf2\xd8\xb9\x31\xf6\x8d\x45\xa7\xbf\xd9\xe1\xbe\xc1\xed\x1b\x47\xb3\xd4\x5d\x6b\xe2\xde\x7f\xdf\x5f\x3f\xae\xa4\x35\x25\x2b\x7b\x72\x9d\x9a\xa6\xb5\xb3\xb9\x72\xb5\x9d\xf7\xa3\xbe\xb8\x4c\x9f\x06\xf7\x03\x23\x63\xb7\xce\x55\x80\x87\x37\xa5\xf7\xae\x52\x5a\xfc\xf6\x2b\xb7\xaf\xcd\x6e\xb6\x74\x4f\xeb\x34\x55\xdd\x35\x9a\x2d\x8f\x80\x4e\x54\xd2\x51\xdb\x7a\x47\x43\xd0\x46\xee\x2f\xfc\x62\xd5\x91\xfd\x5c\x81\x5d\xff\xfa\x49\xdb\x39\x83\xf5\x32\x7e\xb0\x27\xf7\x1e\xec\xc0\x53\x1b\xc9\x30\xf0\xc6\xe6\xfa\xb8\x1c\xf4\x17\x4f\x27\xbf\x0b\x35\xea\x37\x12\x55\x19\x6d\xdb\xc8\xb8\x5d\x84\x62\x9d\x8d\x17\xdf\xf7\x57\xc6\x5a\x2e\xf3\x4b\xe5\xda\xd7\xfb\xdb\x89\xd3\x78\x74\x18\x25\xea\x18\x1d\x1c\xdc\x38\x8c\x18\x31\x95\xc5\xcc\x3b\x08\x64\x3c\xde\x87\x91\x3f\xe5\x6b\xcc\xb6\x13\xbe\x3b\xfa\x2c\x8c\x0f\x5b\xeb\x37\x7e\x31\x27\x10\xd2\x24\xe1\x89\xc2\xa8\x7b\xb6\x7c\x6f\xac\xfa\xf7\x44\x42\x4e\x40\x29\x1e\xdc\xff\x91\x8f\x08\xe1\x51\xa9\xc2\x38\x22\xc5\x2f\xff\x5c\x89\x67\x90\x30\x94\xff\x23\xa1\x24\x8d\x7e\x6a\x3d\x7f\xff\x2f\x5a\x98\x33\x9e\xd0\xe3\x6f\xc4\x8a\x29\x2d\xa7\xb3\xab\x94\xff\x34\xfc\x27\x00\x00\xff\xff\xc6\x62\x36\x6b\x4c\x0c\x00\x00") +var _bindataIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xac\x57\x5d\x6f\xea\x3a\x16\x7d\xee\xf9\x15\x0c\x52\x9f\x7a\x21\x1f\x10\x12\x24\x38\xa3\x04\x28\x50\x28\xdf\xd0\xd2\x97\x23\xc7\xd9\x49\x5c\x9c\x38\x8d\x9d\x94\x70\x75\xff\xfb\x28\x27\x2d\x4d\x3f\xce\x9c\xab\xb9\x23\x55\x4a\xbd\xbd\xd6\xf2\x5e\x7b\x7b\x5b\x6d\xe7\x5f\xfd\x79\x6f\xb3\x5f\x0c\x2a\xbe\x08\xe8\xf7\x6f\x9d\xe2\x73\xd1\xf1\x01\x39\xdf\xbf\x5d\x5c\x7c\xeb\x04\x20\x50\x25\x44\x01\x74\xab\x0e\xc3\x49\x40\x4e\x20\x61\x16\xba\xc4\x93\x20\x4c\x49\xcc\xc2\x00\x42\x51\xad\x60\x16\x0a\x08\x45\xb7\x7a\xa9\x5b\x97\xaa\x1a\x30\x27\xa1\xb0\x88\xc1\x25\xc7\x4b\x55\xbd\x6c\x98\x97\xaa\xfa\x2a\x90\x07\xd4\xde\xa5\xaa\x46\xcc\xb9\xfd\x6f\x40\x29\x62\x0e\x3f\xa3\x29\xc3\x48\x10\x16\x6e\xb2\x08\xce\x50\x94\x08\x76\x46\x94\x32\x3a\x03\xa2\x98\x39\x09\xce\x79\x67\x58\xcc\x98\xd8\xae\xa6\x67\x88\x74\xde\x41\x11\x19\x31\xfe\x46\x2e\x6f\xcc\x50\x00\x3c\x42\xb8\x74\x76\x44\xce\x80\x17\xff\x6b\xc0\x49\x4c\x44\xb6\x60\x94\xe0\x6c\x04\xc8\x81\xf8\x8c\xef\x15\x98\xda\x2b\xa8\x56\xa0\x6a\x2b\x88\x58\x2c\x6a\xf3\x90\x66\x67\xbd\x41\x60\x43\x3c\x98\xed\x5e\xc8\x3f\x8b\x7a\x3d\x30\x37\xdb\xd5\x60\xfd\x16\xd3\xfb\xf9\x4f\xe1\x3d\x27\xd4\x30\x25\xb5\x80\xc4\xc8\x83\x32\x11\x42\x64\x53\x70\x8a\x90\x8b\x28\x87\x82\x93\x70\x12\x7a\x8b\x98\x1d\xb3\x2f\xb6\xa0\x0f\x2e\x4a\xa8\x58\x20\xce\x85\x1f\xb3\xc4\xf3\x79\x01\x13\x71\x02\x1f\xce\xe5\x24\x88\x28\xd4\x50\x22\xfc\xf2\xc1\xf9\x1a\x42\x41\x8a\xc6\xad\x58\x22\xde\x75\xce\xaf\x53\xe6\x91\x72\x63\x12\x01\xa6\x2b\x20\x36\xdf\x11\xcf\x1c\x97\x51\x07\x62\xfe\x9e\x30\x76\x4d\x1a\x03\x72\xb2\x12\xe9\xd5\xec\x7b\xce\x6b\xce\xe6\x62\x51\xce\x72\x3a\x1f\xfe\x58\x0d\xd6\xf3\xe9\x6e\xb0\xfa\x54\x88\x7c\xd3\xec\x6d\xc6\xbb\xc1\x8f\xe1\x60\x36\x58\x99\x9b\xf1\x7c\xf6\x25\x6a\x37\x1e\xdc\xfd\x98\xce\xe7\x93\xed\x62\xfd\x25\x60\xb3\x32\x67\xeb\x71\xce\xff\xed\xfe\x8f\xf1\x6c\x33\x58\xcd\xcc\xe9\x27\x60\x3e\x8b\xbf\x9e\xa8\x14\x62\x5e\x2e\x98\x52\xd7\xf4\xba\x7c\x25\xab\x2d\x55\x6f\x35\x70\xb9\x08\x5f\xde\xd8\x82\x18\x26\x94\xbe\x74\xf7\x98\x5f\x4d\x33\x8a\xe8\x4b\x2b\x86\x94\xd9\x88\x96\xb3\xd2\xfb\xd5\x8a\x94\x3f\x16\xc5\x5b\x81\x7d\x14\x73\x10\xdd\x6a\x22\xdc\x9a\x51\x7d\xdb\xf0\x85\x88\x6a\xf0\x94\x90\xb4\x5b\xbd\xaf\x6d\xcd\x5a\x8f\x05\x11\x12\xc4\xa6\x50\x7a\x3e\xc6\x83\x2e\x38\x1e\x14\x3c\x41\x04\x85\xef\xfd\x17\x93\x1d\xa9\x58\x9f\x15\xa3\x98\x45\x10\x8b\xac\x5b\x75\xec\xbc\x2c\x25\x99\x3f\xff\xac\xf7\xad\x3c\xf6\xd7\x5f\xef\xb2\x2b\x53\x7c\xc4\xfd\x8f\x94\x3c\xf6\x81\x52\x3c\x7e\xf9\x6d\x65\x71\x09\xfe\x9a\xd5\x17\x58\x07\x38\x8e\x49\x94\x97\xeb\x2b\xc2\x47\x78\x4a\xe0\x39\xaf\x72\x09\xfb\x4c\x1c\xe1\x77\x1d\x48\x09\x86\xda\xcf\xc5\x1f\x15\x12\x12\x41\x10\xad\x71\x8c\x28\x74\x95\xba\xfc\x47\x25\x40\x47\x12\x24\x41\x39\x94\xf0\x7c\x1a\x31\xa2\xf9\xc4\x77\x43\xf6\x9a\x1e\x25\xe1\xa1\x12\x03\xed\x56\x03\x14\x12\x17\xb8\xa8\x56\xfc\x18\xdc\x6e\x55\x7a\x0d\xd4\x1f\x39\x0b\xab\x1f\xd0\xdc\x67\xb1\xc0\x89\xa8\x10\x9c\xbb\x79\xa1\xb8\x28\xcd\xd7\x75\x82\xd9\xbf\xd3\xae\x52\x57\x3e\x1f\x53\xe0\x45\x16\x41\xb7\x4a\x02\xe4\x81\x14\x85\xde\x47\x81\x5a\x43\x3d\x36\xd4\x7a\x14\x7a\xaf\x32\x9c\x9c\x80\x77\xab\x3f\xe3\x9f\x45\xb9\xc8\x28\x70\x1f\xe0\x2d\x7b\xc4\x39\x08\x2e\xa5\x10\x3a\x2c\xae\x39\x4d\xc5\x31\xb0\xd3\x36\x5c\x59\xb6\x55\xb9\x09\x6d\x43\x96\xdb\x6d\x03\xb0\x6b\x34\x55\x1d\xea\x98\xf3\x6a\x85\x84\x02\xbc\xfc\xd2\xe7\xfe\x90\xaa\xb5\x6a\x4d\xbd\x3f\x58\x46\x8f\xc6\xc8\x5a\xa3\x2b\x69\x33\x0e\xee\xae\xb4\x9b\x1e\x24\x4b\x58\x1d\x02\x6d\x76\x1b\xdd\xdc\x3d\x0c\x1b\xfe\x3a\xb9\xde\x76\x2b\xdc\x47\x9a\xa2\xd6\x4e\xcd\x85\x3f\xbb\xd7\xd3\x64\xda\x38\xee\x7a\xfe\x52\x09\x54\xd3\x6a\xef\x3d\xcd\xdc\x4e\x77\xc7\x7b\xec\x49\xeb\x68\xec\xcc\x78\x0b\x6b\x23\x79\x36\x30\xee\xf7\xf7\x19\x5f\x5c\xf5\x87\xb3\xc9\xc8\x4d\x9e\xd3\xbd\x7e\x38\xa6\x5b\xc7\x02\x36\xa4\xf3\xfe\x4d\xeb\x6a\xed\xa2\x85\xd7\xed\x56\x2b\x7f\xdb\xf5\xeb\xfc\xd7\xda\x6d\x07\xbb\x80\x35\x8c\x9a\xa0\x18\x8e\xe6\x36\x6c\x5b\x01\x05\xda\x8a\x62\x1b\x2d\xdb\xfe\x95\xef\xc7\xa5\xa6\xf9\xa7\x8c\x4f\x2c\x45\x99\x3d\x4d\xf4\xe9\xc1\x22\xf6\xfa\x41\xa6\xae\xfe\x60\x7a\x64\xb5\x19\x6f\xf6\x2d\xcb\x17\x91\xdc\x3c\xfb\x6e\x8b\xc9\x35\x9d\x3e\xcd\x62\xf3\x26\x5b\x5b\x3e\x77\x97\xed\x54\x3c\xa7\x27\xcb\xba\x39\x8a\xeb\x5e\x90\xb5\x36\xa9\xef\x2c\x7a\x8b\xec\xe8\x6c\xaf\xb6\x7b\x53\x39\x58\x8b\xe0\x30\x8a\x70\x43\x93\x9c\x63\xc2\xdb\x96\x7d\x0c\xd6\xce\x52\x1e\x36\xf7\x87\xd9\xfa\x89\x06\x47\xfb\xec\xfb\xdb\x45\x47\x7a\xf9\xf3\xa3\x63\x33\x27\x2b\x62\x17\x9d\x62\xa4\x2a\x3c\xc6\x9f\x9a\x8e\xe4\x36\x56\x6c\x45\x56\x5d\x4d\xd3\xb4\xb6\xde\xd0\x6c\x84\x65\x57\x75\x5c\xb7\xed\x36\x0d\xbd\xfe\xf8\xb5\xf7\x11\x64\xd6\xc3\x20\xd2\xb4\xcd\xda\x95\xbc\xf6\xee\xba\xa1\xf9\xab\xbd\xa5\x5f\x5f\xcf\x9a\x77\x1e\xdc\xb9\x8a\x91\xd9\xfa\xde\x4f\xbc\xb3\xf7\xa1\x34\x84\xd5\xc9\x48\x53\x18\x5d\x5d\xcf\x17\x27\x63\xa9\x1d\x1a\x73\xa3\xb7\xdd\xe3\x9e\xc6\xac\xe5\x4a\x31\xe5\x7d\x6b\x64\x3f\xdc\x1e\x26\x4f\x6b\x61\x8e\x9d\xb5\x35\x9a\x24\xed\xb6\xb9\xb7\x98\x74\x73\x37\xeb\x85\x3d\x7e\x95\x3c\xf7\x1f\xfa\x5a\x4a\x77\xab\x1b\x1f\x0f\x96\x85\xf7\x8e\x54\x58\xfc\xfe\x2b\xb7\x6f\xcd\x56\x8c\xa6\xae\xe1\xa6\x8d\xf4\x26\x18\x72\x5b\x6b\x69\x58\x6d\x80\xee\x1a\x2d\x04\x8d\x16\xfe\x85\x5f\x2f\xbd\x55\x52\xd3\x7a\xde\xdb\xba\xc2\x1e\x6f\x96\x87\x27\xa1\xf5\x26\x0f\xd2\xa8\xb7\x1b\x2b\xe1\x5a\x69\xb4\xd8\x22\xe3\x18\xc8\xe0\x70\xf6\x1b\x6b\x8a\xbd\x9f\xd0\xa1\xbe\x9f\xfb\xd6\xf1\x6e\x2f\x53\x92\xdd\x4e\x7b\x53\x95\x46\x78\xfb\xa0\x1d\x9a\x8f\x47\xcd\xb4\x20\xdb\x1d\x96\x0f\xc1\xed\x49\x77\x9e\x6f\x91\xfe\x64\x6c\x4f\x4c\xd6\x31\xbe\x9e\xf5\xbd\x46\x3f\x79\x64\xf2\xc4\x6d\xec\x46\xd8\x6d\xae\x87\xfc\xf4\xb4\xfc\x8d\x5f\xcc\x1c\x08\x48\x1c\xb3\x58\xa2\xc4\x2e\x2d\x3f\x1a\xab\xfe\x3d\x91\x80\x39\x20\xe5\x0f\xee\xff\xc8\x47\x8e\xc3\xc2\x42\x85\x32\xe4\xe4\xbf\xfc\x73\x25\x96\x42\x4c\x51\xf6\x8f\x84\xe2\x24\xfc\xa9\xf5\xf2\xfd\xbf\x68\x61\x46\x59\x4c\x4e\xbf\x11\xcb\xa7\xb4\x98\xce\x8e\x54\xfc\xd3\xf0\x9f\x00\x00\x00\xff\xff\x3f\x67\x12\x29\x4c\x0c\x00\x00") func bindataIndexHtmlBytes() ([]byte, error) { return bindataRead( @@ -826,7 +826,7 @@ func bindataIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/index.html", size: 3148, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/index.html", size: 3148, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -846,7 +846,7 @@ func bindataMailDocumentApproverHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/document-approver.html", size: 7037, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/document-approver.html", size: 7037, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -866,7 +866,7 @@ func bindataMailEmailHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/email.html", size: 7549, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/email.html", size: 7549, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -886,7 +886,7 @@ func bindataMailInviteExistingUserHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/invite-existing-user.html", size: 6964, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/invite-existing-user.html", size: 6964, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -906,7 +906,7 @@ func bindataMailInviteNewUserHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/invite-new-user.html", size: 8304, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/invite-new-user.html", size: 8304, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -926,7 +926,7 @@ func bindataMailPasswordResetHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/password-reset.html", size: 7763, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/password-reset.html", size: 7763, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -946,7 +946,7 @@ func bindataMailShareSpaceExistingUserHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/share-space-existing-user.html", size: 6902, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/share-space-existing-user.html", size: 6902, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -966,7 +966,7 @@ func bindataMailShareSpaceNewUserHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/mail/share-space-new-user.html", size: 7196, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/mail/share-space-new-user.html", size: 7196, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -986,7 +986,7 @@ func bindataManifestJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/manifest.json", size: 608, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/manifest.json", size: 608, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1006,7 +1006,7 @@ func bindataOfflineHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/offline.html", size: 28734, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/offline.html", size: 28734, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1026,27 +1026,27 @@ func bindataPublicAssetsDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/.DS_Store", size: 10244, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/.DS_Store", size: 10244, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } -var _bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x77\xdc\x36\x92\x30\x0e\xff\xaf\x4f\x41\x21\xfb\x28\xe4\x8a\xa2\x5a\x4e\xb2\xbb\xd3\x19\x5a\x8f\x22\xdb\x13\xed\xd8\x89\xd7\xb2\x77\xdf\x39\xb6\x8f\x0f\xd4\x84\xba\x31\x62\x03\x3d\x04\x5a\x52\x47\xee\xef\xfe\x1e\x5c\x09\x80\x60\x5f\x24\xd9\xc9\xec\xef\x49\xce\xb1\x9a\xb8\xa3\x50\x28\x54\x15\x0a\x55\x60\xce\x50\xc2\x78\x83\x47\x1c\xec\x54\xe8\x12\x13\x94\x82\x8a\x8e\xe6\x53\xfc\x1b\x3a\x84\xb3\x19\xc8\xdf\x03\x74\x3b\xa3\x0d\x67\x20\x6f\x73\x1a\xc4\x68\x7d\x8d\x1a\x90\x03\x34\xbd\x40\xcd\x41\x4d\x61\x75\x80\x09\xe6\x18\xd6\xf8\x37\xd4\x78\xa5\x47\x94\x5c\xe2\xf1\x21\x22\xd7\xb8\xa1\x64\x8a\x08\x07\x1f\xf3\xcb\x39\x19\x71\x4c\x49\xca\x73\x94\x93\x9c\x65\x77\xbf\x5e\xfc\x1d\x8d\x78\xa1\x86\xf1\xba\xa1\x33\xd4\xf0\x45\xca\x73\xf0\xe9\x13\x62\xaf\x68\x35\xaf\x11\xc8\xef\xae\x61\x3d\x47\xc3\xdd\xc1\x32\xdb\xb9\x86\x4d\x42\xcb\x6b\x8a\xab\x64\xb0\x43\xcb\xe7\x62\x24\xc5\xc9\x6c\x56\xe3\x11\x14\x4d\x17\xe8\x96\x23\x52\xa5\x77\x53\x59\xf9\x75\x83\x2e\xf1\xed\x90\x89\x1e\xe0\xbc\xe6\x85\x9b\x9c\xcf\x68\xf5\x2a\x5e\x2c\xc8\xc9\xdf\xe8\xc9\x0f\x91\x29\xb2\xcc\xf2\x74\x90\x13\xf3\x99\xa5\x34\x8f\xf7\x92\xe5\xdc\xa4\x97\x74\x99\xe5\x5d\x90\xcf\xf9\x04\x11\x2e\x26\x40\x1b\x76\x08\x09\x25\x8b\x29\x9d\x33\x7f\x1d\x14\xcc\x19\x9e\xce\x6a\x74\x20\xaa\x84\xf5\x2e\x20\x43\x01\x8c\xb7\x87\xaf\x33\x56\x3b\x53\x0b\xd2\x06\x31\x4e\x1b\x34\x6c\xbb\xc8\xee\x1a\xc4\xe7\x0d\x49\xd4\x3a\xbc\x39\xff\xef\xd7\x85\xc6\x93\x94\x67\xcb\xdc\x19\xe2\x16\xd5\x96\xd9\x06\x60\x32\xe9\xf7\x81\x92\x83\xa7\x73\x8e\x6b\x76\x88\xc8\x88\x56\x98\x8c\xbb\x39\x04\x3d\x2a\xe2\x02\xd3\x12\x28\x4b\xbe\x98\x21\x7a\x99\x9c\x2f\xa6\x17\xb4\xde\xdb\x03\x4c\xfe\x08\x33\x0a\xcc\x51\x23\xc6\x7e\x1c\x81\x9f\x2e\xc9\x97\x31\xe0\xf2\xbd\xbd\x15\xdd\xf1\x62\x44\x09\xe3\xcd\x7c\xc4\x69\x53\x96\xa5\x4d\xdf\x35\xbf\x8b\x59\x43\x39\x15\xd5\x8e\xcd\xd8\x86\xb6\xc3\x9d\x55\x88\x02\xff\x0e\x6f\x87\x6a\x6d\x31\x91\x70\x62\xa8\xb9\xc6\x23\x94\x66\x39\x9c\xcd\x5e\x21\x0e\xfb\xb2\x6b\x3a\x82\xf5\x39\xa7\x0d\x1c\xa3\xbe\x32\x2b\xf0\x90\x1f\x47\x51\x6a\xe8\xa5\x8a\xe6\xd2\x55\xd8\x29\xd6\x0a\x95\xed\x76\x1e\x23\x7e\x3e\xbf\xa8\xe8\x14\x62\x92\x66\x39\x36\xf4\x07\x5f\xa6\x80\x4a\x44\x00\x65\x59\xa6\x2a\xb5\x2c\x4b\x7e\x0c\xe6\x44\xa1\x46\x05\x86\x34\xe5\x59\xa6\x1a\x85\x25\x2f\x66\x90\xb1\x1b\xda\x54\x79\x53\xf2\x02\x4d\x21\xae\x45\x3b\xbb\x7a\xae\xec\x75\x83\x18\x22\x3c\x85\xd9\xe7\xcf\x9d\xc4\x26\xcb\x62\x3b\x47\x4e\x08\x60\x72\x0d\x6b\x5c\x81\x6c\x07\x97\x96\x2e\x15\x3f\x41\x86\xfe\xed\xfb\x42\x62\x38\x4a\xd1\x3e\x18\x82\xfd\x46\xfe\x0b\xb3\x25\xaa\x19\xba\x13\xb3\x10\xe7\x01\x19\x83\x5d\x83\x25\x7c\xc3\x7e\xf8\x52\x4c\xab\x2e\xef\x4e\xe6\x7c\x42\x1b\xfc\x9b\x24\xc2\x43\xf0\x13\x64\x78\x94\x80\x7d\xbc\xdc\x31\x2b\x33\xc1\x4c\x00\x32\x05\x02\x3b\x40\x56\xcc\x28\xe3\x29\x98\xcd\x2f\x6a\x3c\x72\x77\xa9\xd8\x37\x13\x04\x2b\xd4\xb0\x61\xbd\xcc\x96\xb9\xee\xcf\x5b\xa4\x76\xc1\x6d\xb3\x2e\xe6\x80\xac\x18\xd5\x08\x36\x27\x75\x9d\x66\x79\x04\x25\x36\x24\x32\x57\x68\x31\xaa\x29\xbc\x7a\x14\x22\x13\x23\x25\x8f\x4c\xa1\x1f\xb0\xf1\xae\x46\x62\x09\xff\xd0\xdb\xd2\x34\x56\xa8\x9d\xe8\x20\x79\xb0\x41\xc3\x6d\xc3\x0b\x4e\xaf\x10\xc9\xf6\xf6\xba\x39\x72\x07\x66\xc7\x9b\xa3\xa7\x83\x14\x77\x15\xe4\x70\xf8\x9f\xe7\xbf\xfe\x52\xa8\x0d\x84\x2f\x17\x29\xcf\xf2\x11\x25\x1c\x11\xfe\x76\x31\x43\x43\xf0\x77\x46\x09\x58\xc6\xe6\xda\xee\xa4\x47\x40\xf2\xb6\x8c\x5a\x49\x90\x15\x35\x1d\xd3\x39\xef\xc5\xf5\x11\x9d\xce\x28\x41\x84\xb3\xc3\xd1\x9c\x71\x6a\x37\xc0\x01\x43\x9c\x63\x32\x66\x3d\x9c\xa0\x42\x67\x79\x7c\x40\x12\xcb\xb2\xc7\xe9\xa3\xa2\xbb\x02\xe0\xa9\x19\x75\x8b\xf4\xab\x11\x1b\xb3\x67\x7a\x74\xaf\x1b\x7a\x8d\x2b\xd4\xe8\x92\x62\xfe\x73\x8e\xaa\x02\xfd\x63\x0e\xeb\x14\x88\xa9\x9b\x22\x20\x6f\x37\xd7\x89\x93\x5e\x98\xb6\x44\xbb\x7f\xd5\x88\xf0\x18\xed\x9a\xb6\xb2\xdc\xfc\x7a\xd7\xd4\xcf\x9b\x86\x76\x5b\x9d\xce\xf8\x22\x05\x06\x0b\x4f\x25\xa3\x5d\xcc\x9b\x1a\xb4\x75\xdf\x20\x58\x4f\xb7\xa8\xdd\x88\xf2\x4e\xfd\xd3\x1a\x23\xc2\xcf\xaa\x2d\x9a\x18\xe9\x2a\x4e\x2b\xaf\xe5\xe6\xf9\x2b\x5a\x6c\xd1\xcc\xcc\xd4\x71\xda\x39\xa9\xa6\x98\xbc\x63\xa8\xd9\xa2\x1d\x68\xea\x84\xed\xbc\xd6\xc7\xef\xb6\x6d\x99\x7a\x20\xcb\x85\xcc\xe3\xee\x52\xb9\xf5\x3e\xb1\xf9\x0c\x35\x05\x9c\xcd\xea\x45\x2a\x52\x72\xd8\x8c\xe7\x42\xf0\x61\x7a\x73\xfa\xad\x96\x77\xf3\xa6\x1e\x02\x90\x4b\xd8\x8b\x1f\x06\x82\xe2\xb7\x05\x83\xf8\xb0\x73\xb1\x1f\x66\x30\x22\x61\xdc\xd0\xf9\x4c\xfc\xa8\x30\x83\x17\x35\x7a\x29\x77\xfd\x70\xf7\x28\xd7\x88\xf6\x1a\x35\x53\xcc\x18\xa6\xe4\xa4\xaa\xce\x67\x70\x84\x86\xbb\x47\xcb\x65\x5e\xe1\xea\x0d\x1a\x21\x7c\x8d\x4e\x38\x6f\xd8\x56\x33\xda\x61\x37\x98\x8f\x26\xa9\x43\x36\x5d\x2c\xcf\xb2\xbb\x11\x64\x28\x59\xb3\x89\x86\x17\x0d\x82\x57\x3b\xab\x8a\x9a\xb5\x1b\x0a\x3e\x83\x97\x7e\x7f\x0a\x92\x82\x11\x61\x85\x65\xb8\x52\x9e\x7d\xfe\x8c\x59\x41\xe6\x75\x6d\x7e\xab\x75\xe5\xd9\x31\x2f\xef\x96\xc3\x34\xe5\xa5\x24\xda\x33\xd8\x30\x71\x0e\x65\x2d\xda\x75\x39\xa7\x0a\x49\xce\x89\xb7\x65\x1c\xa2\xd4\x85\x6d\xb9\xbb\xcb\x8b\x09\x64\xbf\xde\x10\x4b\xde\x40\x6f\x69\x90\x09\x4e\xbc\x37\x5b\x74\xe4\xae\x6a\x19\x6b\xdb\x2d\x00\xb2\xcf\x9f\x83\x3a\x1a\xfb\x98\x3c\x1a\x3c\x14\x04\xb9\x10\xb6\x72\x28\x57\x9d\x0d\xef\x28\xb1\x0b\x13\xe2\x02\xeb\x2c\xf1\x5a\x02\xb9\xcc\x29\xb1\xab\x77\xff\xf6\x2c\x61\x14\xed\x9d\xc3\x6b\x6f\x6c\x2d\x52\xe4\xac\xec\xc3\xc5\x9c\xf6\xa1\x8d\x46\x62\xb6\x21\xb6\xd2\xf2\x6e\xb9\xb3\x05\xca\xe2\x4b\x67\x7f\x84\x64\x1d\x58\x56\x5e\x8a\x0d\xb2\xe0\xbf\xa4\xe0\x1b\xb3\x44\x07\x92\xa2\x17\x97\x74\x34\x67\x69\xb6\x13\x6d\xab\x25\xf3\x6b\x5b\xd3\x14\x7e\x75\x7b\x1e\xd9\x5f\xdb\x64\x4b\xf1\x57\xb7\xea\x1f\x03\x6b\x9b\x75\x4e\x80\xd5\xed\xfa\xc7\xc2\xda\x76\x25\xe1\x3c\x98\xcb\x23\x61\x83\x86\xbd\x73\x62\xc3\xc6\x67\xf6\x8c\x30\x1d\xfc\x98\x1a\x1d\xd5\x88\xce\x16\x4e\x5f\xc1\x4e\xcc\xb2\x4c\x1c\xe1\x25\x15\xff\x16\xbc\xc1\xd3\x34\xcb\xa9\x3a\x97\x4b\xfd\xb7\x4d\x36\x90\x2f\xdb\x9f\x6d\x66\x4b\xca\x9c\xdf\x6d\xb6\x3c\x2e\x4a\x8f\x60\xea\xc4\xec\x18\x80\xa1\xfe\xdd\x96\xb7\x87\x4f\xe9\xfc\x0e\xb2\x0d\xac\xca\xe0\xbb\x2d\xb6\x82\x5c\xd2\x6d\xa8\xe5\xe7\xcf\x2b\xda\x12\xfd\xf8\xd4\x32\xd2\x76\x48\x2d\x83\x3a\xb9\x38\x2d\x48\xf5\x3f\x98\x4f\x52\xb9\x18\x39\x38\x14\x44\x5a\x7d\xe8\xf5\x61\xf3\x0b\xc5\xef\xa7\x83\x5c\xa5\xd4\x88\x8c\xf9\xe4\xe0\x28\x33\xc2\x87\x20\x70\x34\x07\x2d\x32\xe7\x7d\x22\x79\x1f\x4e\xb8\xac\x50\x96\x49\x39\x1b\x97\x77\x2e\x69\x1b\xb2\xbc\x25\x67\xa1\x18\x42\xb3\xe5\x4e\xdb\xb4\x22\x9d\x20\x4b\x71\x56\x08\x51\x26\x75\x88\x28\x2e\xdc\x46\xcb\xb2\x5c\x43\xd7\xc4\x89\x65\x1a\x5d\x90\x11\xc8\xd2\xb0\x4d\x92\xdd\x91\x02\x33\xb9\x75\x8e\x53\x5e\xb0\x09\xbd\xf9\x85\x72\x7c\xa9\x95\xb4\x29\x29\xa6\x88\x31\x38\x16\x6c\xb4\xdf\xfb\x1a\x1a\x9c\xf3\xf5\xf3\x59\x66\xd9\xb0\x33\x27\x5d\x4f\xcb\x0a\x85\x7f\x42\x1c\xaf\x1c\xe2\xd0\xf6\x79\x3a\x81\x64\xac\x7a\x15\x22\xd5\x72\x1b\xc1\x6a\x8c\x08\x6a\x60\x1d\x95\xad\x5c\x31\xe9\x8b\x88\x48\x1c\xf3\x1a\x3d\x17\x4c\x50\x0f\xc7\x3b\xa5\x15\xaa\x0b\x3d\xc6\x42\x16\x07\x59\xae\x21\xb0\x79\x45\x5d\x01\x48\x11\xf8\x1a\x35\x62\x77\x3e\x27\xd5\x8c\x62\xc2\x37\x6f\xa5\x5b\x17\x64\xf9\x04\xb2\xb7\x62\x58\x67\x64\x36\xe7\x51\xe6\x1d\x92\x2a\x05\xed\x4c\x41\xae\x3f\x14\x01\x17\x0d\xbc\x52\xc3\x5b\xd3\x84\x3b\x6b\x90\xdb\xcf\xb6\x99\xd3\xce\xf8\xd6\xb4\xd8\x03\x0c\x90\xc7\x72\x74\x3f\x96\x2b\x63\xbd\x3c\x8f\x38\xbd\x8c\x42\xe3\xb9\xe2\x70\xed\x86\x8f\x2e\x68\xa0\x3d\x14\x34\x4a\xf2\x4e\x2e\xa0\xf2\xdd\x81\xa1\x61\xe2\x84\x63\x98\xa3\xb7\xaa\xb6\x7b\x68\x6e\xd6\xad\x45\x87\xde\x8e\x3d\xe0\x46\xba\x7e\x65\x5a\xd8\xbe\xf3\x18\x16\xf5\x8e\xa3\x6f\x1d\x82\x21\xc5\xda\xb4\x23\x53\x5a\xe3\x6d\x86\xb3\xe3\x1c\x36\x48\x1f\x34\x2d\x7b\xbc\xb6\x7e\x8e\xbc\x93\x08\xb9\xa7\x90\x6c\xc6\x6f\x41\xf1\xdc\x75\x4d\x6f\x4e\xcc\x15\xd3\xc9\x68\x84\x18\x03\xce\x0c\xa3\xf9\x59\x31\x6b\xe8\x2c\x05\xa3\x09\x1a\x5d\xa1\x0a\x64\xae\xba\x89\x29\x42\xdc\xa5\xc3\x0e\x8c\x03\x0c\x3b\x72\x4f\x49\xde\xc1\x82\x30\xbb\x7f\x71\x8e\xb6\xa5\xc2\x35\x1e\x21\xc2\xd0\xc1\x95\x38\x91\xbf\x22\x01\x7e\xa9\xfa\x5d\xa5\x74\x50\x8b\xa5\x07\x18\x12\x00\x5d\xbf\x23\x47\xd9\x15\x78\x69\xea\x45\x16\xe2\x06\x93\x8a\xde\x14\x35\xd5\x57\xa4\x0d\xaa\x29\xac\xd2\x6d\x61\xc7\xa6\x7c\xf6\xfb\x1c\x5f\xe7\xaf\xde\xbe\xfe\x99\x32\x45\x35\xd7\xc3\x50\x0c\xb4\x98\x50\x26\x8e\x0d\x51\xf5\x35\x6d\xb6\xaa\x2a\x66\xa5\xab\x9e\x23\x52\xa1\x66\x9b\xca\x4c\xd6\xd0\xd5\x05\xaf\x7c\x56\x6d\x53\x5d\xc8\x27\xb8\x32\x03\x37\x32\xc8\x36\x83\x6f\xf5\x54\x1e\x06\x89\xf6\xe2\xe8\xd3\x85\x2e\xc8\x8e\x1d\x32\x2c\x96\x5d\x41\xd3\x90\xba\xa1\x5f\xd9\x87\x6f\xb7\xb2\x82\x67\x4f\xe5\x10\xc2\xdd\xea\x06\xa2\x3d\x0d\x84\x30\xee\x36\x60\x60\xda\x37\xfc\x0e\x94\x23\x53\xe8\x48\x76\x43\x7f\xff\x89\x86\xa2\x9b\x6f\xcb\x4d\x26\xc6\xaa\xa4\xc9\x1e\xe5\xfb\x14\xdf\x62\xc2\xa4\x9e\x3e\x92\x3c\xa5\x15\xac\xbf\x8a\xda\xdd\x32\xea\xad\x60\x93\xdf\xa1\x0a\x73\xa9\xa8\x24\xf3\xba\xce\x2b\x54\x23\x8e\xda\xef\x4b\x5c\x73\xa5\xc4\x9c\x40\x76\x8e\x6a\x34\xe2\xa8\x12\xd9\x6c\xb8\x7b\x94\x0b\x0e\xfc\x99\xac\xf1\x0c\xc3\x9a\x8e\x45\xda\x3d\x35\xad\x66\xb5\xca\xbb\xa5\x4a\x50\x3d\xeb\xce\xca\xf7\x1f\x8d\x4a\xcc\x19\x42\xf9\xfe\xe3\x4a\x95\xa8\xc3\x76\xad\xd7\x8e\x86\xac\x80\x58\x55\x06\xb2\x1d\x54\x5c\xd2\xe6\x39\x1c\x4d\x5a\x0c\x41\xd9\x1d\xd2\xe7\x3d\x12\x27\xba\x2c\x2f\xb0\xb5\x15\x5a\x18\x92\x62\x6e\x61\xfe\xba\xb7\x51\x95\xa4\x18\x05\x96\x87\xb2\x6e\xc8\xcc\x4b\x1f\x90\x8e\xfe\x4f\x8d\x23\x47\x6e\x9a\x07\x1b\x91\xa7\x15\x77\x02\x80\x4a\xe0\x19\x76\x0e\xf5\x66\x2e\x16\xfd\x82\xce\xc9\x48\x09\xb0\x2e\x98\x65\x43\xf9\x77\x3f\x0c\xb2\x65\x41\x2f\x18\x6a\xae\x11\x33\xdd\x80\x2c\x77\x0a\xc5\xe1\xeb\x81\x2c\x47\x62\xb9\x88\x93\x61\x1a\x2a\x38\x7d\x49\x6f\x50\x73\x0a\x19\x4a\xb3\x1d\xde\x05\x2d\xcf\xee\x52\x0d\xc2\xcb\x79\x5d\x13\x38\x45\x61\xb5\x02\x93\x51\x3d\xaf\x10\x4b\x89\xd4\x9c\xca\xc2\xf2\x4a\x70\x55\xc9\x6c\x6f\x0f\x15\xb3\x39\x9b\xa8\x6d\x95\x72\x1f\xca\x11\x88\x5a\x52\xcc\xe9\x78\x5c\x23\x85\xfc\xde\xe5\x26\xef\xac\x9d\x5d\x7d\x9d\x92\x75\xf1\xca\xc3\x60\x20\x80\x10\x54\x39\x56\xe3\x34\x60\x90\x68\x32\x44\xe5\x27\x73\x05\x89\x72\x17\x11\x35\x73\x8c\x5a\xd4\x93\x97\x93\xee\xdc\xfc\x1e\x7d\x4c\x0a\x77\x35\xb0\x2c\xe9\xd3\x41\xb6\xcc\xd5\xd4\x4f\x46\x1c\x5f\xc7\xcc\x2d\x64\x3b\x72\xd5\x8b\x4b\x4c\xaa\x9f\x16\xb2\xf7\x9c\x8b\x5d\xa3\x58\x57\x59\x13\xe4\xbb\x7a\x93\xe8\xef\x2c\x8b\xe9\x39\x90\xed\xf0\x79\x85\x39\x6d\xee\xd3\x21\x92\x35\xdb\x0e\xf5\xf7\xba\x0e\xa5\xfa\xf0\x5e\x13\x54\x64\xdf\xce\x4f\x7e\xae\xeb\x2d\xd8\x48\x9b\xf7\x76\x8d\xd1\x8d\x5e\x26\xd3\x63\x9b\xd4\xdf\x2b\x25\xe7\x13\x7a\x23\x80\xba\x4d\xa7\xa2\x21\x7d\xec\x60\x41\x0d\x44\x2a\x18\x35\x08\x4a\x54\x07\x0d\xba\xc6\x4c\xfe\xba\xc4\x0d\xe3\x72\xa7\xe6\xa0\x86\xf6\xa7\xda\x92\x39\xd0\xe6\x86\xe2\x44\x34\xe8\x60\x97\xc9\xc0\xcf\x9d\x19\x80\xa3\x11\x9d\x13\x2e\x37\x87\x45\x54\x73\x4c\x05\xf8\x6b\x0f\xf9\xfc\x6e\xe6\x5c\xb0\x49\x53\xc6\x66\xaa\x2d\x5b\xc0\xd2\x15\x08\x45\x4b\x92\xbf\x38\x50\x27\x6f\x56\x50\x92\x02\x71\x94\x15\x17\x52\xfe\x82\x35\xf0\xb8\xe3\x96\x7e\xb2\xd1\x04\x89\x73\x37\x05\xf0\x92\xa3\xe6\x8d\xe2\x72\xf2\x0e\xad\xb5\xdd\xb4\xa0\xb1\x4c\x88\x64\x2c\x56\x8d\x46\xfe\x95\x5a\xcf\x19\x95\x52\xc5\xfa\xc2\x77\x62\xf4\x92\x09\x10\x8b\xfd\x6e\x16\xda\x24\x84\x84\xda\x02\x53\xd0\xea\x36\xb9\xe5\x98\x84\xc8\xde\xde\xc1\x15\x76\x1a\x59\xb6\x62\x82\xb0\xaa\x4e\x6b\xc8\x04\xaa\xb0\x03\x6b\x27\x61\x65\x6d\x54\x33\x94\xf8\xed\x1a\x6c\xe9\x34\x6b\xd1\xe8\x3e\xad\x2a\xf3\x10\x75\xa1\x48\xf5\xa7\x4d\x0e\x7b\x32\x07\xc7\x06\xdd\x84\x8b\x1b\x5b\xb5\x09\xae\x36\x5b\xb2\x76\x7d\xfd\x0b\x0d\xbb\x71\x79\x96\xdb\x09\x88\x79\x21\xcb\x22\x65\x7b\x7b\x41\x8e\x8b\xee\xea\xa0\x33\xdc\x54\x59\x06\xb9\x77\x6e\x57\xed\x05\xb9\x60\x3a\xdb\x0e\x96\x4b\x43\x34\x14\x77\xe7\x9f\x7a\x76\xf3\xb5\xcc\x22\xc8\x7b\xc9\x88\x77\x12\x05\xfc\xa2\xd4\xd5\x88\xae\xc2\x6e\xdc\x5e\x22\x95\x8e\x56\x1c\x6f\xef\x3f\xae\x3e\xdf\x76\x8f\xb2\xae\x7d\x9b\x19\x81\x00\x84\x4d\x6c\xa7\xa7\x79\xb5\xdd\x81\x18\xeb\x4f\xf3\xfa\xaa\x3b\xde\x90\xd7\x8c\x9d\xf5\x51\x4e\x92\x77\x46\x80\x56\x1e\xdf\x1b\xcc\xcf\x6a\x92\x60\x7d\x5a\x53\x86\x52\xf0\x4d\x7b\x93\x76\xa0\xa6\x65\xd0\x71\x7b\x49\x67\x8d\xa5\x91\x2b\xec\x3c\xa2\x69\xf3\x5a\x91\xe6\xce\x92\xa2\x55\x5a\x6b\xa2\x8e\x99\xc2\xa1\x5b\xb9\x21\x36\x9b\xd4\x6b\x09\x53\x2e\x29\xc7\x26\x75\x34\x89\x11\x12\xd4\x0b\x6f\x8c\xfd\xda\x67\x7f\x2e\xee\x19\xeb\xe8\xb4\x5f\xc2\x8d\xda\xf2\xa6\xe7\x1c\xd1\x4e\x4b\xcf\xed\x54\xfa\x9b\x69\xa7\x6b\xce\x76\xd3\xc0\x3d\x25\x3e\x0d\x9e\xb2\x5d\x38\x71\x72\x9b\xd1\x89\xdf\xb2\x17\x69\x40\xa3\x18\xd0\xdd\x81\x6b\xfa\x00\xab\x6a\x7b\x1d\x7b\x64\xfd\x7b\x15\xcc\x01\xcc\x03\xbd\xb2\x6e\xe9\x45\xf7\x84\xdf\xa4\xff\x16\x8f\x7a\xbb\xf7\xd7\x29\xde\xfb\x4b\x78\x9f\xce\x35\x42\x76\x8e\xc8\xde\x82\x7d\x43\x74\xd0\x20\x3e\xbe\xe7\xfa\x74\xf5\xf5\xed\xaa\xd8\xd8\x36\xa3\x0b\x83\x6c\x27\xcc\x81\x55\x25\x09\x62\x47\x45\xa3\x45\x2f\x53\x33\xdf\x0a\x89\x02\x5d\x75\x67\x9d\x43\x65\x76\xb8\x12\x61\xbe\x07\x86\xa3\xcd\x90\x64\x23\x1d\x93\x4c\x43\x84\x1f\x5e\xd4\x74\x74\x75\x60\xb8\xe6\xaf\xa8\xc6\x55\xe6\xc1\x3d\x66\x9a\x1b\xa9\x5e\xf4\x49\x28\xda\x01\x59\xa1\xe4\x87\x37\x68\x44\x9b\x4a\x30\x9c\xf2\xe2\x11\x6d\x54\xf0\x15\xe2\x50\xca\xcb\x4c\x4b\xb9\xce\x85\x86\x84\x8f\x3e\xa5\x75\x01\xda\x8c\xcf\x22\x65\x54\x72\x5b\xcc\x80\xd8\x2f\x6b\x52\xfd\x26\x1d\x1b\xe1\x6e\xc3\x6e\x66\x5b\x45\x0c\x3c\x5e\xde\xe6\xb4\x85\xd5\x95\x5f\xa7\xa4\xb9\x09\x34\xc5\x2e\x68\xb5\xe8\x96\x92\xa9\x6d\xa1\x06\xde\xfc\x14\x2d\x67\x32\xda\xa2\xe8\x76\x84\x9a\x19\xef\x16\x35\x19\xad\x9a\x4a\x0c\x3a\x06\x55\x4f\x97\xb5\x0e\xf2\x68\x0b\xc8\xa3\xcd\x67\x83\xec\x22\x29\x3b\xb9\xee\xfa\x28\xab\x1d\x53\x50\xa0\x78\x43\x60\x7d\x4e\xe7\xcd\x28\x02\xf6\x20\x3f\xf3\xc5\xce\xb1\xa8\xe1\x26\x4d\x05\x7a\xfa\xc2\xa9\xda\xaf\x6a\xf9\x01\x43\x72\x6f\x1c\x82\xfd\x95\x98\xb3\x0f\x0e\xf9\x62\x86\xcc\x5e\xcf\x3c\x5b\xbf\x53\x48\x46\xa8\x8e\x5f\x09\x98\x5c\x90\xa5\x92\xa5\x3e\x91\x45\x86\x3e\x03\xe6\x16\x57\x05\x14\xeb\xbf\x15\x31\xd2\xe3\x3d\xa8\x31\xb9\x42\xcd\x6a\x36\x90\x53\x5a\x73\x3c\xfb\x5d\xd5\xde\xad\xb2\xdb\xe1\x16\xc5\xe0\x7b\x5f\x4e\x60\x72\xf5\x8b\x3e\x3e\x14\xf7\x2d\x20\x29\xf5\xe1\x1c\x5e\x1c\x19\x86\x7b\xb8\x3b\x10\xdf\x4f\xda\xef\x23\xf1\xfd\x9d\xfb\x2d\x84\x97\x73\xa4\x57\xd0\x67\xab\x52\xe0\x36\xe6\x69\x11\x3a\xf2\x89\x57\x52\x2c\x94\x68\xf7\x84\x73\x38\x9a\x48\x96\x2a\xd6\xf4\x93\x8d\x9b\x7e\xd2\x69\xfa\x1c\xc1\x66\x34\x89\xb5\xfa\xdd\xc6\xad\x7e\xe7\xb5\x7a\xa5\xb4\xd3\x4c\x5f\x25\xbc\x82\x7c\x34\x41\xdd\x71\x4f\x55\xba\xd7\x78\x78\x96\x98\x32\xad\x1c\x57\x18\xdc\x64\x5a\x79\xf9\xf9\x33\x97\x04\xd6\xfd\x86\x2d\xb8\x74\xea\x32\xcb\x25\x16\x9e\x55\x9d\x71\xa8\x0d\xde\x99\xa1\x34\x27\x70\x90\x5f\x49\x51\x07\xee\x9e\x16\x35\x0b\xdc\x82\xf2\x95\x28\x21\x50\x81\x92\xb7\x52\xfb\xb7\xea\x98\xd4\xc3\x09\x95\x02\xb6\x1d\x90\xb9\x6a\x3b\x5f\xc7\x4e\xeb\x4a\x4b\xaa\x9e\x61\xad\x47\x50\x3d\xbb\x5a\x3b\x52\x47\x62\x15\xd3\x02\x52\xf5\x77\x0a\x49\x25\x1f\xb7\xb0\x94\xe4\x2c\xa7\x21\x0f\xc6\xed\x25\xc8\xc8\x96\x94\x24\x11\x39\x92\xa9\x42\x7c\x60\x34\x19\xca\xbe\x5b\xad\x8c\xb4\xa2\x76\xd7\xc8\xad\xe9\xa0\x76\x58\xd9\x59\x46\xd9\x44\x77\x59\xad\xf8\x2c\xa1\xf9\xeb\x0c\x09\xda\xe2\xa8\xc8\xa4\xca\x28\x14\x91\xb9\x77\xf3\xe1\x00\xfc\xbe\xe2\x8d\xc6\xd2\xf2\xce\xe2\xe6\xf0\xfd\xc7\x5c\x4e\x58\xfc\x70\x86\x3d\x7c\xff\xd1\x98\xf6\x93\x0a\x35\xf7\xe8\xab\x91\x15\xdf\x2a\x5a\x2b\x98\xcb\xfc\x06\xd7\xf5\x33\xc4\x78\x43\x17\xcf\x6b\x24\xca\xde\xab\xd9\x29\xbd\x46\x6d\xb3\x1d\xbd\x42\x04\x71\x1f\x72\x15\x85\xf8\x68\x92\xff\x7b\x70\x09\x65\x08\x07\xc8\x72\x59\x60\xd5\xf6\x71\xca\xaa\x1d\xb2\xf3\xa9\x15\x83\xf4\x83\x31\xe6\x92\x90\x7c\xb3\xd5\x71\x6f\x8e\xf5\x0e\x61\x92\x42\x3a\x9b\x84\xf7\x6f\x10\xdb\x1b\x17\x6c\xbf\x73\xc7\x8f\xf8\xb9\x3d\x5e\x7a\x34\xf3\xe3\x60\x87\x65\xde\xa6\x6f\x49\x61\xa8\x2f\x12\x47\xbb\xda\x8d\x6a\x8f\xc5\x54\x4f\xad\x10\x83\x72\xe7\x16\x4b\x10\x05\x79\x9d\x84\x2b\xb1\x95\x90\xb7\xc5\xee\xdf\x0e\x71\xa8\xf4\x43\x5a\x79\xe8\x7c\xc8\xe3\xcc\x47\xe0\x79\x0f\x3f\xc6\x7c\x9a\x2d\xaf\x74\x73\x4a\xce\x08\x43\x0d\x7f\x29\x18\x8f\x55\x92\x92\x5d\x3e\x69\x6b\x66\x9f\xc4\xb8\xac\x5b\xdb\x92\x54\x14\x8b\xc6\xdf\xc2\x8b\xd8\x0d\xa5\x1d\x8e\xcf\x6b\x1c\x89\x79\xb8\xac\xaa\xcf\x2f\x3c\x89\x64\x3b\x07\xff\x77\x32\x7b\x1b\x96\xd1\xfc\xf8\x3d\x44\xd8\x75\x6f\xa6\x36\x63\xd5\xe5\x61\xf9\xcf\xc6\xa9\x5b\xb0\x4f\x10\x54\xbe\x12\xbe\x26\xdc\x75\xe7\xe7\x8a\xaf\x8e\x33\xdb\x96\x3d\x11\x24\xbb\xc2\xfc\x15\xad\x90\x7c\x07\x47\x47\x86\x03\xaf\xe8\xe8\xb9\x12\x44\x35\xef\xf8\x8b\x51\xc5\xf4\xe8\x5d\x75\x5d\xad\xda\x54\x55\xd7\x94\x7f\x6e\x24\xdd\x7c\x04\x89\xbc\x28\xed\x30\x84\xa8\x99\x4a\x53\x0e\x2b\xe5\x88\x41\xaf\x62\x53\xdb\xc7\xb6\xc1\x2d\x9b\x7d\x04\xd1\xb2\xb0\xbb\xa9\xb9\xcf\x35\x4d\x8b\x41\x00\x6f\xdb\x5b\x46\x6e\xd6\x50\x6e\x48\xc4\xae\xa0\x47\xaf\x6d\x82\xc0\xcc\xe2\x17\x4a\x50\xf6\xf9\x73\xb7\xcd\x93\xd9\xac\xa1\xd7\xe8\x9e\xcd\xbe\x41\xd7\x18\xdd\x68\x5e\xfe\xdd\xcc\xa3\x33\x4f\xfe\x5d\x12\xc6\x2b\xb4\x38\xa5\x15\xb2\x16\xb1\xa4\x72\xb1\xbd\x63\x52\xe1\xdf\x48\x7b\x37\x4b\x7a\x09\x63\x8a\x01\xad\x36\xcd\xbd\xd2\xcf\xbb\x3a\x0c\x5b\xc1\x51\x63\xf8\x1b\x5e\x20\x9b\xab\xb8\xdc\xf6\x8a\xd7\x6e\x2f\xad\xda\x53\xa4\x3b\xd5\x87\x43\xf8\xf0\x0d\x5f\xa6\xbb\xed\xe8\x5c\x3c\x06\xd9\xde\x9e\x9f\xe5\x62\xad\xe0\xf9\xbd\xb9\x3a\x60\xf0\xa7\xfb\x4b\x0c\x32\x3e\x0c\xfc\x0a\xcf\xd7\x40\xe6\xa8\x6b\x52\xf0\xcc\xee\xd7\xb4\x0b\x6a\xc1\xfe\xad\x3b\x17\xbd\xe6\xef\x45\xcc\x94\xa6\xe5\x8f\x4c\xc9\x46\x90\xa3\x31\x6d\x16\xab\x2b\x98\x52\x42\x60\x53\x66\x62\xab\xcb\xeb\x42\x6d\xfb\xd8\x0a\xd0\x27\xe9\xfb\x8f\x59\x4e\xd0\xcd\xa9\x6e\x53\xaa\x2e\x26\xd4\x7e\x5b\x29\x74\x02\xd9\x69\x58\xbb\xa5\x72\x6d\xc3\xab\xc5\x7b\xa7\x5c\x66\xed\x85\x96\x92\x7a\x2a\x36\xc1\x8e\xe3\x51\x7b\xd0\x84\x25\x24\xa3\x85\x4f\x34\xd5\x38\x4e\xaa\xea\xc1\x83\x70\xfb\x60\x33\x38\x42\xbf\xde\x10\xd4\xf8\xf4\xb3\x53\xe6\x15\x24\x52\xad\xbd\xcc\xf2\x29\xbc\x7d\x0b\xc7\x6c\xf8\x5d\xce\xe1\xf8\x37\x6f\xad\x44\x82\x5a\x94\x60\x05\xdf\xc2\xb1\xb6\x60\xe1\x0d\xbe\x98\x73\xda\xbc\x62\x32\x05\x2a\xea\x6d\x3e\xe7\x0c\x35\x4a\xc0\x0a\x97\x51\x48\xcb\x4a\xe6\x01\x7e\x2b\x42\x98\x65\xfa\x10\x08\x0f\x43\xff\x5c\xda\x18\x2a\x9d\xa3\x45\x00\x5f\x8e\xea\x54\x74\x4d\x6b\x31\xda\xb0\xa7\xd8\x91\xb3\xea\x24\x8d\x1e\x51\xde\x99\xea\x9e\xb5\xa4\x04\xc0\xbe\x75\xb7\xcf\x84\x23\x67\xe4\x90\x94\xd1\xf4\x97\xf0\x02\xd5\xfe\xa3\xe1\xa0\xd4\x4b\x3a\xba\x8a\xd5\x16\xe9\xeb\x6b\xab\x83\x34\x56\x5f\xe5\xc8\x16\x96\x1a\xec\x64\x99\xe9\x95\x87\xab\x61\x79\xd7\x02\xc7\x56\x58\x3e\x10\xac\xb6\x84\x69\x30\x10\x3f\x5d\xb0\x33\x01\x76\x7c\x99\xf2\xb2\x2c\x49\x0f\xef\xa0\x57\x05\xe9\x55\x21\xc5\x89\x6e\x57\x16\x3a\x21\x8b\x0b\x5a\x2d\x86\xac\x8c\x67\x74\x20\x1b\x14\x7b\x05\xff\x4e\x1b\xcc\x23\x0d\x98\x9c\x75\x2d\xbc\x23\x90\xe0\x29\x9d\xb3\x6e\x13\x36\xcb\x5b\x1d\xb6\x5c\x79\x0b\xb6\xa1\x9e\x45\x3d\xed\x50\xbf\x6f\x68\x73\x75\x59\xd3\x9b\x73\x0e\xb9\xbc\x27\x14\xed\x2b\x79\x2f\xa2\xc8\xd9\xc6\xc2\x39\x8f\x30\x2e\x1c\x8e\xd9\x46\x66\x70\xe8\xbe\x66\x70\xb0\xaa\x44\x2f\x07\x97\x18\xd5\x8e\x41\x55\xde\x5f\x82\x5e\x5e\x4a\x4d\x4e\x45\x6f\x88\x1e\x95\xf9\xca\xbb\xae\x85\x76\x79\xc1\x26\xf8\x92\xff\x15\x2d\xf6\xf6\xd2\x23\x29\x9a\x16\x37\x13\x3c\x9a\x7c\xfe\xfc\xfd\x0f\xee\xd7\xd1\x7f\xfc\xc9\xfd\xfc\x0f\x2f\x4f\x33\xb0\xfa\x53\xff\x78\x5a\xfe\xdb\x0f\x7b\x7b\xfa\xe3\xcf\xe5\x9f\x06\x4e\xce\x9f\xfe\xdd\xc9\x39\x7a\xf2\xc4\xc9\xfa\xfe\x3f\x9c\xac\x1f\xfe\x5d\xaa\x23\x8d\x18\x3d\xfe\x4d\x9e\x51\xe6\x4d\xac\x48\x10\x4c\x93\x64\x19\x1f\xaa\xb3\xdb\x14\xa4\xcb\x5c\x20\xdc\x5a\xe3\xa5\x80\x89\x51\x5a\xe1\x77\x0c\x35\xff\x8d\x19\xbe\xa8\x5d\xed\x9f\xa3\x7b\x0e\xb5\x60\x48\xb5\x4e\x8c\xdb\xc7\x14\xd9\x2b\x5c\xf7\x14\x26\x99\x01\x49\xb4\x5b\xc3\x75\xb6\xac\x8b\x31\x8f\xf6\xef\x0b\xbb\x9d\x07\x36\xda\xa7\x4e\x9f\x28\xcb\xe3\xc6\xfd\x62\xc0\x82\x00\xb8\x86\x6c\xa8\xc0\x95\x52\xc8\x50\xee\xbc\xc3\x67\xd9\xde\x5e\xca\x3a\x76\xe0\x83\xf6\xce\xd8\x9b\xa4\x5a\x69\x63\x07\xf1\xfe\xa3\x74\x23\xf7\xa9\xc0\xec\x5d\xeb\x0a\xa5\x4b\x7d\xc5\x2e\x05\x59\xe6\x72\x3f\x41\x9e\xe1\x90\x8e\x0c\xb4\xfb\x4b\xb2\x59\x8d\x79\x0a\xbe\x01\xd9\xce\xa7\x02\x89\xa9\x93\xdc\x37\x6a\x6f\xb9\xad\x8e\xc5\xfc\xd2\x55\x09\x8d\x7f\x33\xaf\x10\xc5\xaa\x0a\x04\xf6\x68\x57\x17\xc1\x00\xc8\x51\x39\xc8\x49\x39\xc8\x59\x39\xc8\xa9\x48\xc0\xe5\x20\x87\xe5\x20\x6f\xca\x81\x7f\xe7\x21\xd5\x7c\x31\x9b\x39\x6e\x6d\xe6\x04\x0b\xf4\x33\x64\x8a\x0b\x7a\x8d\x88\x54\x71\x88\x05\x41\xfb\xe5\x91\x45\x28\xaf\xd4\xc9\x0d\xc4\x1c\x93\xb1\x3a\x90\x64\x61\xd2\x5b\xf8\x8d\x34\xb8\x47\x95\x2c\xc6\xdc\x62\xa3\x4e\x97\xb8\x9b\x1d\xe9\x0b\x76\x4b\x79\x9d\x34\x22\x7f\x99\xe5\xe8\xe9\xe0\xf3\x67\x22\xfe\x61\x4f\x07\xd9\x1d\x2f\xd1\x3e\x48\xc0\x7e\x7a\x54\x96\x25\x3a\xd6\x35\xc1\x50\xff\x60\x20\xdb\x07\xc9\xac\xa1\xe3\x46\x88\x08\x64\x9c\x27\x60\x9f\xec\x83\x04\xea\x11\x24\x8d\x1c\x82\x48\x66\xfb\x20\x69\x4c\x97\x4b\x03\x71\x6b\xde\xe0\x30\x8b\x39\xcf\x72\x2c\x86\x00\xc5\x3f\x8d\x18\x07\x2d\x71\x3b\x0e\xbc\xd9\x38\x60\x7c\x1c\x8d\x37\x8e\x76\x10\x0e\x97\x0b\x72\xea\x2b\xd5\xce\x3b\x02\x4d\xaf\xe6\xd5\x2b\x66\xcd\x4c\x85\x00\x6b\x85\x82\xb8\x4f\x9a\x28\xfb\x23\xaf\xce\x36\xb9\x6c\xf3\xa4\x16\xf5\xa6\x44\x10\x10\x9f\x32\xd0\xad\x2a\x1c\x65\x39\x2e\xdf\x7f\xcc\xa1\x20\x17\x86\xed\x88\xee\x0a\x45\xb6\xee\xd4\xd8\xce\xaa\x21\xc9\x5b\x13\x8b\x21\xb2\x42\xe9\x59\x35\x74\x5f\x8a\xec\x60\xf5\xdc\x84\x09\xbc\xa3\x8f\xd9\x30\x74\xa9\x07\x0b\x8c\x5a\x23\x6b\x74\xe4\x3e\x51\xee\x1e\x03\x0c\x59\xa9\xf2\x95\x74\xe7\xc8\x26\x78\x96\xc2\x1c\xcc\x89\xbe\x93\xe9\x1a\x89\x6d\xd5\x14\xce\x41\x6f\x43\xf6\xf5\xad\xb1\x02\x3e\xa9\x2a\x21\xa9\xf9\x54\x69\xd6\xa0\x6b\x44\xf8\x33\xa5\x4f\x88\xbc\x2f\xb7\x0c\x80\x8f\x4e\x4a\xec\x03\xd9\xce\xa0\x2c\xcb\x94\x94\x24\x78\xc7\xa4\x7c\xb2\x64\xf6\x32\xfb\x93\xd4\x44\x43\x4c\x58\x8a\x72\x92\x7d\xfe\x6c\x1f\xed\x78\x77\x43\x52\xf8\x14\xd2\x2a\x29\x18\x87\x0d\x67\xf2\xd5\x3a\x38\xf0\xde\x4a\x86\xbc\x42\xdc\x10\x7e\x98\x7a\x67\x01\xf1\x2f\x07\x0c\x57\xe3\x59\xbf\xe8\x49\xe5\x00\xac\x62\x4d\xd4\x1d\x63\xa4\x47\xb9\x61\xdf\xa8\x1b\xc8\x10\xd0\x91\xae\x3f\x15\x37\x98\x4f\xe8\x9c\xa7\x51\x68\xf3\xcc\x12\x00\x29\x91\xaf\x10\x8b\x9c\x5a\xa8\x04\xdf\x00\x73\x4c\x72\xef\x98\x44\x25\xda\xe7\xfb\xe0\x1b\xa0\x4f\xf3\xd8\x91\x0b\xb2\x1d\x62\xc7\x29\x19\x8e\x55\xea\x34\x12\x91\x06\x56\x00\x32\xce\xc3\xf7\x3d\x43\x58\x59\xda\x3e\x45\xb8\x97\x3a\x4e\x99\x4a\x6c\x62\x04\xf4\x55\xcd\xc1\xb7\x56\xda\xe9\x5b\x9f\x75\x3a\x38\x2b\x27\x3b\xb7\x15\xe2\xf7\x6b\x38\x46\xca\x46\x48\xe6\x20\x0e\xf5\x8b\xda\x07\x8b\x87\x8a\xa4\x32\x2d\x1a\x08\x4e\xc1\xd5\x3f\xd9\x0c\xc9\x89\x7c\xfe\xec\x9a\x8d\xc4\x1e\x9f\x5a\x87\x15\x86\x5b\xf3\x1c\x91\x72\xaa\x50\x5f\x48\x43\x5d\x43\x91\xcd\xf4\x6f\x81\xfa\x5f\x25\x3a\xec\x61\xbf\x5e\xf8\xb5\x32\xab\xf3\x3a\x8e\x28\xa7\xa5\xfe\xd7\x21\x74\xd2\x30\x34\x60\x15\xe0\x35\x92\x2b\xe2\x63\x5c\xb8\x53\x1d\x05\xc6\xce\x1a\xc5\x48\xbf\x5a\x63\x6f\x2f\x60\x5b\x05\xb5\xe5\x73\xa6\xeb\x28\x5e\x52\xf0\xc4\xa8\x90\x7e\xd5\xd8\x04\x55\x42\x42\x54\x96\x8d\xa8\x86\x1c\x5f\x07\x56\x95\x16\xe2\x59\x98\xd8\xdf\xb4\x62\x46\x7f\x11\xe3\x89\xb4\x0d\xb6\x51\xf2\xcb\x75\xd0\xd7\x8d\x79\x9b\x74\xc2\x7e\xaa\xe9\xe8\xaa\x4b\x8b\x83\xaa\xba\x9c\xbd\x9b\x3e\xa5\xb3\x45\xb0\x18\xc1\x7d\xa8\x2e\xe0\x5d\x2a\x58\x18\xe4\xaa\x95\x57\xb4\xb3\xa4\x7e\x2b\xa6\xc0\xca\x56\xd4\x2b\x9b\x4e\x3b\xe1\x41\xad\x30\x4f\x8a\x67\x9e\xdf\x35\x94\x19\x24\xba\xc3\xd5\xd0\x79\xfa\x9d\x4b\x2b\x5d\x93\x62\xbc\x31\x8d\x26\xb8\xae\x1a\x44\x86\xdc\xf7\xec\xd5\x8e\x42\x12\x7e\x79\x69\x12\xbd\x0d\x1b\x7b\x8b\xe5\x6f\x6f\xbd\x57\xe5\xb9\xd0\x73\xb1\xe5\x58\x29\xf4\x5f\xb6\x3d\xfc\x46\x86\xd3\xd1\x4a\xbf\xc3\x32\x7f\xc3\x63\xe1\x4b\xdb\x80\x6e\x7f\x30\x48\x0a\x7b\xc5\xe9\x4c\x92\xfa\xe9\x8c\x2f\xe4\x8e\x8b\xda\x0c\x46\x55\xe7\x83\x0e\x35\x35\xa6\x6a\xe6\xb2\xe2\x6b\x5e\x39\x7b\x9c\x67\xcf\x11\xe1\x09\x35\xfe\x80\x9f\x0e\xcc\x9d\xf5\x6e\xca\xf6\xf6\xc8\xde\x5e\xf4\xe6\x3a\xaa\xac\x08\xe8\x69\xef\xcd\x75\x4f\xcb\xf6\x92\xe1\x5e\x8d\xb7\xf7\xd7\xf7\xb4\xe8\x13\xa4\x17\x95\x77\xea\x94\x81\x17\xb5\xa2\x22\xbb\x47\xf9\x7c\xf6\x4c\xf9\x23\x94\x26\xc1\x15\xbd\x21\xee\x37\x26\x95\x90\x09\x9c\x14\x3a\xe7\x61\x92\x32\xac\x1f\x02\xf0\x50\x27\xbf\x1d\x94\x98\x37\x0d\x22\xf2\x64\x3d\xab\x1c\x3b\x31\x89\xc2\xa9\xeb\x67\x17\x80\x21\x5f\xa3\x6e\xde\x10\x50\x52\x08\xfa\x69\xce\xa4\xab\xab\x51\x83\x2f\x9c\xfd\x24\xcf\x87\xaa\x42\xfa\xb8\xcb\x81\xf6\x60\xeb\x65\xad\x68\xa7\x41\x0c\xff\xd6\xd6\x16\x33\xc1\xbf\x21\x87\x02\x8a\xcf\xf4\xcb\xda\x45\xda\x71\xcd\xc9\xca\x19\xae\x2c\x6e\x26\x92\xed\x60\xc2\x51\x03\x47\xbc\xc0\xec\x5c\x2c\x99\x60\xd6\x25\x49\xcd\xf6\xf6\x4c\x9e\x9b\x2a\xda\x41\x3c\xed\x31\xd2\x94\x87\x5c\x38\x94\xa8\xf8\xa4\x20\xb5\xcc\xf5\xcf\x1e\x85\xf0\x36\x6a\x7f\xf7\x79\xd7\xbf\xa4\xca\x87\x55\x56\xdc\xe0\x8a\x4f\xd2\xec\x69\x79\xf4\x1f\x03\xa5\xe4\xd3\x4f\x78\x0c\x5d\x55\xaa\x58\x5f\x51\xdc\x56\x9f\x20\x3c\x9e\xf0\x34\x3b\x70\x9e\x55\xc1\xeb\x83\x0b\xd8\x00\x27\xf3\xe8\xfb\xc1\x8e\x27\xee\x68\x58\x8d\x84\x5c\x39\x85\xb7\x07\xaa\x24\xc8\x89\xda\x23\xac\xf4\x4b\x2b\x15\x5d\x41\x2f\x2f\x25\x6c\xf5\x03\xf8\x50\xd9\xab\xc6\x48\x4b\x41\x0e\x2f\xf9\xc1\xd1\x60\xb0\x43\x9f\x7e\xf7\xc3\x60\x6f\x2f\xa5\xe5\x77\x3f\x0c\x02\x91\x4b\x8f\x41\x01\x80\xc6\x33\xc5\x00\xef\x84\x04\x56\xc3\xc5\x10\x60\x52\x63\x82\x0e\xe4\xc3\x10\x90\xcf\x28\xc3\xd2\x36\x0c\x5c\xe2\x5b\x81\xf4\xb2\xa5\x21\xdd\x07\xb3\x5b\x90\xab\x19\x0d\x01\x9c\x73\x0a\x72\xde\x40\xc2\x2e\x69\x33\x55\xfe\x0e\x8c\x61\xf4\x1b\x89\x66\x4d\x9a\x2d\x95\xdd\xf3\xfa\x21\x74\xfa\x36\x6c\xa4\xe9\x1e\x1c\x0d\x06\xff\xa7\xed\xfe\x87\xc1\x40\x8c\xc6\xe9\x9f\x50\x82\x80\xba\xd3\xf0\x06\xe1\x62\x98\xf9\x99\x70\x87\xfd\x2a\x38\x6c\xc6\x88\xe7\xa4\x4c\xa5\x9f\xef\x17\x35\x85\x3c\x95\xa7\x80\x20\x85\xf8\x62\xce\xc5\x46\x83\x1c\x1e\xdc\xca\xf7\x8b\x83\x6c\x9f\x17\xd5\x6d\xce\xd6\x57\x58\x38\x15\x16\x3b\x82\x91\x5e\xd4\xa8\xb8\x41\x17\x57\x98\xbf\x35\x63\x2f\x4d\xba\x9d\x4d\x09\xe4\xcf\x5a\x50\x4b\xa9\x54\x9d\xdd\x6a\x35\xea\xec\x36\x03\xca\x64\xbd\x3b\xb6\x9c\x64\xf1\xac\x05\xc8\x99\xcc\x92\xbd\x18\x18\x97\x7a\x7d\x97\xdb\x6c\xb6\x7b\x93\x8d\x68\x66\xd5\xc0\xf1\x58\x1c\x47\xe9\x9d\xc0\xa7\xf3\x51\x43\xeb\x5a\x1d\x5f\xa8\xe1\x18\xaa\x17\x0c\x82\xd4\x0c\xf9\x32\x2b\x24\xf5\x52\xc5\x51\x35\x46\x6c\x78\x27\x36\x84\x28\xdf\x48\xac\xd8\x1d\xe4\x17\x94\x73\x3a\x95\x8f\x64\x04\xeb\x34\x58\x2e\xd5\x65\x9e\x22\x7c\xa2\x25\xff\x3e\xaf\x83\x03\x1b\xa2\x40\xce\xd6\x96\xd4\x6b\xdf\xae\xba\xc0\xe3\x92\x17\x8d\x60\xf9\xe4\x87\xda\x51\x26\x5f\xa1\xb6\x29\xa0\xbe\x54\x09\xb2\x5f\x0a\x5e\xb3\xe6\xf0\x8d\xc8\x12\x93\xce\x99\x9f\xc6\xe9\x2c\x7f\x10\x7a\x7d\x31\xec\x92\x3b\xd2\x9c\xfd\x1d\xf1\x87\x84\x2c\x9f\x64\x03\x3f\xc9\x5b\x30\xf7\x8e\xc8\x71\x3a\x14\x88\x58\x82\xeb\x5a\x66\x39\x75\x3c\x02\x8f\x0d\xa7\x41\xf2\x08\x39\x3d\xf6\xa4\xad\x21\xcb\xbc\xeb\x47\x62\x6c\x20\x53\x5a\xf8\x4c\x57\x29\x90\xb1\x68\xd9\xae\x92\x16\x2e\xd7\x55\xd2\xc2\x67\xba\x4a\x5a\x04\x3c\x57\x29\xaf\xe8\x5a\x75\x34\x97\x41\x8c\xbc\xfb\x06\x31\x28\xd7\xcc\x31\xf6\xa8\x55\xd4\x52\x52\x22\x77\x86\xb3\x11\x7b\x1a\x63\xda\xa3\xfc\xf0\x23\x2e\x4e\xa1\xd8\xcc\x65\xef\x45\x66\xe9\x2b\x5e\x74\x04\x34\xe4\x04\xc9\xbb\x46\xef\x66\x29\x97\x01\xd5\xc4\xbc\x69\xeb\x2d\x2a\xf0\x2c\x32\x46\xe7\xe8\x1f\x73\x44\x46\xc8\xba\x60\x36\xfd\x0b\x38\x2f\x97\x92\xe7\x7d\x46\x6f\x48\x60\x24\x19\x41\x81\x5e\xd0\xe7\x7f\x20\xb8\x88\xa9\x3c\x22\x64\xce\x24\x06\xff\x2f\x80\x8d\xda\x8a\x1b\x42\xe6\x25\xba\x46\xf5\x2a\xb0\xfc\xaa\xf6\xf1\xff\x02\xb8\x68\x8a\xf4\x18\x80\xa1\xe4\x2f\x94\xd3\x8e\x52\x0b\x5f\xa6\x00\xec\x96\xa5\xcb\xf3\x4b\x62\xcc\x03\x95\xdf\x84\xde\x18\xc5\x99\x68\x6f\x73\x0d\x90\x18\x45\xec\x71\xc1\x66\xcf\x7d\xff\x78\x37\x00\xb0\x19\x4d\xd6\x5d\x00\x88\x32\x20\xcb\x1b\x3a\xe7\xd6\x8a\xb2\xeb\x1a\x41\x2a\xf8\x4e\x8d\xfa\x6f\xf7\x28\x97\x6c\xb5\x74\xcb\x3d\x04\x40\x7d\x39\xcf\x1a\x8c\x0e\x68\xf7\x48\xfc\xd4\xee\x85\xd4\xc7\x2b\xc1\x73\xa9\x27\x11\xea\x59\xee\x0b\xeb\x93\xf3\xbe\x2f\xed\xd4\x24\x9e\xd1\x11\xeb\x3c\xb7\x0b\x7a\x91\x7e\x6e\x66\x7c\xd1\xf3\x20\xd8\x96\x7e\x83\xd8\xbc\xe6\x1b\x68\xbf\xc2\x1a\xae\x22\x4c\xba\x7b\x27\xf3\x36\x4a\x44\xd7\x40\xd9\x33\x52\x95\xd6\x1a\x5a\xef\x7d\xc6\xd1\x14\xe4\x76\xfb\xcb\x5f\xaf\x24\x8f\x09\x2c\x40\x57\xea\xce\x62\xcf\x32\x92\xc0\xc8\xe8\x94\xce\x16\xa0\x75\x3a\x69\x92\xdf\xa2\xe9\xac\x96\xb4\xc5\xbd\x98\x71\x18\x18\x2f\xf1\x55\xe7\x09\x46\x3b\xc0\x07\x68\xa7\x42\xc0\xae\x73\x8e\xba\x61\xb3\xea\x61\x27\x99\xcd\xf9\x0b\x69\xb9\x07\xbe\x99\xa9\x3b\x0c\x79\xef\xb7\xea\xfd\x73\x0e\xbe\x51\x6e\x4b\xa4\x32\x3c\x5e\xa6\xab\xaf\xf2\x97\xc1\x31\x4e\x31\x0b\xcb\x63\xda\x46\x97\x97\x73\x96\x3b\x28\x6b\x80\x1c\x94\x56\x68\x12\x94\x55\xab\x24\xf9\x65\xb3\x57\x7a\x2d\x46\xee\xec\xe3\xf6\x08\x9e\xbf\xb0\xbe\x4f\x55\x60\x95\x8a\x8e\x04\x29\xdb\x19\xec\x96\xa8\x30\x15\xf5\x2e\x70\x19\x47\x8f\x18\x49\xe3\x10\x41\xdd\xfa\x2d\xdc\xba\x5b\x11\xf9\xaf\x4d\xbb\x37\x0c\x1d\xd8\xdb\x4b\x0f\xde\x26\xa8\xc7\x6e\xbd\x0c\xab\x2e\x51\xbc\x85\x17\x59\x5b\x44\x11\x47\x39\x69\x48\x94\x14\xf2\x96\x3a\xcc\x30\xb3\x2f\x54\xdb\x1b\x14\xed\x64\xcf\x3d\x98\xd4\xe2\xa6\xea\x7e\x24\x76\x73\xe3\x9f\x93\xde\xad\x8a\xb3\x14\x1e\x2d\x06\x59\xcc\x3f\x9a\x76\x8a\xb6\x0e\xa7\x57\x5f\x87\xf5\x1a\x12\x69\x3f\x37\xa4\x0c\xb7\x84\x7b\x81\xe4\xaa\xdc\xdb\xc3\x22\xf0\xc5\xc8\x5a\x07\x86\xa4\xcf\x56\x43\xc1\x51\x07\x2f\xd6\x1d\x56\x88\x8d\x82\xfe\x70\xd8\x9f\x7d\x0d\xb4\x83\x4b\x5c\x34\x68\x56\xc3\x11\x4a\x0f\x3f\x90\xc3\xb1\xbc\x63\xb2\x83\xc0\xad\xfd\x08\xed\x35\x18\xe9\x8a\x40\x9e\x45\xe7\x6b\xed\xd1\x27\x66\xef\x28\x87\xe7\x0c\x35\x44\x7a\xa8\x00\xdd\x38\x26\x49\xbc\x6b\x97\xe5\x46\xf4\x44\x16\x73\xdb\xf7\x9b\xb9\xc1\xee\x21\x0a\xb1\x5d\x5f\xe6\xb1\x5c\xda\xa3\xeb\x6c\xe5\x60\x27\xd7\x2f\xa9\x86\x38\xd7\xbe\x67\x86\x50\xe3\xbc\x71\x45\xa3\xbc\x8f\x8e\x4d\xba\x71\x3c\x93\xfb\x0e\x65\x4c\x76\xe8\x66\x66\xb9\xc3\xfb\xef\x53\x9b\xd6\x09\x50\x8b\x21\xea\x02\xd0\x49\xb6\x8f\xe1\x5c\x8b\x11\xb2\xc2\xd6\x26\x77\x96\xb3\xbf\x10\xf7\xb7\x4c\xfc\x1c\xe8\x10\x78\x9d\xd2\xa0\xcb\x06\xb1\x89\xdc\xcd\x6a\x3f\xab\x87\x42\x2e\xcd\x5a\x79\x23\xdb\xa1\x6f\x6b\x5c\x73\xbb\xef\xb6\x3d\xf4\x3a\xd3\x0c\xbc\x6f\x90\x16\x25\x9f\xd1\xbb\xeb\xe8\x43\x8a\x60\x68\xd6\x74\xd8\xb7\xfc\x43\x65\x47\x56\xe0\xd9\x31\xef\x8e\x6f\xa8\xde\x52\xec\xda\x2d\x87\xcc\x23\x40\x6f\x09\x46\x74\xb6\x58\x4f\xb3\x76\x7a\xae\xda\x3d\x73\x24\x77\x7d\xe2\xb7\xed\xbf\xd3\xbc\xf7\xf6\xd0\x6e\xd9\x67\x94\x19\x03\x8a\x40\xdf\x2d\x81\xe2\x58\x0e\xf4\x03\x65\x0b\xb1\xe8\x1a\xa3\x9b\x83\xd6\xcb\xc0\x1f\xfb\xb1\xe2\x9a\x58\xbc\xbe\x37\x96\xfe\xa7\x66\x97\xb8\x96\x92\xf4\xaa\xdb\xec\xa8\xbd\x50\xbe\xf6\x3d\x58\xe7\x05\x5a\xef\x9b\xe5\x4d\x94\x6a\x2f\xe9\xe8\x6a\xe3\x87\x84\xd2\xf9\xec\x43\x63\x1b\x28\x8d\xb4\x01\xa1\xb9\xb8\x53\x2c\x47\x9b\x21\x2d\x4a\x00\xc8\xb5\xe3\xc2\xe5\xea\xab\x58\xa3\xf4\xd8\xd0\x7c\x6c\xad\xb5\xd6\xe3\xc0\xf5\x1e\xa6\xd4\x26\xbc\x1b\xb2\x21\x96\xf6\x81\xdd\x49\xec\x10\xec\xa3\x7d\x70\x08\x5d\x7f\x40\xac\x24\xe8\x26\x79\xd6\xd0\xd9\x6f\x54\x6c\xc5\x6f\xe6\xb3\x9a\xc2\xea\xc0\x9a\xa3\x28\x54\x6c\x43\xd2\x77\x22\xdd\x23\xd8\xa0\x26\xb1\xa7\x55\x18\xac\x41\xb3\x09\x41\xd0\x06\x19\x8f\x1c\x64\xcb\x7c\xde\xd4\x43\x92\x4f\x11\x9f\xd0\x6a\x08\x66\x94\x71\x90\xcf\x60\x03\xa7\xca\x63\x81\xbb\xef\x47\x35\x1e\x5d\xc1\x8b\x5a\xec\xde\x7c\x0a\x6f\x5f\x88\x91\xe1\xdf\xd0\xf0\x68\x20\xab\xd4\x35\xaa\xdf\xc9\xd1\xb3\xe1\x77\xb9\x9a\xc7\xab\x79\xcd\xf1\xac\x96\x32\x3f\xac\x2a\x65\x02\xfb\x12\x93\x2b\x19\x72\x03\xce\x39\x7d\xdd\xd0\x11\x62\xec\xbf\xe6\x48\x92\x85\x38\x5a\xca\xd7\x5c\x73\x1d\x2c\xca\xc9\x34\xa7\x9e\xc8\xff\x87\x68\x41\x6c\xd1\x8e\x74\xcc\x3b\x48\xeb\xd6\x83\x55\x85\x2a\x01\xe5\xa0\xe5\xe5\x32\xdb\x51\x25\x22\x8d\xf2\xec\xce\xdc\x56\x0b\x30\x84\x11\x18\xaa\x86\xce\x40\xce\xc4\xe9\xe3\x77\xbd\xf6\xa1\x52\x94\xbf\x74\xc7\xde\x77\x78\xf4\xca\x52\x1a\x81\x3a\x02\xd4\x79\x4b\x0d\x22\xde\x3a\x1c\x9f\xd8\x27\x0e\x0e\x88\x6d\xcd\xd5\xae\x46\x1d\x1b\xf8\xb5\x7e\xb0\xc3\x19\x77\x6b\x1e\x75\xcd\xcc\x3b\x83\x88\xb8\xbc\xee\x42\x2d\xac\xb5\x82\x35\xc7\x55\x8f\xb5\x7d\x40\xe7\x56\xc1\xc4\x21\x75\xda\xac\x7e\xdb\x13\x56\xef\xd3\xad\x3d\x10\x2a\xa3\x34\x19\x80\xe9\x2b\xc7\xdd\xf9\xe2\x56\xc9\x6b\x0e\xf3\x55\x5e\x0f\x27\x90\xbd\x86\x2b\x5f\x93\x1b\x65\x39\x41\xc6\xa7\xa1\xf1\xd1\xe2\xa7\xbc\xc2\xf2\xf5\x4f\xbf\x5b\x6c\xa7\xac\xd7\xdc\x4b\x1d\xee\x4c\x6a\x48\xd1\x25\x6d\x50\x6b\x55\xad\xac\x1d\x8d\x5f\x03\xb5\x51\xa4\x58\xd4\x1e\xcf\x55\x9b\xa8\x42\xb2\x6f\xc0\x8b\xfc\xb1\xd9\x8f\x09\x54\xa2\x5f\x57\x11\x2a\x05\xbd\x35\x0f\xf5\x55\x19\xc7\x72\x4f\x3a\x3c\x9c\x33\xc4\x1b\x38\x73\xac\xd3\x43\xaf\x73\x5b\xbd\x2a\x96\x25\xf4\x4e\x14\xa7\xd4\xcf\x90\x54\x35\x6a\xa2\xc1\x15\x75\xd7\x92\x03\xb0\x40\x1c\x23\xc3\xdf\xfc\xb4\x38\xab\x24\x7e\x1c\x68\x84\x3e\xb8\xc1\xbf\x41\x15\x8f\x42\x7b\xc2\x42\xf2\x79\x9f\x64\x00\x5e\x99\xe6\x52\x22\x9d\xba\x5e\x60\xe9\xa6\x9c\x8d\xa2\x40\xb1\xe6\xe8\x3f\xe3\x0a\x69\x74\xfb\x1f\xdd\x7a\xbe\x7b\xb4\x7c\x1c\xcb\xb7\x55\x36\x95\x7a\xd1\x43\x9b\x34\x55\xf1\xef\xf3\xe9\xec\x2d\xd5\xe3\x7a\x34\x43\xb5\xd5\xc3\x49\xad\x2d\x90\x7a\x1e\x64\xa0\x3e\x24\x94\xa7\x7e\xd2\x81\xdc\xbb\x07\xf2\x06\x2d\x33\x0f\x8a\x8b\x09\xbd\x46\xcd\x99\xa2\xc1\x3d\xd6\x68\x5d\x05\xaf\x83\x05\x3b\x9e\x67\x47\xe9\xcd\x71\x4e\xda\x65\xcc\x96\x79\x17\xaf\x56\xc9\xa3\xea\xf5\x56\x94\xef\xb4\x4c\x67\x6b\x24\x06\xdf\x4b\x9b\x09\x73\x2a\x94\xdf\xf2\x66\x8e\xbe\xfd\x68\x66\x27\x59\x37\xfd\xfe\x5c\xfd\x6e\xd1\x8a\x19\x3b\x30\x89\xbd\x62\x74\xe6\x5d\x54\x3b\x10\xa6\x41\x22\xf5\x77\x2d\x89\x2e\xcb\x92\x16\x22\x5f\x10\x83\xcf\x9f\x01\x87\x17\x7e\x5a\xb6\xb7\x47\x8b\x56\x26\x96\x11\x3c\x5a\x4d\xd8\x9d\x8a\x29\x4d\xbc\xdb\x4b\xef\xa1\x32\xd5\x06\x34\x67\x55\xb6\xe3\xbf\x2c\xc6\xd9\x31\x2d\x68\x33\x9b\x40\x52\xee\x0e\x86\xf1\x21\xed\xed\x99\x49\xf8\x96\xa3\x6e\xbb\x39\x09\xf1\x35\x33\x0e\x11\x4c\x07\xc7\x16\xb9\x24\x0c\x1c\x25\xe1\x45\x23\xf8\xe8\x03\xbd\x56\xac\xf3\x66\x2e\x67\x05\xe3\x74\x26\x0e\x5e\x38\x56\x71\x9d\xc5\x06\xcd\x86\x29\x97\x83\x3c\x15\x6b\x91\xa2\x9c\x66\x3a\x96\xa8\x60\x92\xcf\x7b\x9d\x28\x0e\x72\x52\x1e\xf9\xba\x55\x7b\xb0\x04\xfe\x50\xdd\xc7\x20\xad\xf9\x9f\x44\x4e\x96\x65\x77\xc4\x5c\xe8\xd6\xe8\x1a\xd5\x40\x61\x36\xd6\xf7\xc6\x67\xa4\x42\xb7\xdd\xd7\xcb\x11\x87\x05\x49\xa8\x22\x2b\x4b\xd3\xb0\xf2\x1a\x2b\xfa\x3e\x38\xda\x2d\x4b\xac\xe6\x00\xbb\xd7\xd5\xef\xf1\xc1\xd1\xc7\x9d\x88\x56\x05\x66\xc7\xa9\xdd\xf6\xca\xc6\x00\x64\xfb\xd0\xe9\xb1\x4d\xce\x0e\x9f\x0c\x3b\x65\x0f\x9f\xe4\xea\x6e\xd9\x28\xd1\x74\x86\x7c\xda\xe7\x64\x28\x18\xe4\x24\x5b\x2e\x37\x3b\x1e\x25\x92\xf5\x3c\x9f\xf1\x7a\x54\xef\x5b\x72\x00\xec\x25\xbb\xd1\xc5\xd8\xc7\x2c\x02\x8f\xe3\x4f\x5f\x86\xd1\x0c\xcb\x74\xf7\x9f\x00\xae\x36\x48\x1d\x02\xe7\x66\xe4\xf2\x11\x8b\x87\xef\xab\x68\x50\x68\x6f\xed\x45\xea\xe1\x6d\xe8\x1e\x57\x13\x66\x13\x5b\x42\xd8\x62\x6b\x43\x6f\x64\x6c\x84\x82\x49\x93\xbc\xb7\x34\x05\xdf\x48\xed\x16\xd8\xe7\xf1\x37\x4f\xb1\x67\x3a\xed\x59\x1c\x7d\xec\xe3\xbe\xd8\xe9\x30\xf6\x28\xa6\xc1\x8d\x3f\xeb\x09\x3d\x17\xba\x0f\x7b\xb4\x42\x35\xf2\x8c\x27\xac\xe5\x3e\xe4\xd1\xb5\x7a\x9e\xed\xf4\xdf\xfe\x78\x37\x35\xbd\xaf\xc0\xa2\x9e\x92\x57\x90\x05\xed\xc0\xc6\xec\x46\x07\xbf\xb5\x4b\x9b\x0e\x8e\x4b\x57\x41\x8e\xc7\x99\x9e\x4d\x30\x94\xb6\x1a\x6d\x10\x3f\x17\xdb\x6d\xf0\x7e\xe7\xed\x57\xdf\x06\xf0\x1e\xc7\xb6\xef\x83\x56\xbe\xf0\x32\x21\xb4\x94\xad\xc8\xbd\xfa\x37\xcf\xda\x74\xf7\x2d\x45\x4e\xa5\x19\xdd\x90\xe7\x53\x21\x95\xa0\x65\x17\xbb\x48\x67\xb0\xcb\x47\x19\x92\xde\xfa\xf7\x80\xc7\xaa\xd5\x92\x7e\xa3\xa2\x4d\x2a\x12\x02\x39\x6f\x58\xd1\xb6\xa9\x5d\x76\xea\x68\x5a\x1e\xd5\xf1\x4d\x75\x58\x40\x11\x52\xad\x0f\x1c\x80\x65\x97\x93\x76\x8f\x30\x8f\x89\x12\xdc\x83\x17\x7d\xa4\xc3\x49\x17\x98\xa5\x60\x78\xad\x5c\xb8\x80\xcc\xbe\xb1\xb1\x66\x4d\xb8\x3a\x5e\x47\x2d\x87\x8e\xd3\x88\xae\xf0\x06\x72\xe9\x21\x37\x07\x03\x10\x34\xe8\x8f\x3c\x17\x23\xce\x86\xf1\x3c\x1e\x44\x51\x89\xcc\x43\x52\xe9\x93\x4b\x8e\x1a\xfd\xac\xdc\x14\xb9\x98\x73\x4e\x89\xbc\x8c\x12\xe3\x58\xd3\xce\x35\xaa\xe9\x08\x0b\xc1\xb4\xbd\xab\x2e\x58\x8d\x2b\x69\xd0\x77\x46\x40\x7e\x57\xcd\x1b\x25\x96\x7e\x37\x18\xe4\x46\xb3\xd5\x35\xb6\x09\xbb\x08\x02\xbe\x2c\xd5\xed\x71\x07\x9e\xf1\x47\x79\x31\xb8\xfa\x0f\xfd\x3a\xa0\xdc\x0e\x62\x2a\xf9\x40\x5e\xf2\x4e\xe4\xb5\x29\x78\x00\xac\xde\xcd\x7e\x9d\xf3\x00\x54\x4b\xc7\xeb\x71\x3f\x83\xd6\x21\xc3\xa1\x7e\xa0\xef\xfe\x7b\x15\xb0\xdd\x2b\x70\xfb\xf4\x4f\x1a\x2b\xbc\x92\x61\xb7\x55\x74\x99\x34\xdb\xa1\x5b\xc4\x22\xa1\x5e\x94\x16\x66\x13\xfc\xb0\x30\x91\x9b\x66\x5b\xd2\x89\x06\x13\x5e\x39\x1b\x76\x52\xd1\x4b\xaa\xe8\xe5\x9d\xe3\x67\xa3\x4f\x19\x67\x6e\xa1\x4d\xd4\xcb\xb1\xbc\x3b\xd8\x09\xe9\x30\xee\x77\x4f\x6e\x89\x98\x23\x10\x60\xc5\x79\x99\xf1\x1d\xf3\xa1\x22\xcc\xed\x8a\xae\xe2\x31\x36\x58\x48\xb4\xed\x42\xb2\xd5\x0b\xc9\xb6\x58\x48\xe6\x2d\x24\xb0\xf7\x00\x36\xd0\x0e\xf3\x02\xed\xb8\xd7\xff\x36\x6f\x83\x45\x67\xeb\x17\xdd\xf6\xa4\x74\x56\x81\x3d\x8c\xc2\x5f\x85\x11\x6c\x7b\x8c\xe0\x3d\x76\x09\x7c\xb5\x5d\x02\xef\xb1\x4b\xe8\xe2\x54\x2c\x26\xc4\x32\x0b\x62\x47\x4a\x3c\x09\xbc\xf5\x44\xa2\x48\xfe\x64\x21\x10\x0f\x18\xe9\xa8\xfa\x02\x6d\xf9\x0a\x23\x9c\x50\x65\x1e\x69\xa9\x57\x7b\x6e\x06\xb4\x22\x5a\xa4\xe1\x99\xfb\xe3\x93\x05\x73\x03\x20\x6e\x0f\x71\x1f\xe5\xb7\x8c\xbf\x2b\x8f\x85\x7f\x76\xb3\x5b\x33\x13\xa3\x91\xbc\xbc\xd4\x8e\xbe\xdf\xe8\x8c\xae\xf6\xd3\x54\x59\xa3\x00\x6d\x8b\x79\x5e\x6a\x27\x90\x3d\x13\xbd\x74\xac\x59\xf1\xe5\xe5\x1a\xcd\xaf\x28\xe1\xb5\x75\xcf\x2b\x61\x3b\xb2\x47\x32\xd3\x94\xa1\x31\x2c\xbc\xd2\x6c\x99\xfb\x29\xf7\xbb\x44\x33\xef\x48\xdb\x86\x37\xbf\x4a\x8b\x18\xe7\x70\x37\xb4\x02\xcf\xf5\xee\xa8\x40\x2e\x4d\x84\x5b\x98\x98\x2d\x39\xa5\xea\x1a\x4a\x53\xf9\x4a\x3a\x83\x9b\x42\x9e\x82\x67\x34\x79\xf5\xea\xd5\xab\xe4\x6f\x7f\xfb\xdb\xdf\x92\x9f\x7f\x1e\x4e\xa7\x4a\xc1\xd7\xc6\x75\x94\x7e\xca\xda\x08\xc3\xfb\x20\xa1\x24\x91\x97\xc9\x89\x72\x56\x56\xc9\x7c\x49\xf2\x77\x82\x68\x7f\x17\x5a\xb5\xd1\x06\x53\x6b\xd1\x4d\x3a\x0d\x6c\x3d\xe4\xd9\x08\x0d\x3e\xc2\x29\x6f\x7d\x96\x87\x56\xa6\x4e\x6f\xec\x8e\x45\xef\x07\x1f\xa5\x10\x2d\x17\x49\xe2\x62\x9f\x84\xba\x6e\x89\xc4\x51\x68\x1a\x16\x0d\xf5\x5e\xda\x89\x76\xbb\xe4\x5a\x4b\x5f\x0a\xf3\x79\xe7\xbe\xd3\x1b\x77\x0f\xfd\x6e\x09\x11\x57\x84\x42\x2e\xaa\xb6\x6f\xb6\x13\x6c\x9f\x2c\xa8\xf8\x19\x39\x25\x6f\x68\x5d\x5f\xc0\x3e\xda\x1d\x02\xd4\x13\xd9\x4c\x55\xf7\x29\x84\xe2\xf6\xbb\xf6\x40\xd6\x2c\xa0\xd1\x95\xb6\x08\x7d\x6b\xd2\x0e\x18\xe2\xf3\xd9\x57\xb5\xe3\x91\x98\xb9\x2a\xbc\xac\xbc\xbf\x34\xc1\x01\xf3\x8d\xa2\xdf\xaa\x2a\xdb\xc6\xbe\x55\xb5\xb6\x89\x7c\xab\x6a\x98\xb8\xb7\x26\xac\xf4\xfa\x1a\x6d\x00\x72\x15\x95\x76\xc6\x17\xd2\xc4\xb1\x3f\x2a\x6d\x0b\x25\x90\xeb\x0f\x37\xac\xed\x8c\x2f\x5e\x78\xd1\x3d\x37\x8b\xb6\x2b\xa3\x25\xbf\x88\x84\xdc\x95\x05\x5e\xc2\x75\x0d\x86\x21\x77\x65\x7b\x2f\x63\x71\x77\x67\x7c\xf1\xdc\x46\x0f\x5d\x1f\x77\x57\x36\xf4\xdc\x0d\xbe\x6b\x5a\x31\xa1\xbc\xfb\x1b\xf2\x96\xc1\xb4\xe5\x55\x03\x99\x13\x9b\x28\x88\x5e\xe0\x1c\x1a\x5e\x30\xd8\x6e\x94\x59\x0f\x2f\x33\x73\x11\xd0\x06\x8d\x75\x56\x29\x08\x1a\xcb\x30\x47\xda\xe8\xd9\xf0\xff\xd9\x70\x75\x37\x6e\x1c\xdf\x6e\x57\xb1\x75\x0c\xfa\xf4\x8b\x6c\xde\xb1\x13\xc0\xb7\xa7\xdf\x97\xab\xe2\xf7\x7a\x25\x36\xef\xb5\x8d\xdc\xab\x4c\x24\xfd\xb0\xbd\x7e\x99\x9e\x61\x3d\xef\x8d\xd9\xdb\x66\x6f\x3e\xa0\x76\xc7\xf6\xf5\xe7\x63\x58\xac\xcb\x36\x0a\x7d\xdb\x6b\x6a\xe8\x38\xaa\x0b\x58\xd7\xf4\xe6\x84\x50\xb2\x98\xd2\x39\x3b\x91\x26\x4d\x8e\xf7\x86\x58\x36\xc8\x8a\x59\x43\x67\x29\x18\x4d\xd0\xe8\x4a\xba\xe2\xb8\xa6\xb8\x72\x38\x39\xa6\xa2\xec\x77\x39\x77\x8f\x17\xf0\x70\x35\x0c\xfb\x1b\xc7\xae\x68\xa9\x10\x17\xa2\x85\x9e\x47\xc3\x08\xbb\x25\x42\x58\x1e\x65\xcb\x6c\x93\x63\xcc\xb9\xbd\xfd\xaa\x67\x18\x1e\x51\x32\x04\x52\xd9\x88\x6b\x2c\xa8\xce\xb8\x5e\xcc\xf8\x44\x86\xf5\xe9\xe7\x79\x8d\xf3\xfe\x2d\x2e\xb9\x45\x4f\x46\x09\xef\x76\xe8\xa8\x17\x55\xd7\x20\x07\xea\x8e\xfa\x53\x83\xaa\x4f\x68\x81\x40\xe6\x38\x84\x07\x15\x6e\xd0\x88\x47\xab\xa9\x2c\x25\x4d\x6c\x00\x73\x89\xca\x07\x98\xcc\xe6\x5f\xd2\xfe\xf7\x2d\xba\xe5\x2f\x30\xaa\x2b\x37\xdc\xd5\x43\xad\x18\xfe\x25\x75\xb5\x96\x1b\xcd\x93\xa3\x5b\x0e\x1b\xf4\x25\xe3\xb2\x88\xa9\x9e\x34\x08\xfe\x8e\x33\xad\x2b\xd4\x1c\x1a\x77\xb2\x07\x72\x4b\xfe\x93\x86\xbf\x9d\x33\xd4\xac\x16\xd0\xe7\xf2\xd6\x71\xfb\x50\x36\x6b\x2c\xd0\x56\x06\x14\x0f\x02\xd8\x28\x51\x42\x99\x72\x55\x0d\x9d\x55\xf4\x46\x2b\x09\xee\x29\x75\x8b\x39\x3d\x96\xc4\x1d\xb7\xe3\xd1\x7e\x82\xbf\x4c\xfc\xcd\x87\x38\xee\x3f\xa9\xeb\x8d\x1d\xf6\xfb\xae\xeb\x17\xfa\xf2\xbf\xbf\xed\xf3\xf9\x74\x0a\x9b\x45\xda\x7d\x84\x15\x55\x3a\xf7\xb9\xdc\x27\xda\x96\xe2\x7f\x26\xa8\x41\x29\xcf\xef\x1c\xc7\xd2\x9e\xa7\xc5\xc5\x0c\x0d\xad\x74\xcb\xc0\x32\xcb\x59\xd7\x14\x82\x64\xc7\xa4\x18\xd1\x39\xe1\xc3\x41\x4e\xb7\x6a\x5a\xa2\x89\x68\x16\x77\x9b\xa5\xd9\x31\x35\xcd\xee\x04\x91\xcc\x99\x71\xbf\x82\xb4\x27\x79\x06\x72\xac\x9c\x46\x3b\xee\xe5\x7d\xd0\xcd\xe0\x08\xbd\x13\x45\x37\x80\x9e\x85\xd3\x9d\x8c\xa5\x1e\x3c\x7a\xd3\xf1\xd5\xf3\x55\x6f\xe2\x44\xff\x6a\x3f\x59\xc6\x79\x08\x9e\x5f\xa3\x66\x41\x09\x02\x56\x1a\x1c\x02\xb0\xcc\x59\x69\xef\x58\x55\x48\x7e\x42\x9b\x29\xac\xf1\x6f\x86\x38\xe4\x24\xdb\xf1\x23\x04\xf8\xe5\xb5\x5b\xf1\x2c\x47\x25\x2a\x18\x6d\xf8\x4f\x0b\x47\xd6\x02\x39\x70\x44\x4a\xee\x01\x0d\x65\xd6\x57\x8d\xff\x66\x35\xee\xc4\xd5\x12\x1f\xcf\x10\x8a\x5b\xcd\x6d\x04\x37\xf6\xf6\x48\xe8\xfc\x12\x65\x39\xf1\xb4\x1f\x27\x55\xd5\x6b\x43\x11\x77\xf5\x1d\xf8\xf4\x3e\xb5\x03\xdb\x31\x77\xd9\x24\xbc\x2c\xb4\xa7\x89\x16\x04\x7a\x9f\xdf\xd9\xc8\x29\xde\x1d\xa1\xed\x42\xea\x96\xb5\xa3\x76\xd3\xe6\x90\x38\xc8\x10\xdb\xfb\xcb\x95\x54\x03\x56\x55\xca\x62\xe6\x20\xd6\x19\x7a\xe0\x51\x2c\x36\x9f\xf8\xeb\x50\x7b\xe8\x7a\x57\x05\x6b\x62\xe0\xf6\xad\x72\x78\x95\x70\xd6\xbe\xf9\x73\x5c\xe8\xb6\xc1\xa0\xc1\x37\x76\x90\xfa\xd9\xaf\x8e\x76\xe3\xc4\x88\xde\xc8\x16\xdf\x7f\x8b\x17\x6d\x73\xb5\x4b\x7b\x55\xb4\xf3\x54\xf9\x2c\xb2\xf7\x3d\x27\xf4\x1d\x6f\xb1\x8e\x42\x4e\x64\xa4\x3c\xb7\xfe\x8d\x62\xfe\x01\x45\x99\x30\x46\x5f\xa4\x89\xa3\x88\x47\xf2\xae\x4b\xc5\x30\xd2\x21\x8f\x85\x28\xf7\x06\xb6\x63\x8c\x5d\x48\xb8\xb4\x99\xa7\x5b\x10\x38\x25\xf6\x67\x8b\x54\x60\x9f\x38\x0b\xbb\x06\xb9\xf2\xdd\xa3\x9d\x6e\xf7\x47\xae\xfc\xb9\xb2\xf5\x15\x2f\x61\x57\xac\xa9\x10\x2c\x53\xb2\x6a\xdb\xac\x00\xe4\x84\xde\x28\x01\xf6\x35\x1e\x5d\xb9\xc6\xae\x11\x13\xae\x4e\x1c\x05\x2d\xfa\x4a\x08\x87\xd4\x48\x11\xd6\x68\xb0\x8a\xbe\x1d\xd5\x7f\xde\x3b\x0e\x3a\x52\xe6\x42\x2c\xa2\x5e\xee\x3f\xec\x83\xb7\xef\x05\x66\x27\x64\x91\x82\x9b\x09\x15\x1b\x58\x9e\x2d\xc1\x43\x5e\xa6\xc2\x51\x7b\xcc\xc9\x3b\x75\x62\x90\x36\x43\x19\xe0\xb5\x84\x91\xe9\x1d\xf3\x97\x06\x12\xae\x60\xb4\xd1\x6d\x61\x07\xac\x91\xab\xc2\x4b\x63\x38\x41\xba\x26\x80\xa7\x4e\x78\xc7\xf2\xfd\xc7\x08\x50\xd5\xd8\x7b\x03\x85\xf4\xc2\x8e\x96\xfe\x3b\xfe\x7b\xb3\x03\x0e\x17\xe4\x60\xbe\xe1\x12\xe8\x72\x87\xa9\x43\x1c\x5b\xac\xed\x43\x7a\xc4\xff\x1b\xa3\x1b\xc1\xc6\xb8\x43\x73\x1b\x8d\x9c\x24\x0e\x45\xdb\x58\xfa\xf2\x02\x19\x7c\x5d\x65\xc6\xb6\x32\x87\x36\x7d\x57\x51\x9e\xba\xd7\x32\x6f\x63\x91\x9b\x62\xb6\xeb\x6f\xfb\x02\x37\xa1\xdc\xbf\x70\x73\xc2\x64\xba\x6c\x19\xf8\x06\xec\xa3\x58\xf0\x26\xcf\x7e\xd4\x20\x61\x34\xd8\x86\xc2\x9c\xb6\x84\xf1\x14\xb5\xe5\xa2\xb1\x83\x1a\xb3\xaf\xfb\x1c\xba\xbd\xf7\x6f\xdf\x09\xa9\xd0\xec\xd7\x6e\x8a\xde\x77\xe6\xc2\xd3\x8f\xab\xda\x06\x0f\x9b\x49\x23\x26\xc7\x19\xb7\x68\x4a\xf0\x89\x9b\xbc\x76\x3e\xa9\x2a\xe7\xb5\xd1\x66\xbe\x92\x54\x51\xfb\x84\x67\xdd\xc3\x21\xd1\x85\x79\xb6\xfc\x92\x8e\xae\xe8\x7c\xb3\x87\xd8\x8f\x32\xb4\xdd\xcd\xc6\x36\x81\xcc\x80\xf9\x44\x23\xdf\xaa\x21\xde\xf9\xde\x7b\x72\xd7\x41\xcf\x72\xfb\x40\xa5\xc6\x07\x50\x5f\x08\x57\xdf\xff\xcf\x03\xc3\x3b\x76\x1e\xbf\xc8\x00\xb1\xf2\x89\xca\xa7\x42\x45\xbf\x4a\x83\x4c\x71\x48\xcb\x17\xa3\xde\x93\x80\x76\xe7\x0a\x96\xe4\xd7\x99\x52\x43\xba\xd1\xd7\x5c\xa3\x99\x10\x99\xdb\x82\xef\x3f\x86\x71\x32\xda\xed\x61\x51\x3f\x6a\x8f\x18\xee\xa3\xc0\x08\x27\x5a\xbb\x33\xfb\xce\xc0\xdc\x99\xad\x19\x76\xd4\x2a\xc8\x35\xe3\xe9\x35\xd3\x71\x43\x56\x9b\xf0\x4d\xe7\x86\x04\xac\x9f\x75\x4b\x29\xec\x9c\x7b\x6b\x6e\x30\xe3\x1c\x99\x40\xa9\x9d\x85\x5f\x15\xeb\xce\x72\x06\xea\x01\x9c\x6b\x27\xb6\xcc\xd4\x6b\x09\xa4\xb9\xe7\xdd\xa3\x9d\x15\x33\x38\xda\x02\x55\x62\x30\x75\xe7\xae\x2d\xa6\x25\x4c\x55\x53\x26\x67\x9d\x2b\x17\x03\x8d\x80\xf3\x0c\x62\x13\x74\xd1\xa5\xc3\x13\x9a\x18\xf7\x2d\x7c\xac\xeb\xa0\x36\xe9\x98\xf8\x81\x0c\x87\xa4\x6c\xe3\x45\x91\xc0\xe4\xcc\x27\xf6\x20\x27\xf6\x88\x3e\x76\x46\x3e\x74\x2d\x98\x36\x02\x28\xd9\xe8\xaa\x46\x9f\x98\x2d\x49\xda\x44\xcd\xfc\x3b\x58\x79\xa9\x71\xae\xd6\x0a\x5b\xee\x78\x63\x6d\xf3\x43\x94\xc7\x2b\x08\x75\x54\x4d\xba\x52\x17\xb7\x9d\xa6\xd4\xaa\xad\xb4\xdc\xf5\xfe\x63\x8f\x6f\x22\xad\xa0\x79\xa0\xfa\xce\x65\xb1\x2f\xe7\x75\xad\x7c\x0b\xe8\xe2\xfa\x5b\x70\xdc\x62\x3e\x82\x2d\x97\x1c\x4e\x1b\x9a\xdc\x7e\xca\x68\xe6\xda\xb5\xa4\x39\xa2\xdd\x4f\xe3\x91\xd2\x3f\x3b\xdd\x14\xc7\x37\xa5\x75\x90\xe8\x7e\x1b\xcf\x88\x5e\x27\x2a\x8a\xc7\x70\xf7\x68\x99\xd3\x15\x3a\x46\x39\xc4\x83\x76\x23\x08\x49\x6e\x87\xac\xd3\x37\xd2\xcc\xc4\x57\x7d\x38\x9c\xc1\x00\xb4\xf0\x05\x49\xab\x27\xfd\xff\x2a\x64\x73\x0f\x56\xbd\x3a\x81\x8d\x34\xd9\x31\xfb\xc0\x3c\x12\x7c\x57\xad\x05\x70\x35\xe8\x52\x3f\xd6\xeb\x76\xd7\x5e\x9b\x6b\x92\x87\x11\x4b\x99\x0c\x00\x68\xd5\xcc\xde\xfb\x7f\xd2\xea\xa6\xed\xde\xd1\xfa\xe7\x31\x32\x0a\xde\x33\x72\x8d\xb9\x7c\xd9\xf0\x0a\x31\x16\xf8\xc5\x52\xa7\x24\xf8\x19\x2d\x12\x3e\x41\x0d\xca\x93\xb3\x04\x4e\x13\x36\x81\x0d\x26\x63\x91\x96\xb8\x4e\xa8\x34\x5c\x54\x4f\xfb\x20\x91\xcb\x91\xa4\x98\x78\xa5\x8c\x5f\x1c\x6d\x48\xb3\x0f\xb2\x44\x9c\x58\xc9\x82\xce\x13\x46\x93\x1b\x94\x8c\x20\x49\x2e\x28\x9f\x24\x23\x5a\xd7\xf0\x82\x36\x90\xa3\x84\x92\xa4\xe5\xcd\x81\xc3\xeb\x31\x6f\x8d\xd6\x3a\x2d\xec\x9b\x77\x1a\xf8\x4f\xf6\x22\x0b\xb1\x98\x6a\x84\x96\x77\x06\x66\x28\x77\x87\x40\x96\x39\x8e\xb8\x5d\xb6\x2f\x65\xcd\x03\x22\x6f\xdd\xf7\xf6\x2c\x72\x9a\x4d\x18\xf1\xc8\x2a\x65\x8d\x4e\xaa\x75\xc7\xea\x27\x3b\x22\x81\x9f\x61\x3d\xb5\xfa\xc9\x9b\x78\x81\x0d\x86\x63\x02\x17\x09\x1c\x84\xe5\x60\x27\xa2\x17\xe3\xd9\x1d\x18\x38\xcf\xdd\xfe\x97\x4c\xd8\x04\x3d\x5e\x66\xdd\x00\x00\x38\x3b\x66\xc5\x14\x36\x57\x27\x4c\xbe\x20\x1c\xa5\xd9\x10\x3e\x3d\xb2\x89\x6f\x10\xe3\x0d\x16\xec\x54\x9a\x0d\x6d\xc9\x06\x5f\xcb\x27\x1f\x79\x88\x6b\xbe\x0e\xb6\x47\x49\x99\x77\x1e\x2d\x88\x53\xdc\xd3\xe4\x87\xe4\xd1\xda\x8b\x6e\xc1\xbf\xa9\x36\x22\x9e\xb1\xbf\xb8\xc2\x63\x2b\xc6\x4c\x0e\xd3\x38\x71\x99\x40\xf6\x4b\x9f\x59\xa3\x36\xd3\xb4\xe5\x83\x00\x98\x57\x68\xe1\x86\x4a\xe0\xd9\x9d\x0e\xa8\x7f\x85\x16\xa7\xb4\x42\x41\x48\x48\x75\xf7\x00\x5c\x51\x94\xd3\xf1\xb8\x46\xfd\x41\xea\xda\x9e\xf3\x40\x70\xd2\x84\xb4\x37\x06\x5e\xbe\x4d\x50\x95\xf6\x6a\x40\xc1\xc8\x5c\x63\x29\xbe\xde\x5c\xbe\x9c\x07\xc6\x91\xed\x88\x5c\x18\xb6\xe1\xfa\x58\x30\xd8\x70\x0a\xbf\xb8\x33\xe8\xc5\xe8\x50\x62\x5c\x11\xd1\xd1\x89\xfb\xb7\x71\xcc\xbf\x9d\x8d\xd1\x5a\xc6\x4a\x5a\x29\x90\xc0\x39\x9f\x7c\x5d\x79\x64\x8d\x3b\xf6\x6d\xdf\xa4\x6c\xb5\x8b\x6a\x3a\x82\xf5\x39\xa7\x8d\x38\xe3\xe2\x65\xdd\x22\xca\x6a\xf7\xd4\x46\xfe\x0e\xf7\xda\xd8\x8b\x0b\x6e\x14\x6c\xf9\xa0\xd5\xd7\xbf\xc4\xe4\x4a\xed\x5a\xc5\x77\x6a\x8e\xf4\x1c\x71\x8e\xc9\x78\x8d\xd7\xf4\x4d\x35\x66\x2d\x23\xdb\xaf\x2d\x73\x78\xdf\x87\xf8\x2e\x57\x9a\x65\x29\x35\x3f\x96\x79\x8e\x34\xd8\x4f\x95\x57\x9f\x77\xb3\x0a\xf2\x87\xb4\x14\x95\xeb\xdf\x7f\x74\x0b\xb8\x53\x90\x79\xd2\x7a\x61\xde\x13\x3f\x26\x8f\xdc\x6c\x63\x14\x06\x67\xb4\xf7\x2c\xca\xbe\x46\x32\x58\x00\xc4\x44\x4b\xab\x64\x71\xcd\x5c\x48\x7e\x17\x9a\xca\xf4\xc5\x6a\x17\x5c\x5a\xe7\x78\x46\xd9\x31\xb2\xa6\x2e\xad\x97\xf1\x53\x91\x02\x72\x9a\xe5\xf4\xe9\x60\x6f\x4f\xaa\x9e\x98\xe4\xbc\x03\xa5\x54\x0b\x1c\x67\x86\x7e\x8c\xf0\x10\xa1\x81\xf3\xb8\xe6\x18\x4c\x15\x62\x0d\x01\xac\x5a\x27\xc5\x9b\xd1\x71\xd7\x71\x80\xe9\xc4\x78\x62\x3f\x6e\x1f\xe6\x98\xe5\xd4\x59\xb9\x63\xf3\xd4\x53\x39\xb3\xcf\x2a\x29\xe5\xcf\x0c\x34\xb2\xa7\x83\x55\xad\x2a\x72\x9d\x47\xe4\xa2\xa1\x1c\x28\x73\x1f\x0b\xad\x18\x13\x0b\x1f\xe8\xb8\xca\xb8\x55\x4e\x2e\xde\x7f\xcc\xa9\xbc\x83\xec\x11\xba\xd8\x7b\xf4\xd1\xdc\xc6\xaf\x7c\x09\xa6\xbc\x36\xaa\x95\x78\x73\xfe\xdf\xaf\x0b\x28\xbd\xe3\x74\x58\x2a\x16\xeb\x88\x09\x56\xab\x73\x47\x6c\x7c\x2e\x6a\x79\x5c\x5b\x9b\x85\x6a\xbe\xa3\x2c\xa7\xef\xd9\x8a\x41\xaa\x13\x52\x59\x5b\x05\xe3\x8b\xb0\x7c\xc4\x7a\x6a\x78\xa3\x1e\x62\xa6\x5a\xe4\x0b\x95\xc6\xab\xed\x1a\xf4\xcd\xee\xbd\xa0\x5a\x79\xfd\x6c\x0a\x58\x45\x43\x50\x47\x91\x1a\x1d\x84\x05\xae\x07\xc8\xf6\x12\xdd\x21\x0c\x3c\xdb\x41\x46\xc5\xfb\x26\xf4\xf4\xe2\xa3\xe4\x1a\x73\x2c\x67\x50\x31\x73\x03\x45\xe6\x68\x84\xcc\xbd\x42\x62\xf6\x4c\x5e\x69\xbf\xff\x98\x43\x01\x5a\x63\x0a\xae\x2d\xbb\xed\x56\x18\xc2\xf2\x53\x31\xab\xe7\xa3\xab\xf4\x53\x71\x23\xc9\x1d\xf5\xad\xfa\x96\x59\xee\xb9\x96\xce\xe3\x32\xd7\x27\xe9\xbb\x0e\x62\xc2\x52\xe8\xbd\xbe\xde\xdb\xc3\xbe\xd2\x38\x46\xd1\x0c\x59\xf0\xa9\x9a\x3e\x8c\x5d\xdc\x6d\x33\xe7\xc4\x00\xe2\x37\x54\x79\x85\x5c\x3b\x74\xaf\x94\x3b\x5b\xfa\xb0\x59\x7d\xfe\xbc\xcd\xac\x7c\x87\x13\x7d\x23\x1f\xac\x9e\xbb\x3b\x2d\x45\x08\xb7\x9e\xce\xfd\xc7\x1c\x0e\x67\xb0\xd9\x52\x2c\x63\xf4\x2b\xb2\x9b\x1c\xd0\xca\x0b\x98\xde\x53\x8f\xf5\xf3\x0a\x78\x33\xb1\xb2\x19\x53\x7e\x60\x9f\xdb\x7c\x4d\x89\x52\x3e\x28\x92\x8e\x37\xe1\xe2\xed\x04\x6a\x47\xc4\x6b\x1f\x01\x9a\xe7\x7f\xf7\x79\xe7\x26\x3f\xce\x54\x3d\xf7\x55\x9a\x02\xc3\x06\x3c\x95\xee\x7c\x07\x5f\xa6\xfe\x03\x26\x14\xd8\x98\xb5\xaf\x95\xbc\x3e\x83\x77\x4a\xc8\x7f\x15\xb5\xe3\x0a\x6a\x62\x44\x71\x27\x00\xde\x03\x1e\x0b\x3c\xb7\x6d\x9d\xa7\x9a\x77\xc2\x35\xb8\xe9\xed\x90\x8e\x36\x53\x41\x50\x72\x41\x61\x53\x1d\xb2\x09\x6c\xd0\x81\x96\x52\xfe\xb8\x2a\x08\xd4\x60\x28\xd1\xcb\x6a\xe4\x05\xaa\xd5\xf3\xb1\xf8\x3b\x53\xae\xae\x31\x51\x0e\x5e\xd7\x78\x2b\x75\x9e\x12\x72\x38\x46\x07\x47\x07\x97\xdd\x97\x7d\xf9\x8a\x52\x79\x62\xd3\x5a\xe3\xe4\xe2\x0a\x2d\xe6\xb3\xee\xc2\xf6\xf5\x73\x0d\xeb\xd4\xf3\xc3\x14\x69\x52\x96\x39\x6e\x1d\x70\x8a\xe4\x03\xe3\xcc\x4a\xf2\x26\x29\x60\xcd\x08\xe4\xe0\x10\x32\x86\x38\x3b\xc4\xd3\xb1\x5d\xd9\x19\x6a\x18\x25\x07\xe3\x06\x21\x52\xcc\xc8\x18\x98\x67\x7a\xf7\x6e\xaa\x41\x95\x6a\x68\x19\x83\x0f\x41\xb7\x7c\x13\xbf\x98\x56\xa2\xdc\x00\x40\xad\x87\xc8\x78\xa1\xf5\xc1\x4a\x56\x00\x36\xd2\xb6\x53\x66\x55\x88\x13\x75\x3f\x60\xb1\x4e\x9d\xde\xf2\xed\xa0\xe7\x2d\x55\x34\x29\x50\x0a\x56\xe8\xd7\xb9\x38\x12\x6a\x7a\xd3\x75\xa0\xee\xb5\x24\xb5\x41\x91\xf6\x5d\x42\xa3\x9b\x7e\xa2\x9b\x3e\x23\x11\x74\x7d\xd2\x9e\x02\xfd\x38\xdd\x16\x3a\x90\x7e\x5e\x9a\xe9\x26\x78\xec\x35\x2d\x21\xa9\xa5\xb1\x3f\xff\xdb\xe7\xcf\x1b\x17\x7e\xfa\xc3\xe0\xf3\xe7\xce\x0a\x74\x8b\x6f\x36\x68\x59\x54\xbe\x73\xcc\xb2\xe1\xea\x75\xed\xdf\xe0\x4e\xa1\xb8\xcd\x70\xb8\xc4\x0f\xdb\x44\xf1\x91\x6e\x49\x8b\xbe\xd6\x58\x23\x3b\xfe\xc9\xd6\x3b\x7e\x77\xfd\x72\x6f\x81\x41\xdb\xa2\x5b\x77\xbf\x47\x37\x89\x0f\xb7\x58\xc9\x38\xc0\x23\xab\xe9\xd5\xda\x9c\x54\xf5\x63\xf8\xb1\x18\xdc\x8a\x6e\xc2\xf2\x65\x59\xae\x87\xd0\x2a\xb8\x38\x0d\x6e\x4d\x0f\xfb\xe8\x55\x9c\x14\xaa\xf0\xc8\x1d\x72\x68\xd9\xe9\x75\xd4\xf0\x3b\x87\x1a\x6a\x0b\xec\x6f\xef\x12\xeb\xcf\x00\x0c\x13\xf0\xed\xfe\x7a\x60\xec\x7f\x0b\xf2\x04\x28\x76\x43\xd5\x91\xec\x08\x86\xb5\xca\x69\x37\x5e\xb4\xc1\xc8\x11\xa6\xea\x59\xda\xd2\x53\x2d\x3c\x9c\xf6\xbf\x05\xc9\xf2\xdb\x9c\x6c\xb0\x7e\x3b\x3d\xf7\xed\x7a\x2f\xa7\x42\xe6\x57\x3c\x53\xd7\xb9\x4b\x6b\x6d\x62\x5a\x1d\x12\xc5\xb4\x0f\x91\xf2\x11\x60\x23\x8d\x69\x0f\xe1\x02\xff\x1d\x1f\xe1\x29\x70\xbe\x68\x33\x34\xac\x26\x88\x99\x72\xdf\x60\x52\xd1\x9b\xa2\xd6\xbe\x0a\x8b\x49\x83\x2e\x4b\xc0\x0e\xc1\x7e\x3b\xc6\x7d\x20\x3f\x05\x6b\x27\x7d\xdf\xac\xab\x7d\x08\x64\x44\x11\x97\xb7\x99\x62\x36\x85\x7c\x34\x01\x59\xc1\x26\xf4\x26\x5d\xbd\x35\x1d\x14\xdf\x90\x04\x38\x35\x7a\x48\x81\x64\xc1\xd7\x71\xe0\xb6\xb9\x06\x31\xf4\x75\xed\x9d\xed\x62\x0b\xe6\x59\xff\x3e\x55\x93\x12\x49\xd3\x39\xe3\xaf\x04\x04\x05\x3b\xbd\x89\x63\x16\xc7\x25\x8b\x86\xcd\x26\xa5\x4f\x0d\x18\x55\x54\x89\x6d\x5d\x93\x98\xef\x56\x02\x9c\x40\xa6\xdb\xec\x6f\xc5\x1d\x9f\xd3\x88\xae\x17\x91\x26\xe5\xea\x6c\x14\xbe\xd1\xc2\x80\x44\x92\xed\x64\xe3\x9e\x51\x50\xc4\x33\x46\x38\xc1\x40\xdc\x24\xe8\x26\xe6\x14\xc3\x6f\x97\xac\x68\x37\x98\x73\xd0\x7c\x67\xe0\x91\x2e\xfe\x31\x87\x75\x8a\x72\xa2\x0e\x26\xcf\xa7\x9a\x40\xe9\xf5\xf2\x6e\x77\x8a\xa1\x4b\x8b\xde\xc1\x0a\x39\x77\xd8\x99\x5b\x88\x49\x1d\x39\xda\x94\x72\x11\x45\x15\x72\x76\x7d\x5b\xd2\x6e\x05\x59\x66\x13\xc1\x5a\x85\x64\xd5\x7f\xc4\xde\x56\x81\x02\xbf\xe2\xee\x56\x7d\xbe\x9e\x34\x90\xc9\x2b\xfb\x7b\x7b\x9f\xdb\x28\x44\x70\xd7\x19\x97\x0e\xf3\x97\xa3\xf2\xfd\xc7\x9c\x94\xe0\x17\xca\x27\x98\x8c\x93\x4b\x3a\x27\x95\xb2\x6a\x76\x62\x98\xa3\xf2\x53\x31\x27\xf8\x1f\x29\x8f\xfb\xc1\x6f\x35\x7f\xd6\x64\xef\x48\x5a\x0d\xa8\x26\x8e\x41\x83\x2e\x51\x23\xfd\xcf\x0f\xdb\xdf\x0c\xe4\x54\x96\x43\xb6\x9c\xbd\xb8\x75\xef\xba\x76\x88\x6d\x49\x3a\x83\x63\xfb\x20\x81\xa3\x86\x32\x96\x80\x7d\xe4\xe6\x50\xe7\x65\x8c\x0b\x61\xf9\xac\xac\xcd\x72\xb4\xe5\x68\x83\x43\x40\x3b\x34\x3d\x84\xb8\xe1\xf0\xa2\x46\x87\x7c\x31\x43\x07\xa8\xc2\x9c\x7e\x5d\x75\x4c\x05\x39\x5c\xe3\x71\xc5\x99\x24\xe4\xd0\xb5\x4f\x98\x22\x0e\x0b\xeb\x42\xd4\xbd\x7d\xc2\xec\x19\x6e\xf8\xa2\x6b\x08\x97\xf4\xd5\xf6\xe3\x38\x8a\x8e\x56\xd9\x29\xe8\xcb\x08\x63\x2b\xa2\x5e\x48\xaa\x17\x23\x2b\xad\xcb\x6d\xb0\x5d\x7f\x18\xad\xf1\xb8\xf6\xfb\xca\xb3\x5c\xbf\x01\x37\x03\xcc\xc3\xd1\xf9\x4e\xe7\x54\xdf\x82\xf4\xc9\xb8\x07\xf7\x44\x00\xf5\xee\xf3\x2b\x6b\xe4\x36\x1e\xeb\x05\x64\x06\x47\x0f\x30\xa9\x31\x41\x7f\x7c\x07\x27\xad\x15\x48\xeb\xea\xe4\xee\x62\xce\xa4\xbd\x6c\x10\xef\x48\x3e\x8c\xc2\x44\x3b\xa4\xdd\x3d\xda\xc4\xe8\x49\x7a\x42\x36\x7e\xf6\x26\x90\x3d\x43\x6c\xb4\xb6\x3c\x32\xc1\x94\x73\xe5\x9e\xb0\x6b\x93\x21\xed\x36\xba\x56\xa4\x32\xb6\x83\x5e\x81\x30\x74\x29\xc8\x0a\x5c\x2d\xb3\x7c\xd6\xc8\xa0\x01\x6f\xd1\x2d\x1f\x82\xd7\xea\x03\x3c\x3c\x96\x93\x16\xae\x7a\x23\x33\xd9\x60\x40\xdd\xd1\xe9\xeb\x26\x6d\x9b\xeb\x6f\xbe\x20\xe0\xcf\xbc\xae\xa5\x03\x86\x94\x04\x61\x9c\x90\xa8\xb8\x69\x18\x27\x43\x16\x64\xec\x26\x53\xed\x3d\x18\xf1\xa6\xde\x17\x88\x3a\xa2\xd3\x29\x24\xd5\xbe\xb7\xb9\x22\xed\x98\x4d\xad\xda\x71\xdf\x59\x99\x51\x8b\x43\xa0\xe5\x9d\xc2\x25\x51\x6f\xf5\x15\xff\x14\xd1\xac\x71\x19\xfd\xa6\xb5\x1e\xeb\x7b\xfb\xfd\x45\xfc\xc5\x6c\x15\x7b\x29\x0d\x82\x2f\xe5\xf6\x3b\x0e\xd5\xe0\x21\x59\x48\x98\x95\xd8\xef\x98\xac\x89\x0d\x09\xb2\xcf\x9f\xad\x07\x70\x1f\x8e\xd6\x61\xa0\x6b\x6a\x84\x99\x86\x09\xaa\x40\x3c\x43\x69\x12\xfc\x13\xc3\xd2\xe9\x9e\x1e\x96\xf1\x43\x27\x04\x96\x3e\xdf\xd4\x25\x92\x00\x93\x38\xbe\xd2\x6c\x6f\x8f\xa7\x99\x0a\x75\xef\xba\x94\xa8\x30\x1b\xc1\xa6\x5a\x15\x73\xd8\xf1\x2f\xd1\x0d\x75\xef\x1c\x73\xf2\xc6\x5d\x35\xd7\x41\x02\xdf\xb3\xe9\xfa\x3e\x83\xe0\xcf\xde\x59\xaa\x09\xc7\x2a\x18\x38\x84\x26\x70\x84\xcd\xc2\xec\xdc\x12\x22\xc1\xc2\x1d\x83\xe7\x15\xe6\x89\x34\x31\x6c\x49\x94\x1f\x67\xc7\xa6\xb6\xce\x0f\x5a\xd2\xdc\xfb\x1c\xcf\x16\xb1\xaf\xf1\x94\x13\x30\x91\x3e\x8c\xb1\x99\xbd\xb5\x8f\x62\x61\x7f\x5e\xca\xb8\x54\x9b\xbd\x6e\x8e\x1c\x9a\x7f\xb8\x77\x5a\x23\xb9\xe4\x2f\xe1\x05\xaa\x87\x40\x22\x0e\xd0\xdb\x56\xa7\x9d\xc3\x6b\x04\x72\x73\x5c\x7e\xf9\xe3\x70\xdd\x29\x65\xcf\x83\xfb\x9d\x04\x41\xf5\x07\x9f\x08\xae\xd4\x3c\x46\x07\x7a\xde\x1b\xa9\x7c\xd5\x49\x6e\x26\xbe\x79\x15\xee\xb9\x40\xdd\xe4\x50\xe9\xed\x73\xe3\x26\x3c\x5a\xfe\x45\x69\x23\xf8\xb2\x64\x10\xac\xa2\x78\xf1\x43\x2a\x3c\xa3\x32\x37\x4e\x45\xcf\x19\x92\xf5\xac\xd9\x6a\x8f\x34\x3b\x26\xae\x91\x67\x30\xfe\xdc\x2c\x97\x74\x27\x1e\xed\xd6\xae\x68\xa7\xe3\x76\xad\x37\xe8\x7a\xcb\x63\x72\x4b\x0a\xf8\xc7\x96\x6c\x46\xb4\xea\x15\xc1\xfb\xe5\x9a\xaf\x4a\xab\x8d\x44\x2d\x55\xb3\x63\xd4\x86\x75\xa9\xd0\xf9\x82\x70\x78\xab\x64\x18\xf1\xfd\x5c\xce\x41\x7d\xab\xf9\x6c\x21\x62\x88\x06\xd6\x89\x18\x4c\x76\x78\xcf\x46\x55\xe5\xde\xb6\xef\xa9\xb5\x52\xad\x6a\xe7\x07\xe5\xfb\x8f\x3b\x3d\xea\x5a\x5f\xe9\x50\x34\x48\xc6\x38\x4a\xc1\x9f\x0f\x67\x0d\x7a\xaa\xcc\x6c\x48\x99\xa2\x12\xd9\xbc\x6f\xff\x3c\x6b\x50\x32\x12\xdb\xa7\x54\x33\x99\x62\x71\xa4\x25\xa3\xe9\x01\x3b\x60\xb4\x86\xd2\x46\x4c\x7d\x56\xb0\xb9\x02\x89\x0c\x1e\x5a\x43\x32\x2e\xc1\xb7\xa2\xc9\xac\xc0\xa4\x42\xb7\xbf\x5e\xa6\xdf\x82\xa7\xdf\x66\x39\x2b\xef\xa6\xb4\x42\x43\x30\xe1\xd3\x7a\x8a\x6f\x51\x65\xe2\x5d\xff\xfc\xf6\xd5\x4b\xb0\xfc\x51\xc6\x78\x24\xd2\x70\x1a\x15\x6c\x7e\xc1\x78\x83\xc9\x38\x1d\x48\x5f\x46\x5e\x12\xd9\x7f\xe2\x3d\xf5\x30\xc8\x61\x5f\x1c\x4b\xdb\x5e\xed\x14\xe6\x93\x79\xce\x78\x4a\x2b\xf4\x4a\xce\x42\xfa\x51\x3e\x23\x97\x34\x07\xfa\x69\x70\xc4\xa5\xa0\x1c\x2c\x92\x45\x75\xb0\x72\x79\xb1\xbc\xdc\xa1\xae\xf1\x9d\xf4\xb3\x24\xca\x94\xd6\x6a\x59\x4a\x7f\x06\x43\x4d\xdc\x84\x96\xe9\x72\x17\x4d\x5a\x8d\xdb\x90\x09\x8e\xf0\x68\xab\x67\x99\x7d\x2a\x14\xb4\x4b\xed\x8b\xd0\xa9\x7c\xb7\xe2\xc0\x35\x5b\x13\xbc\x57\xe1\x89\x03\x8f\xcb\x86\x4e\x8d\x3b\xd9\xb4\x4f\xdc\x75\x8c\xc9\xf4\x06\x13\x92\xed\x1d\x9f\x20\xb1\x88\x53\xc8\xd5\x4d\x62\x5e\x63\x82\x7e\x99\x4b\xd3\xd5\xe1\xee\x40\x7e\xfe\x4f\x03\x67\x33\x69\xb3\x34\xc8\x05\x56\x10\xfe\x4e\xa0\xfc\xf7\x39\x87\x17\xe7\xf8\x37\x34\xfc\x3e\x57\x24\x42\x3a\x36\x85\xe3\x67\x0d\x9d\x0d\x05\xbb\xb1\xe3\x0c\x52\xf3\x2b\x4c\x5a\x36\x97\xce\x74\x5a\x16\x87\x37\x78\x3c\x46\x4d\x6a\x98\x9c\x6c\x99\xfb\xc0\x7b\xae\x49\x1d\xef\xba\xae\x72\x81\xde\x7d\x4b\x2b\xe3\x2c\x3b\x83\x81\x73\x4e\x5f\x52\x58\x09\x86\x5e\x50\x42\x89\x03\xfa\x7e\x58\x2d\xae\x59\x17\x9d\xb5\x56\xa6\xed\x04\xce\x6c\x87\x1b\x15\x4e\x39\xb5\x2b\x96\xe5\xbc\x54\x31\xc1\xa3\x93\x95\xc1\xd0\x7a\xbd\xdf\x8d\x11\x7f\xfd\xe6\x79\x57\x6b\xf9\x40\x12\xb0\x1f\x83\xac\x04\x05\xc8\xf6\x05\x45\xd8\x8f\x4f\x55\x1b\xd7\xa7\xf2\xc7\x7f\x0b\xa4\x48\xb3\x7d\x43\xaa\x7c\x57\x2d\xb2\x49\x15\xe3\x70\xb5\xa7\x44\x17\x92\x7d\x6b\x88\x72\xae\xd7\x10\x75\xd7\xd0\x64\xb5\xf0\x35\x0c\x5f\x60\x41\xeb\x6e\x50\x9e\x2d\xf3\x4d\x74\xc2\x96\x77\xfc\xfc\x79\xf7\xa8\x2c\x7b\x06\xde\xc2\x05\xb3\xd3\x1a\x41\x92\x7e\x5d\x5d\x71\x9f\x6a\xf8\xf5\x9b\xe7\x69\x66\x0d\xe8\x5b\x55\x32\x72\x43\x86\x69\x9b\xff\x56\x6d\xfe\x28\x7a\xe4\x96\x83\xf9\x5d\x38\x2d\xd1\x7d\x84\x25\x71\xcf\xb7\xcd\x5c\x70\x18\xfe\x77\xe5\x89\xbf\xdb\xa3\x05\xf2\xdc\x4c\x05\x6a\xa0\x9e\xe5\xd5\xbc\x7d\x3f\x37\xf0\x98\x6c\x40\x4e\x4a\xe4\x73\x02\xed\x41\x1f\xdf\x37\xe1\xe1\x1f\xee\x2f\x7d\xd2\x87\xfc\x40\x96\x7f\xa9\x03\xdf\x1e\xf0\xbc\x7b\x52\xf4\x1e\xf9\xcb\xd5\x47\xf0\x97\x5d\x73\x5e\x02\x13\x12\xb9\xcb\x70\xee\x83\x83\x91\x3a\x99\xb6\x67\x01\xbe\xec\x79\x9f\x37\x08\x56\xbf\x92\x7a\xa1\x84\xe1\xf8\x69\x86\xba\xce\x3c\x57\x1f\xdd\x64\xd5\xd1\x8d\x72\xd2\x4f\xf6\x89\x39\xba\x1f\xac\x8f\xee\x68\x9e\xef\x71\xba\x87\xfb\xc0\x3b\xde\x37\xa7\x9a\x63\x34\xc5\x04\x6f\x2e\xf9\x99\x20\x98\x9b\xca\x84\x5f\xf1\x4e\x4b\x0f\x6d\xb5\x61\xbd\x19\x7f\x96\x3b\xe2\xe4\x0d\xc4\x5c\xdb\xd0\xbb\x26\x5e\xd2\x27\xcd\x03\x7c\xe9\x97\x77\x9a\xe1\xbc\xa1\xcd\x95\xf2\x62\x56\xbe\xff\xa8\x92\x54\x78\xc9\xf2\x6e\xb9\x81\x89\xc1\xdd\x72\x87\x37\x8b\x3b\x5e\xfe\xe7\xf9\xaf\xbf\x14\x33\xd8\x30\xf7\xb1\xbb\x94\xe7\x4c\xb4\xca\x6c\x39\x82\xfa\x45\xd8\xb2\xd5\x96\xe8\x80\xc9\x27\xaf\xcf\xfe\x8a\x16\xca\xbd\xb9\x7c\xa9\x76\xb7\xcc\x31\x47\xd3\x53\xed\x06\x7e\xde\xc8\x87\x06\xda\xbd\xcf\x40\xfe\xd0\xfe\xce\x73\x3b\x05\x99\x63\xbf\xb4\x73\x04\xff\x61\x8f\x1a\x8b\xcf\x55\x9b\xdb\x65\x0d\x6a\x87\x53\xd2\x36\x76\xee\xda\x81\x4c\x45\x46\x4b\x3b\xac\x88\x28\xd8\x20\xf9\x22\xcf\xbd\x5c\x53\x73\xef\x0d\xe1\xda\x76\x7a\xd4\x3a\xc2\x95\xb5\x0a\x05\x13\xc1\xd3\xc1\x19\xbe\x42\x8b\x30\x7f\xde\xd4\x22\x73\xde\xd4\x9d\x1c\x0d\x1d\x99\xad\x7f\x67\xb6\x1d\xcf\xdb\xe8\xbc\xa9\xfd\x6f\x5d\xdc\x49\x44\x5a\xc1\x2a\x5d\x03\xb8\xe6\x7f\xbd\xb3\x18\x07\x63\x11\x02\x58\xa4\x25\xc5\xd3\xff\x8f\xc5\xc0\x95\xf7\x19\x0a\xc8\x1d\x37\xca\x5b\x2e\x5a\x0e\x2c\x7e\x6c\xb8\x4e\x9e\xcb\x63\x3d\x27\x07\xe3\xe4\xfb\xcd\x16\x56\x83\x52\x31\x0c\xa4\xe4\xef\x07\x1f\x8b\xb3\x2a\x5c\x1a\xb7\xaa\xe3\xfb\xb8\xdd\x86\x96\x27\xad\xd1\xa8\x85\x4d\x4a\xb6\x7b\x45\xad\xed\x32\xd9\xa8\xa1\x75\xfd\x96\xa6\x03\xeb\x48\xa1\x10\xec\x94\xce\xf8\x19\xe1\xf1\x44\x76\xd7\xb9\xd7\x6c\x47\xe6\x2c\x6d\x7c\xed\x9d\xa1\xbf\xff\x18\xaf\xa7\x56\xfa\x8c\xa3\xe9\xd7\x59\x64\x41\x3a\x36\xdf\x88\xb1\x1b\xcb\x30\xd5\xbc\x03\xd1\xb3\x33\x1d\x84\xcb\x6b\x69\x96\xd8\x7a\x0a\x2d\xa2\x10\xe9\x80\xf2\xfe\x63\xe8\x81\xb9\x0e\xc3\xe0\x61\xd1\x1a\x57\xef\xe3\x60\x39\xb3\x98\xb7\x23\xe2\x5a\x0b\x92\xdc\x79\x52\x49\x8a\xb3\x4a\xf0\x9e\x99\xfd\xb5\xb7\x97\xfa\xe0\xb9\xd4\x4f\x3d\x49\xa1\x1e\x7d\xae\xdc\x1d\x1d\xe0\x7a\xa4\x5d\x34\x22\x43\xce\x05\x1e\x0b\x5c\x74\x24\x2d\xb6\x48\xdc\x4b\xb7\xb5\x82\xb2\x12\xef\x52\x9e\xbe\x01\x5f\x1c\xd1\xf9\x3b\xa4\xd9\xd3\xf8\x2b\x5e\xe6\x40\xa6\x6f\x7a\xd5\xb0\xa2\x79\x43\xdf\xa3\x7d\xd8\xcc\x87\x77\xa4\x8f\xa0\x58\x37\xea\x2c\xd9\xe6\xf6\xa2\x7b\x76\x45\xc1\x56\xf0\x06\x4f\xd3\xac\x7b\x6c\xbb\xc7\x5a\x3f\x44\xfa\xab\xdb\xf3\xb4\x6f\x96\xa6\x6a\x84\x07\x6e\x87\xa7\x84\x42\x6e\x25\x45\x70\xd8\x6e\xf5\x83\xa3\x40\x09\xea\x9e\xd3\xae\xac\xe8\x54\xe8\xea\xf7\x3c\xd5\xc6\xbd\xa9\x20\xca\xd5\x31\xbb\x19\x11\xd4\x4a\x13\x8f\xc5\x54\x1d\x91\xd6\x51\xa6\x6b\x79\xe7\x9f\xee\x39\x2f\x7e\x82\x0c\x3d\x27\x1c\xf3\x85\x8c\xe6\x4a\x22\x8c\x81\x54\xae\xb4\xc7\x7d\x1a\x10\xc1\x9e\x31\x1c\x05\x63\x50\x12\x46\x7c\x18\x83\x68\xc7\x3a\xb2\xb9\xed\x39\xa2\x89\x5b\xad\x2f\xf3\x8f\x62\xfe\x07\xb3\x7d\x94\xac\xb7\x42\x2d\x7c\xe9\x6e\x62\x75\x40\x64\x59\x00\xad\x15\x35\x2c\x86\xd8\x2a\x41\x30\x79\x19\xa2\xe2\x31\x54\x62\xae\x70\xf7\xc7\xbe\x7e\x1c\x63\x3e\x99\x5f\x6c\x2e\x86\x12\xca\xf1\x25\x96\x0e\x0d\xfa\x24\xd4\xdf\x2d\x78\xdc\xfd\xe5\x50\x63\x66\xd2\x11\x42\xe9\x0d\x41\x0d\x7b\x50\x70\xb7\x6d\x04\xce\xce\x9d\xa1\xda\x38\x3f\x8a\x43\xac\xd5\xa4\x74\x48\xf7\xa8\xc6\xda\x51\x85\x32\x64\x5b\x55\x14\xaa\x60\xd3\xef\xd4\x19\x2e\x84\xa2\x35\x74\xd6\x6c\xab\xbb\x65\x48\x59\x89\x7d\xca\xb5\xdc\x61\xe5\x9d\x19\xc5\x90\x98\x01\x3d\xcb\x9d\xee\x86\x44\x3e\xe3\xa2\x0d\xfe\x4d\xbe\xa6\x3a\x35\x59\x6f\x5e\x2a\x30\x2b\x28\xcb\x9f\x9f\x8c\xf4\x5b\x63\xc6\xd9\xf0\xfd\xc7\xfc\xa2\x81\x64\x34\x39\xc7\x64\x24\xd3\xd5\xe7\x4b\x4c\x10\x1b\x82\xa3\xc1\x00\x38\x21\xc4\xb4\x61\xab\x17\xc7\x65\x42\x6f\x5e\xe1\x1a\x31\x4e\x45\x0d\x1d\x6b\xe1\x8c\xb1\x79\xfb\x75\x4a\xa7\x53\xcc\x99\x40\x40\x29\xf5\xab\x0b\x4c\x57\xf2\x8f\x89\xfd\x3b\xac\x90\x23\x2e\xa9\xfa\x9b\xb3\x42\x8e\xb9\xa4\xea\x6f\xce\x0a\x67\xe8\x25\x75\xbf\x72\xa6\x49\x7b\x49\xf5\x8f\x9c\xe9\xa8\xe1\x25\x35\xe1\xc3\x59\xe1\x0f\xbe\xa4\x41\x82\x2e\xa1\x26\xa3\x73\xd5\x87\xce\xd1\x13\xd3\x59\xfa\xcb\x51\x57\x7c\x2a\x30\x7b\xd7\x7a\xab\x75\x4b\x49\xcf\xb5\x5e\x23\xf2\xdc\xf0\xe9\x2d\x0b\x52\xf4\xc8\xfd\x60\x57\x92\x0f\xc0\x65\xf8\xa2\x4e\xbd\x59\xd9\x11\x6c\x5a\x89\x5b\x25\xf8\xb1\xd4\xf4\x0a\x7a\xa4\xae\xc5\x23\x2e\x3a\x55\x8c\x7b\xa3\xae\x73\xbe\x15\xb3\x27\x12\xa4\x0f\x2b\xac\x90\x14\xba\xcd\xef\x8d\x44\xf3\x2a\x36\xd9\x5a\xfc\x67\xf0\x1a\x9d\x4b\xe5\x07\xc8\xef\x38\xbd\x42\x64\x08\x3b\x5b\x41\x3d\x1a\x35\xd2\xff\x39\x87\x63\xf4\xc4\xd3\x26\xa0\xec\x6e\x44\x09\xa3\x35\x2a\x6a\x3a\x4e\xf5\x1d\xa5\xa7\x2e\x90\x0c\xab\x41\x89\xd6\x4d\x98\x7e\x05\x59\x98\xbf\x1e\x8d\x92\xa5\xa5\x45\xe5\xde\x5e\xea\x76\x00\x14\x61\x4f\x44\xe9\xe4\xa6\xa1\x64\x9c\x88\xa2\xc9\xd9\xb3\x3c\x51\xce\x8b\xa4\xbc\x15\xac\x5c\xe0\xd4\x78\xc3\xae\x5b\x07\xcc\x2b\xa8\xc8\x04\x8d\xae\x4e\x14\xcb\xb6\x9a\x5f\x7b\x0c\x50\x7a\xc7\xab\x5b\x98\x1b\x69\x5d\x3a\x10\x7c\x29\xa9\x4b\xd4\xa4\x53\x9a\x5c\xd9\x90\x55\x2e\xbb\xac\x8e\x04\x2b\xc8\x7b\xd4\x95\x2a\xb7\x84\xd6\x9e\x1c\x85\xf4\x18\x65\xc7\x86\x3b\x56\xf1\x12\xde\x0f\x3e\x76\x79\x79\xd5\x4c\x8e\xb2\x6c\xd8\x97\xc7\xbd\x08\x05\x48\x70\xa5\xae\x50\x60\x5b\xb0\x0c\xf2\xaf\xcd\xf8\x0d\x9a\x51\x26\xe7\x9c\xca\x2d\x15\x3b\x26\xc4\x21\xf7\x0c\x72\xf4\x16\x4f\x91\x0a\xf6\xa5\x9c\xe5\x6a\x09\xa9\xa8\x20\x47\x1c\x4f\xd1\x4c\xe6\x89\xce\x5e\xd2\x11\xac\x51\x0a\x10\xf1\x4c\x06\x15\x9d\x3b\x60\x82\xd0\x81\x2c\xa8\xe7\x85\x0b\x8c\x74\x99\x83\x67\x94\x48\x63\xaf\x3c\x1c\xfa\xe6\xcb\x15\x39\x48\x77\x36\x11\x2c\x68\x33\x6e\x44\x77\x6b\x31\xd5\xde\x59\xa9\x59\xcb\xd8\x14\x3d\x5e\x10\x3d\x2f\xe6\xaa\xb8\x66\x8a\x46\x0d\x82\x5c\xb0\xdd\xad\x7f\x78\xaf\x5b\x75\x8c\xb4\x16\x8d\xd6\xab\xe1\xfb\x8f\x59\x1b\x03\x62\x60\x22\x70\xed\xf6\x39\x71\x96\x2c\x79\x4e\xca\xdd\xa3\x1e\x0f\xe5\xa8\x64\x7e\xd4\x0b\x85\x53\x71\x13\x0c\x52\x1a\x25\x1e\xaa\x72\x5a\x4a\x9b\x65\x9b\x50\x92\x65\x96\x53\x51\xea\xfd\xe0\x63\x9b\xba\x3b\xc8\x96\x3e\xb9\x51\x53\x93\x8a\x0c\x6f\x19\x8f\x82\xed\x1e\xe6\x9a\xe2\x11\x61\x8a\xcb\xd3\xea\x17\xc9\xa5\xaa\x33\x26\x05\xef\x08\xbc\xa8\x51\xc2\x69\x22\xd7\x38\x91\xab\x2b\x58\x5d\xe5\xf3\xcd\x27\x26\xcb\x07\x6a\x51\x14\xc1\xea\x7b\xea\xf2\x18\xd4\xb6\x6f\xf6\x83\x10\x8c\x83\x3e\xe9\x7b\xfd\xa1\xa7\x89\xdc\x06\x3b\xa0\x6f\x6d\x4c\x0b\x26\x46\x6f\x4b\x70\xd3\x2f\xbb\xba\x96\x3e\x47\xd6\x35\xd0\x72\x45\xe8\x87\x43\x97\xba\xfd\x6b\xe2\x02\x26\x9c\xcf\xd8\xf0\x50\x0b\x4f\xc5\x88\x4e\x0f\x6b\x3a\xc6\xe4\x90\x8a\x3a\x87\x86\xcd\x45\xc7\x8a\x0f\xfe\x84\xab\x32\x78\x94\xe4\x73\xed\xfb\x60\x8f\x8d\xe8\x0c\x95\x02\x33\xf7\x1a\xa4\x42\xba\x7f\x9a\x37\xb8\x04\xfb\x88\x08\x6e\xe5\xdd\x9b\x33\x2b\x04\xad\xe3\xea\x45\x73\x1c\x72\x14\xaf\x1c\x73\x6a\x90\xed\x44\x5d\x1d\x70\x21\xde\xcb\x85\xdb\x5a\xa9\xd0\x3d\xb0\x22\x59\x7a\xff\x5b\x8f\xb5\x1d\x34\xa1\xe4\x5c\x4c\x64\x65\xef\xba\x2d\x39\x63\x65\xed\xf3\x60\xf5\x45\xdf\xb9\x12\x51\x28\x6b\xcd\x06\xeb\xb5\xd4\x69\x35\x1b\x2c\xd0\x6c\x08\xc6\x96\x6d\xaf\xba\x60\xbd\xaa\x8b\xf5\x6a\x33\x22\xc5\x39\x2e\x43\xc4\x6d\xa4\x39\x0b\xc7\x1c\x0e\xb0\x35\x39\x6a\xb7\x2f\xb2\x3e\x4c\x4f\xb4\x9c\x98\xb3\xf8\xe5\xca\xba\x3a\x5b\xa9\x5c\x1c\x45\xc6\x1f\x5b\xe5\x32\x85\xcd\x55\x45\x6f\xc8\xef\xf6\xf0\xba\xc6\xe4\xaa\xcf\x23\xb9\x6b\xe0\x2d\x7e\x9b\xc7\x58\x00\x38\x8e\xf5\x07\x8f\x6f\xfb\x6d\x80\xb2\xe1\x13\xd3\xfb\xb4\xac\xab\x3e\x9e\xf9\xb7\x3e\x0e\x3a\x1c\x52\x48\x0a\xb2\x63\xde\x67\x04\xae\x74\xf2\x43\x00\x1c\x4d\x78\x6b\x46\xcd\xd7\x18\x10\xcb\x3a\x90\x73\x38\x9a\x28\xe0\xaf\x7f\xb2\xb9\xd2\x00\x86\x7b\xa6\xc5\xf2\x91\xdc\x3d\xcd\x60\x04\xdb\x2e\xd1\x68\x15\xe7\xb4\xce\xde\x54\x43\x67\x99\xbb\x53\xfc\xd2\x06\xd4\x7a\xf3\x80\x5c\x59\xc9\x1b\xec\x09\xec\xab\x8e\x1e\x64\x5f\x85\x6e\x79\x03\xff\x8a\x16\x6c\x78\xf7\x9c\x70\xd4\x0c\x01\x41\x37\xa2\xc1\x13\x52\x9d\xc9\x76\x4e\x29\xe1\x98\xcc\xd1\x2b\xdd\xbd\x38\x11\xc1\xf2\x9f\xc7\x10\xbb\x85\x5b\xd4\x18\xdb\xc9\xf6\x9f\x78\xad\x7c\xfb\xe9\xec\x11\x27\x4e\x44\x0c\x69\xb7\x33\x27\x90\xee\x41\xc2\x16\x78\xb0\xb1\xf4\x55\x5f\x67\x8b\x16\x1a\xd3\x53\x7b\xd7\xa5\x59\x29\x33\x45\xcc\x15\xc5\xc5\x97\xca\x9e\x4e\x5b\x23\xa4\x5e\x4d\xa7\x5d\xfb\x6e\x5e\x39\xf3\xe8\x7f\x48\x1a\x2e\x58\x2d\x9f\x88\x16\x17\x73\x5c\x57\xa2\x70\xca\x23\x81\x12\xe3\x7b\x4e\x6b\xc6\x94\xaf\x61\xc5\x96\xcb\xe0\x89\xbd\xf2\xcf\x1f\xd8\x42\x7a\x63\x6f\x1a\x16\xf6\x8f\x70\xe1\xe3\x9f\xe9\x7f\x6c\xfe\x63\x06\x45\x6f\x0d\xc4\xf5\xa3\x5e\xfb\x38\x39\x73\x8e\x6b\x76\x48\x10\xef\xdc\x05\xe5\xec\x9f\xe0\x36\xe8\x0b\x58\x25\xda\x4b\x20\xf5\x29\xef\x2e\xbf\xba\x0d\xe2\x5b\xa9\xbc\x06\x20\xff\xc7\x1c\x35\x92\xc3\x9b\xc2\xdb\xe1\xd1\x20\x1f\x37\x74\x6e\x1c\x91\x2c\x18\x47\x53\xf9\xbb\xc7\xb6\xd0\x24\xba\x46\x73\x15\x66\xb3\x1a\x2e\xd4\x73\x6b\x5f\x7e\xd0\xeb\x51\x60\x76\xf2\x77\x78\xab\x82\xd6\xcb\x72\x29\x7f\x44\x7b\x95\x95\xb6\x56\xbe\x94\xf3\x50\xd3\x03\x6e\x4c\x0f\x3a\x9e\xc6\xd8\x06\x96\x06\xda\xac\x89\x85\x77\xfc\x66\x79\x40\x0e\xfe\x55\xff\xd7\x06\xaa\xef\x1f\x09\x35\x0f\xd8\x3a\x83\x69\x4d\x0e\x6c\x19\x1e\xb5\x1f\xd8\x31\x91\x0d\xc7\x6e\x61\x19\x1f\x6f\xb9\x63\xc3\xaf\x28\x75\x76\x21\x31\x25\x3b\x76\xc3\xb9\x30\x95\xc8\x64\x78\x68\x5d\x42\x32\xd4\x43\x93\xf3\x7e\xf0\xb1\xab\x46\xa4\xd6\x15\xb5\x18\x11\xca\x81\x2c\x0b\x72\xba\xad\xdd\x44\x60\x84\xd1\x03\x54\x09\x4c\x17\x4d\x53\xee\x6b\x88\xc0\x18\xf1\x44\xcf\x3e\x19\xc1\xba\x4e\x2e\x21\xae\x51\xd5\xbd\x4f\xf8\x6a\x23\x92\x77\x37\xf2\xc6\x29\xb1\x96\x47\x8a\x23\xf8\x8b\x84\xeb\x46\x6f\xae\x3c\xa4\x8f\xe8\x2c\x76\x36\xd5\xe3\xe8\xf5\xf1\xf4\x38\xdb\xed\x1c\xd2\xbb\x73\x5a\x4d\x83\x07\x3b\x16\x98\x23\xfa\xeb\x10\xaf\x11\x40\x54\x07\x46\x93\x54\xed\x2b\x03\x4c\x91\xd2\x7f\x52\x88\x3d\x1a\xbb\xf6\x40\x6d\x59\xcc\x42\x47\xdd\x74\x44\xd6\x0c\x97\x47\x03\x75\xf7\x26\x08\x4b\x2a\x0f\xcb\x33\xc2\x53\x5a\x4c\xe1\xad\xbc\xc6\xc2\x65\x98\xe8\x78\x6a\xa4\x42\x2e\xb9\x05\x39\x7e\x84\x05\xdb\x48\xbb\x16\x9a\xdb\xee\xa8\x9b\x6a\xe4\x19\x38\xed\xc0\x02\x5d\xcb\xb0\xa9\xfa\xae\x07\xef\xed\xa5\x26\xad\xb4\x99\xac\x16\x0c\xcd\x20\xc7\xd9\x3a\xad\x22\xcd\xba\xba\xc8\xa0\x08\xcc\xa2\x56\xb7\x5b\xa8\xf6\x22\xd4\x31\x6e\x3a\xbd\x39\x8f\x1d\xf2\xad\x7f\x70\x2e\xbb\x86\x84\xcf\xa7\xbd\x3c\xf6\x17\x1f\xe9\xba\x98\xe5\x1a\x81\xaf\x47\xf7\x64\x8d\x2b\x0c\xc7\x0d\x9c\x2a\x67\x6f\xc0\x7c\x1a\x01\x5e\x32\x93\x5a\xe3\xf6\xd3\x9c\x73\x41\x33\xe4\xe1\xea\x38\x86\xdb\x5a\x49\x68\x60\xfa\xf8\x4a\x42\xdb\xf2\x3a\x25\xe1\x18\x11\xd4\x40\x8e\x36\x55\x54\x74\xc9\x87\x12\xf4\x23\x90\x01\x39\xf8\x8b\x6a\x1d\x93\x71\xa2\x4b\x14\x45\x01\x82\xcb\x07\xe5\x38\xb3\x1d\x9e\xb3\x10\x20\x5b\xee\x6c\xa3\xf9\x08\xee\x01\xaf\x47\x2d\x6f\xe9\xbf\xfe\x99\x99\x35\x23\xfd\x64\xcc\xc7\x00\x20\x50\x14\x72\xd8\x47\x48\x56\x81\xc1\x7a\xe0\x8a\x92\x96\xb0\x1f\xa5\x8d\x7c\x48\x2f\xf2\xcc\x7b\x94\xd8\x8e\xc1\x00\xda\x64\x77\x91\xfa\xdd\x98\x9a\x1c\x0f\xc7\xee\x6f\xd7\xef\xba\xa6\xf3\xb0\xc4\xf3\x78\xea\x8f\x61\xdb\xc3\x3f\xb2\x11\xfa\x26\xb1\xe6\xae\xcd\xdd\x2a\xab\xcd\xc6\x63\x9c\x43\xcc\x59\xaa\x3b\xe5\xee\xdb\xf8\x7e\xc5\x4f\xcf\x72\xb6\xba\x38\x51\xfa\x1a\xfb\xcb\xd0\xb3\xd6\xdf\x7e\x20\xff\x97\x71\xd8\x08\xea\xf2\x81\xc8\xce\x13\xc1\x35\xd4\x88\x27\xa7\xc6\x3b\xe5\x07\xf2\x81\xa4\xff\x9a\x25\x07\x07\x1f\x6e\xbf\x43\x09\x38\xad\xf1\xe8\x4a\x97\x2a\x26\x90\x54\x35\x7a\x83\xfe\x31\x47\x8c\xa7\x19\xf8\x40\x4c\x31\x82\x6e\x92\xd7\x02\x30\xa2\x3e\xbe\x4c\x80\xf8\x28\x04\x57\x32\x9a\x37\x98\x2f\x4e\x27\x68\x74\x05\x12\xb1\x61\x3f\x90\x24\x49\x92\x83\xa7\xef\x79\x33\x47\x1f\x6d\xc9\x33\x82\x55\x93\x22\x57\xfd\x2b\xda\xc1\xec\x05\x6d\x6e\x60\x53\x1d\x07\xb5\x09\x15\x75\x55\x60\x84\x64\x44\x09\x6f\x68\xcd\x3a\xd5\x47\x5a\x7b\x9d\xb4\x21\x14\xbc\x86\x64\x63\x72\x0e\xef\x17\x88\x7d\x4c\xca\xb2\x7c\xf3\xfc\x97\x67\xcf\xdf\x9c\xfd\xf2\x97\xb2\x2c\x55\x21\x54\x33\xd4\x29\x2e\xfa\x97\xa5\x9f\x9d\xbd\x79\x7e\xfa\xf6\xd3\xe9\xcf\xcf\x4f\xff\xda\x56\x21\x15\xbe\x74\x07\xd3\xb6\xb1\xbe\xbb\xb0\xae\x82\x43\xf2\x9a\x32\xee\x43\xc1\x69\xc9\x80\x51\x14\xb2\x60\x34\xab\xa3\xf3\x14\xd9\x4d\x33\x90\x40\x96\x28\x9e\xc5\x2b\xb7\x62\x3a\xe1\xe8\x15\xf4\x55\xb3\x7f\x41\x9d\x1e\xdd\xc6\xbd\xe9\x74\x1a\xba\x84\x35\x43\x7d\x90\xd4\x55\x15\x46\x3d\xa3\x89\xb1\x47\x08\x71\x41\x41\xc0\xe4\x26\x8d\x42\x50\x10\x4c\xee\xa7\xe7\x2f\x7e\x7d\xf3\xfc\xd3\xb3\xe7\xe7\x6f\xdf\xfc\xfa\x37\xd5\x81\x1d\x8e\xee\x21\x8a\x6c\x35\xba\xe4\xb6\x17\x5d\x62\x8b\x4e\x02\x00\x36\x78\x3c\xe1\x06\x81\xd5\x92\x24\x82\xa6\x24\xdc\x44\x8b\xdf\xb0\x49\x05\x1c\x0b\xa3\x60\xb1\xf5\xc5\x9b\xb3\x4b\xd3\x7f\xcd\x3e\x90\xff\x8b\x48\x35\x9f\xd6\xdf\xf6\x13\x78\x43\x59\xce\xc5\x04\xc9\xa8\x1b\xc6\xbb\x4b\x59\x80\x47\x59\xe0\x88\xd3\x26\xf9\x89\x5e\x24\xdf\x34\xa8\xfa\x40\xbe\x4d\xde\x4e\x50\x42\x49\xbd\x48\x2a\x7c\xa9\x7d\x94\x27\x17\x88\xdf\x20\x44\x12\x59\xfa\x03\xf9\x16\x92\x2a\x99\xc1\x86\xe3\x11\x9e\x41\xc2\x13\xcc\xc4\x12\x24\x55\x03\x6f\x30\x19\x7f\x20\x6e\xde\x89\x90\x30\xfc\xa4\x0f\xe0\x2c\x99\xc0\x6b\x94\xc0\xa4\x41\xb0\xae\x17\x35\x25\xe3\x84\xc0\x29\xfa\x20\xd1\xfd\x65\xf2\xcd\x9f\xfe\xf4\xe2\xc5\x9f\xfe\xf4\x81\x1c\x7e\x9b\xfc\x8d\xce\x93\x11\x24\x09\xac\x19\x4d\x2a\x34\xaa\x61\x83\x86\x0a\xac\x6e\xa3\x2f\x45\xcd\x4e\xcb\x89\xdb\x74\xdb\xac\xa8\xfc\xed\xa1\x58\x09\x39\xbc\x83\xa7\x3f\xd1\x8b\x61\x72\xd2\x4a\x1f\x98\x92\x44\xd3\xce\x0f\xe4\x27\x7a\x71\xf0\x54\x16\x8c\x94\x61\x33\x4a\x04\xbe\xc8\x42\x2f\x87\xc9\x4b\x3a\x4e\x78\x03\x09\x53\x87\xaf\x5d\x45\xb0\x7e\x15\xdf\x31\x74\x0a\xd9\x26\x8b\xe8\x1f\x0f\xc3\x57\x10\x93\xe4\xa4\x9a\x62\x32\x14\x50\x90\xbf\x3e\x90\xf4\x1d\x43\x72\x5d\x04\xf3\xa1\x07\x9c\x89\x7c\x91\x91\x89\xc9\xbf\x63\xa8\x49\x0e\x9e\x26\xe9\xb9\x68\x2b\x33\x09\x0a\x39\x6d\x29\xd9\x5c\x72\x10\x26\x13\xca\x51\x22\x37\x48\x42\x2f\x55\x9f\xc9\x30\x79\x3b\xc1\x4c\xe0\x03\x24\x09\xba\x85\xd3\x59\x8d\x8a\x6e\x61\xdd\x86\x58\x85\x93\x44\x66\x99\x05\x56\x89\x17\x02\x05\x13\x86\xae\x51\x03\xeb\xa4\xc6\x04\x31\xb9\x79\x64\x59\xdb\x1c\x90\x7d\xc9\x9f\x58\x1e\x2b\x44\x5a\x0c\x26\x9c\xda\xaa\x54\x0a\x48\xac\x90\x68\xf5\xcb\x93\x0f\x44\xcf\x34\x29\x0a\xf9\xf9\xcb\x13\xf1\x4b\x0f\x47\x2f\xd4\x07\xb2\xc1\x86\x93\xaf\xfb\xb6\xde\x6d\xd2\x17\x4b\xf2\x82\xd2\xa3\xe4\x4e\xcd\xd4\x20\xf7\xdc\x90\x9c\x60\xd2\x22\xa9\x28\xd4\x5f\xc8\x92\x05\x9d\x27\x37\x90\x70\x9d\x40\xaa\x44\xea\xd7\xd4\xa7\x21\x36\x32\x88\x01\x4b\x38\x1d\x23\x3e\x41\x8d\xae\xfd\xe9\x93\xdf\xa3\xda\x26\x2c\x99\x42\xb2\x50\xad\xb0\x9e\x6e\x0e\x0e\xd4\xdf\xe7\xa4\x12\x8b\x27\x27\xf1\x81\x2c\xc5\x3a\xa8\x09\x49\xac\xb9\x33\x83\x4d\xce\xb1\x58\xf6\xe4\x2f\x88\x73\xd4\xd8\xd1\xef\x27\x63\xc4\x7f\x81\x53\x94\x66\x4e\xc2\x49\x55\x35\x88\x31\x93\x26\x6a\xd3\x29\x4a\x58\x58\x97\xf9\x75\x3f\x7d\x4a\x66\x0d\xbe\x86\x1c\x49\x97\x35\x76\x72\x98\xf0\x04\x8e\xed\xa9\x95\x20\x32\x6a\x16\x33\x81\x14\x66\x12\xe7\x52\x5b\x91\x98\x68\x1d\x7a\x1e\x9b\xef\x51\xc3\xc3\xfd\x12\x61\x5e\xd7\x2d\xff\x07\x22\x7f\x7f\x20\xc3\x55\x9c\xda\x8f\x1f\xc8\x50\xb0\x68\xe2\x9c\xf9\x51\x1e\xa7\x69\x8c\x41\xcb\xe4\xa9\x97\xa4\x82\x33\xd3\x50\x19\x7a\xec\xd9\x8f\xf6\xb0\x4c\x5b\xc6\xcc\xd4\x22\xd4\xd6\x09\xd8\x32\xa7\x5a\x8c\x21\xeb\x34\x20\x91\x96\xd3\x59\x3f\x3f\x94\x62\x26\xd9\x21\x53\x75\x81\x98\x53\x77\xe8\x31\x43\x3f\xb6\x47\x70\xd0\xc7\xd0\xe5\x60\x7e\xec\xf4\x36\x0c\xf8\x26\xbf\x84\x6a\x4f\xf2\x2f\x99\xcf\xaa\xa4\x95\xc3\xaa\x74\x47\x38\xb4\x8c\x8a\x86\xc1\x8f\x01\x23\x22\xea\x5f\x06\xc0\x75\xaa\x07\x1c\x48\x7c\x7a\xc3\x18\x67\xf1\x63\x9c\x73\x50\xa0\xde\x06\x63\xad\x8e\x67\xeb\x73\x45\x9c\xda\xa3\x2b\x31\x28\x20\x77\xa5\xbc\x3f\x00\x66\xa7\xff\xfc\xf6\xed\xeb\xe4\x20\x79\xff\x02\x37\x4c\x08\x25\xba\x97\x8f\x2a\xf7\xfd\x09\xa1\x82\xfa\x78\x19\x4b\x83\x19\x84\x56\x28\x01\xbf\xca\x02\xea\x56\xc2\x36\xfb\x42\xb5\x7a\x8e\x46\x94\x54\xdd\x66\xc3\xde\xcc\x69\xf5\xe2\xed\xeb\x0f\x64\x99\x28\xa2\x44\xe7\x95\x69\xee\xfd\x73\x75\x0a\x25\x47\x1f\xf5\x5e\xff\x40\x04\xc9\xb8\x80\x0c\x25\xe0\xd5\xe2\xfc\x1f\xb5\xed\x5a\x85\xf6\xd2\xe7\x0a\x66\xc9\x74\xa1\x93\x6c\x89\xf7\x2f\x54\x91\xef\xf4\x70\xf4\x84\x2e\x1b\x38\x45\x82\xdd\xa4\x4e\x49\x99\xf6\x7d\x5b\x50\x77\x1e\x01\x8c\x99\x83\x37\x56\xe7\xc3\xe6\x3b\xbd\xb7\xbf\xdb\x5c\xdb\xe3\x56\xac\x23\x87\x7c\x7b\x96\x83\x8d\x60\x8d\x92\x7f\x1b\x0c\x92\x1b\x5c\xf1\x89\x9c\xd8\xbf\x7e\x14\xbc\x84\x6c\xef\xe8\x83\x32\xc1\x3d\x32\x83\x93\x5f\x4f\x92\x61\x72\x3e\x1f\x8d\x10\xaa\x04\xaf\xe9\x97\x10\xd5\x87\xc9\xc9\x05\x6d\xb8\xcd\x7c\xe2\x55\xff\x2e\x52\xfd\x49\x4f\x75\x69\xd7\x6b\xaa\xe9\x25\x51\x69\x0a\x95\x65\x4e\x22\x7d\x26\x88\x03\x4f\x70\x89\x47\xaa\x94\xfc\x99\x0c\x93\xff\x9c\x33\x9e\xc0\x84\x4b\x0e\x50\xae\xe8\xbf\x5a\x50\x77\x8a\xbb\xe9\xc9\x30\xf9\x05\xdd\x24\xcf\x20\x87\x91\x22\x9a\xdc\x8a\xdc\x64\x98\x3c\x27\x74\x3e\x9e\xe8\xb2\x4b\x3d\xa7\xef\x3a\xb3\x7e\x21\xef\x14\xc3\x6c\x35\x65\x0b\x91\xe4\x30\x39\x17\x67\xfa\x1b\x19\xf3\x27\x5e\xd8\xc2\x47\x6d\xc3\xb5\x58\xb2\x85\x9a\xdd\x53\x5c\xff\xb1\x95\xec\xbf\x6f\x00\xa3\x1e\xbf\xc8\x5b\xab\xb5\xe5\x2c\xd6\xe9\xb4\xf5\x60\xde\x8a\xb2\xc3\x6f\xff\x2c\xeb\x18\x97\x80\x37\x0b\x86\x6f\x16\xe3\x03\x99\x08\x12\xc6\x17\x35\x2a\x81\xdc\xcf\xc3\xe4\x68\x30\xf8\x3f\x3f\x82\xa7\x7f\xe6\x13\x04\xab\xa7\x7f\xe6\x8d\xf8\xf9\xf4\xcf\x17\xcd\xd3\x3f\x1f\x8a\x1f\x1b\x7e\x1c\x72\xf5\x4b\x35\x72\x41\xab\x85\x6e\xab\x0a\xfa\x7b\xf2\x43\x31\x18\xe8\x3e\x55\xed\xea\xf7\x28\x25\xc7\xfb\xff\x06\xf8\xd0\x01\x1e\xea\xa5\x56\x5b\xed\xe9\xb7\x9b\x45\xeb\x72\xec\x23\x7b\x55\xdd\x3d\x3e\xe5\x75\xb6\xeb\x69\x24\xd6\x9a\xbb\x1d\x36\x74\xb4\xec\x07\xc9\x69\x6d\x7f\x6d\x78\x76\x9e\x15\x97\x0d\x85\x35\xd4\x36\x9f\x77\x9c\xd2\xfa\x02\x36\xea\xe2\x40\x3e\x43\xd7\x29\x67\x32\x04\xd5\x70\x77\x90\x4b\xb0\xbc\x41\x0c\xff\x86\x9a\x5f\x2f\x2f\x19\xe2\xc3\xa3\xc1\x72\x3b\xfb\x53\xc7\x59\x9b\x33\x14\x4a\x52\xe0\x0e\xa7\xd0\x2f\x37\x94\x11\x43\xe5\xb5\x80\xba\xf6\x08\xea\x52\x63\xb5\x31\x78\x3c\x7c\x90\x63\x15\xad\x02\x2d\xaf\x1a\xc5\x03\x6c\xb8\xbe\x9e\x4d\x68\xce\xca\xf5\x53\xf5\x96\x5e\x7a\x8f\x15\x65\xd4\x6d\x44\xc7\xa6\xd4\x22\xaf\x7a\x22\x5f\xf6\x22\x66\xc7\xfa\x94\x3d\x8e\xc1\xe9\x3f\x4d\xe4\x36\xde\xa0\xba\xa6\x8f\x62\x69\xda\x1f\xd4\xad\xcf\xf5\xc8\x97\x31\x37\x65\x11\x73\xd3\x47\x71\x87\xd9\xeb\x86\x44\x86\x55\xd6\x6e\x48\x08\xfd\x49\x7d\x89\x82\xb3\x99\x76\x2c\x29\x4b\x9c\x0b\xa2\xde\x61\x3b\xb4\x39\x92\x2c\xd1\xa1\x3b\x11\x47\x50\xaa\xa0\x7c\x70\x6c\x7d\xe2\x77\xfc\x8a\x64\x99\x66\x5e\xbe\xf9\x7e\x24\xfe\x07\xe6\xc6\xae\x98\x35\xe8\x92\x15\x17\x70\x74\x35\x6e\xe8\x9c\x54\xa7\xb4\xa6\x8d\x1f\x82\x56\xa9\x6e\x0a\xb1\xc7\xce\xe1\x25\x4a\x41\x5b\xfa\x60\x24\x8a\x0f\x13\xb0\x8f\xb2\xfb\x87\x64\xd8\xd6\xe7\x4a\x60\x34\x7a\xb7\xb4\x46\xa2\xcd\xe2\x0e\xdd\xd7\xf4\x16\xa9\x67\xd5\xda\x69\x84\x76\xf0\xa9\x16\x51\xc2\x58\xfd\x34\x2e\x4e\xa2\xe6\xb6\x68\x33\x83\xd4\x7e\x1f\x2d\x8e\xbd\xa2\xc4\x15\xe5\x70\x53\xfc\x0a\x4d\x13\xb9\xb2\x4b\xe4\xea\x47\xf0\x98\xa1\x7d\x17\x0a\xd9\xc4\x60\x46\xe7\x41\x88\x67\x2b\x9a\x19\xef\x30\x6d\x38\x0b\xf0\x8d\x6c\x5b\x7b\xde\xf0\xfc\x75\x08\x3a\x1a\x1d\x0f\xcb\x96\xd2\x8f\x87\xb6\x4f\xd5\xb3\x30\xde\x3d\x88\x87\xb9\xaa\x4a\x76\x4c\x3c\xf3\x64\x13\xa7\x5b\x14\x3d\x1f\x35\x78\xc6\x53\xfb\x82\x17\xce\x70\xa1\x28\x94\x7c\xc5\x7b\x74\xa8\x1e\xe5\x16\x7f\x67\xc7\x57\x68\x51\x82\xfd\xa0\x5b\x77\xfb\xbc\x55\xf5\x2a\x64\xdf\xfb\xa6\x1b\xf8\x9e\xd8\xc0\x83\x71\x34\x38\x80\xdc\xf4\x0f\xf1\x80\xa0\x68\x48\x70\x3e\xfa\x5b\xde\x33\xcc\xd3\x4f\xc5\x57\xb8\xb2\xf8\xfc\x79\xe0\x86\xbb\x6d\xc7\x62\x48\x94\x1c\xcf\x30\x8d\x66\x1c\xb5\x11\x37\x48\xd8\x34\xc9\x8e\x51\xeb\x25\x83\x94\x28\xea\x25\x43\x13\x34\x12\xf3\x92\xa1\xf3\x90\xe7\xd1\x80\x38\x5e\x32\x56\x6d\x28\x96\x03\xfd\x32\x79\x53\x07\x10\x71\x8f\x0d\xda\x5d\x83\xf2\x98\xaa\x1c\x59\xf6\x7a\x66\x28\x49\xd7\xf9\x42\xce\xca\xdd\x41\xcf\xd3\x2b\x26\xdd\xb9\x8f\xea\x79\x85\x2a\x71\x64\x99\xdf\x25\x5b\x86\x4e\x5d\xf4\x5c\xd0\x57\xf6\xb2\x20\x97\x20\xd1\xb0\xe8\x3c\xc6\x7f\x10\xdf\x28\xb6\x81\x54\x9d\x5f\xd0\xdb\x0d\xac\x79\xcd\x82\xf8\x10\x56\xeb\xb3\x5b\x96\x28\x30\x44\x37\xa0\x04\xf9\xae\x03\xe3\xa8\x8f\x4c\x00\xbc\x67\x50\x86\x4a\x64\xde\x69\x27\x98\x4e\x45\x63\x0e\xe0\x6c\x16\xba\x95\x44\x32\x1c\xb8\xf5\x28\x99\xb7\x61\xcd\x57\x3b\x21\xe8\xec\x6f\xeb\xda\x21\x70\x68\xf0\x10\xea\xd7\x9d\x5a\x84\x00\xb6\xe4\xef\x4e\x70\x79\x43\x6b\x12\x00\x72\x4c\x38\x6a\xc4\x3a\x5f\x4b\x61\x49\x79\xf5\x7a\xa6\x99\x37\x90\x4b\xa7\x07\xc3\xbb\x06\xc1\x4a\x64\xdf\x34\x98\xa3\xe1\xee\xd1\x32\x47\xb7\x33\xdc\x40\x65\x2e\x48\xd0\xb5\xe0\x06\x67\xa8\x61\x98\x71\x51\x8e\xcd\xe5\x2b\x92\x61\xe0\x32\x68\xa5\x4b\x0c\xff\x50\xd1\x23\x97\x5f\x69\xd6\xf5\x9b\x61\x0a\x4c\x91\x7c\xef\x69\x0e\x7c\x10\xdb\x2f\x8e\x33\x0f\xf9\x66\x6f\x25\xfd\x5f\xef\x28\x49\x93\xe9\x07\x78\xde\x30\x2d\x18\xcf\x1b\xed\xc9\xf1\x85\x3d\x6f\xd8\x13\xa6\xeb\x79\x03\xf9\x2f\x83\x1e\xb3\x6f\xb7\x42\xb7\xef\xa5\xb6\x67\x97\x40\x78\x80\x17\x0b\x7d\xa0\x6c\xe8\xc5\xc2\x07\xf9\xff\xf3\x47\xb1\xca\x1f\x85\x46\xf7\x4d\xec\xe5\xff\x79\xbc\x51\xb8\x52\xef\x1f\x5b\x3e\xd7\xba\xe3\x3f\xaa\x99\xfa\xa6\xbe\x2a\xb6\x56\xba\x1b\x9d\xf9\x1a\xb5\xbb\x51\xf8\xdd\xbb\x61\xdd\x40\xbf\x5e\xff\x71\xcc\x8e\x37\xd0\xb8\x6e\xa2\x23\xe5\x1b\x05\x64\xbf\x87\x76\xf3\x6e\x04\x47\x13\xf4\x89\xcd\x2f\x2f\xf1\xed\x10\x1c\x5f\x97\xdf\xff\xf0\x3d\xd0\x2e\xdc\x69\x33\x94\x7a\xb9\x50\x29\x97\x37\xa8\x86\x82\x79\xf8\x34\x6f\x6a\xa9\xf0\xb8\x68\xe8\x0d\x43\xcd\x27\x36\x43\x75\x2d\x7d\x0a\x0a\x86\x60\x8c\x46\x57\xd4\x4b\x3b\xca\x19\x87\x7c\xce\x2e\x60\xa3\x5e\xed\x1a\x7d\xed\x0c\x32\x8e\x3e\x55\x90\xc3\x4f\x78\x0a\xc7\x48\xc6\xca\x91\xbf\x3e\xc1\xea\x9a\xc3\x8b\xf6\x7b\xa4\x1f\x2c\xec\x0e\xf2\x29\xaa\x30\xfc\x54\x8b\x91\x08\x8e\xa0\x92\xb5\x4c\x04\x1e\x5a\xa1\x46\x08\xaa\x57\x98\x0c\x41\x8d\xc7\x13\x3e\x6e\xe0\xe2\x60\xdc\xc0\x0a\x4b\x4f\x3b\x48\x3a\x8e\xfe\x24\x7d\x31\x61\x32\x1e\x0a\x02\x06\x72\xb5\x01\x50\xf5\x49\xbe\xec\xfb\x84\xd4\x92\xb0\x21\xb8\xc8\x71\x7e\x71\x28\x24\x44\x32\xce\xf1\x21\x9a\x82\xfc\x92\x12\xce\xf0\x6f\xe8\xd3\x25\x6d\xa6\x50\x14\xfa\x8f\xd9\x6d\x72\x34\x10\xff\x3c\x11\xff\x7c\x2f\xfe\xf9\x77\xf1\x8f\xc8\x78\x22\x3e\xbf\xfb\xb7\xd9\x6d\xf2\xbd\x28\xf2\x83\xf8\xe7\xdf\x06\xb3\x5b\xd1\x90\xaa\x7f\x77\x41\xeb\x6a\x78\xa7\xe1\x02\x2e\xc0\x32\xc7\x1c\xd6\x78\xd4\xa6\x61\xb0\x5c\x4a\xbf\x2e\x4c\xde\x5e\x7f\xaa\x21\x19\xcf\x25\xc4\xde\xdf\x71\xf9\xe8\xe3\x14\x18\xf7\x16\x23\xb0\xcc\x4d\xe2\x37\x6d\x2a\x9b\xc0\x66\xe6\x64\xed\xef\xb7\x79\x33\x37\xe3\xfc\xdc\xa9\xc4\xda\x8c\x67\x54\xb9\x03\xd4\x79\x95\xfa\xb4\xd9\xcf\x6b\x7c\x8b\xdb\x6c\xa4\x3e\xdb\xec\x46\x8c\xb9\xcd\x56\x9f\x36\xfb\x85\x1a\x9e\xc9\xbe\x0c\x46\xfb\x17\xcc\x6d\xde\x18\x73\x27\x83\xb6\xe9\xb4\x4d\xfe\x19\xb2\x2b\x54\xd7\x36\x6f\xa2\xbf\xdb\x02\x6f\x5f\xbd\xb4\xb9\x53\xd8\x5c\xcd\x67\x6e\xe6\xdb\xd7\x6d\x55\xce\x9d\xac\xff\x84\xd7\xd0\x66\xfd\x5d\x7c\x78\x59\x8a\xa9\xf7\x0a\x30\x95\xd4\x16\x3b\xff\xf5\x97\xb6\x00\xa3\xa4\xcd\x7a\x89\x18\xb3\x59\x35\x72\x81\xff\x0a\x5e\xa1\x4b\x2c\x28\xba\x1d\xb3\x4e\x70\x8a\x18\xef\x28\xce\xb4\x64\x82\x2d\x42\xc6\x98\xdc\xda\x7c\xf5\x65\x33\xd5\x79\x82\xaf\x51\xd2\xe2\x12\x35\x69\x0e\x52\xbd\x46\x4d\x0b\xd8\x99\xf8\x68\xb3\x7e\x6e\xe1\x36\x9b\x38\x60\x7b\x4d\x6f\x50\xc3\x26\xee\x92\xcc\xda\xa4\xb6\xd8\x82\x4f\x68\x3b\x81\x99\xfa\xb4\xd9\x6f\xe6\x17\x0b\x9b\xd9\x88\x0f\x27\x8b\x71\x27\x8b\x39\x00\x3f\x87\x8c\x25\xe7\x2e\x5a\x33\x0f\xaf\xcf\xff\xab\xc5\x04\xf6\x0f\x67\x34\xe7\x37\xf8\xb2\x6d\x94\xc9\x2f\x9b\xf9\x76\x31\x43\xc1\x6a\x8b\x53\x3b\x5c\xed\xff\xdf\x0a\x34\xfb\xdb\x89\x93\xb9\x80\xd3\x1a\x2c\x3f\xe6\xb3\x7a\x3e\xc6\x84\x0d\xdf\x03\x58\x5d\x0b\x6e\x56\xf0\xd4\x54\x9c\xbc\x4a\x7c\x4f\xe4\x4f\x49\x14\x93\xd1\x04\x36\x53\x38\x4b\x66\x0d\x26\x3c\x99\x34\x09\x24\xa3\x09\x55\x16\x4f\x17\x0d\x82\x57\x20\x07\xca\xa9\xaf\x56\xfa\x25\x37\xb4\xa9\x46\x74\x4e\x78\x72\x8d\xd9\x1c\xd6\x17\x35\x1d\x5d\x31\xfd\x21\x9a\x63\x89\xa0\x32\x49\x4b\x6a\x92\xcb\x79\x5d\xb3\x51\x83\xe4\x3b\x69\x2c\x4f\x2c\xe3\x3f\x34\x91\xa4\x38\x21\x94\xc8\xde\x30\x19\x27\x0c\x5e\xa3\x44\xdd\x87\x2b\xb9\x13\x53\x02\x6b\x2c\x58\x79\x60\x6c\xb0\x12\x49\xf7\x13\x01\x04\xa9\x60\x4e\xe4\xbf\xca\x19\xa9\x4c\x9d\x41\x2e\xf8\x57\x35\x4b\x71\x66\x0b\xd6\x67\x8a\xc8\x7c\x78\xb7\x94\x7f\xf5\x49\xa2\x8f\xf3\xa3\x21\xd0\xa4\x54\x1e\x60\x89\x21\xd0\xfa\xf3\x73\x22\xe8\x6b\xa2\x48\x6a\x32\x17\x67\xa2\x20\xaa\x89\xe0\x55\xaf\x10\x9f\x34\xd2\x58\x44\x9e\xb0\x6a\xf5\x12\x36\xbf\xd0\xbf\x3e\x27\x97\xb4\x41\x6a\x94\x17\x70\x74\xa5\x7e\xc9\x25\x98\x13\xe9\xe3\xc5\x0c\xe2\xc9\x10\xd0\x39\xaf\x10\xe1\x89\xf2\x3e\x94\x5c\xcc\x6b\xb9\x7e\x64\x3e\x95\x7f\x3f\x27\xb0\xc6\x63\x52\xa3\x4b\xae\x7e\x8d\x90\x90\xc8\xd5\x6f\x65\xc4\x2b\x7f\xfe\x7d\xce\x38\xbe\x5c\x24\x9f\x35\x1c\xd5\x5a\x2b\x50\xb7\xeb\x02\x72\x01\xea\x4f\x94\x88\x3f\xc6\xe5\xe0\x70\x43\xc7\x43\xcb\x1d\x60\x55\x58\xa0\x2c\x05\xe2\xd2\xcb\x84\x63\xb2\x98\x8e\xd0\x71\x44\x49\x71\xa8\xf3\xcc\xdf\x62\x8a\x49\xf1\x77\x66\x38\x07\xa7\x5b\xad\xa3\x36\xe5\x2a\x3a\x2d\x9e\x5f\x0b\x1e\xb3\xa2\xd3\x97\x14\x56\xd2\xf7\x68\x6e\xb2\x2f\x20\x43\xef\xde\xbc\x2c\xc1\xe1\x21\xd8\xef\xa8\xb7\x29\xe3\xfb\xb6\x6b\x60\x2b\x29\xbe\xa5\x04\x62\x10\x6d\x2a\x26\x98\x4b\x01\x77\xd8\x49\x79\x70\xa8\x3a\xdb\x89\xba\x91\x7c\x05\x09\x1c\xa3\xa6\x40\xb7\x68\x74\xaa\x1c\x3f\xa5\x60\x3a\x42\x6f\xa4\xae\xd8\xb8\x71\x92\x5c\x49\xe4\x72\xd3\xf3\xb1\xb4\xda\x9d\x50\xb4\x57\xd1\x5e\xb4\xe1\xbc\x75\x04\x2b\xc0\x37\x46\xd2\x73\x15\x22\x3c\x0d\xf4\xfb\xc4\x73\xf7\xc0\x73\x23\x87\x12\xeb\xf4\x76\xb2\x81\x1f\x23\x01\x60\x65\x09\xa9\x3a\x61\xbd\x6e\x8a\x34\x3b\xbb\xdd\x6c\x4c\x37\x5d\x8f\x6e\xaa\x9d\xf6\x8a\xc3\xbd\x09\xdb\xdb\xe3\x85\x1e\xc1\xd7\x75\x75\x24\xa4\xfc\x2d\x27\xb8\xd6\x39\x12\xf3\xd6\xf0\x71\xee\xaa\x3d\x11\xf3\x0f\x2a\x0d\xcb\x98\x2d\xea\xcf\x81\x20\x9d\x3d\x97\xd4\xca\xb3\xd1\x88\x12\xc6\x21\x59\x19\xa1\x7f\xab\x9b\x6d\x79\x51\xd5\xbd\xbc\xce\xe9\x97\xf5\x96\xd4\x5e\x64\xd3\xf6\xfa\x7a\x02\xd9\xeb\xf9\x45\x8d\x47\xca\x2e\x55\x8a\x5d\x22\xad\xa1\x5c\xbe\xca\x08\x93\xa5\xf1\xbe\x93\x78\xcf\x2b\xdb\x99\xdb\xa7\x8d\xd6\x38\x0b\x7a\x75\x32\xdc\x7e\xcb\xf7\x1f\xb7\xba\xe9\x35\x21\xc0\x72\x22\x1a\x94\xad\xba\xb1\xea\xb9\x87\x8f\x5a\x2c\x55\x06\xc4\x82\x07\x03\x99\xbc\xf6\x32\x9e\x8d\x5e\xd8\x8c\x42\x01\x6e\x6f\xcf\x73\xf7\xcd\xad\xd6\x77\xa3\x26\xd4\xc4\xf6\xf6\xe8\x43\xda\xd0\x50\xdb\xdb\x63\x7e\x2b\xde\x25\xb3\x07\x72\xe0\xbf\x7b\x0d\x01\xaf\xc2\x3c\x38\xd9\x2e\xf8\x65\xfc\xfc\x36\x33\xc4\x20\x57\x27\xe1\xf5\xa9\xef\xf8\x40\xf6\x74\x10\xd6\x0f\xda\x77\x1a\xf0\x72\x56\xb5\x10\x4e\xc0\x6d\xc3\xcf\x73\x5b\x71\x8e\xca\xf5\x14\x4e\x33\x62\x87\x97\xb4\x39\x30\xee\x26\x57\x9b\xb7\x28\xef\x20\x5b\x50\x8d\x29\xad\x60\xfd\xd5\x0d\x5b\xa2\x1e\xd5\xe6\x0c\x35\xfd\xfe\x22\xe4\x05\x48\x96\x33\x4e\x9b\x1e\xa3\x97\x2c\x97\xfb\xae\xbf\x09\x6d\xa3\x9f\xe5\xda\x05\x7a\x5f\x33\x6b\x74\x86\x33\x4c\x08\xaa\x7a\xc7\x30\xa1\x37\x6f\x05\x83\x2f\xaf\x92\x26\xf4\xe6\x99\x5e\x38\xc9\x11\x3d\x80\x80\x61\x65\xa8\x5d\xde\x61\xf6\x5a\x8d\x60\xf7\x48\x8c\x45\x45\xa5\x21\xe8\xc6\xc4\x6c\xd5\x88\x0a\xaf\xd1\x5b\x2d\x9e\x94\x77\x26\xe0\x4d\xa5\xc5\x39\x79\xf5\x05\x36\xb5\x5f\x59\xaf\xb2\xeb\x3c\xa8\xb7\xe8\xea\x9e\xf1\x0a\x72\x20\x13\xfc\x8c\xce\x57\x53\x49\xdd\x58\x2e\xdd\x30\x40\xc6\x7d\xa5\x06\x41\x21\x67\xed\x3a\xf6\xb7\x39\x06\x36\x20\x57\xf6\x1b\xdd\x12\x1a\x50\x36\x7c\x8c\x0e\x05\x98\xf3\x58\x18\xcf\x76\xcb\xbb\xe0\x2c\xc2\x38\x7a\xd6\x15\xac\x6d\x2c\x5e\xcf\x81\x7e\xb4\x3a\xba\x1d\xa1\x66\xc6\xd7\x2a\x53\x37\x44\x19\xb9\xb7\xcf\xc8\x6c\xce\x5f\xc8\xdb\x5f\xf0\x8d\xe9\xe9\xc0\x08\xae\x07\x6a\xff\xe7\xe0\x1b\x82\x6e\xda\x54\x35\x8f\x47\x10\x32\xe2\xf6\x26\x8e\xb4\x60\xf0\xe0\x19\xaa\x51\xe4\x79\x89\x1c\xde\x69\x4d\x19\x72\x47\x5f\xc9\xc2\x7a\xec\x3e\x13\xe9\xb7\xd7\x7a\x91\xc0\x84\x9b\xac\x61\x57\xb6\x93\xea\x06\x55\xf4\x1d\x99\x61\xb2\x6a\x1b\xf8\x98\x3c\x17\xc5\xcf\x38\x9a\xa6\x5e\xa6\x8b\xa7\x91\x10\x34\xed\xcd\xbd\x9d\xd3\x0c\x93\x83\x0b\x69\x09\x0c\xb2\x42\xd3\xeb\x14\x54\x98\xcd\x28\x43\x60\x15\xa6\x3b\xb7\x9b\xe1\x0e\x01\xb2\xa2\x74\xe1\xf4\xd3\x5c\x33\x41\x6c\x22\xcb\xa9\xcb\x4a\x10\x47\x7c\x09\xb3\x3e\x30\xe4\xa8\xbc\x13\x30\x8a\x4c\xd8\x6c\xae\xcc\x46\xcc\x3d\xab\x86\x11\x44\x97\x51\xb3\x14\x39\xf6\x0a\x48\x02\x2e\x73\x97\x5d\xdf\xb2\x16\xe6\x06\xe2\x1d\xaf\x65\xe8\xb1\x21\x3b\xe8\x85\xac\x4b\xb0\xee\x05\x62\x29\x59\x52\x72\xee\xd0\x87\x95\x2c\x65\x87\xfe\xf8\xee\x27\x7b\xe9\x8c\x31\xb4\x34\xee\x3a\x9d\x60\xa4\x91\x2d\xbf\x51\x40\x52\x7c\x99\xee\x3a\x56\x88\x2e\xd0\x63\x4d\xaa\xfd\x1f\x69\x35\xef\xa9\x27\x86\xbf\xb2\xde\x4a\xb2\x0c\xfa\x0b\x78\xf4\x17\x80\x88\xff\x62\x7f\x41\x40\x26\xd8\x21\x97\x9a\x76\x48\x51\x40\x48\xe5\xb2\xae\x9e\xd6\x6a\x08\x2f\x95\xe0\xbb\xb3\x29\x5b\xa8\xa3\x71\xaf\xe2\x09\xd7\x31\x7f\xeb\xb9\x48\x25\x96\xaa\x9b\xf0\xdf\x41\x8e\x44\x11\x89\xf2\x4e\xf1\x7a\x2b\x8d\xa0\x2d\xbf\x57\xd3\x11\xac\xcf\x39\x6d\xe0\xb8\x97\x77\x34\xcb\xb4\xba\x49\xeb\xce\xe3\x0b\x33\x91\x4e\x0c\xfe\x7c\x44\x67\x0b\x4b\x22\x64\x70\x84\xd9\xe2\x35\x6a\xa6\x58\xf5\xaf\x53\xec\xe9\xb6\x7b\xa4\xf9\x60\xc4\x39\x26\x63\xd6\xbd\x59\xb6\x75\x59\xe4\x82\xd9\x25\xb8\x6d\xc1\x42\x36\xf9\xab\x8a\x3f\xe6\xfa\x7d\xea\x94\x51\x4a\x22\xa0\x44\x1b\x71\x06\x9f\xbb\x73\xc1\xe4\x1a\x73\xf4\x7c\x0a\x71\xdd\x7e\xbe\x42\x8c\x89\x95\x01\x40\x88\xfc\x66\xaa\xdd\x81\x1b\xe0\xaf\x19\xb6\x2d\xe6\xc8\x5d\xcb\x2c\x97\xe4\xea\x19\x1d\x99\xa1\xb8\xdf\xca\xb3\xf0\xee\x91\xc5\x02\xa7\x5c\x90\x64\x8b\x9a\xc0\x53\x76\x69\xa4\x17\x7e\x3a\xfb\x8d\x12\xf4\xa0\x88\x9e\x78\x3a\x93\x8f\x2f\xcd\x8a\xb6\x5a\x09\x95\x73\x2e\xaf\x9e\x6d\xe2\xa8\xa6\x04\x55\x12\xca\xe5\x1d\xae\x5a\x09\x60\x73\x89\xe1\xcb\x89\x01\x8a\x3c\x65\x39\x29\x3f\x15\x0d\x52\x5a\x82\xae\x9a\x44\xbb\xf6\x35\x07\xea\x32\x73\x3c\xdc\x89\x33\x40\x0b\xd2\xbf\x1a\x4f\xc3\xc4\xb5\xfd\x71\x84\x0a\x09\x84\x3f\xb6\x44\x31\xf0\x2c\x3a\x3d\xfc\x07\x99\x35\x4a\x76\xcc\xc6\xbc\x12\x76\xda\xcf\x14\x19\x3c\x13\xb9\xf2\x6a\x41\x97\x48\xbf\x98\xe8\xa0\x74\x97\x1e\xe7\x9d\x83\x6f\xf4\xb7\xca\xd4\x6c\xc9\xca\x06\xd4\x7c\xda\x06\xbc\x54\x24\xe8\xc2\x17\x93\x3b\x72\xf7\xfd\x80\xc3\x94\xea\x3d\xab\x02\x11\xc6\xd2\x05\xdf\xa0\xdc\x2e\xb9\x1e\xf7\x4c\xb6\x72\x10\xa8\xac\xe8\xfb\x96\xa5\x6b\x7b\x0c\x7e\x46\x8b\x84\x4f\x50\x83\xf2\xe4\x2c\x81\xd3\x84\x4d\xa0\x74\x38\xc2\x27\x28\x71\x8d\x79\x14\x4b\xac\x40\xbb\x0f\x12\xf9\x99\xa4\x98\x24\x81\xf9\xac\x38\x6c\x0a\xa5\x78\xcf\xf6\x41\x96\xdc\x60\x3e\x91\xfe\x59\x18\x4d\x6e\x94\xdf\x9c\x0b\xca\x27\xc9\x88\xd6\x35\xbc\xa0\x0d\xe4\xd2\x77\x8e\x61\x64\x58\x01\x96\x39\x43\x7c\x3e\x3b\x93\x44\xc6\xb3\x44\xfe\x92\x70\xeb\xb3\x37\x6e\x45\x01\xef\x6a\xc2\xcc\x14\x91\x6a\x46\x31\xe1\x62\xb2\x87\x8a\x2e\x1e\xaa\xf3\xfe\x10\xec\xa3\x9c\x95\x04\xdd\x24\xcf\x74\x5f\x29\xf8\x46\x15\xb1\x5a\x34\x23\x10\xe4\x77\x13\x04\xa5\x6a\xf9\xee\xc4\x8d\x1e\x3c\x04\x3f\x21\xd8\xa0\x26\xb1\x66\x43\x61\xf8\x3c\xfd\x50\x31\x08\xa3\xa7\x9f\x88\x2c\xf3\x79\x53\x0f\x49\x3e\x45\x7c\x42\xab\x21\x98\x51\xc6\x41\x3e\x83\x0d\x9c\x2a\x9a\xab\x82\x7f\x28\x7d\x1e\x1c\x8d\xd0\x8c\xa3\xea\x05\xae\x11\x1b\x82\xa2\xa2\xa3\x5c\xfc\x73\x9b\x17\xd3\x2a\xb7\x81\x3e\xf2\x62\xc2\xa7\xf2\x9f\x1a\xe4\xa3\x1a\x8f\xae\xe4\x5b\xed\xdd\x41\x3e\x85\xb7\xb2\x2e\xfe\x0d\x0d\x8f\x06\xb2\x9b\xba\x46\xf5\xbb\x59\x4d\x61\xc5\x86\xdf\xe5\x73\xf9\xeb\xd5\x5c\x6c\x04\x51\xe5\x28\x87\x55\xa5\xae\xf6\x5e\x62\x72\xc5\xf4\xa3\x30\xaa\x7d\x0e\xfc\xd7\x1c\x49\x2e\x2d\x7e\x80\x51\x92\x02\x6d\x22\xdd\x35\x58\x26\x95\x2b\x84\x9f\xe9\x93\x4c\x90\x46\x81\xc1\x39\xb2\x4a\x15\xd1\x8a\xb2\x4d\xef\x35\x68\x06\xa7\x94\x5c\xa3\x46\x40\x5b\x3b\x4b\x4f\x2e\x65\x30\x19\xd5\x16\xf7\xda\x82\x55\x85\x2a\x65\x4e\xb2\xc9\x98\xa4\xcf\x45\x35\x28\x69\x79\x29\x03\x2d\x93\x14\x08\x66\x43\x2a\x0e\x02\xc7\xd6\x8a\x96\x08\x28\x87\x5a\xee\x16\x9f\x99\xaf\xd9\xf8\xca\x8a\x04\x45\x48\xff\xf7\x6a\x11\x00\xf8\xd2\x0a\x83\x07\x43\xf0\x2b\x68\x0b\xc4\x10\xe5\xe9\x12\x98\x99\x17\xb3\x46\x36\xaa\x0f\xa0\xb4\xcb\x89\x39\x9c\xb7\x0d\x0c\x66\x5f\xce\x1d\x26\x87\x63\x15\x32\x60\x05\x73\xa2\xea\xec\xe0\xcb\x54\x30\x31\xc4\x7d\x41\xb5\x01\x5b\x92\x0f\x76\xdb\xc7\x5c\x36\xb2\xbb\x39\x1f\x49\xfe\x06\x8d\xf0\x0c\x4b\x13\xc5\xf7\x1f\x97\x3b\xa8\xc0\xa4\x42\xb7\xbf\x5e\xa6\x20\x07\xd9\xd3\x83\x23\x19\x2a\xbc\x2d\x54\xa2\x82\xcd\x6a\xcc\x65\x76\x96\x3b\xc5\x7f\xd4\xc5\xc5\x20\xdd\x1a\xed\x78\xe3\xed\xfc\x28\xda\xe9\xad\x84\x6c\x28\xdc\xbd\x3d\xaf\xc0\x6c\xce\x26\x29\xf2\x03\x0e\xb7\x90\x6e\xb5\x11\x2d\xba\xb6\x56\xea\xe2\xcc\x47\x21\x43\xac\xce\x3c\xb6\x7e\xaf\xfb\x4c\x53\xbf\xba\x64\x19\x53\x60\x44\xb8\x31\x1d\x22\x7c\x4d\x37\x6b\xd4\x17\x06\x49\x43\x7d\xee\x66\x48\xaa\xc5\x05\x97\x8f\xf6\x50\x32\x90\x28\x75\xd8\xe2\x52\x3e\xb2\x52\xec\xb9\xfe\x8b\x3c\xf7\x44\x41\x2d\xb9\x28\x8e\xa2\xb0\xcb\xc3\xf6\x03\xd3\x57\x36\xb7\x0d\x83\x2c\xba\x8e\xfd\xa0\xf7\x75\xd8\x21\xe8\x63\x63\xda\x00\xf2\x13\x7a\xf3\x5c\x8b\xb5\xaf\x44\xc3\x71\x7d\xfa\xaf\x33\x44\x52\xf0\x8d\x14\x80\x05\x47\x64\xb8\xf1\x3b\x36\xa1\x37\x43\x41\x69\xdc\x4c\x73\x17\x40\xc9\x49\x55\x99\xd6\x7b\x2c\x4a\x76\x7a\xd6\xd8\x5d\x43\x57\xee\x0e\xb4\x93\xc4\x3e\x6d\x6b\x17\xaf\x23\xa6\x2b\x42\x2b\xdf\xb1\xb5\xf0\x0a\x87\x6b\x15\x96\xab\x1b\xf2\x7c\x68\x7b\x03\x6b\x37\xae\xb7\x76\x21\xcc\xdc\xcd\x1d\x68\x90\x84\x44\xaa\xe4\x75\x78\xdd\x6a\x09\xe2\xbb\x1d\x0c\xfa\x5c\x9f\xcb\x92\x0d\x9d\x73\xd4\x48\x12\x0c\x09\xc3\x22\xf7\x2d\x75\xee\xd8\xcc\xf9\xe2\xb4\xe8\xa5\xb0\x7a\xae\x82\xf1\xdb\x53\xc8\x3e\x14\x93\x39\x26\x8c\xc9\x84\xde\xbc\x6d\xb5\x1d\x71\x0c\xf2\x55\x2c\x12\xd2\xdd\x37\xa7\xfa\x18\x34\x2a\x12\x1d\x8c\x21\xef\xa0\x60\xab\x1b\x8d\x63\xa1\x97\xdf\x22\xa2\x0a\x24\xd7\x55\x9b\xf3\xc7\x18\x63\x27\xd9\xbb\xfa\x0f\xb5\x3e\xfa\x2d\xad\xde\x1e\x0e\xf4\x1e\xb0\x43\x02\x8d\xd3\x06\x9b\x24\xa6\xa3\x8a\xee\x93\x08\x40\xed\x56\x09\x0d\xe5\x3a\x53\x95\x36\x77\xe6\x3d\xfd\x71\xdb\xe8\x0d\xae\xc6\x88\x4b\xbb\xa6\x83\x99\x0e\xea\xdf\x43\xad\xdc\xd7\xda\x3d\x83\xf6\xf6\x64\x08\x8a\x9e\x6d\x19\xc1\xa3\x47\xda\x99\xec\x77\xde\x97\x76\x63\x2a\xb9\x65\x23\xc2\xde\xca\xba\x9d\x3d\xd5\xc2\xd6\x08\xfa\xa9\xb7\x2d\x65\x57\xf1\x36\x3a\x9c\xc8\x66\xef\x73\xcc\x0b\xc9\x8e\xfc\xb5\xd2\x28\xd1\xd5\x74\x86\x6c\x69\xa8\x1e\x95\x41\x19\x1d\x33\x24\x2d\x37\xca\x30\x17\x60\x9f\xef\x03\x19\xe4\x22\x57\x46\x53\xa9\xf7\xc4\xd2\xeb\x26\x47\xdd\x2c\xb7\x9b\x9c\x44\x26\x82\xaa\xc7\x9c\x07\xbe\x4c\xfd\xa9\x9c\x2b\x41\xfb\x72\x5e\xd7\x8b\x64\xa4\xe6\x85\x2a\x31\x2d\x39\x21\x3a\x7b\xd8\x7c\x72\x97\x93\x8f\x5d\xb9\x77\xd0\xc0\x67\x80\xde\xa0\xcb\x06\xb1\x89\xbc\x66\x97\xc1\xdc\x67\x88\xc4\xc9\xf2\x06\xbc\x5f\x84\xdc\x84\x17\x8d\x7d\x94\x32\x7c\x7d\x8f\xf4\x30\x23\x7c\x57\x78\x61\xa7\xc9\x9e\xb5\x50\x2c\xa6\xf0\x0a\x9d\xd7\xf3\x71\xaa\x7d\x73\x68\x9d\x9a\x3b\xf1\xb5\xfb\x3e\x4a\x4a\xc2\x44\xbd\xfb\x51\xce\xcc\xad\xdf\xc6\xc6\x60\x5a\x73\x7e\x5f\x4f\x47\x51\x7b\xd0\x2f\x71\x87\x17\x77\x60\xf4\xb0\xcb\xad\x09\x64\xa7\x35\x25\xa1\x23\xa2\x82\x50\x2e\xb9\xd3\x14\x38\x37\x22\x0a\xf2\x4e\xc2\x3d\x6f\x66\x1e\xaa\x54\x6f\x0f\x4b\x58\x55\x9a\xad\xd7\x08\xa8\x14\x6a\x13\x7a\x53\x5c\x68\x84\xf5\x95\x4f\xdb\x10\x5b\xff\xe6\xd9\x93\x1e\x8c\x98\x20\xc9\xb1\xa3\xa6\x92\xb0\x3c\x9f\xd9\xf0\xbc\x3d\x2f\xc3\x1d\x10\xaa\xc0\x6f\x92\xdf\x51\x20\xbd\x8f\x90\xf7\x4b\x57\xb8\x0b\x97\xcd\xe3\x7a\x50\xc4\xeb\x45\x67\x8e\xab\x25\xa4\x7c\xf7\x48\x6f\x76\x65\x0e\x87\x72\x39\xf7\xb3\x67\x43\xe2\xa3\xa1\x33\x24\x27\x59\x3e\xfe\xf7\x90\xd3\x2f\xd7\x66\xe8\x92\x16\x69\xfd\x72\xcf\xac\x65\xdc\xd2\x91\x4e\x98\x2f\x9d\xf6\x00\x5e\xc5\x22\x5a\x01\x81\x4d\x6c\x2d\xba\x18\x28\xff\xa6\x60\x82\x2b\xb4\x59\x49\xab\x0e\xf3\x0d\xf8\x35\x42\x80\x2c\x65\x9b\x18\xf0\x1b\x8a\x46\xe0\xf5\xc1\x05\xec\x73\xdc\x16\xda\xc4\xfb\x74\xeb\x8b\xd8\xf3\x2b\x45\xe3\x86\xc6\x05\x6b\x03\xa1\xad\x34\x13\x58\x69\xcf\xba\xda\x48\x00\x49\x1f\x15\x2f\xe9\x98\xce\xa5\xdf\x92\x09\x64\xaf\x31\x09\xaf\xcd\x1d\xba\x38\xc3\x32\xf2\xea\x04\xda\x8b\xd2\x15\x85\x99\x29\xa2\x6a\x38\xf6\x9a\x2b\x2a\x55\x4e\x29\xd0\x75\xaf\x86\x2f\xd3\x0d\xef\xee\xc4\x50\xed\x0d\xb7\x77\xf1\x23\xce\xae\xd7\x0d\xbd\xc6\x12\xfa\x9e\x89\xfa\x89\x93\x55\xfc\x15\x2d\x46\x35\x85\x57\x5d\x53\x2a\xb7\xa5\x53\xed\x0d\x62\xc7\x0f\x80\xec\xa9\x05\x1c\x30\x83\x7c\x97\x17\x15\x66\x6d\x4a\xb6\x7c\x94\xfb\x56\xef\x8a\xc9\xf7\x51\x62\x6f\xd7\xac\xd6\x58\x3f\xe6\xbb\x40\xae\xde\x58\xb6\x93\x03\xc9\xd9\x6b\xf0\xb7\xac\xbe\x48\x90\x57\xc3\xf6\x6b\xed\xc5\x04\x66\xfa\x02\x56\x0c\xc1\xb5\xf8\xb0\x19\x98\x8c\x03\x5b\x10\xa3\x6f\x1f\x23\xfe\x8e\xa1\x46\xf5\x1a\xf3\x2c\x13\xed\x21\xde\x7c\xda\xaa\xd4\x3d\x2f\x53\x2d\x7e\x4a\x37\x5c\x35\x47\x8d\xe4\xfe\x98\x26\x95\xbb\x83\xd6\xf1\x8e\x87\x96\x41\x71\x4b\x8e\x65\x8d\xc7\x79\x5a\xe7\xad\xd6\x9c\x44\xd7\xcb\x3d\x85\xff\x3e\x9f\xce\xde\x52\xef\xaa\xa4\x95\x25\xdc\x77\x19\x67\xfa\x3a\xd4\x37\xa7\x3c\xd3\x87\xe5\xa7\x02\xb3\xe7\x46\x47\x70\xd7\x11\xe7\x05\xa5\x01\x59\x31\x43\xe8\xea\x0d\x1a\xd1\xa6\xb2\x44\xcc\xf2\xcb\xab\xb8\x5b\x5b\x36\x67\xbe\x8c\x2a\x6d\x02\xc3\xa0\xa9\x0f\xed\xcd\x91\xa1\x73\xea\xf6\x97\x93\xdc\x31\x2e\xdf\x86\x71\xe6\x07\x1a\xe0\x5f\xf5\x6d\x98\xf4\xa1\x2d\x0e\x76\x36\x7c\x0f\x46\xb4\x06\xb9\xf8\xf7\x80\x4d\x0f\xbe\x07\x1f\xb7\x18\x7b\x8d\xc9\xd5\x1f\x65\xe4\xff\xb1\xd5\xc8\xf5\xaf\x3f\xd6\x8b\xbc\x39\x3e\x50\x02\xe7\xd7\x05\x29\x63\x2a\x20\x10\x00\xf9\xac\xa1\xd3\x19\x57\xf2\x88\x0a\x0c\xfe\xdf\xa2\xa9\xd7\x90\x4f\x86\x52\x88\x55\x89\x2f\xe1\x05\xaa\x55\xa2\xb2\x6f\x85\xc1\x93\xce\xec\x6e\x99\x7f\xb2\x6f\x64\xc3\xb3\xb9\x41\xb0\x62\x46\xb8\x56\xbc\xa9\x25\x3b\xa3\xc0\x5f\x95\x77\x54\xfe\x8b\xa9\x04\xb2\xf7\x83\x8f\x85\x91\xce\xcf\x48\x85\x6e\xc3\xc0\xf7\x5c\xee\xc5\xf7\xbb\xbb\xce\x59\x20\x67\x07\xb2\x63\x7e\x70\x34\xe4\x1f\x1d\x4e\xb7\x1d\x6b\x40\x09\xa0\x7d\xff\xb9\x09\xf3\x38\xc7\x62\x0d\xe1\x35\xe4\xbd\x9c\x63\x60\xff\xfa\xe5\x19\x47\xe7\x31\x93\x34\xa8\x13\xf2\x59\xc4\xfd\x66\x70\xb9\xbb\xe1\x54\x47\xda\x23\xe1\x57\x45\x58\x0e\xc7\x4a\x52\x67\x33\x48\x80\x27\x37\x4a\x4f\x38\x51\x5f\xa1\x8e\xee\xbc\xab\xde\x11\x27\xc6\xa6\x53\xae\x30\xac\xe9\x78\xa5\x5c\x10\x35\x4a\xfe\x32\x7b\x57\xe1\xb9\x32\x45\x18\xc9\x57\xd6\x36\xe6\xb0\x7e\x74\x9d\x4b\xe7\x62\xcd\xd4\xa6\xff\xfa\x57\x90\x4b\xfd\xd1\x10\x9c\xaa\x2c\x90\x2b\x55\xec\x51\xae\x8c\x0c\xde\x4a\x97\x86\x17\x9c\x1c\x30\x19\xc8\x06\x36\x0b\x90\x4b\x4b\x1e\x19\xf4\xf8\xc1\x8c\x25\x73\xb6\xa8\xb4\xe5\xd0\x43\x54\x12\xdd\x01\xd8\x47\x9e\xe2\xeb\xac\x4a\x8f\x06\xda\x86\xf0\xdd\xac\x82\xfc\x1e\x6e\xa3\x76\x62\xfe\xf0\xdb\x21\x48\x56\xc5\xc1\x8b\x09\xbd\x01\xce\x1b\x02\x6e\x84\xcc\xbb\x65\x2b\x8a\xda\x44\x5d\x7c\xa7\xdf\xa7\xfd\x04\x57\x15\x22\x31\x5d\x0a\xb1\xae\xd8\x64\x23\xf2\xa6\xa1\xdb\x81\x15\x6d\x97\xc1\xa5\x2c\xef\x93\x93\x63\x75\xbd\x9d\xd2\x79\xaf\x1f\xf7\x16\xef\x80\x28\xd6\x62\xf4\x31\xbf\x00\x65\x47\xe3\x92\x6b\xcf\xa3\x9e\x6c\xae\x89\xab\xef\x2c\xc0\x3e\xb9\xf7\x02\x22\x58\xf0\x6c\xc2\x5d\xa9\x9d\xea\xde\xfd\x7c\x4d\xfa\x24\x8e\xc4\x17\x18\xd5\xd5\x10\x08\x69\x69\x4c\xd5\xf6\x21\xe3\xda\xa8\xb3\x76\x8f\xf2\x29\xbc\xfd\x19\xe1\xf1\x84\x0f\x07\xf6\xf2\x50\x9d\xbb\x32\x4c\xc5\x29\xeb\x9a\x9a\xdb\x2a\x2b\x3d\x9a\xb7\xa5\xda\xa7\x24\x4f\x07\xc7\x80\x5e\xa3\xe6\xb2\xa6\x37\x07\x8b\x61\xc2\x46\x0d\xad\xeb\x1f\x93\x29\xbc\x3d\x98\xa8\x51\xa8\x5b\x89\xd9\xed\x8f\x60\x08\xc0\x7d\xbc\x90\x7b\xe8\xf5\x96\x8e\xc7\x35\x0a\xb1\x42\x3b\x07\x76\x17\xfb\x5c\x1f\xe7\xad\x1c\xae\x36\xa0\x03\x2d\x90\x45\xae\x30\x38\x9a\xaa\x3b\x96\xd8\x2d\xaa\xe7\x74\x23\x7a\xdf\xcb\xda\x46\x72\x94\x2d\xfb\x2a\xf0\xee\x31\x21\x05\x8b\xd8\x0c\x52\xbe\x05\x6a\x36\xb0\xc2\xf4\xf7\x3c\x34\xb5\x3b\x24\x90\x53\x22\xc3\xf9\x29\xd4\x5b\x75\x94\xea\xf5\x0b\xb6\xb0\xac\x1c\xee\x60\x9d\xe8\xac\xa7\xec\xce\x80\x2f\x79\xdc\x53\x99\xa1\xe6\x80\x38\x8e\x52\x57\x1e\xcd\x53\xcc\x46\x5f\xe3\x60\xfe\x12\xca\xfc\x98\xae\x45\x4e\x7c\xf1\x4e\x3a\xe2\xd5\xca\x96\xc0\x6f\xec\x86\xa6\xeb\x71\xd5\x80\xd3\x7c\xb6\xcc\xc3\xa6\x3b\x9a\x01\xa5\x39\xf7\x3c\xb1\xba\x2b\x23\x76\x2c\x0b\x5d\x3c\x4c\x5a\x47\xe9\x6e\xc9\x5c\x9f\xd9\xd4\x72\xfe\x45\x77\xa5\x85\x14\xd0\x06\xff\x77\xed\xd2\x48\xf1\x2f\x29\xcd\xa4\x13\xdd\x34\x6b\x1f\x6b\x15\xd2\x3b\xf3\x35\xac\xd3\x0e\x05\x25\xf1\xf1\x72\xc7\xc6\x2e\xe5\x5a\x97\x7d\xc2\xd3\x81\xf5\x23\x13\x8c\x9b\x6b\x8b\x3d\x6e\xcd\xf4\xf4\x58\xc4\x09\x9d\x66\xcb\xfc\xc9\x0f\x83\x41\x1e\xef\xcd\x5c\x7a\x2e\x37\x61\xc0\x05\x34\x66\x0d\x55\xf6\xc5\x6b\xfd\x2f\x7c\x55\x41\x63\x02\x99\x0c\x75\x48\xec\xdb\xa4\x40\x02\x54\xf7\x27\xd2\x8f\x64\x5d\x5c\x9a\xa2\x4a\xab\xfb\x12\x6e\x5a\xb1\x86\x6e\x3d\x69\xdc\x18\xab\x64\x8a\x2b\x6b\xc1\x95\x67\xa7\x53\x2e\xf3\xe3\x77\x18\x2d\x96\x0e\x0b\xa2\xbc\x3c\x41\x5c\x2b\xd3\xeb\x09\x64\xaf\x75\x50\xd6\xf8\x08\x66\x6e\x2e\xc8\xed\x77\x61\x7e\x80\xfc\x6e\x8c\x78\xc4\x1f\xbc\xe9\xfe\x75\x83\x18\x22\xdc\x0b\x1d\xe5\xb6\x99\x65\xc7\xda\x78\x7d\x18\x8c\xb8\x53\xa1\xed\x34\xcb\x8e\x05\x51\x1f\x4a\x8b\x9c\xc1\x52\xcd\x44\x4b\x05\xab\x27\x34\x8a\x14\xba\xc7\x1c\xa2\xcd\x88\xa9\x38\xf7\x44\xf2\x35\xd8\xbd\xe3\xa2\x98\xb9\x96\x77\xe6\x97\xba\xe2\x95\xfd\xea\x77\x15\x60\xe9\x70\x2f\x0c\x5e\xf7\xe8\x1f\x02\xdf\xf3\x1d\x60\x06\x5e\xa9\x75\xbe\xdb\x95\x12\x34\xfa\xd6\xa7\xb3\x1d\x22\xf7\x8b\x4e\xae\x35\x92\x5a\xdb\x64\xbb\x51\x22\x2d\xb6\x99\x9b\x37\xa8\xb7\x48\xa4\x35\x63\x92\x1b\x69\xca\xac\x3e\xb2\x7e\xd1\x1c\xd5\xb0\xd7\x10\xd3\xce\xbc\xf2\x1e\x34\x33\x11\x04\x9c\x6b\xc1\xa0\xe0\xaa\xc9\xb8\xfd\x9b\x31\xf5\x8f\x20\xdc\xb9\xdd\xae\x67\xd1\x3e\x77\x6d\xa7\xff\x98\xc3\x5a\xfa\x0f\x7b\xd4\x2e\xfe\xff\xec\xbd\xeb\x72\xdb\xb8\xba\x20\xfa\xdf\x4f\x41\x73\x66\xdc\xe2\x84\x92\xed\x74\xfa\xa6\xb5\xb5\x73\xdc\x4e\x7a\x75\xd6\x4a\xd2\xde\x71\xd2\x6b\xaf\x71\x5c\x3d\x10\x09\x49\x68\x53\x80\x9a\x80\xec\xb8\x1d\x55\x9d\x5f\xe7\x01\x4e\x9d\x07\x98\x67\x99\x47\x99\x27\x39\x85\x2b\x41\x12\xbc\x49\xf2\x6d\x75\x57\xaa\x62\x91\xc4\xf5\xc3\x07\xe0\xbb\x7f\x45\x51\x7a\x56\xc4\x12\x5f\x71\x5c\x16\x9a\xcf\xc1\x04\x61\x90\x24\xd7\x65\xdb\x6d\x45\xf5\x3a\x0e\xa4\xcc\x22\xb9\x58\x26\x87\xd2\xbc\x5c\x5d\xa0\x70\xa5\x23\xb5\x23\x88\x6d\x8b\xee\x55\x2c\xb7\x1c\xa4\xaa\xac\x29\x30\x15\x0c\x09\x29\x71\xc6\xcd\x5b\x82\xe1\xf0\x20\x7c\x4d\xa2\x8b\xe1\x61\xf8\x4e\x24\x09\x1d\x3e\x0d\xf9\x6b\x21\xce\x1c\xfa\x52\x09\x42\x3d\xe1\x3e\xcc\x18\x8c\x85\xbf\x1a\x59\x32\x0f\x2c\x16\x29\xb9\xe4\x8c\x3b\xaf\xae\x8a\xf3\x9f\x30\x0e\xbd\x48\x55\xc3\x84\x65\x55\x7d\xd5\x43\xa1\xe9\x14\xfe\xb6\x44\x29\x34\x0d\x7a\x63\x38\x21\x29\xf4\x64\x88\x28\x09\xcf\x55\x78\xa4\xbe\xe6\x06\x7e\x84\xaf\xc7\x24\xbe\x1e\x1e\x86\x6f\xc0\xaf\x24\x45\xec\x7a\xf8\x34\xfc\x80\x01\x46\x73\xb2\xa4\xc3\x2f\x75\x01\xd5\xa3\x6e\x43\x77\x19\x7b\x93\x94\xcc\x3d\x80\xaf\x55\xe7\x9c\x62\xd4\x2d\xa9\x3a\xfa\x31\x1b\x5e\xa1\xb2\xaa\x48\xfd\xac\x63\x55\xd5\x3c\x57\xd6\x4d\x12\xab\xfe\x2a\x94\x10\x91\xf9\x7b\x6f\x4e\xa4\xcb\x09\x8c\x87\x07\xe1\x09\xc4\x22\x62\xf4\x61\xf8\x01\xc7\x30\x35\x0b\xf5\x4e\x78\xea\xc2\x78\xf8\xa5\x2e\xf2\x16\x5e\x0d\x9f\xad\xc2\x13\x30\x85\x12\x52\xef\xc1\x78\xe8\x33\x30\xf6\xc3\x53\x25\x78\x36\x39\xc7\x56\x2b\x4e\xca\x69\x0a\xe6\xc6\xe0\xe2\x10\xae\xea\xb1\x16\xde\x31\xda\x1e\x59\x28\xfb\x0e\x82\x78\x78\x18\xfe\x00\x61\x2c\xc2\x8e\x3e\x0d\x8f\x09\x66\x29\x1a\x2f\x19\xe4\x0b\xae\x20\xad\x92\xaf\x0f\x9f\xa9\x37\x30\x1e\x7e\x95\x81\xeb\xeb\xc2\xd4\x61\xd3\xdc\x67\x30\x59\xc0\x94\xee\x03\x1c\xe7\xe9\x4a\x91\x18\xa4\xcf\xd2\x25\x9b\xf5\x75\x21\xbb\xf0\xc6\x24\x66\x65\x05\x35\x78\x3f\xbc\x81\x78\x39\x87\xa9\x76\x32\x74\x53\x1b\x86\x10\x5d\xd5\xb5\x29\xa6\xd7\xb2\x3d\x80\xe3\x8a\xe3\xcd\xcc\x7f\xb1\xe8\x2b\xbf\xc0\x0a\x62\x5c\xe6\x78\xd8\x87\xf8\x12\xa5\x04\x4b\x35\xa2\x02\x69\x94\xa0\xbe\xd5\x80\x62\x55\x53\x38\x85\x9f\x8a\x1a\x82\x10\x07\x37\xfa\xd9\xa3\x99\x46\xd6\x50\x3d\x9a\x5d\x39\xdc\xdb\x93\x44\xdd\xee\x28\xfb\x78\x76\x78\xfe\xdc\x7e\x18\xde\xac\xb2\x30\xa3\x9c\x3f\x39\x9d\x81\xe7\x64\x30\x17\x79\xdd\xf0\x40\x8d\xe7\x1d\x9c\xbe\xfc\xb4\xe0\xbc\xd6\x50\x96\xfa\x59\xbe\xb7\x4a\xd2\x19\xb0\x4a\x91\xd5\x1a\xdc\x05\x58\x2c\x54\xbb\x23\xaa\x38\x3f\xcb\x8a\xe2\xe4\x44\x8f\x66\xa7\xc8\x88\xfc\x28\x96\x60\x20\x57\xa2\x47\x6b\x97\x49\x8a\xc8\xfb\x20\x49\x5c\xa8\x1d\x11\x1c\x2d\xd3\x14\xe2\xe8\x7a\x5f\x63\x78\x09\xab\x0d\xf4\x6d\xae\x97\xf3\xa1\x0a\x90\x78\x6f\xcf\xd7\x65\xb2\xa0\xbf\x78\x20\xbb\x3e\x4a\x92\xcf\x9f\xe5\xb8\x01\xe5\xcc\x7e\xcf\x7f\x3f\x83\x9e\xa0\xea\x3c\xbd\x34\x1e\xbf\x68\x61\xec\x31\x22\x3c\xaf\xff\x67\x36\xea\xff\xe9\xc9\x61\x79\x74\x46\x96\x49\xec\x8d\xa1\x07\xbc\xf7\x80\x5e\x78\x24\x15\x7f\x45\x3e\x7a\xaf\xa7\x2f\xae\xdf\x96\x84\x41\x1a\xfc\x45\x38\x5d\xab\x56\xfd\x27\x58\x88\x99\x7b\x07\x21\x1c\x30\x40\x2f\x24\x00\x8f\x13\x42\x97\x29\x0c\x7a\xbe\x0d\x24\xdf\x0c\xdb\x0f\xcf\x70\x48\xcf\x83\x75\xd6\x56\x36\x22\xfb\x19\x61\x45\xba\xf8\x7c\x6e\x5f\x64\x9d\x7d\xe1\x99\xc8\xd5\x6a\x92\x57\x80\x7a\x08\x5f\x92\x0b\x18\xfb\x0d\xcb\x8e\x6b\x97\x5d\xeb\xe6\xf7\x39\xb3\xdc\x47\x51\x7e\x93\xe6\x0f\x73\xb3\xbe\x30\xdb\x5d\xfe\x12\x5f\x60\x72\x85\x07\x0b\x3c\xf5\x77\xe8\x15\x12\x39\x08\xcf\x0e\xce\x07\x8c\xbc\x26\x57\x30\x3d\x06\x14\xf6\x82\xe0\x26\x02\x14\xfa\xdf\xfc\xee\x0f\xd5\x0f\xb4\x50\x3f\x7f\x47\x8b\x4f\xd9\x4f\xf5\xeb\x0a\xa4\xea\x57\x6a\x7e\x31\xf3\x6b\x2a\x0a\xc2\x11\xaf\x20\x3b\x16\xe1\xbf\x77\xc4\x47\x70\x89\x54\xb1\x39\xb9\xd4\xbf\x16\xcf\x44\x79\x70\x89\x4a\xe5\x85\x87\x36\xff\x28\x92\xbc\x16\xbf\x46\x94\x8a\x8f\x11\xa5\xa5\x6f\x63\xc0\x54\xfb\x74\xa6\x7e\x2c\xa8\xf9\x71\xa8\x7e\x45\xfa\xd5\xe5\x58\x7f\x9b\xe9\x69\x8a\xf8\xfd\x6a\x4e\x44\xbf\xd3\xe5\x53\x53\xfe\xda\x7c\x22\x58\xb7\x2a\x2d\xa1\xe4\xc3\x27\x35\x83\x88\xc4\xb0\x3c\x4a\xa4\xeb\xc0\x4f\x50\xfd\x8a\x13\x59\x61\x8c\x70\xb9\xfc\xdc\x8c\x6e\x31\x35\xbf\xa0\xfe\x39\x45\x13\xbd\x1e\x68\xa2\x7f\xd2\x4b\xfd\x99\xb7\xa6\x21\x10\xab\x5f\x40\x2f\x08\xbd\x80\x2c\x9a\x89\x9e\x45\x4c\xf1\x52\xdf\x9f\x12\x3d\xf9\x4f\x09\xfd\x64\x00\x78\x29\xaa\x7c\x4a\xca\x4b\x90\x10\xdd\x1d\xfb\xa4\x17\x63\xae\xfb\x35\xe9\x07\x78\x6d\xf6\x89\x95\x6a\xcf\x17\x5f\x1a\x7c\x93\x7d\xcc\x17\x5f\x96\x4a\x2d\xe2\x89\xf8\xb6\x88\x27\xe5\x6f\x0b\xdd\xeb\x62\xc1\x3e\xc9\x62\x8b\x72\x47\x97\x06\x16\x97\x34\x96\xc5\x2e\x69\x5c\x2a\x16\x93\x48\x2f\x10\x89\x64\xb1\x98\x44\xa2\xd8\x4a\x9f\xa1\xf0\xaa\x22\x6d\x2a\x5c\xeb\xfc\xd1\xfb\xff\x07\x94\xc0\x57\x11\xc1\x23\x58\x12\x67\xe5\x8f\x13\x58\x7b\x9c\xc0\xdf\xda\x13\x46\x90\x73\x7f\x8f\x8c\x34\x92\x63\x6e\xdb\xa2\x28\xdd\x40\x1e\xc9\xc4\x01\x0c\xc6\xfd\x58\xf8\xa7\x75\x39\x7c\xd9\xd9\xe1\xb9\x15\xa5\xbc\x90\x14\x12\x8e\xfc\x17\xc4\x7b\xf3\xe6\xcd\x1b\xef\x9f\xff\xfc\xe7\x3f\x43\xef\xc7\x1f\x87\xf3\xb9\x1f\x84\x73\x32\x17\xa2\xa6\xb3\x83\x73\xe1\x6b\x37\x07\x6c\x4d\xec\x31\x83\x7f\x01\x18\xdc\x10\x75\xa6\x10\xc3\x14\x30\xd8\x47\xf1\x2d\xaa\x7f\xf2\x23\xb2\x9b\xd6\x1a\xc1\xb3\x83\xf3\x27\x7e\xdf\x7f\xc2\x81\x5b\xbf\x74\x53\xd6\x1e\xd9\xa7\xec\x91\x61\xfa\xb4\x7d\x73\x53\xd6\x80\xe3\x53\x06\xbb\x40\x0a\x3e\x3a\x50\xc1\x0e\xb0\x82\x0d\xc0\x42\xb4\x0f\xd2\x14\x5c\xb7\x87\x98\xa9\xf1\xb8\xc0\x86\xe8\x91\x9c\x67\xcb\x36\x55\xf9\x66\xf0\xa9\x43\x7a\xcb\x32\x89\xf2\x90\xf2\xc0\x46\x93\x9e\x18\x9f\x1e\x67\x96\x15\xdd\x63\x3b\x68\xd2\x3b\xbd\x9e\x8f\x49\x32\x40\x8c\x9f\x72\x24\xf5\x10\xf6\x8c\xae\x2f\x70\xb6\x28\x39\x28\x11\x92\x7e\xf7\x20\x24\xa3\xdd\xc3\x10\x8d\x24\xeb\x2a\x52\x91\x4f\x48\xda\xe3\x65\x40\x98\x8e\xd8\x59\xa1\xfd\xf3\x5e\xf0\x97\xdd\x1e\x1d\xf5\xc0\x28\x1d\x60\xf8\x89\xf5\x82\x60\x10\x13\x2c\xae\x06\xe5\x5c\x09\x06\x62\x96\x41\xb8\x0b\x3f\x7f\xd6\x7e\x85\x22\x1c\xc3\x5f\x78\x97\xc1\x5f\xb2\x3c\xe6\x84\x0f\x01\x8d\xd8\x4a\x49\x4b\x6f\xf8\x00\x76\xe9\xde\x5e\x3a\x90\x63\xcf\x7e\xf5\x02\x53\x08\x4d\x7a\x24\x60\xb3\x94\x5c\x79\x68\x65\x48\x98\x95\x98\xde\x8e\x7c\xcf\x09\x9a\xf7\xd7\x0b\xa9\xd3\xea\xf9\xaf\xa4\x66\xc3\xe3\xb7\xca\x7c\xc1\x38\xa3\x27\xc2\x52\x2d\x23\xb6\x4c\xa1\x87\x09\xee\x8b\x19\x8a\xbc\x34\x42\x5a\x13\x41\x3f\x58\xad\x7a\x41\x03\x1b\x54\x56\xc8\xc2\x1e\x0b\x9f\x1a\x5d\x16\x3e\x3b\x38\x1f\x8d\x46\xb8\xf1\xd4\x47\xb4\x8f\xc9\x16\xed\x50\xff\x44\xaf\x7f\x35\xf4\x92\x03\xd9\xe5\xf8\x75\x18\x9c\x1d\x34\xe3\x13\xc1\xb0\x4f\x26\x6d\x69\x3f\x34\xe9\x95\x13\xee\x5b\xca\x57\x19\xf8\x2d\x10\x99\x68\x94\xc8\x6b\xf4\x34\xd0\xab\x09\x85\x48\x26\xc4\xa3\xc3\xbf\xe0\x7f\xd3\x05\xfe\x82\x9f\x3c\x09\xd0\xa4\xc7\xce\xf0\x39\x5f\x1f\x35\x83\x03\xb5\x39\x76\x0f\xd7\x21\x0e\x11\xfd\x09\xc3\x9f\x26\x1b\x92\x85\x49\x07\x22\x2b\x79\x6c\x44\x56\x87\xe6\x12\x56\x11\x69\x38\x9b\x7c\x07\x22\x2b\x79\x74\x44\x56\xd2\x81\xc8\x4a\x1a\x89\x2c\x4c\x58\xbf\x0b\xaf\x2a\xcb\x3f\x3e\x7e\x15\x13\xf6\xf2\xb7\xd6\x2d\x8a\xd2\xcd\x90\xeb\x04\xb6\xc7\x07\xb0\x2e\xe0\x6a\x00\x16\x49\xdb\xc3\x8a\xa4\x8f\x0c\x54\xc2\xaa\xa5\x5d\x73\x24\x6d\x00\xd4\x02\xa6\x13\x92\xce\xb7\xa2\x7a\x08\xb1\xee\xb9\x52\x8e\x6f\xba\xcb\x7e\xf1\x6a\xeb\xdc\x72\xaa\x01\x2d\xc1\x6f\xb8\xeb\xea\x85\xf1\x8b\x64\x99\x82\x04\xfd\xee\x3c\xc8\x11\x9e\xc8\xec\xc8\xfb\x09\x1a\x3b\xaa\x6c\xd1\x8c\x2d\x5b\xff\x9a\xc1\xa6\x10\xc4\xfd\x05\x60\xb3\x3f\x49\xe1\x3f\x49\xe1\x36\x9c\x56\x48\x47\x9c\xc9\x0a\x89\x60\xb2\xf2\x36\x84\x53\xc8\x7a\x34\x24\x41\xfd\x29\x41\x11\x9e\x2e\x13\x90\x76\xda\x21\x76\xa5\xbb\xde\x23\xfc\xec\xb9\x17\x61\x66\x61\x23\x65\xe2\xcd\xe2\xc6\x79\xce\x86\xf2\xd5\x24\x25\xf3\x1e\x0b\x56\x3d\x26\xd2\x78\xf2\x85\x12\xd1\x36\x13\x14\xc1\xde\x61\xc6\x26\x0f\x7e\xe1\xa7\xf1\xb5\xb2\x2b\xc4\x61\xc1\x91\xa1\xb4\x31\x6f\x32\xc6\xe3\x20\xc4\x23\xf5\x5e\x9b\xf3\xfe\x05\x66\x3c\x08\x7c\xf2\x24\xc0\x67\xf0\x7c\xc4\xce\x60\xa6\x33\x5e\xe5\x06\x6e\x46\x49\x83\x06\x5c\x61\x68\x0e\xfb\x60\x4a\x6a\x6d\xde\x85\xc8\xbd\x8d\x1a\x3b\xd3\xb7\xf3\x76\x8f\xa6\x44\x4a\xcf\xd5\x28\xcd\x5e\x12\xed\x8d\x44\x5c\xcb\x1e\x1e\x89\x08\xad\xeb\xdc\x29\xaa\x8f\x0d\x6f\x13\x61\x06\x8d\x30\x62\x08\x24\x35\x26\x3a\x6e\xc5\x82\x60\x11\x1b\xf5\x0b\x9e\x2f\xc2\xb4\x67\x1f\x70\x20\x67\xce\x3f\xf4\xa0\x30\xc7\x17\x6a\xaa\xde\x41\x78\x18\x3c\xc1\x85\x17\xc1\x80\x91\x0f\x8b\x85\x56\x12\xaf\x03\x2a\x3e\xc9\x57\x6a\x8e\x1b\x72\x9a\x9f\xba\x50\x6b\x9f\x1e\x1d\xb9\xf6\xa9\x03\xbd\xf6\xa9\x92\x60\x53\xf8\x84\x7e\xaf\x35\xed\x71\x1b\xef\x58\x75\xfb\x13\xc0\x0f\xea\xeb\x06\x33\xa0\xcd\x83\x5e\x29\x8b\x0a\x6c\xdb\xcb\x84\x64\x44\x65\x50\x72\x34\xa2\x0e\xe3\x19\x95\x7e\xef\x68\xb1\xf0\x7e\xd6\xb3\xcb\xc6\x3e\x14\x54\xa5\x2a\x1b\xf4\x48\x88\x02\xa7\xb1\x58\x11\x52\x49\xbd\x13\x8e\xd3\x1a\xb4\xc1\xec\xae\xc9\x00\xca\xe4\xd1\x4e\xc8\x18\x24\x2f\x2f\x41\x32\xca\xf9\xa1\xeb\xef\xe0\x57\xf0\xe9\x14\xb2\xe5\xa2\x77\x13\xa5\x84\xd2\x17\x64\x0e\x90\x8a\xe6\x25\x63\xd8\xa5\x74\x78\xe3\x33\xf8\x89\x79\x2a\xbf\xfc\xd0\xa5\x3a\x5b\xad\x0c\xc0\xb3\x03\xd3\x0c\x97\x5f\xfc\xe6\x6d\x36\x8b\x1d\x36\x48\xe1\x14\x51\x26\x12\x84\x1b\x0b\x3c\x3e\x02\x99\x66\xd4\xfa\x0c\x8b\xdf\x49\x10\xea\xac\x01\x03\xb0\x64\xe4\x05\xa2\x11\xb9\x84\x29\xa7\xe0\x8e\x49\x0c\xdf\x20\x4e\xec\x0c\xe6\x24\x56\x59\xbe\x23\x12\xc3\xb9\x78\xb9\xcf\x5f\xee\xff\xb7\xb7\xfb\xff\xed\xed\xe0\x57\xea\xaf\x25\xe1\x32\x4b\x3c\xa2\x61\x09\x7f\x72\x6b\x6e\xe1\x0f\x6d\x46\x97\x71\x4a\xae\x68\x9d\x6f\x66\xfe\xd0\x66\x2a\xda\x90\x0a\xcf\xe1\x87\xbe\x69\xc0\x57\x01\x88\x86\xfa\x8d\x1c\xb7\x2c\x1d\x11\xcc\x52\x92\x24\xa2\x60\xdb\x2a\xca\xb7\xa5\xbe\xc6\x86\xd0\x84\x65\x68\x9a\xce\x44\x30\xb5\xa1\x8e\xbe\x93\x83\xac\xdb\x6a\x33\x07\xd9\x16\x36\xab\x4d\xb0\xb5\xf7\x67\x01\x1f\x2b\x81\xdb\xba\x4e\x06\xdd\x96\x55\x4c\x8a\xab\xd6\x35\xd4\x62\xb5\xaf\x20\x1c\x1b\x1a\x8a\x6f\x7f\xc1\xad\xde\xd4\x92\x57\x6d\xa8\x76\xcb\xce\x00\xc2\x30\xed\xc7\x70\xbc\x9c\xf6\x41\x0c\x16\x0c\x3a\xef\xfb\x14\x52\x92\x5c\xc2\x74\x5f\xff\xa0\xfb\x22\xb4\x0a\x8a\x2a\x5b\xd9\x22\x5b\x91\x4d\xde\x3d\x5e\x6b\xda\x25\x47\x1c\xdb\x7e\xf5\xf3\xe7\xec\xe9\xe0\xbc\x78\xc6\xba\xda\x56\x27\x6a\x76\xb5\x15\x70\xb9\xba\x8a\x88\x74\xa2\x32\xdb\xd9\x8b\xa4\x51\xa3\x79\x79\x62\xc0\x80\x6b\x4d\xb6\xc6\x2f\x29\xb0\xe6\xfb\x91\x1e\x06\x43\x15\xfc\xa8\x02\xb4\x2d\x46\xdf\xc6\x10\xbe\xe9\x50\xb1\xdb\x28\x5d\x73\x95\xc7\x4a\x87\x5a\xd9\xc1\xd2\xba\x92\x75\xb4\xb4\xae\x93\x1d\x2e\xf5\x55\xb6\x7f\x5e\xc0\xad\x1e\x18\x25\xd9\x63\x83\x68\x72\xeb\xa8\xea\x18\xc0\xfa\x08\x2a\xda\xe2\xc8\xef\x9a\x05\x7f\xbf\x2f\x22\xcd\xf5\xcd\x3e\xcf\x7d\xbc\x85\xf3\xcd\x1e\x91\xbd\x30\x36\x27\xd3\x66\x4e\x14\xcd\x17\x09\xec\xcb\x0c\x98\x5d\x9d\x0b\xac\xca\xaa\xd8\x32\xd5\x8e\x5b\xe5\x12\xb9\xde\x25\xb8\x0c\x0d\xd2\xa9\x78\x5f\xef\x91\xad\xa7\xe6\xcc\x01\x37\x07\x1a\x17\xea\x28\x6e\x1f\x65\xb4\xfa\x99\xa3\xea\xf9\xe7\xcf\x37\xab\x1d\x34\x18\x03\x2a\x48\xe8\x8c\xb0\x4f\x09\x61\x1f\xde\xbd\xfe\xfc\x39\x7b\xa5\x0a\x65\xe1\x83\x07\x09\x01\x71\x0f\x09\x93\x7a\x9a\x31\x4d\x4c\xbc\x20\xf6\x8b\x36\x68\x7c\x29\x53\x81\x6d\x72\xcc\x2a\x5f\x7e\x8b\x66\x35\xaf\x2a\xcf\xcb\xd6\x75\xec\x93\xb9\x65\x25\xe1\x88\xde\x54\xfe\x16\x0e\x4b\xd3\xdd\x16\x8e\x4a\xb1\x12\x7d\xab\x85\xbe\x64\x38\xdb\xef\xc8\x1a\x11\x5c\x0b\xe2\x06\x4d\x7a\xbb\x87\xbb\x76\x68\x51\xd9\xeb\x51\x36\xa2\xbf\x8a\x01\x29\x69\x1e\xaf\xe0\x1b\x99\x95\xbf\xab\x3d\x51\x64\x76\xf1\x00\x8f\xe4\x0f\x91\x3d\xd9\xab\x28\x2b\x67\x18\xe0\x91\xfc\x61\x32\x2d\x5b\x65\x8d\x87\x0b\x85\xc9\x44\xe9\x1d\x76\xf0\x88\x3f\xad\x04\x93\x1c\x92\xe6\x21\xef\xd0\x91\xaf\x82\x66\x99\xf6\xc8\x73\x32\xcc\xd9\x80\x4b\xfa\x74\x72\xdd\xb3\xa2\x43\x09\xa4\x38\x49\xe1\x04\x7d\x0a\x42\x7c\x46\xcf\x3f\x7f\xee\xf1\x3f\x23\x26\x38\x6a\xb2\x80\xb8\x77\x63\x45\xbf\xe8\xe6\x3f\x2e\x13\xde\x78\xbc\xc1\xd5\x2a\x08\x56\x1b\x62\x28\x76\x60\x68\x35\x56\x59\xe8\x89\x9b\xd1\x53\xee\xb4\x53\x49\xe3\xdd\x1e\x69\x99\xeb\x66\x5b\x94\x65\x42\xa6\xd3\x4d\xc4\x00\xba\xbe\x39\x53\xd4\x8b\xaa\xa3\xae\x5d\x79\xeb\x98\xab\xac\xb0\xfd\x23\x4b\x77\xb5\x19\xff\x2f\x20\xd3\x97\x73\x21\x6b\x40\xd6\x86\x96\x8a\x85\xaa\x7f\xd4\x11\xc3\xee\xa2\xdb\x07\x52\x71\x7a\xdd\x80\x63\x60\xba\x2e\xbe\x65\x04\x91\xc6\x07\xfd\xa6\x12\x83\xda\x56\xc9\xc0\xde\xae\x86\xbe\x58\x6b\x4a\x6f\x1f\xfc\xa6\xb3\xcd\x6f\x55\x7a\xdb\x07\x96\xea\x40\x8d\xb4\x82\x20\xef\x76\x5c\x89\x98\xc0\x13\x92\xce\x6f\x27\xf2\xad\x1a\xb8\xdd\x4b\xeb\x83\xb6\x6c\x37\xa7\x75\xda\xfd\xae\xac\x52\x56\xbe\x2f\xba\xad\xa0\xe7\xef\x91\x4d\xaa\x9e\x58\x25\xbf\xe4\x62\x60\x5c\xcd\xe4\x39\x99\x14\x72\x08\x48\xfc\xbe\xad\xd9\xb7\xe1\x63\xf2\x2a\x99\x2a\x66\xc2\x0e\xfa\x74\x4f\xc9\x0b\xde\xf0\x21\x0c\xa2\x14\x02\x06\x7b\x37\x0d\xb9\x08\x10\xb5\x43\xe4\xbf\x50\x83\x1c\xee\x1e\x84\xaf\x72\x5f\x74\xec\xfc\xe1\xee\xe1\xba\xa1\x80\x64\xd4\x3f\x67\x7f\xfe\x06\x51\xfd\x75\x1b\xd5\xbd\xe8\xb1\x6f\xd2\x8b\xc9\x1d\x50\xa1\xb3\x54\xeb\xae\x02\x8c\xde\x9a\x35\x46\x7e\x6d\x4d\x86\xaf\x61\x51\x47\x57\x13\x88\xb4\x1c\xa4\x14\x9a\x3c\xe8\x79\x25\xbb\x2e\x88\x45\xa2\x57\x4e\x19\xf5\x7c\x11\xff\xc6\x0f\x56\x61\x21\x9b\xfb\x30\x8f\xc4\x85\x08\xac\x74\x46\xae\x9c\x01\x58\x33\x05\xa2\xc8\xc4\x5b\xec\x45\xf7\xf3\x42\x0e\x7e\xe8\xaa\xe7\x8c\xb5\x2a\xde\xfc\x88\xe2\xa6\x2a\x32\x6e\xab\x2a\x2f\xb2\x42\xb5\xaa\x50\x1f\xe8\xd5\xca\x9b\xd6\x0c\x96\x0a\xa8\xc8\xa4\xd2\xb9\xb6\xf0\xfa\x30\x2e\xb4\x56\x00\x8c\xa3\x31\x3e\xcd\xd6\x6d\xc5\xb0\x61\x68\xd5\x01\x78\xb3\xf6\x6a\xb7\x55\x96\xb8\xea\x8e\x76\x56\x6d\xac\xc5\x7c\xc4\x46\x93\xb0\x39\x17\x0c\xd2\x0e\xc8\xba\x85\xc6\xea\xc1\xa3\xc3\xec\xdc\x15\x74\x6a\x07\xa3\x63\xab\xdf\xd5\x60\xf2\xc1\xd3\xcb\x31\x95\xbb\xa5\xc9\xfa\xe2\x4c\xe8\x6f\x98\x88\xa0\x3b\xf2\x4d\xa0\xf8\x2f\x9c\x99\xbf\x4d\x88\xb0\x31\x89\xaf\xad\xe4\xe0\x37\x32\x88\x2a\x49\x87\x95\xed\x85\x31\x4c\xc0\xf5\xf0\xe9\x57\x07\x32\xff\x96\x0c\x6d\x59\x3d\x8d\x8e\x43\xe3\x0d\xf2\x49\x9e\x90\x85\x88\xf9\xb4\x65\xb8\x2c\x64\xb3\xa2\x73\xf5\xbb\x0e\x2e\xba\x48\x25\x5c\xb2\xf6\xdc\x70\xa9\x9e\x46\x2d\x5c\xca\x43\xab\xda\x48\x24\x86\x09\xdd\x07\x8c\x81\x68\x26\x05\xf8\x15\x94\xb9\x56\x54\x5b\xaf\x00\x63\x45\xfd\xec\x86\xb9\xf3\x6c\x91\x9d\x0c\x4c\x65\xa5\xbd\xef\x1d\x64\xb2\xef\xa0\xa7\x25\x77\x41\x28\x8a\x8a\xc4\x52\x55\x25\x26\x28\x81\x35\x0d\xf0\xcf\x82\x2a\xae\x2a\xf0\x2b\x19\x57\x7e\x23\xe9\xb4\xa6\x69\xb9\x59\x8b\xdf\x83\x30\x85\x97\x88\x96\xdf\xd7\x2e\xd2\x38\x21\xd1\xc5\x43\x5b\x9f\xfa\xe9\xeb\x54\x3d\x95\x05\x84\x89\x61\x0d\xf8\x64\x1c\x78\x11\x97\xac\xaa\xcc\x42\x07\x62\xab\x2a\x20\xb3\x0e\x54\x7d\x15\xd1\xed\xaa\x51\x2b\x82\xe9\x82\xd5\x0d\xbf\x34\x78\xbc\xe4\x2b\xe0\x87\x37\xea\x95\x48\x65\x32\xe4\x70\x4c\xc1\xd5\xf7\xe5\xde\x02\x19\x15\x74\x5a\x7a\xcd\x41\x9c\x62\x90\x9c\x92\x65\x1a\x95\x26\x30\x26\x24\x81\x00\x17\xfb\xd9\x3d\x5c\x71\x84\x56\xd1\x3a\x2b\x07\xae\xa3\x6f\xde\x09\xe2\x66\xe1\xe8\xff\xa5\x70\x57\x4f\x6b\x5b\x30\x0c\xf5\x59\x47\x4b\x5f\xf8\x36\x29\xbd\xad\x85\x79\x4c\xa2\x3e\x85\x20\x8d\x66\xfd\x14\xd2\xa5\xdb\xd3\xf3\xa1\x01\x3f\x03\x41\xe5\x87\x9a\x3a\xa7\xc9\xb2\xbc\x89\x18\x98\x96\xc1\xe9\xde\xd6\x41\x88\x18\x9c\x3b\x3a\xe0\xaf\x1d\x27\x4c\x10\x0a\xbb\x1c\xf7\x5b\x47\x33\xe2\xbd\x73\x90\x3a\xf4\x7c\xd7\x15\x16\xd3\x16\xa9\xbc\x2e\x11\xeb\xbe\xbd\x5a\x0b\x67\x42\x1c\xd2\x87\xb5\xf7\x5a\x90\x05\xfc\x5e\x68\xf8\xfc\xbe\xf6\x66\x68\xb8\x9b\xb6\x70\xc8\xea\x95\x73\x5d\x5f\xea\x1a\xa9\x3e\x45\x74\x65\x19\x0a\xb5\x18\x28\xdb\x6e\xda\x11\x7c\xdc\xcf\xe2\xc9\xe5\x92\x4e\x99\x2a\x2a\xaa\x9c\x67\x0c\x0b\x06\x9c\x27\x3b\xb2\x8a\x0c\x8e\xd5\xc0\xd8\xc8\x3f\x8a\x63\x18\xdb\xe1\xb6\xea\xea\x89\xf8\xa2\x6c\xe4\xff\x8c\xe0\x55\xfb\x5a\x2f\x63\xa4\x3a\x93\xbf\xda\xd6\x7b\x21\xb4\xa9\xa2\xa2\xfa\xd9\xb6\xe6\x51\x1a\xcd\xd0\xa5\x9a\xa0\xfa\xdd\xba\xae\x0e\x89\xca\xeb\xaa\xdf\xed\xe1\x23\x53\x9b\xf3\xba\xfa\x77\xdb\xba\x26\xa4\x6d\x96\xc1\x77\xe4\x9b\x97\x9e\x49\xe0\xdb\xb5\xb9\xef\x39\xed\x99\x6f\x4b\xbc\x6a\x3f\x27\x15\x17\x56\xcc\x49\xfe\x36\x71\xd7\xd8\x2a\xc3\xe6\x63\x92\x38\xc2\xbe\xdf\x2d\x36\x47\x7c\x0c\xfd\x71\xb2\x6c\x0d\x27\x8d\xd2\xba\x26\x68\x0f\x99\x0c\xaf\x65\xe5\x69\x0a\x21\x5e\x03\xb9\x65\xed\x74\x3d\xf4\xd6\x5d\x83\xeb\x75\x10\x7c\x8d\x81\xdb\x38\xde\x79\xe4\x65\x24\xef\x8e\xc7\xeb\xac\x71\x86\xc2\xd9\x90\x2d\x1c\x6e\x77\x5b\xa7\xa4\x98\x38\xe3\x61\xd2\x62\x9d\xee\xda\xa6\xab\x72\x99\x24\xb5\x17\xa1\xee\x82\x6f\x86\x2a\x46\x27\x2b\xa5\x70\xaf\xb9\xe0\x3b\x92\xc0\x76\x4d\xf2\x92\x4d\xcd\xb6\x5a\xdf\xcd\x89\x30\x67\x1a\xbf\x5b\xa0\xc0\x6a\x17\xa4\x89\xf1\xad\x93\x88\x24\x44\x89\x7b\xd7\x13\x99\x6c\x2a\x33\x70\x50\xfc\xd6\x47\x7d\x62\x54\x62\xc4\xc2\x04\xf0\x6f\xcf\xd8\xeb\xe0\xf3\xed\x6b\x54\x50\xfc\xb5\x5c\x3d\xe5\xac\x43\xf1\x66\x94\x89\x50\xcb\x7e\x86\xd9\x41\x36\x07\x17\x82\xeb\xb0\xee\x46\x95\x94\x63\xb5\x5d\x36\x5f\xe7\x34\xde\x1e\x17\xd2\x7e\x6f\x6c\x68\xdc\xdb\x71\x77\xd4\x23\x70\xd3\x61\x28\xc0\x54\x43\xf2\x17\xd6\xfe\x69\xd7\xa5\x27\xed\x96\x7e\x0e\xd2\x8b\x23\xfa\x0e\xf2\x81\x09\x54\x2c\x6a\xb6\x69\x96\x6c\x5b\xd2\x5d\x19\x4e\xfd\x60\xde\x0e\x54\xc2\x0b\x18\x07\x2b\xd5\xe4\x49\x8a\x2e\xf9\x16\x5b\xb7\x3d\x51\x3b\x6b\x4d\xe4\xa8\x58\xb7\x31\x51\x59\xe4\x10\x03\x29\x8c\xff\x81\xd8\xac\x2c\x7d\xdb\xe2\x16\x20\xe9\x14\x60\xf4\xbb\xc3\x17\xf5\xfe\x2f\xf9\x7a\x31\xe8\x1c\x52\x0a\xa6\x35\x17\xc2\x1c\xa0\xd2\xf9\x66\xcb\x69\x95\xab\xef\x4b\x1c\x2f\x08\x2a\x09\x70\x2c\x9e\x37\x49\xc8\xd5\x11\x26\xf8\x7a\x4e\x96\xf4\x28\x8a\x20\x2d\x1d\xd7\x75\xa7\xe0\x36\x97\x6b\x01\xa6\xd0\xf6\xcb\x78\x58\x0b\xb6\x28\xaf\x07\x5f\x27\x06\x4a\x2f\x17\x2a\x79\x49\x09\xb5\x45\xb6\x93\x13\xe7\x57\xeb\xca\x93\xc5\x8e\xae\x00\x62\x08\x4f\x55\xea\x93\x86\xd2\x86\x1a\xae\x2c\xc7\x8f\xc1\x1f\x01\x3d\x6e\x37\x86\x5c\xe9\xb6\x43\xc9\x55\x6a\x3d\xa2\xb7\xf0\xea\x04\x34\x0f\xa9\x19\x73\xf8\x5a\x3c\x44\xa4\xd9\x8c\x96\xaf\xbf\xdc\xee\x4c\x87\xb1\xf5\x7d\xae\x36\xc9\x43\x5c\xb0\x76\xbb\x9c\x5c\x61\x98\x56\x1f\xc1\x7f\xee\xf5\x2e\x9b\xf7\xa1\xa1\xc1\xc6\x1b\x73\x2b\xaa\xd2\x04\x5e\xc2\x96\x5c\x8c\xe0\x48\xe0\x6f\x4b\x88\xcb\xfb\xba\xa2\xc6\xc1\xd3\x67\xab\x20\x94\x1f\x1d\x08\x92\x9d\x31\x7c\x8b\x0b\x13\xa2\xd6\xfc\x94\xd0\x8d\xd7\x31\x85\xeb\xeb\x80\xdd\x27\x9e\x4d\x39\x39\xf6\x2a\x65\x80\x2d\x3b\x8c\x3f\x85\x09\x60\xe8\xb2\xee\xe8\x6e\x66\x7b\x45\xa6\xe5\x22\x97\x20\x96\xd4\xc1\x26\xf8\xb3\xa7\x3e\xc7\x49\x12\xbd\xc2\x31\xc4\xac\x75\x45\xef\xe9\xc1\x7f\xb7\x18\x0a\x59\x2c\xe8\xcb\x2c\xd7\xba\x35\x57\x22\x71\xf3\xd1\x35\x9a\x39\x48\xa7\x08\xf7\x13\x38\x61\x7d\x3b\x13\x7c\x56\x49\x25\x3c\x7d\x67\x90\xa3\xd8\xbe\x41\x1b\xd7\xa0\xb3\x16\xb3\x62\xc1\xbf\x1f\x74\xbf\x68\x42\xa4\x09\x88\x0f\x14\xa6\xfa\xac\x2b\x47\x6c\xf1\xfd\x5c\xce\xf1\x6c\x81\x7d\x9d\x60\x5e\xbc\x97\xab\x2a\x2c\x70\xd9\xde\x9e\x9d\x8b\x5c\x60\x90\xfc\x60\xe7\x2d\x55\xac\x71\x30\xb0\x52\xd9\x0d\xb2\xd4\x74\x9f\x3f\xaf\xd9\x84\x95\xf6\x2e\x58\x65\x93\x94\x6f\xde\x41\x10\x5f\x97\xa3\x19\xb5\x9c\xe3\xba\xe3\xa8\xb7\x59\x5a\xa0\x07\xc7\x62\x6d\x41\x2e\xb0\x19\xed\xd6\xed\x40\xfe\xee\xbb\x55\x10\x2e\x50\xb5\xa0\xae\xfb\xd6\x38\x15\x1a\xf1\xe2\xce\xcc\x46\xee\xda\xfa\x79\x24\xb2\xca\xf2\xd5\x47\xf4\x85\x36\x09\xe8\xd8\xea\x6e\x75\xab\xf5\x78\xa5\x05\x1a\x7d\xb9\x22\xfd\x05\x48\x19\x8a\xd0\x02\x3c\x3c\xeb\xb8\x06\x94\xaa\x67\xda\xb7\xa0\xc0\xae\xfd\xd8\x88\xd0\x5d\x25\x61\x1c\x1a\x46\x95\x50\xc4\x86\x2c\x43\x71\xe8\x9b\xdc\xc2\xb5\x17\x81\x95\xd3\xf8\x89\xef\xd9\x97\x4e\x96\x9b\xb8\x01\x57\x1c\x06\xc8\x0f\x01\x2d\xee\xc0\x6c\x2e\x86\x32\x58\x59\x9d\x9c\x1f\x45\x04\xff\x40\x6a\x64\x41\xa2\x00\xaa\xe9\x65\x06\xe8\xab\x39\x67\x90\x8a\xab\xad\x9b\xf6\x43\x5f\x37\x52\xbf\xd8\xa6\x54\x60\x32\xeb\x6f\x99\xc9\x14\xe6\x3d\x7d\x91\x8a\xb7\xe4\xe9\xf9\x10\x90\xe2\x76\xb5\x2e\x8d\x2a\x3e\x01\x9e\x9f\x6b\x59\x3c\x51\xe4\x0d\xc0\x0e\x39\x64\xa1\xd0\x4f\x2e\x56\xd8\xa1\x28\x8c\x6b\x78\xd6\x6e\x3a\x47\xa9\x69\x6f\x2e\xf7\xa6\x95\x62\xf2\x98\x2c\x4a\x0c\x45\xb9\xd4\xfb\x46\x65\x55\x5b\x8d\x68\x2d\xe2\x66\xa1\x88\x1e\x8b\xea\x12\x2c\xd9\x8c\x54\x8b\x42\x62\xe7\x9e\x6e\x73\x62\xd5\x9f\x79\xac\xd3\x4d\xe5\xd4\xd9\x88\x0e\x3a\xeb\xeb\x64\xad\xad\x2b\xec\x44\x10\xdb\xb5\xad\x07\xef\x48\x20\xf2\xb6\x8d\xdd\xc0\x46\x66\xbc\x26\xb9\x75\x75\x99\x4b\x61\xaa\xd6\x91\x4e\xb6\x74\x1e\xda\x58\xa6\x5a\xe2\xe1\x96\x67\xd9\x17\xe1\xb1\x35\xce\x22\x5a\x59\x73\xa8\xbf\x06\xed\x82\xb9\x9b\x70\x06\xa8\xb4\xc7\x2b\xb5\x2d\xe7\x5e\xdf\xac\x2a\x53\x6c\x51\xdb\x54\x95\x86\x2b\xdf\x37\x0c\x55\x15\x2a\x36\x6a\x2c\x8f\x4a\x46\x62\xda\xce\xae\xb6\x59\x53\xaa\xd8\xae\x91\x29\x96\xe5\x0a\xca\x5e\xad\x41\xac\xa0\x4a\xd9\xed\x36\x6e\xbf\x87\xb6\xeb\xb6\xc0\x13\xd4\x33\x1d\x3a\x66\x76\xf5\x5e\xe1\xe7\x51\x27\x4d\x01\x8c\x11\x2b\xdf\x06\x75\x35\x40\x3c\x2f\x73\xbd\x75\x15\x38\x7e\x7f\x70\xd8\xe0\xd7\x56\x92\x21\x75\x3a\x8d\x2b\x8a\xc8\xd2\x65\xff\xdf\x95\x11\xbf\x73\x2e\x29\xd4\x19\x46\x75\xbc\xf0\x72\x04\x4d\x67\x93\x03\x96\xa2\x79\x2f\x08\xe1\xc8\xd5\xae\xfa\xba\x63\x39\xb8\x9b\x90\xeb\x4c\xc5\x3b\x97\xd1\xcf\xa1\xfd\x54\xe5\xec\xb6\x20\xb1\x8c\x50\xb0\x3f\x21\xe9\x94\xb0\x7d\x3b\x58\xca\xad\x79\x6d\x1e\x9b\x4e\x72\x6c\xfb\xa9\x8a\x98\xe2\x8c\x4f\x20\xc4\x82\x6a\x33\x08\x57\x5a\x39\x60\x67\x60\xe8\x9c\x28\x51\xb5\xea\x8b\xdc\xb3\x53\xc2\x4e\x00\xa5\x57\x24\x8d\x7b\xd5\xbe\xb4\x25\xa8\xa8\x80\x33\xf7\x13\xc4\xe1\x1d\xef\x3c\x23\xf4\xea\x83\x38\xc8\x08\x25\x6f\xf8\x51\x59\x32\x10\xd9\x28\xda\x81\x92\x5e\x8a\x68\x28\x88\xb7\xfa\x9e\xf4\x7c\xde\xc8\x20\x21\x53\x11\x5d\x28\x14\xc1\x3a\xb2\xb5\x2d\x38\x82\x33\x89\xae\xea\x14\x87\x7c\x9e\xe2\x05\x05\xd7\xef\x67\x00\x5f\x50\x3f\xdc\x3d\x54\xbe\xd2\x4e\x63\x19\x31\x7c\x13\xf2\x99\x57\x16\xce\x0a\x47\xf4\x64\x96\x02\x0a\x7b\xfe\x0f\x62\xb1\x3c\xbd\xc0\x0e\xe7\x53\x10\xc7\xc7\x09\xa0\xb4\xe7\x8f\x41\x74\x31\x4d\xc9\x12\xc7\x7d\x69\xb9\xca\x66\x70\x0e\xfb\x09\x9a\xce\x18\x9f\x4b\x0c\x5d\xe3\x28\xb6\x27\x3d\x52\xdb\x35\xd9\x12\xd5\x5c\xac\xc7\xb6\xf3\x78\xbc\x7f\xf3\xfa\x7b\x90\xd2\x81\xee\xab\x77\x83\xe2\xa1\xff\xd3\xcf\xf8\x6d\xfa\xe1\x1f\x33\x5f\xaa\x8e\x86\x5f\xdc\xf8\x54\xa4\x9e\xa1\xfe\xf0\xec\x3c\x14\x32\x6b\x28\x9c\xb1\xfc\xe1\xd9\xd9\xd7\xa1\x1f\xa3\x4b\xff\x3c\x3c\xfb\x2e\xf4\x45\x44\x38\x3f\x14\xf8\xd0\x1f\x93\x4f\xfc\xf5\x37\xe7\xe1\xd9\x41\xe8\x7f\xfc\x88\x3d\xcf\xf3\xf8\x1b\x67\x95\x84\x4c\x49\xb9\xb8\x55\x05\xcd\xa7\xaa\x0a\x4d\x23\x3f\xf4\xf7\x01\xa5\x90\xd1\x7d\x34\x9f\xee\xf3\xca\x12\xd8\x22\x6b\xb9\x2c\xa6\x18\x0a\xdf\x44\x14\x91\xaf\x41\xc2\xca\x2f\xf5\x28\xd0\x7c\xda\x9f\x24\x4b\x14\xeb\xa1\x7c\x5b\x1a\x7d\xf9\x4d\xd5\x7c\x10\xee\x8b\x24\x4f\x95\xb3\x3a\x0c\xcf\x9e\x7e\x15\xfa\x72\xc5\xfb\x0b\x8d\xaf\x21\x5e\x26\x49\x78\x76\xa6\x3e\xf0\x92\xa2\x1c\xd0\x12\xb5\xb3\xc3\xef\xc2\x83\xf0\xec\xfc\x3c\xcc\x8a\xf0\x3a\xe7\xe7\xe7\xe7\xe1\x04\x24\x14\xd6\x8c\xba\xf8\x74\x1e\xfa\x33\x40\x5f\x5e\x82\xc4\x1f\x8a\xba\xab\x2f\xa4\xe2\xee\x46\x06\xf3\x7b\x2b\x43\x18\x37\x22\xea\x60\x36\xa6\x7e\x45\xb2\xc0\xac\xd2\x85\x3a\x46\xee\xed\x82\x69\xda\x7e\x66\x80\x0f\xe8\xac\x57\x71\x8f\xaa\xce\xfa\x86\xab\xe0\x22\xe2\x07\x79\xd5\xd7\x84\x44\x20\x39\x65\x24\xcd\x64\x89\xa5\x32\xbf\x2d\x61\x7a\x7d\x02\x52\x30\xa7\x02\x2b\xe0\xf0\x26\x85\x93\x14\xd2\x99\xbc\x60\x76\x0f\x56\x2b\x63\x26\xe7\xfb\xee\xcb\xc7\x24\xb5\xe1\x87\xb8\xc9\xb3\x03\xaf\x54\x2a\xa6\x77\xa7\x3f\x9f\x0c\x4e\x52\x32\x47\x14\x66\x39\x85\x68\x70\x83\xb3\xfb\xc2\x2f\x07\xa5\x61\x03\x6b\x70\x22\xe1\x42\xf0\xbc\xfc\x6e\xa8\x78\x10\x3f\x08\xf5\xaf\xdd\xd1\x08\xcb\xab\x44\xb4\x1c\xec\xed\xe1\xcd\x2e\xc6\xcf\x9f\x69\x2f\x08\x55\x23\x12\xe6\x9c\xd6\x80\x2c\xe2\x65\x27\x28\x81\xbd\x60\xc0\x66\x10\x3b\x32\x26\x15\x6b\xcd\xc1\x42\xd7\x61\xc1\x8e\xfa\x6a\x02\xc8\x89\xa1\x41\xcc\x50\xc4\xcf\x6c\xdf\x7a\x22\xe9\xf0\xc2\x44\x36\x82\xc5\xee\x38\x2c\xf3\xf7\xb6\x94\x00\x88\xe0\x3d\xf6\xa0\x34\xc8\xe5\x8a\x72\x82\x52\x24\xef\xe2\xb3\xb3\xd6\x22\x83\x29\x15\xd2\x14\x67\x13\x85\x92\xa5\x96\x75\x65\x19\x3d\x26\x4f\xac\x48\x1c\x91\x08\x97\xdd\xfc\x72\xb9\x0c\xba\x59\x1f\x54\xa3\x2d\xc8\x39\xb3\xc9\xef\xef\x96\x7d\xfb\xcf\x77\xa7\x3f\x5d\xbc\x7b\xd6\xee\x96\x7d\x16\xfa\x68\xe2\xab\x7b\xc0\xca\x35\x7e\xf6\xf4\x20\x3c\x33\x99\x12\x04\x68\xf8\x81\x2e\x49\x31\x7d\x29\xc8\xfb\xe4\xa6\xd0\xe4\x41\xe8\xd7\x5e\x60\x94\x12\xf7\x15\x6e\xd5\x5a\x58\x5f\x8f\x32\x34\x44\x78\xea\x5d\x21\x36\xf3\xf4\xde\x18\x0c\x06\xe5\xab\xb3\xe5\xdd\x3e\x5e\xd2\x6b\xe1\x7f\x35\x98\xa2\x49\x9b\x6b\x59\x40\x60\xc1\x37\x3f\x64\x1c\xb9\x87\x67\xe7\x2b\x09\x09\xfb\x0a\xec\x08\x51\x85\xc1\x77\x0b\x52\x0d\x3e\xcf\xda\xe2\x88\x60\x6f\x02\x50\xb2\x4c\x61\x2d\x48\x4d\x3b\x9c\xc8\xc8\x4d\x49\x6d\x13\x8b\x54\x58\x0f\x9a\x6b\x13\x0e\xa5\xdd\x97\x91\x0e\x75\x9b\x56\x20\x75\x05\xdd\x10\xba\xc3\xed\x6d\xfd\x5e\x2e\x13\x14\xe6\x56\x08\xeb\x59\x32\x7e\xaf\x48\xb3\xd8\x20\xac\xbd\xcf\xb3\x73\x3e\x44\x32\xbf\xdb\x71\x0a\x63\xbe\xfa\x20\xa1\xc3\xdd\xc3\x30\x85\x14\x96\x83\xed\x51\xc8\xd4\x84\x10\xa4\xbd\x1b\x29\x6a\xf2\xfd\x50\x53\x95\x43\xdf\x57\x59\x92\xd8\x48\xcb\x86\x07\x33\x08\x62\x79\x59\x9e\xaa\x28\x3c\x3d\xff\x6c\xa1\xe0\x32\x8a\xc7\x33\x40\x67\xe7\x7e\x30\x50\x5a\xd3\x1d\x93\xd9\xfb\x60\x6f\xcf\xbf\xb9\x19\xbc\xf8\x9e\x97\x58\xad\x84\x45\x81\x83\x33\x14\x64\x0c\x9f\x11\x5b\x2e\x7c\x3b\xfe\x95\x58\x4b\xb7\x20\xc4\x12\x78\x58\x13\xf2\xc5\x84\x7c\x8e\x8a\x9a\xab\xdb\xb1\xcc\x68\x5a\x5d\x8d\xb1\x09\x2d\x58\xba\x1a\x61\x26\x34\x70\x4d\xc0\xdc\x93\x21\x5c\x05\x03\x99\x33\xd3\x5e\x00\x2d\x81\x29\x2e\x97\x1f\xee\x1e\x88\x48\x66\xed\x70\xfb\x01\x91\x9c\xb7\x4e\x53\xd2\x19\xb9\x7a\x2d\xb0\x60\xf7\x70\xbb\x04\xa3\xf2\x77\xae\x25\xe7\x94\xd3\x73\x03\x49\x37\x54\xe4\x8a\x19\xab\x10\x4d\x94\x68\x3c\xb1\x78\x25\xe2\xae\x4c\x6d\x09\x29\x49\x46\x9f\xdd\x94\xc9\x6a\x75\x71\xaf\x56\x92\x2c\x0a\x6d\xfc\x64\x03\x30\x26\x29\x93\x06\xe5\x94\x24\x90\xf7\xdb\x83\x7c\x38\x9d\xbb\x51\xb7\x99\xe4\xd6\xa4\x8f\xaf\x02\x84\x6b\xca\x07\x72\x34\x75\x34\x5a\xb6\x9a\xd6\xa6\x34\x4d\x04\xab\x35\x84\x42\xe2\x98\xeb\x6d\x24\x08\x52\xbd\x3f\x2a\xf1\x8f\x3c\x09\xee\x8f\x2e\xc5\xf0\xdd\xbb\xef\xbe\x7f\xfa\xd7\xae\x74\xa9\x4d\x62\x64\x2b\x7f\xbe\x2e\xa9\x54\x2d\x41\x5a\x53\x8a\xf4\xc0\x24\x49\x65\x42\xeb\xe3\x47\xf6\xf1\x23\x53\x43\xd4\x72\xa3\x2f\xdd\x52\x1f\x4d\xdf\x9f\x9d\xf9\x22\x04\xf2\x99\x4f\x97\xe3\x39\x62\x02\xde\xd6\xe4\x65\x9b\x59\xb3\x65\x80\xf1\x8e\xfa\x1c\x5d\x17\xbe\xbb\x66\x56\x39\x01\x63\x98\xa8\xea\x13\x92\xaa\x45\x7a\x29\xee\xe5\xac\xae\x79\x2e\xce\x2c\x6b\xcb\x88\xbd\xa2\x25\xed\x23\xbc\x58\xb2\x4c\xe4\xc5\x84\xc7\xa2\x2f\xf0\x96\x43\x31\xf6\xb3\xb1\x2e\x12\x10\xc1\x99\x74\xa5\xe5\x73\x56\x24\x81\xc4\x3d\xf9\xc0\x81\x93\x8d\x4a\x4d\x4f\x91\x8c\xde\x9c\x2c\x29\x64\x29\x58\xf8\xa1\xef\x97\x45\x65\xb9\x31\x3a\x46\x7f\x7b\x30\x34\x92\xea\xac\xba\xfd\xaa\x11\x92\xad\x61\xc8\xa1\x96\x89\x19\x25\xe0\xcc\xb3\x86\x9d\xe9\x3a\x0f\xbe\xf5\x21\x36\x5e\x32\x26\xd1\x94\xef\x25\x39\x38\x8d\xaf\x39\x40\x8e\x19\xf6\xc6\x0c\xf7\x17\x29\x9a\x83\xf4\xda\x9b\xb3\xfe\x33\x0b\x26\xa7\x68\x8a\x3d\x84\x5b\x2d\xcf\xe1\x81\x69\xf6\xec\xe9\xd7\x8a\xcd\x5b\xe2\x04\x8a\x37\x72\xe6\x0e\x7a\x8d\xc3\x00\xe1\x4b\x44\xd1\x38\x81\x9a\xdb\x0b\x7d\xcf\x44\xb5\xe0\x63\xfa\x32\xb7\xcd\x74\x12\xe6\xc8\x6e\xa6\x28\x70\xcd\x9f\x93\x15\x11\xaf\xeb\x0e\x4b\x07\x2e\x95\x11\x71\xce\xfa\x5f\x55\xa3\xa0\xaa\xf9\x2c\xf4\x13\x84\x2f\xfa\x4c\xe4\xa8\x16\xc4\x42\x4e\x88\xec\xea\x5d\x69\x54\xae\xc9\x32\xf5\x34\xbe\x3c\x6f\xe6\xb3\x8b\x5d\x77\xe0\xd1\xcb\x55\xee\x84\x35\xcd\xdf\xbe\xad\xf9\x52\xb2\xbc\x3f\x8d\x69\xcb\xe1\x95\x78\x8b\x2d\x8f\x6c\x9b\x12\xeb\x7a\x8a\x2f\x63\xf6\xd4\x06\xe6\xb4\x4b\x99\xfa\xae\x0c\x20\x5d\x02\xcd\xfd\x11\x5b\xd7\x17\xe8\x70\xf6\xdb\xb7\xf3\x0d\x54\x6d\x95\x32\x25\x87\x3c\xe9\x35\x99\x4e\x11\x9e\x7a\x64\xc9\x9c\x12\xb9\xcd\xa5\x71\x5b\x53\x2e\x15\x96\xa6\xdd\x4e\x14\x2c\xc3\xc3\x37\x5d\xb0\x44\x32\xe6\xf7\x31\xc1\x13\x94\xce\xf9\xab\xf9\x92\xb2\x37\x80\x45\x33\xce\x19\x1b\x89\x49\x41\xea\x93\xe5\xcc\xb7\x98\xe3\x2a\x83\x07\x51\x37\xb3\x77\xe0\xa5\x04\xa9\x1e\xb2\xf2\xb6\x81\x2e\xf9\x47\x4e\xbf\xdf\x42\x9c\x21\x17\xe2\x6e\x8f\x9c\x79\x49\x7a\x90\x49\x74\xc8\x05\xc4\x9b\x30\x92\xef\xf8\x7c\x1e\xab\x41\x81\x5c\x8c\xfb\x3b\xe4\x3e\x7d\x43\xae\x9e\x2d\xff\xda\x52\xd3\xf1\xa7\x3d\x81\xa6\xea\xf5\xd1\xd0\x17\x0b\x98\x91\xf7\xf2\xb1\xce\x28\x40\x97\xa8\xb0\x09\xd8\xda\x21\x9d\xc7\xac\x96\x67\xf4\x9d\x1e\x0a\x4d\xa3\x11\xc1\x6f\x1e\x2c\xe9\x26\x47\xe7\x90\x0a\x97\xd3\x26\x59\x5a\x0f\x2d\xfe\x8e\xfb\x32\x2d\x9b\x4c\x49\x76\xbb\xf2\x62\x4b\x0b\xd2\x40\xfa\xb5\x91\x0d\x37\x1a\xaf\xd9\x8d\xf8\xc1\x20\x4a\x20\x48\x8f\x92\xa4\x57\x96\x50\xb2\x72\x50\xa4\x57\xb1\x1f\xb2\x01\x8a\xed\xec\x40\x34\x59\x4e\x85\xe1\x64\xb2\x9c\xe6\xde\xc3\x14\x81\x44\x7c\x11\xbf\xd6\xb7\x6e\xd3\x0d\xc9\xa6\x45\x5b\xe6\x9b\xec\x5c\x7c\x91\xfd\x97\x86\xcb\xbf\xe9\xc7\x35\x44\xa2\x3d\xff\x94\xa3\x92\x27\x7c\x50\xbb\x5d\x5f\x64\x32\xe9\x5f\xcd\x10\x83\xdb\xba\xbc\xec\x06\xdb\x6d\x80\xfb\xbb\xba\xe8\x77\xfb\x87\x27\x57\xd7\xcb\x76\x57\x97\x3a\xb7\x09\x1e\x13\x90\xc6\x72\xf0\x7d\x1d\xfa\x4d\x9f\xde\x1a\x11\xac\xd5\x95\x08\x70\xae\xa5\x03\xaa\xc4\xf9\xb9\x12\xd0\x98\x82\xe6\x8d\x2c\xef\x3c\xd9\xd7\x3e\xcb\xf3\xa0\x6e\x77\x96\x53\x4a\x1e\xee\xd9\x49\xc9\xc3\xe2\x79\xef\xfe\xe0\xcb\x18\x84\x10\x8f\x14\x15\xbc\x81\xd2\x34\x86\x11\x89\xe1\x87\x77\xaf\x8e\x75\x56\xcc\x1e\x0e\x9a\x18\x08\xb7\x8d\x51\xb9\x54\x81\xc3\x58\xe7\x84\x3b\xfd\xa9\xcd\x89\x42\xc9\x7d\x2a\x57\xfe\xf3\xef\x7f\x7b\x3b\xfe\xf5\xe7\x3b\xe2\xf7\x4f\xd1\x14\x73\x7e\x1f\xe1\x87\xce\xee\xdb\xcb\xd2\xee\xec\xb9\xbf\x45\x9c\xff\xf4\xdd\x9b\x9f\xe2\x2f\x5f\xb4\xbe\x14\x0e\xbf\x0d\x7d\xb2\x64\x89\xa0\xc9\xb7\x76\x60\xb7\x06\x57\xb4\xa4\x8c\x88\x47\x51\xaf\xad\x01\x8d\x49\xb0\x76\xb7\x46\x34\xca\x35\x68\x3d\xc1\x61\x93\xd8\x51\x0b\x53\x08\x3e\x05\x97\xb0\x41\x9a\xd2\x64\x6a\x80\xf9\x29\x66\x9f\xa4\x03\x44\x65\xf6\xf4\xa3\x78\xce\xcf\xb1\xe7\xea\xb3\x4a\x20\x1e\x0c\x28\xb8\x84\x47\x4b\x36\x13\xc2\x9e\x69\xcf\x21\x7d\xc1\xbd\x60\x15\x0c\xb1\xb4\xa7\x24\xf8\xf4\x1a\x47\x6e\x2b\x99\xb6\x83\x14\x24\x69\x61\x14\xd7\x38\x7a\xa9\x82\xcf\x09\xcf\x2d\x97\x5d\xaa\x4a\xc1\x27\x46\x21\x63\xd0\x94\x69\xea\xc2\x2d\x22\x45\x76\x3d\x9b\x7c\x76\x1a\x5f\x84\x2c\xf7\x5c\x55\x5e\x02\x49\x97\x96\x4f\x41\x28\x73\xe4\x0f\x74\x20\xe5\xc1\x2c\x85\x93\x91\xbf\xef\xd7\xca\xa4\x0a\x3b\x60\x3b\x0c\x55\x87\x14\x21\xb7\xc8\x6d\x6d\xb6\x21\xea\x37\x5b\x23\x35\x52\x81\xf7\x2a\xd0\x52\x9d\x8b\x50\xc9\x8e\x24\x67\xff\x75\x63\xe3\xc7\xb0\xc9\x67\x29\xcc\xf0\x63\xc8\xa9\xec\x55\x07\x5b\xa1\xe2\xde\x98\x42\x66\x6d\x50\xc7\xbe\x50\xc6\x45\x30\x8f\xc2\xd2\x9a\x08\x37\x58\x13\x41\x0b\x93\x47\xcc\x8e\xad\x5f\x51\xd3\xe4\xde\xcd\xd5\xf4\xfd\x15\xed\x41\xb5\x3b\xbb\xd3\x49\x47\x39\x5b\xd2\x7a\x92\xa9\xb0\x71\xee\xef\xce\xfd\xe6\xdd\x97\x17\xe8\x70\xfa\xae\x13\x23\x96\x1f\x7d\x9f\x42\xc6\x10\x9e\xd2\x8c\x17\xcb\x1f\x4b\xbe\x7d\xea\xf8\xf2\x8a\x90\x3f\xae\x71\x24\x7e\xc8\x83\x30\xe3\xd4\xb4\xbd\x4b\xae\x1d\xc3\xa5\xd9\x5f\x55\xb3\xe2\x5b\x85\xd0\x4e\x75\xa8\x75\xce\x75\xe5\xf8\x78\x5a\x94\x33\xc3\xad\x94\x03\xae\x43\x7c\x54\xe0\x44\x07\x32\xe4\x01\xb2\x8c\xd9\xe0\x14\xbb\xd2\x9a\x4c\x32\xb9\x25\xef\x94\x4a\x92\xa3\xac\xd7\x36\x29\xc9\x43\x10\xc6\x29\x59\xc4\xe4\x0a\x8b\xd3\x71\xdd\x54\xdd\x0a\x2e\xa3\xb3\x73\xf9\x1c\x8b\xa8\x2f\x42\xa0\x34\x12\x5b\xd4\x97\x21\xaf\x7c\x7f\xb5\x0a\x13\x67\xe2\x25\xcd\x09\xda\x7c\x60\x29\x39\x8d\x61\x17\x95\xa9\xb1\x3a\x5b\x0f\x87\x2a\x78\x99\x08\x72\xe3\x1b\x73\x45\xfb\xad\xc0\xbf\x1c\x91\x97\x4f\xb7\x6c\x8b\x02\xad\xe1\x0f\x50\x2c\xb3\xf3\x12\xac\x42\xd9\x34\xd9\x25\xe7\xaa\xfb\x41\x88\x47\xbc\x91\x90\x8e\xe0\x80\xc3\x20\x24\x23\xd7\x7c\x26\x08\xc7\xdf\x5f\xf7\x84\x3d\x0e\x0e\xec\x98\xf3\x3b\x74\x34\x1a\x91\xbd\x3d\x11\x99\x8d\xaa\xbf\xe4\x79\xcf\x08\xd6\xfe\x8b\x8c\xa0\x24\x7b\xed\xcb\x8c\xc9\x55\xf9\xa7\xeb\x0b\x67\x09\x59\x8b\x43\xcc\xd4\x85\xb2\xa6\xc8\xf1\x5d\x20\x4f\x99\x1b\x78\xbe\x6f\x64\x96\xf6\x27\xe5\x4c\x2f\x3e\x3a\x3b\x12\xc1\x06\x5e\x23\xca\x4a\x37\x2d\xd4\xb6\xbf\x70\x20\x6d\x55\x39\xe0\xec\x98\xf6\x4f\x83\xbf\xf4\x10\x1d\xc0\xf9\x82\x5d\xf7\x70\xf0\xf9\x33\xa2\x03\x8e\xde\x3d\x28\x7f\x67\x1e\x62\x30\x08\xf6\xf6\x7a\x78\x74\x76\x5e\x10\xac\xf2\x8b\x40\xdc\xa2\xc1\x30\x83\x9d\x82\x9a\x04\xa1\x72\xb5\xcf\xa4\xa3\x88\xf6\x95\xcd\x81\x70\x23\x8f\x96\xc2\x2e\xb6\xd3\xb9\xf2\xc8\xa4\xf9\x9d\x0e\x9a\x3a\x82\x31\xa3\x15\x05\x95\xb8\x0e\x8d\x58\x0e\xc0\x50\x8d\x4f\x4d\x72\xfa\x3b\xc2\xae\x75\xe4\x58\xf2\x28\x6b\x49\x97\x69\xb4\xba\x3f\xd2\xec\x14\xbe\x4c\xde\xfc\xfd\xb7\xa7\x4e\xd2\x4c\xe3\x46\x83\xe1\xb0\x06\x59\x83\x05\x5c\xa5\xb2\x37\x25\x57\x2e\xbb\xb7\xca\xf2\x11\x49\x2a\xec\xe4\x2a\xab\x5c\x22\x78\xd5\x37\x70\x6f\x34\xf4\x9c\x1d\x16\x55\xd8\x1c\x37\xfb\x33\x08\x62\x19\x07\x2c\xe7\x9b\x65\x50\xc6\x97\x97\x9e\x9f\xa7\xd5\x3c\x99\xa3\x43\x2b\x87\x0f\xbf\xcd\x0c\x49\xcb\x2e\x5c\xb5\x46\x99\xa5\x77\xce\x17\x6b\x02\xa0\xda\xef\x4d\x9c\xa6\x09\xa2\x2c\x5f\x4d\x99\x23\x42\x10\xcd\xba\xa2\x42\xf3\x82\x89\x4e\xbd\x0a\xcc\x68\xae\x1e\x91\xa4\x7f\xf8\xd4\xe3\x7f\xe8\xbc\xff\x6d\x6d\x23\x4e\xcb\x4a\x93\xf3\xe7\xf0\xbb\xf0\x30\x3c\xe3\xd7\x3e\x27\xff\xd5\x93\x56\xe1\x70\x36\x24\xb3\xcd\x05\x09\xe3\x85\x8a\x53\x3e\x34\xd5\xc4\x8d\x64\x90\xa3\x8b\xfd\x65\xb5\x95\x6e\x27\x40\x3c\xf3\x18\xfc\xc4\xfa\xa9\xb0\x3d\x69\x01\x93\xbc\x45\x2e\x8a\x95\x39\xae\x9f\xa3\x51\xa4\x81\x70\xbf\x00\x2b\x01\x1d\xdb\x3a\x58\x96\x42\x11\xc1\xfd\x98\x73\x36\xa9\x07\x12\x34\xc5\xfd\x39\x8a\xe3\x44\x5b\x5e\x58\x89\xdf\xfd\x30\xcb\xfc\x9e\x7d\x13\x56\xe4\x32\x1f\x99\xcf\xc8\xa2\x68\xdc\x21\x46\xe4\x49\x2a\xb3\xda\x00\x5f\xd2\x96\xa5\x01\xd7\xc3\x23\x03\x09\x2a\x1a\xee\x02\x26\x94\x7e\x62\x72\xd4\x39\x13\x49\xc7\xd9\x5f\x40\x3a\x85\x7c\x12\x2e\x7a\xcf\x2a\x37\x06\xd1\x05\xe7\x00\x7c\x79\x04\xa3\xc8\x5a\x36\x59\xa7\x16\x2f\xda\xe0\x4d\xb5\x81\x7a\x9d\xb1\xee\x61\xa3\xc9\xaf\xe3\x85\xf3\x88\x12\x34\x68\x25\x14\x0c\x90\xad\x77\x0c\x8c\x11\x8e\xe1\x27\x3f\xf4\xfb\xfa\xa4\x96\xe9\x07\xfd\x18\x81\x84\x4c\x3b\x9d\x6f\xa2\xe5\x7e\x56\xd1\x6a\x4c\xe7\xbe\xeb\x78\xdb\xc8\x16\x95\xdb\x65\xe3\x65\x53\x55\x9f\xdf\x36\xd2\x57\x42\x2b\x84\xc4\x99\x28\x70\x1c\x91\x2a\x43\xfa\xe6\x76\x85\x9e\xbf\xc5\xa9\xaa\xbd\x58\xf8\xd6\x27\x58\x99\xfc\xd7\x49\x2c\x5e\x68\x7c\x94\x78\xa1\xb0\xa3\xc5\x19\x93\x73\x44\x4f\xa1\x77\x4d\x96\x1e\x5d\xaa\x1f\x57\x00\x33\x8f\x11\x4f\xe2\x86\xa0\x1f\xe5\x06\xf7\x00\x8e\x3d\x90\x24\x9e\x49\x2f\xfe\xbc\xcd\x5e\x58\xdb\x09\xa4\xd9\x1b\xa4\xcc\x7e\x58\x2e\x21\x09\xe4\x9c\x30\xbb\x5e\xa8\xf3\xc9\xe3\x05\xf8\xc4\x22\x69\x3c\xda\x34\xf6\x36\x4e\x23\x95\x0e\x37\xda\x9f\x84\x5f\x53\xfc\x0a\x70\x0e\xb6\xc6\xe1\xe6\xd4\x8c\x58\x3b\x9e\xd8\x3c\x74\xa8\x6f\xb6\x1a\x27\x13\x07\x00\xe9\x1c\x24\xc5\x6d\x2e\x46\xc0\x47\x28\x6f\xaa\xb9\x08\xe8\x98\x41\xf1\x3d\x5f\xfd\x2b\xc4\x17\x5d\xa2\x43\x6e\xfd\x05\x46\x68\xfa\x96\x8a\x20\x06\x08\x5b\x18\xb3\x7b\x27\x67\x65\x87\xad\x38\x21\x84\xe5\xb6\x78\xe5\x66\x74\x79\xe1\xe4\xde\x15\xbd\x70\xc8\x92\x25\x08\xc3\x3e\x85\x11\xc1\x31\x48\xaf\xed\x5b\x25\x46\x74\x8e\xf2\xc7\xaa\x1a\xc0\x31\xc0\x11\xac\xf1\x00\xdb\x60\x44\xf2\xd6\xcf\x4e\x94\x28\x41\xd1\xc5\xfa\x07\xca\x8b\x86\xdb\xaf\xe2\xcb\x1a\x74\xb5\xd3\x53\xa5\x96\xc7\x59\xe4\x50\x16\xa6\xd0\x03\x29\xf4\x30\x91\x68\x48\xf9\xae\x9f\x03\x24\xd2\xb3\x35\x77\xb5\xa1\x9c\xb7\xc8\x63\x76\x10\xf5\xca\xd8\x87\xc9\xbd\x89\x7c\x49\x3a\xad\x97\x5d\xe4\xd2\x12\x5a\xc2\x43\x9a\xd3\x0f\x3b\x64\x0f\x59\xcb\x4a\xb1\x6b\xd9\xd5\x0f\xd4\xb4\xdd\x4e\x29\x9d\x00\xf7\xc8\xc4\x45\x9d\xe1\xbd\x91\xfa\xb2\x83\x82\x72\x2b\xaa\xc9\xbc\x16\x52\x44\x8d\xf7\x03\xad\x6d\xb4\x34\x8d\x33\x40\x67\xbd\x1b\xb5\x84\xc3\x0a\x9c\x99\x42\xf6\x53\x3a\x95\x6a\xf6\x35\xc4\x44\x7f\x95\xad\x7b\xa7\x5a\xab\xd5\x52\x60\xa4\x11\xeb\xfe\x04\x46\x5f\xd2\xd9\xf4\x57\xf0\x3d\x58\x53\x97\xa7\x26\xe0\x50\xe7\x19\xf7\x73\xa9\x47\xcb\x29\xe9\xea\x34\x6f\xd4\xd2\xbb\x6d\x5f\x4b\x56\x04\x78\x63\x9c\xbc\xac\x6a\x82\x22\x88\xe9\xfd\x29\xcc\x1a\x6c\x71\xec\xb3\xf2\xb5\x1c\xaa\x8d\xbf\x68\xd2\x6b\x34\x15\x08\x4a\xe7\x6a\xce\x58\x46\xb5\x6a\x1f\xad\x0a\x26\x1b\x1c\xad\x1a\xaa\x8f\xec\x68\xfd\x57\xb1\xf4\xa8\x3a\x2e\xd5\xb2\x0c\x1d\xa8\x30\x85\x4c\x63\xc2\x9a\xa7\xa5\xaa\xde\xf6\x90\xd4\x28\x72\x7f\x87\xe4\xef\x97\xef\x2f\x11\x9c\x74\xb3\x3c\x2f\x4d\xa0\x7f\x01\xaf\xdd\xe7\xa3\x06\x48\xc7\x63\x32\xab\x76\x4b\xa7\x65\x11\xf2\x1d\x68\xcd\x47\xb6\x9f\xab\x62\x1e\x21\x3a\x10\xb1\xe8\x7a\x6c\x20\x45\x7c\x1c\x60\xd6\xda\x0e\xa4\xe0\x2a\x70\x06\x62\xce\x4a\xa9\x6b\xa7\x2d\xc6\xd3\x39\x5b\x3c\x86\x7b\xe6\xf4\xcd\xfb\x93\x2d\x5f\x32\xbc\x49\x6d\x91\x99\xdd\x33\x1c\x20\x1b\x5c\x32\x02\x9e\x8f\x0c\x23\xff\xd5\x6f\x18\xbe\x26\x15\xd7\x8b\x85\x03\xeb\xba\x1f\xbc\x79\x7f\xd2\x99\x18\x17\x58\x72\x7f\x97\xcc\x8f\x07\x87\xf0\xcd\xcf\xe4\xa7\x35\x2f\x19\x3e\xfa\x06\x32\x9c\x43\xa5\xeb\x1d\xa3\xea\xdc\xd2\x05\x93\x03\x79\x87\xdb\xe5\xfe\x56\xe9\xe4\x3f\xaf\x9e\xbc\x9e\xfc\xc7\xa7\x4e\xfe\x06\x8c\x90\x64\x0c\xd2\x7d\x0c\x2e\xfb\x63\x90\x96\x1c\x0f\x32\xed\xab\x2e\xc9\xfa\xea\x97\x5a\x49\xa7\xf2\x35\x57\x3e\x41\x22\x5a\x7f\x75\xe9\x9c\x5a\xc7\xa5\x1d\x15\xaa\xae\x33\x23\xe7\x53\x89\x7a\x85\x8c\x99\x97\xf5\x79\x15\x97\x42\x54\xab\x32\x68\x9b\x58\xaf\xd5\x25\x72\xb3\x51\xd7\x4c\xcd\x7c\x6a\xa2\xcd\x34\x86\x9b\xad\x50\xad\x0a\x01\x9e\x43\x7e\xbb\x4d\x4b\x07\x6f\x7e\x5d\x19\x16\x48\xd5\x5b\x16\x85\xe8\x0c\x8c\x39\xe6\x98\xd0\x4f\x75\x0a\xa8\xfc\xc2\x96\x29\x10\xb1\xc4\x32\x77\xcd\xb1\x1e\x95\x63\xc1\xa9\x88\x40\x0a\x63\xd9\x7b\xdd\xd2\xff\x55\x37\xdc\x35\xfe\x50\xd5\x48\x73\xc8\xb8\xcd\x91\xb6\x45\xd2\xb6\x03\x5d\xd2\x5b\x19\xe6\x07\xd9\x6c\xb7\xb0\xc9\xd2\x55\x55\xe5\x73\xf4\xf3\xd7\x76\x5b\xe3\x8d\x86\xe9\xf2\xb3\xfa\x16\x16\x45\xdc\x2f\x6b\xd8\x4e\x54\x0d\x33\xb1\x78\xa9\xad\x8e\xd4\x70\x5b\x5b\x1c\xac\x8a\x8b\xbc\xe5\x91\x16\x9c\x0a\x36\x3a\x95\x6d\x1c\x59\x43\xd7\xd2\x10\x20\xed\x99\xa7\xf2\xa9\x8f\x09\x63\x64\xde\x3f\x3c\x38\xa8\x3a\x50\xeb\x5d\xf7\x1c\x4a\x9e\xcd\x9d\x21\xcb\xf4\x46\x07\x12\x45\x9c\x0e\x0f\x3f\xfc\xd1\x9a\x06\xe8\x58\xe6\x19\x1b\x59\x89\xd8\x7c\x3f\xcb\xb9\xe6\xfb\xa1\x89\x79\xad\x12\xa5\x89\xb4\x14\x86\x7b\x04\x71\xdc\xe0\xf0\x27\x47\x4d\x21\x93\x03\xf0\x55\x8f\x22\x4b\x41\x55\x68\x25\x10\xc7\x16\x03\xaa\x6b\x94\xdc\xa2\x99\xf1\x15\x94\x34\x70\x30\x58\x2c\xe9\x4c\x2e\x83\x50\x01\x14\x83\x4a\x9b\x01\x3e\x3b\xf8\x6e\x34\x1a\xb1\x81\xcc\x14\xff\xdc\xff\x80\xc1\x38\x11\x5a\x7f\x10\xc7\x5e\xbc\x5c\x24\x82\x65\xf4\x04\x70\x87\x85\xcf\xe2\xa5\xca\x11\x36\x23\x57\x6f\x85\x4b\xa7\xdc\xa3\xd2\x83\xc8\x61\xf3\x9e\x07\x4d\x75\x48\xa9\x39\xb9\x84\x2e\x17\x46\xe8\x2a\x3e\x85\xec\x98\x70\x9e\xd7\x11\xaa\x4d\xc0\xc6\x8e\x9a\x91\x79\x1e\xd6\x79\x69\x56\x8d\x4c\xea\xe2\x6e\x77\x5c\x3a\x12\x54\x31\xf8\x47\xc5\x90\x96\x8b\x18\x30\x98\x05\xe0\x1a\xa0\x38\x84\x6d\x25\x09\x72\x57\xff\x2b\xf9\x2c\xb6\x3e\x29\xea\x44\x0a\x86\x7d\x6f\xd2\x21\xde\xb2\x51\xfa\x26\x2e\xb9\x55\xa9\x66\x1a\x1c\x09\x9f\x77\xf7\xe8\x35\x5d\x76\x43\x7f\xe5\x04\x3c\xdc\xa4\xf2\x3a\xc2\x14\x49\x90\xb6\x14\xa2\xc8\x0d\x72\x7f\xfc\xf9\xd7\xbf\xa6\xe8\xe2\x13\x6d\xe9\x9b\xd8\x9a\xab\xab\x63\xe9\x3a\xb1\x80\xad\x2c\xd7\xfd\x2e\x66\xeb\x19\xcb\x50\x17\x89\x77\xf6\xb4\xd0\x16\x5d\x8e\x1d\x2d\x9d\x42\xe6\x8d\x01\x45\x91\x87\xf0\x84\xa4\x73\x71\x3b\x85\x26\xcc\xac\x34\xc9\xca\x72\xc7\x53\x6f\x42\x52\x13\x26\xcd\xf6\xb3\x74\x9b\xce\x2f\xab\x06\xda\x68\xb2\x53\x30\x3c\xb5\x4c\xe7\xf2\xb8\xe7\x72\x2c\x8d\x63\xbf\x2e\x40\x9b\xfc\x5e\x21\xe1\xaa\xed\x4b\xac\x47\xd6\x91\x9c\x9d\x65\xe9\x94\x73\x5c\xb5\x83\x48\xb7\x95\xc0\x95\x6c\xa6\xb6\xe0\xb0\x6a\x8d\xe3\x96\xa4\x7a\xf9\x33\xa0\x91\x66\xd6\xf6\x7e\xfb\x62\xc7\xde\x1b\xc9\x4c\xa1\x68\xbe\xfe\x2e\x54\x85\xfc\x9c\x67\xa3\x34\xb2\x2b\x1d\xa8\x8e\xd0\x9d\xc6\x02\x59\x10\x2e\x47\xa2\xb8\xd3\x17\x4a\xd0\xbc\x74\x94\x4f\xb4\x95\x0c\x04\x84\xfc\x60\x47\xf9\x4d\x2a\x3b\x79\x96\xcf\xbe\x1e\xaa\xaf\xc2\x30\x58\x7f\x94\xd1\xc0\xcc\x37\xf8\x29\x82\xe9\x82\x99\xcf\xfa\x39\x2b\x91\x82\xab\xef\x45\x03\x8a\x54\xd3\xcf\x59\x89\x48\x79\x67\x43\x93\xb2\x9b\x3f\xda\x7d\xc8\x4b\xf0\x94\x2c\xd3\x08\x9a\x72\x85\xd7\x81\x4d\xce\xe7\xd7\xc0\x10\x6b\xdf\xf3\x69\xf7\x68\x53\x52\x8f\x32\x90\xeb\xc9\xba\x02\xe2\x3d\x32\x05\x91\x1e\x7d\x3d\xc2\x66\xc0\x08\x3b\x79\x0f\x76\xdc\x0d\x95\xf1\x5e\x4b\x7a\x1f\xd9\xc3\x30\x53\xee\xfd\x40\x52\x7b\x98\x4a\xfe\x67\x52\xe6\xd7\x94\xd4\x3f\xd5\x55\x5f\x83\x46\x53\xc8\x24\x0e\x31\xb9\x85\x7e\x41\x71\x50\x1f\x92\xba\x80\x1b\xf7\x47\xd0\x3c\x8b\xde\x7c\x7a\xf5\xea\xf0\xc7\xdb\x50\x38\xa8\x5b\x4d\x97\x9e\x90\xb4\x6f\xc0\x6b\x6e\xb5\xec\x8d\x76\xec\x56\x3f\xfc\xd0\xb7\x28\x01\x95\x69\xe4\x3d\xe1\x23\x93\xbf\x5f\xa8\x9a\xaf\x11\xbe\x28\xde\x7a\xb6\x37\x46\x31\x46\x43\xe6\x75\xe6\xfc\x50\x7e\x6f\x0f\x43\xdf\x66\x21\x4b\x97\xb0\xe9\x3e\xcf\xaf\x72\x5f\x66\x68\x77\x4e\x5d\x3b\x90\xf9\xf2\x08\x16\x11\x1d\xa4\x6d\x35\xff\x29\x4f\xf2\xee\x73\x2c\xbf\x97\xcd\xd7\xd3\x04\xc6\xa8\xbb\xf1\xae\x37\xe3\xda\xea\x4d\x5f\xb1\x37\xda\x5f\xf4\x0f\x30\xe6\x84\x19\x9b\x30\xe8\x78\xe0\x01\x27\x3a\x1f\xfd\x7a\x89\xea\x2b\x98\x43\xae\xf3\xf1\x9f\x20\x7c\x51\x5f\x56\x68\x10\x83\x90\x81\xf1\xd0\xd7\x9e\x54\xb9\x54\xb6\x67\x7e\xb4\x4c\x53\x88\xd9\x09\x98\xc2\x57\x9c\x3a\xb5\x28\xac\xf7\x60\x5c\x15\xf7\x4a\x12\x42\x60\xac\xa3\x46\x9c\xce\xc8\x15\x6f\xa2\xae\xa4\x19\x81\x4d\x7b\x58\xac\x6f\xc4\x21\xff\x9e\xf4\xfc\xff\xb2\x00\x53\xd8\xf7\x9f\x30\x23\x00\xd3\x67\x5a\x45\x00\xae\xc2\xca\x64\x12\x30\x77\x47\x9a\xc7\x66\x76\x00\x8a\xca\xb2\x6f\x20\x03\x2f\x20\x8d\x52\xb4\x90\x3d\x17\x69\x37\x11\x1f\x8c\x2c\xae\x0b\xf3\xaf\x21\x2b\x4d\xf2\x41\x94\xcf\xe1\x57\x9e\x47\xa4\xda\xed\xd1\x90\xb9\xb2\xd9\xd2\xd1\x68\x04\xf7\xf6\x7a\x2a\x65\xd9\x42\xae\xa2\x08\x38\xa1\x52\xb4\x49\x03\xaa\xc1\x2f\x82\x5a\x4a\xdf\x20\x0e\x65\x34\x16\xe2\x4b\x91\xbe\x38\x4b\xd8\x6b\xa1\x93\xbc\xbc\xed\x9b\x84\xea\x64\x72\xb9\xb1\x3b\x64\x1e\x6a\x24\x4a\x31\xce\x82\x55\xa0\x04\x86\x6f\xc8\x25\xbc\x0f\x10\xf1\x01\xe1\xb8\x27\x78\xb0\x29\x94\x9c\x5d\xec\x87\xfc\x9a\x67\x61\x34\x43\x49\x9c\x42\x3c\xdc\x3d\xb4\x05\xae\xdd\xc7\xe9\x07\x21\x19\xa9\x77\x7c\xc8\x21\xb2\x0a\x65\x22\xc6\x60\x07\x4d\x7a\xea\xed\x22\x25\x4c\xef\xe5\xdd\x11\x1a\x9c\x98\xe7\xf7\xd7\x0b\x38\x78\x4d\xa2\x0b\xd9\x2d\x18\xdd\x2c\x44\x9e\xdf\x01\x23\x7f\x3b\xfd\xe9\x6d\xef\x06\xe1\x28\x59\xc6\xf0\x55\x2c\x8f\x31\x71\x75\xc0\x8a\xaf\xab\x5a\xe8\x69\xb9\xec\x14\xf6\x88\x66\x4b\xc4\xf8\x81\x0b\x92\x15\x8d\xc8\x0c\xcf\x60\x0a\x69\x8f\x84\xf9\x54\xcd\x42\x5f\xdb\x80\x2b\x7c\x72\x02\x57\x5a\x62\x22\x69\x85\x76\xe2\x9f\x94\x54\x9b\x65\xcf\x9d\x1f\x13\x92\xf6\xf2\xf1\x61\xdd\xd8\xc7\xd7\x7b\x80\xe2\x90\x8c\xd8\x40\xe3\x4b\x88\x46\x67\xe7\x21\xb0\xaa\xc8\x49\x04\x61\x3a\xfa\x45\x84\xb9\x79\xc5\x6f\xb4\x1e\x08\x9d\xd9\x18\x4c\x0d\xd1\xc1\x68\x34\xa2\xab\x20\x4c\x46\xe0\x2c\x3d\x0f\xa3\x51\xfa\xe4\xf0\x2f\xd1\xbf\x01\x05\x0b\x29\xd2\x09\xf6\xf6\x7a\xd1\xee\x88\x7f\xfb\xfc\x19\x9c\x45\xe7\x56\x1b\x09\xbc\x84\x09\xc7\xa1\x51\x52\x7e\x1b\xec\xed\xed\xf6\xdc\x15\xfe\xcd\x59\xfe\x2f\xd1\x93\x27\x01\x12\xca\x99\xde\x8d\x3c\x50\x86\x85\xfa\x02\x2a\xa2\x7c\xf1\x8b\x6a\xa4\x7f\xb8\x52\x9b\x56\xf2\xac\xb9\x3b\x46\x90\x45\x41\x48\x9e\xf7\x0a\xbd\x70\x20\xd4\xe1\xaa\xf4\x56\x94\x78\x86\x43\x1a\xa2\x4a\x0d\x47\x2d\x8a\x42\xd7\x1a\xc3\xf6\x58\x0b\x0b\x58\x2b\xe3\xe7\xb4\x1b\x38\x1f\xf7\xc3\x19\x35\xdf\x1d\xaf\x30\x85\x29\x3b\x85\x45\xa9\xc8\x66\xe1\x40\xcb\x53\x01\x71\x2c\x00\xe0\x9c\x47\x49\x57\xa5\xba\xa7\x23\x3d\x43\x46\x52\xde\x0a\x26\xe9\x1c\x24\xe8\x77\x28\x67\xc2\x27\xb2\x53\x28\x22\x50\x8a\x1a\xd8\xdc\x1e\x50\x69\x11\xa8\xa2\x53\x78\x09\x31\xfb\x7e\x49\x07\x8b\xe5\x38\x41\x74\x96\xb5\xce\xbb\x3c\x8a\x63\x68\x62\xef\x0b\xb2\x48\x68\x36\x79\x03\xfc\xd0\x7f\xee\x4c\x3d\x63\x86\xa7\x49\x3f\x3d\x44\xc9\xce\xe4\x46\xad\x5e\x89\xd8\x1a\x25\x18\xe4\x4a\x66\xad\xca\xb2\x62\x4c\xc3\x1e\x74\x6e\x59\x39\x60\x2c\xf4\x76\x81\x3e\x5c\x8d\xe6\x54\x70\xf9\x5b\x0c\x25\x5b\x90\x23\xc4\x59\x27\x95\x01\x63\xf3\x77\xf7\x11\xbd\xe5\x21\x81\x38\x6e\x33\x1e\x7d\x6f\xd5\x05\x55\xab\xbd\x9e\xe5\xd4\x75\x33\xbd\x8a\x1b\xca\xa5\xea\xaa\x4c\xe1\xec\xe7\x43\x91\xa9\x0d\xe8\xc0\x1e\x0b\xa6\xef\x15\x8f\x52\xa9\xec\x2d\xb0\x3a\x3a\xd0\x2f\xd5\x15\xab\x46\xee\x26\xd9\xb4\x86\x79\x0a\x4f\xe1\x6f\x4b\x88\x23\x58\xe2\x43\xf2\x24\x59\xf5\x5d\xc3\xea\xaf\x94\x48\xb4\x6b\xf7\x54\x39\x52\x27\x69\xd9\x7c\xc4\xb8\xc8\xe6\x4d\x68\xa4\x4c\xff\x3e\x85\xaf\xf9\x6d\x7b\xfb\xa0\x11\xdd\x3c\x16\xb8\xbc\x07\x53\x07\xd3\x9a\x6d\xfe\x22\xd9\xbe\x03\x35\x8b\x3a\xa5\x8d\x30\x11\x6c\x25\x14\xfd\xbc\x23\x49\x32\x06\xb9\x33\xc6\x05\xf8\x8a\x86\x52\x55\x5b\x5c\x89\x9d\xf6\x06\x76\x73\xd4\xad\xb9\x3d\x0e\x25\xf5\xb0\xc6\x79\x64\x2d\x60\xe5\xa8\x4b\xfe\x0c\x95\xcb\x98\x25\x8b\x51\xcb\x08\x83\x55\xad\x62\x62\x0a\x99\xb0\x27\x15\x67\x2f\x2d\x85\xcc\x6c\xe8\x44\x08\xce\x54\x2f\xed\x54\x14\x52\x2c\xf5\xaf\xae\xa2\x68\x2d\x47\xea\xa4\xcb\x68\x6d\xe2\x52\x61\x9d\xb2\x89\x55\x49\x3d\xe2\x0e\x84\xd5\x25\xad\x52\x6c\xfc\x82\x62\x7d\x1f\x36\x62\x30\x2e\x62\x30\x0e\x42\xa8\xef\xff\x3a\x37\xfa\x5a\xd5\x4a\x2e\x99\xa1\x12\x46\xd5\x8b\xad\xac\x42\x8d\xf2\xaa\xb0\x42\x3b\x44\x1b\xd5\x43\x34\xbc\x0d\x3d\x92\x80\xdc\xb0\xcc\x49\x0b\x5e\xbe\xa6\x01\xf1\x5d\xcb\x4c\xeb\x0a\xea\x22\xa1\xa5\xb1\xa8\x29\x6e\x95\x0a\x53\x92\xc0\xba\xb2\xe2\xbb\xd4\x11\xd5\x15\x93\x05\x56\x6d\x53\x67\x99\x58\x88\xc6\x2e\xbf\x10\x59\x33\xfb\x92\x45\x9d\x35\x5a\x13\x68\x40\x6b\x3e\xea\xe3\x55\x30\x1a\x59\x63\x4a\x5a\x02\x25\x28\xad\x44\x5d\xda\x0f\x04\x1a\xd8\x65\x4d\xd9\xca\x27\x68\x03\xcb\x14\x11\x40\xe1\x1f\xc5\x0f\xf3\xda\x1c\xbf\x0a\x1c\x75\x66\x51\xb5\xb6\xb0\x2a\x01\x82\x11\x18\x1f\x84\x07\xed\xb4\x8a\xf2\x38\xbf\x3f\xad\xe2\xdb\x7f\xbe\x62\xbf\xbd\x5e\x5e\x3d\x02\xad\xa2\x5a\x43\x45\x67\x14\x39\x19\x63\x63\xf3\xde\xc0\xd2\xcf\x4b\xea\x79\x13\x92\xca\xc8\xf4\x73\x65\xbd\x5c\x49\xe7\x58\x54\xd0\x15\x74\x8c\xf2\xa5\x1c\x9b\x79\xe4\x43\x6c\x30\xe7\xc9\x0f\xbe\xa5\x59\x8f\x99\x5b\xcb\xf2\x66\xea\x8d\xe5\x33\xc8\xd4\xdb\x3f\x95\x23\xfc\xc5\x24\xea\x5f\x22\x78\x75\x2f\x5e\x54\xfd\xc3\xa7\x35\xa6\x73\x45\xe5\xae\xfe\x61\xec\xdd\x5c\x58\x98\x47\xba\x12\x1c\x2b\x11\xa7\x84\x17\x9d\x56\xc6\x09\xf0\x76\x93\x99\x43\x06\xea\x55\xd5\x59\x20\xdb\xfc\xe4\xd4\x19\xdc\x61\x92\xc5\xcd\x50\xda\x2d\xce\xdd\x21\xfb\xd9\x0e\x50\x36\xf4\x35\xb9\x3b\x1c\x63\x24\xaa\x5f\x15\x0d\x7d\x29\x35\xac\x3d\xec\x0a\x6c\xb2\x9f\x69\x37\x95\x45\x61\x51\x2c\x61\x5e\x5b\xfc\x78\x97\x75\xb5\x56\x4c\x3f\xae\x79\x02\x1e\x84\x25\x85\x6e\x3d\x1e\xe8\x89\xb5\xb2\x60\x2c\xcd\xbb\x65\xad\x3c\x58\x36\x43\xb6\x26\x7c\xf3\x30\xe9\x4f\x97\x8c\xc1\x94\x7a\xf3\xb1\xdb\xe9\x73\x7d\xfc\x73\xd6\x12\x31\x16\x23\x88\x19\x4c\x3d\x4c\x70\x7f\x91\x22\xcc\x84\x0b\x4a\x86\x9e\xc2\x97\xb4\xde\x87\x74\x13\x1f\x54\x2b\x9e\x26\xd2\xb1\x01\x55\x1b\x32\xd6\x30\x03\x63\x4f\x45\x09\x54\xbe\x8b\x5f\x85\x3e\xfc\xcd\x78\x31\x2a\x0c\xf2\xb3\x70\xab\x72\x65\x33\xff\x37\x6b\xe1\xaa\x23\x02\x1b\x8b\x01\x4b\x36\x61\x85\x04\x3e\xce\x82\xb9\x36\x05\x46\xdc\x70\x1e\x80\x31\x10\xcd\xe6\x5b\x9a\x8a\xdd\x9a\x15\x64\xd5\xbc\xa5\x65\xbb\xe9\x2a\x27\xd1\x9c\x7c\xa0\x8b\x93\xe8\xd6\x40\x93\xc2\x4b\x44\x2d\xfb\xa4\x4d\x00\x93\xb5\x95\x81\xe5\x9d\x7a\x57\x02\x4a\x3b\x77\xc7\xf6\x41\x27\x0b\x70\x6e\x85\xd0\xed\x03\xaa\x17\xaf\x1a\xe9\x42\xa0\x6d\x68\x1c\x57\x8d\x62\xa6\xcc\x4d\xa3\xd9\x9d\xd2\x7d\xe2\xa0\x14\x32\x8e\xab\xe2\x66\xca\x54\x1b\xe2\x21\xa7\xb4\xcb\x7d\x56\x9a\x0f\xcb\x1e\x3e\x7b\xd6\x46\x2a\xe2\x41\x9b\x63\x58\x25\xd5\x63\x0b\xba\x5d\xce\xb5\xea\x02\x53\x33\xaf\xbb\x91\x5a\x91\x37\x06\x2a\xad\x2f\xc3\x5a\x82\xa7\xed\x45\x97\x07\x6e\x4b\xe2\xdf\x86\x7d\x8b\x2a\xf6\xd2\xb4\x49\x63\xa5\x57\xae\x45\x59\xb3\xb0\x2d\x6f\x67\x6d\x11\xb3\x39\xd7\xd2\xd5\x7d\xbe\xed\xd1\xbd\xe1\xa6\xb5\x1a\x6c\x62\x41\x5a\x73\x1c\xeb\x4c\xbe\xe5\xfc\x8b\xe7\xf3\x86\xb3\x37\xcd\xb5\x22\x8f\x33\xbd\xc6\x9a\x04\x6c\x25\xaa\x59\xed\xae\x8b\x3e\x9d\x5d\x96\x36\x34\xb4\xcd\x8b\x8b\xda\x1b\xda\x3e\x32\x7d\x41\x47\xab\xd3\xdb\xf5\x80\x68\xad\x8b\x68\xad\x35\xc8\xf4\x9f\x59\xba\x79\xf1\xce\xad\x05\x90\x85\x7e\x41\xb1\x9d\x94\x55\x7f\x6f\xa8\x6b\x69\x10\x82\x70\x63\x6d\x85\x91\x5a\x01\x06\x7a\x85\xa2\xaf\x6a\x75\x11\x96\xe0\xaf\x2c\x0b\xce\x72\x33\x55\x0a\x97\x71\x51\xb8\x9c\x23\x4a\x70\x9d\xd0\x17\x17\x84\xbe\x3a\x40\x92\x16\x31\x57\x2b\x47\xea\x5d\x57\x6c\x05\x81\xc9\x27\x97\x53\x47\x58\x9f\x2c\x2c\x75\xd8\x65\xf9\x41\x59\x11\x30\x2d\xce\x32\xb0\x45\xff\xd3\x6c\x82\x39\xb5\xc4\x34\x9b\x61\x50\x50\x44\x54\xea\x2f\x45\xaa\xfa\x9c\xc6\x60\x03\x55\xa7\x76\x2d\x16\x06\xdb\x30\x4d\x49\x9a\x8f\xa3\x38\xe9\xb1\x5c\xe4\xbf\xbc\x5b\xf7\x3e\x26\xac\x3f\x21\x4b\x1c\xfb\x41\xb8\x7b\xd8\x4e\x25\xaa\x06\x7a\x6f\xde\x04\x9d\x8f\x9f\x8d\x5c\x06\x55\xa4\xc9\xb0\xe8\x12\x98\xb3\x9d\x71\x7f\xd3\x66\x55\x85\xaf\x55\xca\xf2\xc2\x57\x55\xfb\xc6\x36\xd6\xd7\x76\x92\xc5\x4a\xc6\x26\x73\xb5\x6a\xe9\xe1\x78\x27\xf6\xc4\x8e\x23\x2b\x67\x61\x5c\x32\x84\x34\x76\x1a\xb8\xd9\xe8\x0f\x3b\x8c\xfe\x60\x10\xd6\xba\x26\xea\xc5\xc4\x55\x2b\xe9\xfa\xa0\x16\x02\x57\xaf\xa1\xfb\x93\x73\x01\x73\x9c\xd0\xd0\x02\xc6\x6a\xd5\xda\x26\x41\x6f\xc0\x47\x46\x65\xdc\x2e\xd9\xd0\xda\xd8\xa0\xab\xcb\xe4\xbd\x29\xc5\x9d\x37\x54\x31\xdb\xa3\xe3\xda\xba\x05\xad\xb9\x38\x2b\x6a\xf6\xfc\x14\xb2\xcc\x8e\xa9\x76\x5a\xd6\xee\x97\x46\xaf\x82\x52\x12\xc7\x4d\x8b\x0e\xde\x40\x4e\x08\xad\xd7\x49\x4b\xbf\x53\xbd\xb9\xee\x4f\x47\xfc\xee\x9b\x2f\xff\x8e\xd1\xc1\xc5\x23\xd0\x11\x3f\x22\xcf\xd3\x7b\x8c\x3d\xb9\x86\x46\x61\xce\x2a\xa3\x55\x36\x29\xc2\xda\x38\xd3\x2a\x1d\x98\x54\x65\xde\x96\x4b\x6d\x5e\x8b\xa5\xdf\x8a\x3e\xef\xca\xcf\x76\xb3\x74\x45\x5b\x14\x24\x14\x4f\x95\xf6\xa2\x84\xfb\x3b\x87\x96\xbf\xa2\xf4\x1f\xc7\xdf\xc2\x4e\xe7\x50\x45\x9c\xc0\x0d\xc1\xd7\x1a\x6c\x12\x17\xf7\x39\x95\x33\x25\xe9\xf5\x43\xf4\x78\x2e\x0e\xf1\x91\x51\x71\xcd\x09\xa9\x5d\x7e\xb6\xf9\x2b\x5b\x13\x6d\x9a\xc2\xce\x59\x33\xb6\x8c\x5c\x51\x68\xa3\xce\xb2\xcf\x14\xb5\xed\xfa\x2a\x88\xbb\x42\xb3\xd4\xb8\x70\x57\x97\x34\x25\xea\x29\x8c\xe2\xba\xdf\xdf\xc6\x9e\xfd\x74\xf4\x3f\x5e\x9e\x1e\xee\xff\x19\x4b\x7b\xbe\x76\x98\xe2\xaa\x01\xf8\xee\xcb\x31\xd4\x99\x8f\xdd\x1f\xcb\x89\x90\x3b\x8c\xbd\x18\x02\xcc\xb4\xda\x2d\x4f\x72\xf5\xcc\xdb\xe8\x74\x14\x39\x52\x40\xf2\x62\xa4\xae\x4c\xdf\x69\x52\xa2\x9f\x75\xa5\x04\xb7\x15\x4d\xa3\x6a\x3f\xb6\xbe\x63\x1e\xec\xd5\xd2\x2d\x94\x06\x16\xf1\x50\xc5\x5a\x3c\xe8\x58\x1a\xdd\x94\x08\x24\x02\xc9\x29\x23\x29\xe7\x5c\x2b\xb4\x08\x56\x11\x3f\x28\xc6\xc4\x50\x58\xe1\x9f\x87\xfa\xa7\x8e\xa9\xab\x24\x89\x47\x71\x2c\x4e\x8c\xe6\xc8\xac\x45\x96\x5d\x44\xcb\xad\x8e\x8d\x5b\x2c\x4e\x21\x3b\x96\x42\xa3\x1f\xc4\x97\x1e\x0b\x42\xa7\x93\x68\xc1\xb9\xcf\xf6\xea\xcb\xb9\xf3\xbd\xc8\x52\xce\x76\x1f\xbc\x74\x47\xac\x09\x2d\x9b\x07\xeb\x20\x4a\x20\x48\x4f\xa5\xf1\xcb\x2b\x06\xe7\xd6\x1a\xd5\x4c\x82\xfa\x6a\xac\xef\xca\x7e\x4a\x96\xcb\x61\xb3\xab\x53\x8b\x7d\xfc\x28\x3d\x7c\x34\x52\xd6\x6f\x07\x83\xc5\xb7\xe2\x62\x53\x18\x83\x56\x5a\x09\xc4\x52\x1a\xab\x06\x92\xaf\xde\x9f\x46\xb5\x8f\xa4\x52\x49\xf7\x66\xf4\x4a\xa6\xfb\xe5\x7c\x0e\xd2\x6b\x5e\x86\xca\x9f\xa5\x22\x6f\xc4\x52\x8a\x66\xe6\xf2\xe7\x0c\x2d\x82\x10\xf6\x70\x95\x2a\x6a\x5b\xd4\xec\x8e\xd3\xe1\xa7\x48\x64\xee\xb0\xc1\x84\xa4\x2f\x41\x21\xf6\xb5\x71\xc6\xd0\x01\xe8\x77\x0f\x83\x95\x6c\x12\x56\x36\xa9\x4f\x4c\xb3\xa0\xb0\x43\xdb\x77\x4e\x7c\x1b\x89\x28\x1d\xc2\x2e\xa4\x76\x48\x67\xe4\xea\x94\x81\xd4\x04\x06\x19\xee\x1e\x86\x29\x21\xfc\xf9\x98\x2c\x31\x1b\x1e\x84\x19\x02\x59\xb2\x45\x0b\xab\x82\xb0\x80\x43\xe5\x62\x06\xbb\xb2\xb2\x0a\x99\x1c\x65\x35\x9a\x49\xa5\xdc\x84\x9f\x49\x05\x59\xb3\xa5\x86\xc9\x16\x4a\x44\x17\x29\xb4\x11\x92\xd1\x41\x88\x46\xbf\x0c\x16\xc9\x32\xba\xe8\xd1\x30\xa7\x44\xd9\xc1\xce\x35\x45\x03\xa5\xa7\xa1\x3d\xeb\x0e\x08\x3e\x7f\xee\x91\x27\x23\xb1\xbc\x6c\x60\x83\x68\x44\x5a\x1f\x8f\xf7\xc7\xac\x44\xfb\x7f\xfb\x1f\xbf\x9e\x7c\xd3\x4d\x0a\xb1\xbe\x34\x54\xc9\x39\x35\xc1\xda\x20\xff\x34\xf8\x28\x0d\x67\x94\x79\x54\x66\xde\x25\xf3\xba\xaf\x41\xe4\xd6\x8b\x3b\xf3\x1f\xb3\x41\x34\xd8\xdf\xe4\xad\xb7\x9a\x8d\xd3\xf4\xe8\x5b\x85\xe8\x55\xe8\x22\xf3\xe0\x0b\x07\x95\x6a\x20\xda\x60\xcb\x03\xd4\x6c\x0a\x3f\xcc\x9d\xff\xe5\xd3\xbe\x7c\xb8\xfb\x36\x6e\x5b\x05\x7e\x40\x09\x13\xfc\x90\x0d\x82\x4d\x57\xa4\x00\xf4\xd6\x8b\x95\x4d\xb0\xf4\xc9\x9a\x6f\xd5\x37\x33\xfd\xca\x02\x1a\x1a\xa5\x02\x39\xe0\x64\x86\x99\x86\xce\xed\x82\x3a\x5b\x66\xc1\xaa\xac\xac\x2a\x52\x03\xab\x5a\x8f\x8c\x62\xbb\x5d\x7e\x67\x8d\x40\x83\x35\x79\x0c\xfd\x6d\x5b\x57\x15\xe8\x85\x8e\xd6\x51\x0e\x9d\xa7\x66\x85\xec\x02\xf5\x16\x51\xc6\xb2\xa9\x10\xea\xa4\x86\xd1\xc2\x35\xbe\xde\x39\x73\xa8\xcc\xa8\xa9\x4c\x4b\xb6\x0c\xc9\x9b\xb7\x5d\x6a\x63\x9d\x54\x65\x15\xe5\xb0\x35\xca\x88\xac\x06\x1d\xeb\x51\x92\x7c\x7f\x2d\x8e\xfd\x1e\xcb\xd9\xc1\xe5\x29\xb3\x8a\x80\x2f\x53\xc8\x4e\xc1\x25\x8c\xb5\xdb\x24\xcd\x35\xd2\x6c\xa9\x14\x11\x4c\x49\x02\x07\x09\x99\x8a\xc8\x8d\x5b\x32\x5c\x52\xe7\xc5\xfd\x91\x30\xbf\xbe\x1e\x2f\xc6\xd7\x07\xe9\xfd\x29\x52\x0a\x20\x68\x29\xe2\xba\xbf\x34\x4a\x9d\xce\xbe\xc7\x2f\x94\x69\xb3\x14\x8f\xec\xba\x6b\xc8\x47\xb3\x65\x61\x5e\x8b\xd4\xba\x3a\xcd\x8c\x08\xbf\xc0\xcb\x89\x80\x8a\x96\x11\xa7\x43\x6e\x25\x4f\x4f\xc7\xf1\x23\x1a\x11\x81\x5f\x9b\xd5\x61\x55\xa7\xf2\x5a\xf9\x75\x25\x25\xdd\x42\xcf\x74\x9f\xb9\x60\x62\xf0\xd7\xc9\x3f\x7f\xfe\x9d\xde\x25\xcb\x46\x1d\xec\x46\x76\x1e\x74\xcb\xfd\x61\xd5\x6a\xc5\xfa\xc8\x0e\x15\xeb\x93\x20\xca\x4a\x63\x29\x75\xbf\x5d\x0a\xba\x43\xd2\x0f\x73\x6f\x3e\x44\xfd\x45\x36\xb8\x47\x76\xda\xd5\x9d\x3e\xf9\x93\x23\x93\x6f\xb7\x82\xc3\xfd\x6d\xe2\xbf\xff\xf3\xe5\x13\x30\xf9\xe7\xfb\xd6\x09\x9d\x64\xd6\x24\x65\xb0\xf4\x96\x30\x4f\x92\x67\x25\x9b\x9a\xdb\xa0\x6f\xca\x00\x6b\xdc\x08\x8b\x94\x4c\x50\x02\x1f\x7e\xa6\xc8\x86\x8c\xf3\x86\xfa\xa1\xd5\x69\x02\x43\x2c\x22\x8c\xca\xfc\x43\x52\xdc\x48\xf0\x04\xa9\x34\x53\x3b\xa5\x2b\xcb\x95\x4b\xd0\x48\x64\xcb\x9a\x1f\x35\x32\x7a\x92\x42\x0a\x31\xeb\xe1\x60\x6f\xaf\xf8\x8e\x06\x7b\x7b\xce\xe4\x83\x85\xb4\x80\x76\x82\x48\x65\x5c\xcd\x29\x2b\xf9\x2c\x93\x29\x33\xf8\x0a\x23\x86\x40\x42\x7b\xc5\x50\xad\xf2\xb2\x54\xa0\xd3\xd5\x5a\x68\x9a\xda\x20\xca\x23\x3b\x92\x5a\xe3\x57\x27\x52\xac\x01\x19\x1b\xa9\x30\x1d\x4e\x2d\xef\x04\x1f\xac\x93\x73\xb0\x01\x6b\xa7\x90\x7d\xa0\x9c\x30\x2f\xf5\xed\x1c\x83\x15\xe0\xad\x42\x76\xaf\xa6\x51\x0c\xc6\xf6\x0f\xc4\x66\x64\xc9\x4e\x97\x93\x09\xfa\x64\x04\x12\xcb\x24\x51\x1a\xa0\x96\x01\xbf\x94\x98\x0e\x96\x3c\xb1\x2a\x08\xc9\x41\x64\xb3\x1f\xbc\x9f\x16\x28\x7c\x7f\xb7\xc9\xe2\x1f\xdf\x4d\xaf\xc9\x93\xef\xff\x34\x39\x5a\xc7\xe4\xe8\xf1\xa6\xef\x57\x14\xb2\xc8\xda\xa7\xb0\x30\x23\x8e\xb5\x68\x9a\xca\x0c\x7a\xad\x29\x74\x6a\x65\xdc\x73\x11\xd2\x9b\xdb\xed\x16\x37\x4c\x23\x35\x41\x21\x48\xa3\xd9\x3d\xe6\xd0\xe3\xdd\x37\xf9\xef\xf2\x32\x25\x4b\x97\x89\xd6\x8e\xcc\x81\xf4\x38\xd5\x3f\x75\xa8\x16\xf5\xf8\x1e\x4c\xf5\xcf\x1f\xf8\x2a\x9e\x87\xb2\xe6\xd0\xf7\x43\x82\xff\x0e\xaf\xf9\xf5\x5d\x8c\xbb\xab\x69\x83\x74\x89\x07\x31\x1c\x93\xa5\x0e\xaf\x2c\x8f\x35\x61\x2f\x10\x7e\xf3\xd5\x41\xb0\x1a\x90\x31\x1f\x29\xa4\x3d\x3d\xa2\x20\xd4\x23\x1a\xee\x1e\x84\x04\xbf\xd1\x4f\x9b\xb5\x6e\xa6\xa9\xda\x57\xd3\xb4\xfa\xd0\x6f\xb6\xd0\xcf\xb1\x89\xce\xab\x61\x38\xdc\x3d\xd4\xfd\xf0\xa7\x2d\xf4\xc1\x17\x46\xb5\xcf\x17\xc6\xea\x40\x3c\x6e\xa1\x07\xb1\xde\x6b\xa7\x2c\x4f\x21\x5d\x26\x8c\x8e\xf8\x91\x22\x3a\x71\xab\x13\x42\x38\xba\xb9\x90\x58\x94\x93\x69\x6b\x64\x88\x49\x64\xbb\x3d\x66\xab\x98\x05\x77\x28\x7e\x57\xe3\x66\x60\x5a\xfc\x22\x61\xa6\x62\xb9\x14\x3f\x9a\x45\x5b\xed\xc0\x81\x1e\xd2\x28\xfb\x39\x60\x29\x9a\xf7\x82\xf0\x60\xd7\x7e\x29\xb3\x74\xec\xed\xf5\x44\xf0\xcd\xcf\x9f\xe1\x80\x81\x29\xff\xa3\x7a\xe1\x3f\xb3\xa1\x06\x7b\x7b\x36\x61\x62\xed\x5e\x3f\x10\xc9\x43\x7a\xa5\xc0\xcf\x19\xad\xa0\x20\xaa\xc3\x18\x37\x9e\x4a\x8f\x8c\x72\x5d\x43\x2c\xa6\x8e\xb6\x16\xb0\xb8\x47\x2d\xc0\xc1\x7f\xfe\xf4\xb7\xef\x67\xe3\x3f\x49\xa0\x3f\x16\x09\x54\x9d\x8e\x5a\xa2\xa4\x57\xe5\xeb\x55\x59\xd9\x95\x3e\x5a\x6c\x80\x0a\x27\x27\x67\x23\x13\x92\xce\xfb\xd3\x94\x2c\x17\x7c\x00\xcf\x9a\x43\x2e\x4e\x48\xb4\xa4\x7d\x84\x17\x4b\x4b\xbe\xc9\xae\x17\x90\x4f\x87\xef\x06\x3f\x6b\x7c\x91\x80\x08\xce\x8c\x89\xb7\x08\x90\xa7\x2d\xe3\xd5\x89\xce\xc1\x2d\xc6\xa0\x68\x26\x6f\x3e\xee\x3f\xf3\x43\x1f\x78\x3f\xbd\xf3\xc6\xa1\xf7\xc9\x3b\x7a\xfb\xc2\xbb\x0e\xbd\x8f\x1f\xfd\xc5\x2c\x05\x14\x7a\x73\xc0\xfe\xfb\xc7\x8f\xbe\xdf\xe0\xe7\x55\x3d\xdd\x68\x06\xa3\x0b\x2f\xfb\xd9\x47\x38\x41\xb8\x2a\x1b\xb8\x15\x6f\x0d\x8c\x61\x31\x30\x9f\xd5\x8a\xf9\x5c\x1b\x9a\x4f\x81\xd1\x0d\x40\x11\xda\xd5\xe0\x13\x6f\x55\xc4\x63\x3a\x93\xbf\xc7\xe4\x93\x86\x9e\x78\x96\x31\xb4\xfc\xdc\x44\x44\xab\x8a\x82\xd6\x97\x63\x49\xce\x6c\xe2\x11\x7a\x22\x69\xb1\x63\xb6\x2d\xa2\xae\xfd\x09\xea\x02\xa8\x4d\x50\xc3\x12\xb8\xd5\xdd\xff\x27\x9c\xb7\x02\x67\x4e\xb5\x95\x61\xcc\xc0\xd4\xc3\x60\xfe\x27\x32\x6f\x07\xc8\x92\xb9\x2b\x41\x39\x23\x5d\x37\x04\x76\x29\x86\x63\x69\xa6\x8a\x52\x93\x7f\xfa\x86\xd8\xd5\x33\xd7\x2f\x8c\xc0\xc0\xbc\x70\x3b\x00\x6f\xdf\xab\xb7\x40\x4a\xb6\x10\x0e\xb0\xe5\xa2\xd9\x1f\x67\xc9\x50\x42\xf7\x21\x8e\x88\xba\xdd\x6f\xdd\x1d\xe7\x06\xfc\x0a\x3e\x75\x54\x2c\x54\x9a\x80\x49\x2d\xfb\xaf\xe0\x93\x70\xc0\xf8\x6d\x09\x29\xeb\xf9\x72\xee\x7e\x78\x33\x87\x6c\x46\xe2\xa1\x7f\xf2\xd3\xe9\x7b\x3f\x8c\x81\x8e\xf7\x20\xa4\x3d\xe2\xf9\xfd\xf5\x02\x0e\x25\xa5\xb0\x2a\xeb\x18\xa4\xd5\xb4\xe1\x12\x06\xdf\x03\x0a\xbf\x7e\x36\x10\xd0\x82\x3d\x7f\xe8\x3f\x51\xde\x06\x03\x38\x07\x28\x79\x62\xbf\xd1\x9a\x8f\x60\x47\xe5\x0d\x48\x48\x24\x34\x1f\x83\x59\x0a\x27\x23\x5f\x30\x3d\xfb\x94\x92\x7d\xff\x89\x6c\xf0\xc3\xbb\x57\xc7\x64\xbe\x20\x58\xaa\x33\x56\xc1\x20\xe2\x7b\x23\x67\x19\xd2\xa0\x36\x90\x8b\x5e\x62\xbd\xb6\xcc\x6b\xe4\x78\xa8\x2a\x35\xa4\x5c\x30\x13\x1c\x83\x93\x8f\x03\x21\x04\x3a\x15\xd6\xff\x24\xed\xf9\x67\x0b\xd5\xf9\x28\x1e\xcf\x00\x9d\x9d\x8b\xb4\xaa\xe2\xf2\xda\x39\xd8\x1d\x8d\x98\xe1\x6f\xfd\x9b\x9b\xc1\x8b\xef\x79\x99\xd5\xca\xe7\x5f\xd6\x91\xdd\x6f\x38\x22\x89\x76\x37\xf1\x98\x1f\x45\xc3\xd6\xcd\xf0\xd2\x56\x33\xa1\x6c\x78\xc8\x42\x41\x0c\x0d\x7d\x3f\x9c\x43\x4a\xc1\x14\x0e\xfd\xf7\x33\x44\xbd\x17\x6a\x41\x3d\x24\x92\xb7\x46\xd0\x53\x94\x3e\xf5\x40\x92\x78\x64\x99\x7a\x0c\x82\xb9\x21\xaa\x80\x14\x55\x82\x24\x21\x57\x47\x98\xe0\xeb\x39\x59\xd2\xa3\x28\x82\x94\x0e\x77\x0f\xc3\x09\x4a\x29\x13\x23\xf6\xfd\x30\x01\xd9\x6f\x81\xb1\xfc\x87\x46\xd4\x21\x5b\xb9\xad\x43\xe4\xa2\xff\xd7\x9e\x3f\x26\xf1\xb5\xb4\x5a\x3a\xe6\x87\x7f\xcf\x1f\x83\xe8\x82\x53\xf3\x38\xee\x47\x24\x21\x69\x9f\xcd\xe0\x1c\xf6\x13\x34\x9d\x31\x2b\x18\xda\x40\x4c\x75\xe4\x9b\xa9\x9d\x8a\xfd\xb9\x0a\x63\xd8\xa6\xbf\x14\xce\xc9\x25\x6c\xd5\x65\xf3\xde\xb8\x3f\x56\xfc\xf0\xed\xef\x7f\x07\xf3\xff\xf8\x8f\xd6\xba\xed\x1a\x9e\xcf\x13\xa9\xaa\xc5\x8c\xbc\x05\x88\xf9\xd1\xdd\x3f\x3c\x38\xb8\xdd\x80\x22\x75\xec\x5a\x56\xa9\x96\x36\x41\xf3\xa9\x6a\x98\xa6\x91\x1f\xfa\xfb\x80\x52\xc8\xe8\x3e\x9a\x4f\xd5\xfa\x24\x64\x4a\x06\x0b\xac\x8b\x81\x84\xf9\xa1\x41\x9c\xc2\xa0\x30\xe9\x4b\x57\x22\x0f\x93\x3e\x59\x32\x4e\x1e\x79\x73\x90\x4e\x11\xee\x33\xb2\xe8\x3f\x35\x00\xd9\x02\x4d\x66\xb5\x7b\xf8\x55\x19\xd2\xdd\x67\x1a\x91\x29\xb5\x66\x7a\x85\x62\x36\xf3\x43\xff\xf0\xab\x6f\xd4\x9b\x19\x14\x48\x1d\xfa\x87\xdf\x7e\x93\x03\x87\xd8\x3e\xc2\x67\x8e\x5f\x61\x63\x40\xdb\x00\xa6\x23\x28\x3a\xb1\xf5\x1c\x3b\xbe\x6d\x66\xe6\xf5\x7e\xec\xab\xfb\xf9\x76\x55\x32\x77\x16\x6f\x25\x7f\xb0\xd4\x11\x66\x29\xa4\x24\xb9\x2c\xd2\x62\x52\x2c\x6a\xbe\x6d\x91\x04\x33\x94\x8b\x73\x30\xc2\x81\xb5\x82\x2c\x14\xa6\x1a\xd3\x7d\x88\x2f\x51\x4a\xb0\x8a\x8a\xbc\xd9\xb8\x76\x24\x35\x65\x91\x10\x19\x49\xa8\x69\xa3\x61\x46\x6b\xe9\x57\x9c\x42\x5b\x05\x3b\xd9\xa4\xf0\x60\x0e\x16\xbd\xa2\x98\x36\xcd\xdb\x57\x84\x37\x0b\xc0\x66\x43\x7f\xdf\xd7\x99\xfd\x54\x81\x18\xd0\xd9\x98\x80\x34\x36\x45\xb2\x37\x85\xa2\x5a\x19\xae\xca\xd1\xfd\xa1\xb1\x2b\x37\x3f\x85\x39\xed\x2a\xac\x18\x8d\x71\x74\xd1\x6d\x98\x17\xab\xa0\x38\x2e\x13\x30\xa9\xa9\xbb\xfd\x78\x7f\x68\x45\x7c\xb5\x1e\xea\x07\x63\xb2\xf8\xea\x0e\x54\x74\xa0\xa1\x8a\x55\x56\x9c\xfe\x58\x06\x70\x57\xa5\xc5\xd3\xfe\x50\xfc\x91\x85\x0b\xc5\xa3\x25\x65\x44\x1c\xd2\x59\x07\x8c\x21\x3c\xa5\xd5\x43\x92\xa6\x35\x89\xa9\xa1\x9f\x0b\x4d\x2f\xa9\xbd\xa4\xf2\xc9\xb9\x56\x59\x21\xfd\x5c\x28\x46\xe7\x6c\x91\x8d\x8f\x3f\x14\x0a\x24\x28\x82\x98\x66\x73\xd0\xcf\x85\x62\x9c\xd2\x34\x65\xc4\x43\xa9\x40\x8c\x98\x55\x82\x3f\x95\x40\xa6\xd9\x14\x03\xae\x65\x69\x3c\x14\x46\xcb\xd4\x06\x29\x7f\xdc\x1f\x32\x72\x01\x71\x8b\x41\x55\xe2\x02\x25\x59\x9b\x94\x54\x34\x78\x01\xaf\xa3\x84\x80\x0c\x09\xcc\x8b\x22\xd4\x04\xcd\x6d\x60\x26\x9e\x4a\x0b\x94\x4e\x09\xb3\xd6\x47\x3c\x16\x0a\xa5\x90\xc2\xac\x8c\x78\xaa\x18\x1a\x27\x13\x96\xcc\xee\x92\x3f\x16\x81\x37\x03\x36\xec\xf8\xd3\xfe\x90\xef\x18\xb1\x8d\x86\x14\xa6\x48\x20\x5b\xa1\x9a\x31\x19\x50\x15\xf5\x73\x69\x69\x84\xf8\x3b\x5b\x1a\xf1\x58\x5c\x93\x28\x22\x4b\xe1\x59\xa8\xd7\x45\xbf\x28\x14\xcc\x5c\x4b\xcc\xd1\xf5\xdf\xaf\x50\x12\x47\xf2\x60\xaa\xb8\x4f\x78\x5d\xba\x0f\x16\x8b\x04\x45\x8a\x11\x68\xa7\x70\xcb\x6a\xe4\xd4\x6d\x25\xc1\x00\xe6\xeb\x51\x8a\xde\xc1\x08\x49\x18\x5a\x14\xae\x84\x10\x87\xf4\xf6\x34\x74\xb4\xb5\x99\x7f\x83\xb9\xd8\x02\x61\x0c\xe3\xaa\xaf\x6b\x9b\xfd\x3b\x7c\x3e\xea\xd4\xd4\x3b\x59\x60\xdc\x46\x43\x31\x92\xfa\x81\x43\xea\x21\xa1\xe0\x07\x83\x31\x21\xac\xc7\x06\x32\x32\x05\xa7\x50\x42\x97\xc8\xc1\xe1\x67\x82\x26\x3d\x3f\xd7\xcf\x50\xaf\x34\x67\xb2\xf1\xde\x5e\xe1\xab\xd9\xff\xf2\x2b\x1b\xb8\xb8\xce\xbd\xbd\x5d\x58\xe3\xfd\x50\xfe\xc8\x8f\x34\xf9\x35\x30\xd1\x03\x0a\xf6\x95\xb6\x82\xb8\x38\x64\xa0\xbb\x57\xe9\x98\xf5\xfa\x1f\xd9\x4a\x65\x9b\xbf\x44\x93\x5e\xad\x87\x86\x92\x2d\x54\x8f\xb2\x85\xff\xc6\x0e\x4c\x28\xb4\x13\xaf\xba\x8a\x4f\x21\xcb\x05\x29\x81\x98\xa5\xd7\x1f\xd2\xc4\x0f\x76\x10\x1d\x60\xc2\x06\x9c\xb4\xed\xb1\x60\x6f\x4f\x3d\x2f\xb1\xdc\x57\xb1\x78\xd9\xe0\x48\x52\xd1\x76\xa8\xda\x52\x6e\xfb\x7c\x6b\x4a\x59\x94\xf0\x4d\x71\x0a\xab\x58\x10\xac\x2c\x3f\xba\x2b\x94\x24\xef\x8d\xe4\xc5\x06\xed\x1b\xb2\xa4\x90\xa5\x60\x31\x10\x87\x77\xcf\x58\x63\x70\x0e\xfe\xbd\x3c\x35\x68\x2f\x58\x85\x45\x57\x3c\x4e\x50\xca\xc5\xdf\xed\xb1\xbd\xbd\xa2\x57\x9e\xfd\x28\xc2\x2d\x6b\x2a\x11\xd1\xa3\x5f\xc1\x27\x89\x78\x2f\x79\x9b\x02\x30\xbb\xb5\xeb\x2b\x82\x13\xac\xe9\x83\x63\x8b\x98\x2a\x45\x71\xf2\x62\x41\xbf\xc3\xb4\xf1\x6c\xe6\x0c\x5c\xae\xfc\xaf\x94\xe0\x3e\x58\xa0\x5b\x61\x03\x0c\xbd\x6d\x42\x5b\x3b\x97\xe0\x46\x48\x4a\x6f\x50\x3c\x84\x03\x14\x87\xec\x7a\x01\x87\x4a\xac\x29\x4e\x17\xc0\x58\x8a\xc6\xfc\xea\x19\xc2\x55\x1b\x20\x98\x30\xa1\x29\x49\x60\x05\xc7\x51\x05\xb4\x07\x02\x07\x4e\x75\xbe\x8a\x9f\xeb\x1f\xc3\x83\x2d\x80\x45\x08\x71\x32\x3d\xfe\xa3\x84\x0b\xe2\x30\x41\x5b\x84\x87\x0c\x0f\xfb\x98\x41\x91\x25\x42\x7e\xb5\x8d\xcd\x23\xa0\xb2\x80\x58\x26\x33\x7d\xcc\x80\xd9\x16\x8e\x3c\x6e\x28\x6c\x1b\x3d\x52\xc2\x44\x34\xa5\xbe\xe4\x79\xfb\x0b\x90\x32\x14\xa1\x05\xc0\xec\xb1\x03\x4a\x87\x58\x78\xa2\x8f\xdd\x2d\xc0\x4b\x3a\x4c\x66\x51\x0d\x1e\x27\x8c\x6e\xe3\x3a\x92\xfe\x4b\x8f\x11\x1a\x5b\x38\x60\x38\x6b\x47\xf7\x85\x3a\x0a\xb1\xeb\x5b\xd4\x0e\x69\x57\x9a\x36\xda\xf0\x29\x34\x91\xc6\x74\xb0\x30\x47\x88\x8f\x6a\x45\xb8\x9e\x4e\x16\xd3\xda\x7f\xc2\x32\xb5\xf8\x5f\x5f\xbe\x2f\x6b\xbd\xad\x76\xcb\x1a\x68\xfd\xed\xec\x5c\xd9\x00\x97\xa3\xe5\x64\xb0\xe4\x83\x71\x90\xbc\xfc\x7d\xb1\x54\x07\xc1\x73\x88\xb7\x8c\x66\x0d\xe2\x82\x19\xa1\x6c\x98\x31\x1c\x60\x81\x7e\x24\x94\x85\x18\xcc\xa1\x38\x4a\xf2\xdf\xde\xea\xd7\xe1\x0c\x02\x11\x29\x45\x36\x1b\x91\xf9\x62\xc9\x60\x5c\xe6\xf3\x95\x5e\xb8\xe0\x18\x26\x85\x5e\xe1\xcd\x14\xb2\xb2\x0a\xfb\x66\x15\xc2\x1a\xc9\x41\x5d\x8b\x46\x8e\x00\x39\xfb\x28\x8a\x90\x14\xfd\x2e\x76\xf3\x08\x06\x21\x5b\xad\x82\x70\x06\x70\x9c\xc0\x77\x90\x2e\x08\xa6\xc5\xdd\xc7\xd2\xeb\x9b\x26\xd9\x85\x7b\x04\xda\xb5\x74\x04\xcf\xfc\x4f\xfd\x4c\x19\xc4\x00\x5b\xf2\x6d\x46\x0a\x1f\x2e\x61\x2a\x13\x12\xee\xa0\x49\xef\xd9\xc1\xe1\x68\x34\x62\x0e\x4e\x98\x64\xec\xb1\x89\x44\xe7\xe2\x62\x15\x9b\x5b\xcd\xe5\x0a\xe6\x6e\x5f\x31\x77\x9a\x4b\x86\xf3\x05\xbb\xee\xd1\x40\xc2\x1e\x8d\xfe\x76\xfa\xd3\xdb\xc1\x02\xa4\x14\xf6\x68\xb0\x83\x06\x62\x8b\xc1\xbd\x3d\x3c\x90\x29\x10\x46\xa3\x11\x52\x3f\xf9\x4b\x11\x8a\x58\xbc\x13\xbf\xf8\xab\x4b\x04\xaf\x3e\x50\x98\x52\xf1\xda\x3c\x7d\xfe\xdc\x62\x54\xab\x95\xdc\x90\x2c\xb8\x59\xd9\xbb\xbf\x4e\xd2\xd4\x78\xe6\x2d\x16\x75\x44\xb7\x63\x43\x96\xa4\x84\x9c\x3d\x67\x00\x17\x0e\xcb\x8d\xf7\x6a\xf7\x03\xb3\x8d\xf4\xee\x22\x3a\x5a\xb2\x59\xa5\x01\x92\xdc\xdf\x43\xdf\x7f\x02\x4b\x9b\x1e\xe2\x78\x41\x10\x66\xc3\xd2\xa7\x27\xfe\x7e\xa1\x42\x76\x12\x44\x04\x2b\x54\x7e\xa9\xeb\xfb\x7e\x48\xd2\xe9\xab\x98\xff\x30\x76\x20\xaa\x50\xce\x24\xc4\x0f\x39\x2e\x89\xb7\xc7\x64\x3e\x5f\x62\x71\x39\x5d\x82\x04\xc5\xc3\xdd\x83\x4a\xab\x0f\x8e\x33\x27\x29\xb9\x44\x31\x4c\xad\x03\xea\xc8\x7a\x3d\xd0\x4a\x75\x51\xf8\x58\xac\xf2\x50\x68\x64\x8d\xa8\x84\xb7\x94\x09\xbe\xf8\x13\xc2\xa2\xeb\xd7\x52\x2b\x52\x76\x8c\xdd\x15\x9b\x94\x63\xa4\x28\xb7\xe2\x37\xd8\xf7\x80\xc2\x0f\xa9\x2b\x38\xd5\x59\x76\x82\x68\xc8\xfa\x41\xc8\xce\x07\xbf\x12\x84\x7b\xfe\xbe\x1f\xac\xc2\x31\x21\xac\x2e\xa5\xd8\x25\x41\xb1\x77\x90\x93\x97\x75\xb5\xf0\xe1\x07\x02\x5d\xdb\x2e\xc8\x9c\xa8\xb4\x6c\xa6\x44\x9f\xf7\x74\xa0\x32\x85\xf9\x08\xd2\xde\x8d\x5c\x71\x85\xdd\x2c\x45\x78\x3a\x98\xb1\x79\x72\x0a\x26\xb0\x57\x34\x92\x09\x2a\xd6\xf8\xc0\x5e\xa6\x83\x95\x9d\xd2\xad\x5a\xa0\x65\x05\x03\x53\xea\x66\x31\xbe\x20\x18\x56\xd3\x10\x8b\xe5\x38\x41\xd1\xfe\x5c\x8a\x9a\xf3\xb4\x02\x35\xb4\x02\x2e\xcc\x91\x06\xa1\xd6\x5d\x71\x8c\x78\xde\x2b\x16\xa8\x07\xc2\xa9\xa8\x9a\x19\x8e\xf3\x53\x92\xb3\xbf\x75\xd0\xc8\xf0\x94\x83\x03\x37\xc0\x22\x18\x16\xc4\xa0\xd0\x16\x83\xba\x6b\x8b\xac\x6f\x6e\xa9\x6a\x08\x83\xb0\x3a\x15\x83\x39\x6b\x85\xad\xc6\xdd\xd1\x96\x08\x33\x98\x5e\x82\x7c\x30\x58\x7e\x28\xf3\x2d\x44\x47\x99\x97\x17\x7f\xa7\x56\x32\x2f\x28\x97\xdb\x6b\x34\x1a\xe1\xcf\x9f\x71\xbf\xef\xfd\xfb\x41\x70\x23\x5c\xa0\xe6\x90\x2c\x59\x8f\x86\x30\xd8\xe1\x14\x01\x1b\x44\x20\x49\x7a\x7c\xff\x05\xd9\x1d\xc5\x66\x29\xb9\xf2\xf0\xe8\x20\x64\x03\x46\xe4\x2a\x8b\xf8\xd8\x2b\xd1\xe5\x4e\xa1\xa5\x95\x08\xb0\xfb\x56\x84\x86\x57\xf6\x00\x25\x4f\x78\x79\x5a\x5c\x42\xcc\xbe\x5f\x52\x91\x81\x6f\x9c\x20\x3a\x13\x0a\x34\x34\xb9\xfe\x20\x78\x18\xd6\xbc\x10\xca\xa1\xeb\xee\xd6\x42\xd1\x46\x4d\xee\xb2\x4a\xe3\xb1\xae\xdf\x23\x85\xec\x0d\x64\xe0\x05\xa4\x51\x8a\x16\xb2\xae\x08\x06\x20\x9c\xd6\x72\xe0\x2c\x58\xe7\xb1\x27\xbe\xf7\xd9\xf3\x9f\x94\xa8\x3a\x3d\x11\x2d\x49\x17\xc5\x7d\xab\xd5\x23\x7a\x22\x5c\x65\x6a\x5b\x6f\xd9\xea\x13\x9f\x0f\x21\x6b\x3b\x17\xe8\xa0\xb6\x03\x51\xa7\x30\xf7\x5c\x05\x63\x56\xc8\x8f\xb2\x33\x4e\xbf\x8f\xe2\xac\xe8\xb9\x31\x34\xec\x05\x61\x8f\x9f\x0d\x52\xf5\xf2\xf9\x33\xa2\x39\xb5\x8b\xd0\xbb\x34\xcf\x47\xdd\xe0\x59\x6e\x99\xff\xda\x13\x2e\x54\x7e\xc0\x8b\x70\x8c\xf8\xe2\xdf\xf8\x40\x84\x61\xfb\xc8\xb7\x46\x62\x1c\x38\x46\xfe\x17\x4f\xd8\x93\x2f\xfc\x7f\xff\x82\x03\x3b\x4a\x49\x92\xbc\x27\x8e\x29\xa5\x4b\x3c\xa0\xd1\x0c\x72\x9c\xec\xf9\x22\x8c\xc4\x3b\x88\x85\xe9\x4a\x81\x75\x80\x23\x3d\x16\x16\x0c\xc8\x64\x22\x54\x34\x3b\xb9\x09\xc2\xe0\xf3\xe7\x6c\xc0\x6c\x9e\x84\x9e\x36\xfb\xc4\x68\x2e\x8c\x19\xf5\x50\x16\x22\x57\xe7\x62\x15\x3e\xfd\xea\xa0\xda\x27\xd4\x6c\xb9\xcc\x18\xa6\x4a\xc4\x60\x9d\x91\xb7\x2a\x58\xe8\xb8\x15\x37\x25\x38\xc5\xb5\x51\x49\x6f\xc6\x71\x95\x0e\xb9\x8a\xbd\x5f\x10\xca\x72\xb6\x45\x0a\x5f\xa4\x2d\xfb\xaf\x94\x60\x65\xeb\x2e\x78\x15\x2a\x4e\x5d\x34\xb9\xee\xb1\xc0\xc5\xec\x6b\x1b\xf7\xaa\xd4\xa7\x59\x3f\x19\xa9\x03\x1d\x59\x50\x45\x54\xfb\x50\x05\x40\xf9\x19\x51\x34\x4e\x2a\x23\x22\x36\x0a\x2e\x4c\x7e\x14\x41\x41\x77\x93\x5a\xe4\xcd\xc3\xb6\x3d\x43\x39\xc7\xa3\xa4\x52\xf3\xbf\xc6\xdc\x9e\xf8\xcf\xa5\x7f\xe2\x08\x24\x89\xff\x80\x66\xda\x14\xdd\xc9\x44\x97\xec\x30\x6b\xff\x09\xb6\x1c\x33\x3e\xbc\xf7\xc3\x07\x84\xbe\x32\xd1\x48\x37\x21\x9b\x35\x33\x0b\x4b\x5f\xbc\x7c\xfd\xf2\xfd\x4b\x5f\xe1\xcb\x89\x15\x5a\x77\xed\xc6\x9f\xf8\xfb\xb6\xd8\xba\x83\x18\xcf\xec\x4b\xba\x39\xd6\xca\x81\x48\x59\xf1\xed\x61\xea\x52\xd1\x71\xad\xb0\x14\xb2\x9f\x11\xbc\xca\xcf\x2e\xb4\x69\xda\x56\xd3\x82\x39\xf8\x3e\x17\xbb\x73\x94\x5b\xd3\x2e\xd8\x6a\x8e\xc3\xb5\x04\xb7\xae\x33\x62\x9f\xea\x28\xf4\x9d\x56\x9e\x42\x76\x9c\x0f\xd3\x3e\x43\x0b\xa7\x44\xbd\xcd\x78\x64\x26\x93\xe7\x73\x12\x73\xd8\xc0\xa2\x8b\x55\x87\xad\xbc\xb2\xa5\xdb\xc7\x59\xd2\x8c\xf5\xe0\xb4\xae\x80\x5b\x2e\x11\x07\x72\x2d\x90\xba\x83\x68\x9d\x9b\x8b\x0f\x27\x9f\xcd\x66\xed\xed\x2a\x9a\xd9\x5f\xe7\x1a\x95\x3b\xd3\xe4\xfa\x19\x9e\x9d\x87\x59\xfa\x1a\xfe\xa4\xd0\x50\x84\x2a\xb0\x93\x88\xdc\xea\x6d\x64\x12\x05\x99\xee\x46\x34\x97\x58\x67\xc4\xac\x87\x2c\x2b\xcf\x88\xe9\x5f\x21\x6e\x41\xa2\x12\x72\x21\x32\x3f\x94\xb5\x16\xea\x53\xb9\xec\x5d\x99\xeb\x9b\x8e\x33\x4b\xf1\x87\xca\xbb\x76\x0b\xa4\x5d\x43\x5d\xd7\x52\xce\xd6\xf1\xb1\xf6\x36\x31\x31\xea\xbb\xec\x8d\x6a\x8c\xce\x96\xa6\x19\xa3\x1d\xce\x9d\xf9\x1a\xca\x3f\x23\xa8\x0b\x42\xcf\x32\x7a\x54\x85\xd0\xdf\x1c\x14\xae\x9b\xaf\x0a\x20\x72\x69\x8e\xd2\x14\x5c\x9f\xa4\xe4\xd3\xf5\x20\x4a\xa1\xe0\x11\x75\x94\x23\x55\xa0\x77\x76\x6e\x6d\xe2\xee\xe4\x40\x17\xc0\xd6\x81\x96\xd5\x51\xb5\x5d\xc8\x59\x1b\x71\x60\x81\x42\xa8\xbe\xf1\x24\x79\x59\x83\xb5\x79\x84\x6c\x1c\x06\x74\xd2\x9b\x20\x8e\x4f\xc0\xb4\xa8\xb7\x93\x20\xce\x77\xc0\x29\x1e\x30\x85\xd4\xaf\xe7\x35\x71\x78\xe3\x9a\x13\x0c\x1c\xf7\x3d\x1f\x80\x8e\xae\x5a\x18\x83\xb4\x0f\xe7\xe3\x20\x92\x85\x40\x15\xc3\x11\xc4\x58\x8f\x3e\xf7\x9f\xa7\x23\x96\x2e\xa1\x3f\xe4\xbf\x84\x3b\x56\xb6\x36\x12\xb3\x28\x64\x3d\x7e\x0d\x30\x20\xc3\x12\x08\xcd\xdc\x2b\xac\x5f\x0e\x50\x1c\xd8\xa2\xf1\x02\xfc\x50\x8b\x95\xc3\xee\x59\xba\x0f\x07\x38\x22\x95\x38\x2c\x2d\x97\x32\xfc\x25\x0e\xfc\x85\xcd\xd8\xcb\xb9\x09\x0e\xa4\xed\x9c\x79\x06\x03\x6e\x91\x96\x2f\x4e\xbc\x81\xb7\xae\xc4\xdd\x0d\xa6\x97\xdf\xa5\x75\xc7\x3b\x1c\xe1\xd6\x13\xc1\x15\x2b\x68\xa6\x21\xbc\x14\x6e\x61\x2a\x4f\x7c\xa9\x8f\xd9\xce\x94\x94\xf6\xb7\x79\x5e\x65\x6b\x90\xec\x50\x2b\xe2\xa4\xad\x67\xe8\x7a\xe8\x68\x00\x50\xf7\xb9\xe3\xdc\x91\xa1\xe3\x20\xcc\x46\xd6\xe1\x2c\xe4\xf0\x6d\x1c\x19\xae\x62\xf4\xf5\xd9\xfe\x0e\x5e\xa2\x32\xbb\xef\x3a\xe4\x9f\xf8\xfb\xa9\x2e\xdc\x0c\x92\x12\x16\x1b\x5c\x73\xf5\xd8\x66\xae\xdd\xfa\xc7\x8d\xfd\xbf\x40\x93\x49\x27\x3c\x28\x0e\x62\xdf\x7f\xe2\x88\x0e\x5e\x46\x0d\x7b\x1c\x8d\xb1\x3c\x5a\x59\x35\xf9\x62\x3e\x29\x49\x92\x31\x88\x2e\x1c\xf7\xd7\xed\x4e\x44\xb0\xd0\x0a\xa2\xef\xc1\x38\x81\x3f\x4d\x54\x90\xa7\x2d\x1f\xf6\xcf\xb5\x82\xe1\xe0\xa1\x1c\xfb\x91\x08\xe1\xca\x21\x7e\xca\x47\x8e\xa3\x4e\x3b\x96\xaa\x3a\x5b\x26\x63\xb2\x41\xbd\x86\x97\x15\x19\x35\x2b\x46\x94\xf0\x0a\x5b\x1e\x0e\x27\xf3\x4d\x3c\xa4\xed\x61\x44\x16\x63\xa9\x0d\x11\x20\x67\x7d\x76\xbe\x53\xd4\x16\x1b\x4c\xd9\xdd\x65\x7b\x7b\x22\xd6\x3f\x65\xe9\x32\x92\x26\x51\x92\x23\x5d\xf5\x58\xf0\x1c\x0f\xf1\xa8\x3b\x32\x65\xa3\x6c\x8b\x52\xf2\xf0\xcf\x20\xd6\x55\xe4\x55\x03\xa7\x3c\x35\x51\x90\xf4\xf2\x6b\x9f\x5c\xc2\x63\xb2\xb8\x7e\x2f\x1c\xf2\xe8\xba\x61\x8c\x94\x83\x36\xdd\x97\x8e\x7d\x8d\xcb\x03\x2d\x0e\x32\x07\x5f\x2b\xff\x6b\x33\x83\x05\x2d\x36\xad\x66\xc3\x92\xc5\x75\xcd\x01\xb9\x39\x7d\xc3\x3b\x28\xe8\x0a\xe4\xf1\x58\x45\xe3\xd0\xd6\x07\x11\xad\x24\xdb\xe6\xe4\xd2\xc5\xb6\x6c\x6f\x56\xbc\x83\x3b\x9f\x95\x90\x05\x6a\xc2\x64\x0b\x52\xc5\x6e\xb2\x56\x25\x4f\xd4\x95\x86\x37\xab\x5c\xa2\xc1\x1b\x71\xe1\x42\xf1\x43\x27\x17\x3c\x3b\x57\x3f\xf9\x4b\x11\x28\x56\x09\x1b\x5b\x09\x08\x8c\x7b\x45\xb0\x53\xaa\x21\xa0\xa2\x9c\x6f\x49\x4d\x73\x65\x27\x01\x66\xa7\x92\x0e\x76\x4a\x95\x45\xcb\xc4\xa4\x06\x71\xa4\x6e\x2b\xe4\x6f\x24\x72\x14\xa8\xc5\xa4\x94\xdb\x1c\x1b\x08\x48\x05\x3b\xa5\x3a\xa2\x73\x24\x1b\x04\x23\x9d\xff\x90\x76\x3e\x65\x4d\xfa\x87\x0e\xf2\x58\x3d\x48\x21\x8f\xb5\x66\x38\x22\x21\x96\x03\x1e\xa1\x10\xeb\x21\x8d\x80\xf9\x3d\x02\x22\xe6\xf4\xf7\xd7\x42\xe6\x12\xe6\xf2\x4d\x88\xac\x9a\x21\x1e\x88\xc5\x1f\x31\xf9\x37\xc4\x8d\xcc\xb1\x40\xd0\x32\x2b\x52\xb0\x19\xcc\x10\x3c\x33\x5c\x0d\x42\x32\xda\x3d\x0c\x11\xff\x0f\xf0\xff\x52\xfe\x5f\xc2\xff\x8b\x46\xbb\x87\x6d\xf7\x06\xdf\x95\xed\xf7\x45\x3c\xb2\xe4\x63\xd9\xb1\xeb\x4a\xb3\x5d\x3f\x3a\xde\xd8\xb2\x99\x73\x1d\xf0\xbf\xc1\x4e\xa9\xa4\x58\xd6\xa5\xc4\x9f\x79\x4b\x6e\x51\xc8\x57\x82\x9d\x52\x71\xd1\xd6\x5c\xb6\xb5\xc8\xcd\x8f\x6f\x21\xe1\xc5\xe6\x9c\xa0\x84\x47\xdb\x29\x94\x4a\x8a\x6e\xe3\xa0\x15\x24\x0a\x53\x68\x00\x47\x2c\x3f\x4a\x47\x1b\x3f\x18\x8d\x46\x30\x9c\xe8\xb7\xca\x78\x3d\x08\xa7\xa3\x1b\x14\x0f\xe3\x4c\x86\x18\xf2\x9e\x86\xb1\x8c\x1e\xb4\x0c\xc9\x15\x86\xe9\x90\x0d\xc4\x5f\x4d\x5a\x4a\x70\x0c\x27\xa3\xd1\x88\x0e\x64\x1a\x83\x53\x06\x18\x1c\xa8\x2f\x9f\x3f\x57\x7e\x7a\x0b\xaf\x54\x2b\x47\x57\x00\x31\x84\xa7\x9c\x01\x83\x57\x8e\xc6\x3e\xe0\x18\xa6\xf2\xab\xaa\xf2\x0e\xfe\x2a\x5c\xc6\x1c\x85\xf5\xa7\x90\xcf\xf7\x47\x40\x8f\x73\x23\x9d\xef\xed\xf5\xd6\x1c\x6d\x90\x6f\xb1\x30\xea\xf9\xde\x5e\xfd\xc0\x73\x95\xcd\xf8\x9d\xd5\xf4\xd7\x55\x38\x6b\x42\x04\xe3\x56\x39\x0d\x76\x4a\x85\x05\x1a\xcc\x82\x70\x21\x7e\x49\x12\x96\x3f\x17\x96\x7e\xb7\x62\xce\x7b\x7b\x2d\x0b\xbe\x85\x57\x9f\x3f\xf7\xc8\x68\xf7\x20\x4c\x47\xf3\x52\xfb\x75\x60\xd9\xdb\xeb\x21\x5e\x2f\x69\x53\x4f\xc3\x65\x6f\xaf\x07\x8a\xf8\x5b\x8d\x07\xd1\x08\xec\xed\xcd\x03\x15\xbf\x69\x22\xd0\x7c\x59\x44\xf3\xa5\x44\xf3\x79\xa8\x00\x3a\x5c\x14\x50\x9c\xb8\x91\x15\x15\x11\x12\xb8\xf1\x2e\xad\x45\x9e\xa4\x02\x3b\x22\xfd\xfe\x2d\xbc\xe2\x97\x82\x6e\x6d\x39\x40\xfa\xd5\x07\x0a\x53\xf5\xba\x87\x9d\x06\x7d\x76\x8a\xa6\x69\x13\x3e\x59\xce\xdc\x93\x60\xa7\x54\x5c\x60\xd4\x94\xaf\x94\x85\x51\x53\xa1\x93\x6c\xba\xda\x1a\x34\x97\xc2\x22\xb6\x3f\x5e\xd2\xbb\xd3\x0a\xca\x97\x2f\x79\xc7\x30\x0e\x6f\x3a\x1b\xac\xee\x58\xbc\x90\xf2\x7c\x01\x71\x2c\xda\x7b\x8d\x28\x83\x18\xa6\x3d\x5f\xda\x1a\xfa\xe1\x2f\x03\x36\x4b\x09\x63\x09\xcc\x45\xfe\xca\xcc\x7f\x65\x41\x18\xcb\xa8\x72\xc1\x2a\x3c\x3c\x38\x08\x82\xb0\xb2\xe1\x14\x52\x11\xab\xea\x97\x2c\x2d\x89\xbb\x61\x59\xb0\xd0\xee\x2a\x54\xdf\xab\x72\x83\xb1\x14\x4d\xa7\x95\x1e\x39\x21\x5d\x8e\x69\x94\xa2\xb1\xc3\x85\x42\xd6\x27\xb8\xaa\xea\x12\x37\x57\x9e\x4c\xd6\x73\x05\xd2\xf4\xdf\x9f\x06\x9a\xd9\xc7\x5c\xca\x33\xe9\x20\xb3\xa6\x6d\xb6\x4d\x1c\xdf\xac\x56\xeb\x9b\x7e\x0a\xee\xe4\xb6\xed\x3e\xdb\xf3\x02\x42\xee\xa1\xe0\xb3\x2e\x67\xd9\xd9\x40\x65\x1b\x03\xdf\xb6\x0a\xde\x2d\xe8\x51\x9d\x8b\x35\xcb\xf8\xa6\x65\x92\xec\x8e\xd8\x73\x0c\xaf\x3c\x97\x57\x8e\xf2\xc8\x49\x61\x42\x40\xdc\xdb\x92\xd2\x5a\x03\xb9\xa8\xb0\xee\x64\xb5\x25\x8d\xe4\xdd\xc2\x50\xdb\x5a\x4d\x89\x3a\xd6\xd5\xa5\xac\x63\x89\xe9\x40\x22\xab\x45\x82\x45\x94\x47\xf7\xc8\x95\x97\x93\x8c\x11\x57\xa7\x7a\xd7\xa2\xdb\x1c\xcc\x2c\x97\xf8\x7d\x0b\x7e\x50\xc2\x8b\x2f\xe1\xda\x32\x40\xb5\xd5\x6f\x4d\xf0\xa7\x77\x4b\x3b\xb1\x5f\x8d\x29\xeb\x5a\xbb\x3d\x67\x72\x79\xab\x4a\x68\x87\x44\xa7\xb5\x09\xb4\x7b\xca\xad\xa4\xc8\xcd\x33\xed\xb2\x03\xa5\x3c\x4f\x20\x69\xcb\x81\x58\x17\x86\x1a\x05\xc2\x97\x48\x07\x0d\x6f\x7b\x83\x40\x6d\x67\x7b\x9c\xbb\x0c\x2b\x96\x1f\x4d\x7a\xbb\x05\xa7\x99\xbd\xbd\xdd\xcc\xa5\xa6\x80\x94\xe2\xec\xd2\xce\x4b\x3d\x3f\x9f\x62\x34\x64\x35\x9e\x8d\x65\x7f\x3c\x8d\xcd\x58\x52\x97\xb4\xda\x4f\xc7\x90\xf5\x3b\xbe\xcf\x99\x1f\xe1\x03\xea\x1f\xf8\x5a\x36\x68\x60\x86\xf3\x2b\x27\x2d\x9f\x1b\x51\x9c\xac\x71\x71\xb9\x50\xb4\x2c\xf4\x54\xd8\x99\xe1\x6e\x59\xb4\x48\x95\x2f\x62\x28\x7c\xce\x39\xcd\xbb\xd1\xf1\xb3\x3f\x07\x58\x08\x5f\x1e\xc8\x29\xd4\x40\xc4\x4e\x13\x32\x06\xc9\xc3\xb5\x8e\xac\x4d\x7f\xd1\x10\xd9\xb2\xc1\x1e\xf2\xf4\xcd\xfb\x13\xe5\xc9\x9d\x77\xe3\xac\xdc\x06\x88\xfe\x55\x80\xeb\x88\x63\x4a\x16\x80\xb1\x1a\x23\x24\x74\xf7\x55\x20\xdd\x4e\x86\xe8\xe0\x12\xba\x06\xc8\xee\x64\x84\x0d\x96\x79\x53\xc8\x1c\x4e\xed\xb7\x31\xae\x2c\xc2\xf0\xfa\x06\x0c\x12\x98\xa5\x01\xdf\x12\x24\xcb\x23\x36\xc0\xb4\x46\xac\xd2\xab\x68\x6a\x38\x8b\x29\x70\xcb\xf0\x54\x51\x8f\xbb\x62\xa2\x6b\x80\xb7\x04\xbf\xc2\x08\x1b\x30\x91\x5e\xe3\xe8\xe5\x27\x06\x53\x0c\x92\x82\xcb\x4e\xd3\xf0\x5a\x0f\x4c\x84\xd0\xde\xe7\x3d\x75\x82\xdc\x46\x12\xaa\x8b\xa8\x2f\x01\x51\x93\x86\x08\xc3\xcd\xc3\xcc\x3f\xa0\xe3\x5a\x87\xcb\xdd\x48\x6a\x20\xe3\xaf\x08\x81\x41\x3e\x16\x86\xeb\x26\x2f\xb0\x93\x27\x29\x99\x23\x6a\x49\xb6\x84\x32\x1b\x4d\x7a\xe5\x70\xb2\x12\x51\x4c\x80\xdf\x20\x0b\xaa\x23\xa9\xb6\xd2\xf7\x00\x3a\x5e\x66\x61\x6f\xe9\x88\x8f\xe5\xef\xea\x53\xcf\x0a\x9b\xa3\x6a\x69\x47\xe9\x2c\xfa\x08\x6f\x74\x47\x65\x9b\xcd\x42\x8f\x73\x38\x14\xfb\x19\x70\x58\xf6\x82\x01\x5d\x8a\xf8\x0f\xb6\xe4\xce\x35\xaa\x55\x30\x10\xf1\x66\x73\x98\x8b\xe5\x7e\xe3\x5b\x4e\x04\xd7\xd9\x0c\xb0\xc2\xb4\x99\xc9\x48\xcc\x15\xa4\x1f\xb1\x04\x5d\xfc\x84\x5c\x2c\x3e\xa4\x49\x2f\xf7\xee\x74\x39\x8e\xc9\x1c\x20\xdc\x0b\x82\x27\x2a\x1c\x85\x9e\x87\xf4\xb9\x92\x71\x80\x76\x98\x8c\x41\xdb\xbb\x49\x61\x8c\x52\x18\xb1\x0f\x29\x1a\x92\x95\x13\x22\x7a\x06\x3d\x07\x1c\xcc\x57\xda\x13\x33\x14\x5f\x65\x00\x77\x6f\x02\x50\x02\x85\xdc\x5b\xb1\x42\x32\xc8\xfa\x16\x10\xb0\x02\x4e\x34\xb8\xa1\x03\xd9\x49\x6b\x7c\x71\x4d\xb8\x8c\x2e\x22\xec\xc7\x7b\x72\x01\x71\x2f\x08\xa1\x0b\x10\xb0\xb1\x1a\x96\x5c\x50\x66\x51\x71\x22\xc3\xc2\xdf\x1e\x3c\x18\xff\x92\x10\x10\x0b\x25\x85\xec\xcd\x85\xf4\x4c\x60\x7d\x2d\x96\x4b\xeb\x16\xb0\x28\x8d\x99\x65\xe1\xf4\x04\xe2\x89\x80\x44\x7c\xc6\x56\x44\x18\x0b\x22\xe2\x93\x10\x01\x31\xf8\x2a\x1e\x1a\x9e\x6e\x80\xe2\x52\xa4\x04\xfe\xee\x39\x93\x99\xd1\x86\xfc\x49\xa5\x9c\xca\x2a\x89\xe7\x72\x3d\xf9\xfa\xb9\xef\x0f\xd5\x6f\xa1\xc6\x11\x79\xab\xb2\xba\xfa\x55\xb9\xba\xf9\x22\x5b\xd0\x8f\x56\x26\xac\xac\x15\xf1\xee\xad\xb3\x99\xec\xd3\xf3\xac\x91\xa1\xf5\x3e\xcb\xa6\x95\xb5\xc7\x5f\xb9\x9b\x33\x5f\xf2\xad\xe9\xd7\x21\xc4\x60\x9c\xc0\x78\xb8\xdb\xdb\xb5\x00\x24\x5f\x2a\xf6\x39\x07\x23\xf5\x25\xf8\xfc\xd9\x3c\x34\x46\x37\x94\x69\x91\xff\x80\x7c\x91\x36\x7e\x7a\x2d\x6c\x89\x3a\xc9\x14\x8b\xd6\x5c\x2a\x6f\xb5\xcb\x0a\xfa\x18\xe0\x18\xc5\x80\x39\xec\xe0\x1b\xbb\x11\xcd\xaa\x2e\xa4\xa9\x58\xce\x4a\xac\x9d\xa3\x2f\x48\xa3\x99\x73\x10\xc6\xf2\x5c\x74\xf3\xdc\xa4\x97\x77\x66\x1e\x64\xcd\x92\xe4\x16\xbe\x14\x39\xab\x1c\x84\x5d\x9a\x0e\x95\x32\xe3\x16\x86\xb3\x0a\xc7\x4b\x94\xc4\x7c\xb9\x5d\xfd\xfa\x21\xe6\xff\xd9\xd2\xa1\x2c\x99\x82\x78\xb4\xc2\x91\x91\xea\x52\x22\x84\x9b\x11\xbc\x9b\x04\x3b\x32\x73\x21\xc2\x17\x9c\x3b\xda\xdb\xf3\x19\x18\x97\xde\x19\x7b\xb5\xdc\x87\xcf\x9f\x7b\x78\x24\x71\x8c\xe3\x82\x79\x2f\xd0\x41\x1e\xa1\x23\xff\xdf\x80\x48\xfb\x65\xe2\x24\x8e\xbe\x60\xe9\x12\x7e\x21\x5f\x8a\x2c\xe9\x52\x90\x84\xe2\xd1\x17\xbc\x96\x09\xa2\xeb\xdb\x65\xf4\x57\x54\x78\x2f\x6d\x4d\xfb\xc6\xf4\x4c\x97\xcb\x62\x16\x3b\xcb\xeb\x62\xf2\xb1\x54\xe8\x7a\x01\xe5\xf7\x6c\x46\x5f\x78\x22\xbc\xe1\x17\x42\xc2\xf6\xc5\xbf\x8b\xca\x88\x25\xf0\x89\xff\x6f\xfb\xe0\xdf\xfd\x20\xf4\x45\xd2\x95\x51\x1e\x70\x3d\x3c\xa2\x4f\xfc\x7d\x25\xae\xcf\xdb\xe4\x12\x05\x26\x3d\x86\x3f\x12\xb0\xa0\x12\x61\xe0\x0b\x79\x8c\x3b\xb5\x1c\x37\xbc\xc1\x57\xf1\x10\x0e\xb2\xa8\xb8\x67\xbe\x3d\x4d\xff\x7c\x20\x0e\xf8\x50\x77\x5d\x59\x56\xa4\x02\xd6\xa5\xb3\xf9\x56\x97\x2f\x81\xca\xd4\xd6\x30\xaf\xac\xab\x97\xc8\xd4\xd0\x80\x6b\xea\xcd\xaa\xb2\x4c\x93\x5c\x69\x11\x5c\x53\x7d\x23\xe9\x62\x06\xf0\x70\xf7\x70\xb5\x83\x07\xf2\x61\xf4\xcb\x00\xd1\x97\x22\xf6\xa7\xb4\x42\x7c\xc5\x09\x1c\xfb\x65\x36\xe7\xc2\x07\x3d\x9d\xc2\x6b\x3d\x66\x23\x99\xce\x59\x3f\x9a\x4e\xf4\x61\xc7\xab\x7e\x30\x17\x3e\x0d\x9e\x9b\x91\xed\x1e\x0c\xcd\x6f\xaa\x7e\x84\x58\x1a\xca\x1e\x27\x28\xba\x28\xac\x3d\x9a\xf4\x76\xa1\x2a\x17\x94\x42\xb7\x6a\x15\x67\xee\x34\x34\x52\x57\x08\x2f\xde\xc1\x88\xa4\xb1\x25\xa2\xcd\x26\x98\x3b\x1b\x5d\x75\x2c\xab\x72\x1b\x5e\x21\x1a\x69\x1a\x87\x06\xcf\x7d\xea\x0f\x75\x1b\xc9\x52\xc4\xf8\x33\x9f\x49\xf0\xdc\x8f\xfd\x21\xb1\x3f\xef\xa0\x49\x96\xcc\x6c\x34\x1a\x41\xeb\xf8\x14\x67\x6d\xee\x9d\x9c\x71\x3a\xba\x59\x69\xc8\xa6\xc2\x84\xf0\x55\x3c\x82\xd9\x49\x21\xc2\xdc\xe1\x82\x9a\xd7\x1e\xbd\x9e\x73\x88\x72\x53\x09\x41\x78\x23\x42\x45\x9e\x80\x14\xcc\xe9\x30\x5d\x05\xab\xdc\xd9\x9e\x0d\xe4\xb9\x3c\xcf\x76\xf3\x03\x76\xc7\x7c\x85\x83\x65\x9a\x04\xc3\xb5\x06\x54\x97\x95\x44\x91\x81\x24\x02\x49\x9f\x2a\x35\xca\x1d\xd2\x83\x05\x75\x4d\x01\x4f\x6d\xe5\xce\x19\x3b\x1f\xc9\x23\xcd\x5d\xde\xd0\x17\x85\x4a\xab\xb0\x98\xf9\x26\x1f\x33\x4e\x28\x95\x2b\x2a\x15\x14\xf8\x76\x21\xc9\x09\xf6\x1a\x65\x5c\x09\x99\x4e\xef\x34\xa8\xa0\x4c\xc9\x93\x9b\x63\x3e\x73\x4e\x39\xd3\x4e\xb9\x04\xc2\x13\x52\x57\xa0\x61\xd2\x24\x9d\x02\xac\x42\x48\xff\x21\xb9\x8b\x9f\xd2\xe9\xda\x9a\x70\x1b\x78\x5b\x0a\x42\x91\x5f\x8f\x36\xe6\x3b\x95\xb6\x25\x28\xae\x4b\x3b\x56\x08\xe8\xaa\x63\x16\x2b\x39\x8a\x09\x80\xa8\x02\x1c\xab\xd7\x2a\xce\xa3\x2b\x28\x32\x33\x36\xf9\x85\x2f\x7e\xb0\xaa\x71\xe2\x2f\xc1\xb0\x75\x3c\x86\x06\xc4\x96\x89\xe2\xee\x1e\xa5\xef\x0d\x97\x11\x46\x4c\xa6\x79\x88\x65\xb0\xe7\xf5\xcc\xdc\x10\xa6\xa3\xb3\x73\x13\x73\xec\x04\xe1\x0a\x17\x38\x67\x14\xfb\x4c\x31\x5f\x42\x3d\x47\x6a\x3c\x18\xfb\xc1\xf3\xac\x84\x35\x03\x3f\xa8\x34\xae\x32\xc5\xf9\x50\xfd\xfa\xe8\xc7\x08\xb7\x88\x1d\xc0\xa9\x2c\x29\x2c\x07\x69\x0a\xae\x7b\x30\xd8\xdb\xeb\xc1\xd1\xd9\x79\x3e\xe9\x6d\xd7\x38\x29\x7c\x97\x77\xd5\xa4\x2f\x10\x6e\xa3\x46\x0f\x95\x9c\xdd\x06\x58\xb8\x7b\x60\xde\x0b\xc8\x84\x38\x08\xf1\x2a\x18\x56\xc0\xd1\x1a\x73\xb0\x0a\x17\xa8\x7c\xdf\xe6\xc3\x05\xd6\x2c\xb5\xd6\x6b\x39\xc6\x74\x68\x6f\xfd\x0a\x0c\x68\xd6\x78\xc9\x75\x2c\xfa\xdd\x6d\xd1\x5c\x52\xc0\xbd\xcd\x61\xbb\xc4\xf5\x90\xba\x67\x10\x29\x59\x83\xd3\x82\x4e\xc6\x75\x71\x78\x68\xaf\xb1\xd2\x5b\x59\xce\x27\x7e\xe6\xfb\xbd\xfe\xd2\xe6\xb6\xae\xcc\xab\xb8\x85\xad\xbb\x86\xc3\x7c\x3b\x14\x0a\x61\x79\x8b\xae\x42\x44\xb5\x90\xf3\x44\xe6\x37\xad\xa7\x48\x5a\xe9\xb3\xf2\x5e\x92\x55\xe7\xb3\xf8\xae\x0f\xfa\x92\x12\x03\x06\x37\xb0\xec\xef\x25\xde\x16\xdd\xaa\xc8\xde\x9e\x7a\x99\xf1\x33\xe2\x03\xdb\xdb\xc3\x3d\x98\x59\x8b\x71\x20\xe0\x9e\xef\x2b\xbd\x06\xa2\x22\xf2\xd5\x63\x9e\xb7\x2f\x99\xd6\xd2\xe4\x0d\x44\x32\xb7\xc8\x46\x78\x34\x50\x35\x3a\x6d\xf1\x63\x24\xd4\x6b\xa9\x97\x0a\x29\x73\x5b\x5f\x7b\x95\xcc\xb9\xcd\x21\xd2\x32\x20\xd4\x1d\x06\x47\xeb\xcb\xf1\xf7\x53\x48\x97\xc9\x56\xa2\xa4\x35\x62\x51\x54\xe4\xf7\x1e\xbd\xab\x48\x13\x9f\x57\x69\xe1\xdf\x3e\x94\xc3\x6d\xda\x50\x9a\x25\x69\x67\xca\x2d\x74\xd8\x55\xf1\x6d\xf4\x78\x9f\x9b\xc3\xe8\xc5\xc8\x7f\xc2\xca\x07\xd4\x13\x7f\x4f\x95\xcd\xbe\x5b\xbb\x43\x14\x90\x33\x1e\xd5\xf9\x02\x08\x33\xe5\x96\xe1\x9e\x4a\xc6\xf6\xd2\xca\x7e\x92\x42\xdb\x1d\xab\x48\x93\x64\xd1\x34\x54\xd1\xc2\xd4\xba\x47\x3e\x6a\x0e\x8e\xe2\x48\xe2\x9c\x11\x19\x6c\x90\x40\x3c\x65\xb3\x7f\x3f\x10\x5a\x8d\xdb\x8b\xaf\x13\xb8\xfc\xe6\x65\xe8\x2e\x10\xc7\xdf\x27\x24\x72\x29\xc9\xda\xb8\x21\x69\x88\x8e\x79\x1b\x1c\xb7\x37\x3a\x2e\x9b\xe6\x2b\x7a\x69\xed\x8f\xb4\xd6\xbc\xca\xa1\x57\xe4\xd4\xb6\x23\x98\xe9\x36\x01\x41\xd3\x88\x59\x6c\xe0\x67\x51\x98\xc6\x5d\x44\xd3\x6f\x3f\x4b\xc3\x51\x94\xd7\x6a\x9d\x05\x1a\xa0\xb8\x63\x20\xce\x2a\x1c\x71\xb5\xbe\x5e\x2c\xce\xc6\x5b\xd4\x91\x82\x54\xc6\x1b\xa6\x68\xbe\x48\xa0\x30\x99\x2c\x97\xbf\xd5\x1b\xf5\xb6\xa4\x4b\x6d\x3c\x31\x25\x99\x6b\xfb\xdb\x08\xd3\x49\x97\x0f\x26\x7d\x03\x22\x21\xa5\xa2\x6f\xc8\x18\x25\x22\x3d\xd9\x0c\xd0\xa3\x28\x22\x4b\xcc\xca\x79\x17\x11\x3d\xca\x71\x99\xa1\xdf\x22\x5b\x61\x58\xb2\x94\xf3\xad\x52\x24\x1d\x02\x9d\x89\x4a\x28\xf2\xeb\x18\x5b\x92\x72\x72\xbe\x5c\xa4\xba\xf7\x01\x50\x73\xf1\x03\x73\x57\xac\x82\x10\x54\xcd\xd0\x9a\xbd\x63\xe0\x0e\x39\x5a\xab\xae\x57\x32\x70\xc3\xf6\xe1\x99\x93\x04\x14\x5b\x0b\x1c\x1e\x94\x2d\x92\x4b\x7e\xfe\x7c\x83\xe2\xa1\x7f\xe0\x17\x32\x64\x36\x27\x18\x70\x28\x32\x55\x04\x25\x0e\x72\xbb\xab\xca\x8c\x9e\x9d\xf0\x28\xb3\xf2\x6a\x42\x9a\x60\x6f\xaf\xb7\x21\xd6\xf9\x07\xee\x82\x35\x08\xa0\xf9\x4a\x65\x55\xbe\x9d\x49\xdf\xcf\x34\xf6\xf6\x76\x0f\x46\x1d\xeb\x01\x69\x4a\x2f\x00\xf0\x52\x64\xf3\xfc\xa3\x41\x40\xe6\x30\x55\x20\xb0\x1c\x1f\xfe\x68\x70\x50\xee\x64\x02\x0e\x6b\xe7\x64\xe3\x07\xdc\x1b\x10\xf9\x21\xa2\x83\x39\x88\x7a\x41\xe1\x93\xb8\xc1\xe4\x57\xf1\xb3\x17\x38\xed\xad\x2b\x3d\x21\xb3\xbc\x86\x4d\x24\x07\x83\xf3\x45\x02\xd8\x9d\xea\xfd\xef\x88\x45\x47\x73\x3e\x9d\x53\x70\x09\xe3\xf7\x6a\x96\x35\x81\xfc\x42\x32\xf2\x35\x30\x74\x78\x3e\x49\x7e\xa8\x94\x4c\xc2\x0e\x8b\xf2\xd6\x5a\xb8\x7b\x3a\x05\x47\x78\x9d\xb8\x7e\xae\x50\xf7\xd5\xb1\xfd\x38\xa3\x60\x4f\x78\x7d\x5e\xc1\x86\x45\x0b\xfe\xa0\x4a\x68\x7e\x57\x42\xaf\x0c\x8f\xdb\xfb\x71\x1f\xd1\x06\xbc\xb8\x79\x61\x64\x02\x43\x16\xbe\x05\x73\x38\x84\xe1\xcb\x4f\x11\x4c\x17\x6c\x88\x57\x1d\x80\xd8\x4a\x92\x48\xcb\xea\x08\xc1\x97\x37\x6c\xe1\x62\x9e\xfe\x7f\x91\xed\xbb\x46\x38\x94\xbc\x43\x9b\x1f\xde\x88\xf4\xff\xdb\x90\xdd\x6e\x2d\x3f\x95\xd6\x82\xd7\x48\xa6\xa4\x37\x5e\x4b\x19\x94\x9c\xe1\xba\x22\x88\x4e\xc3\xde\x40\xde\x29\xa6\xf4\x5c\xe6\x46\x1f\x1d\x96\xf2\x06\x6f\x22\xe6\x94\x53\x68\x1d\xae\xe2\x98\x70\x3e\x9a\x35\xb8\xe9\xb4\x9c\xc9\xc1\x7d\xce\x44\x08\x84\xea\x92\xb8\x65\xb8\x64\xe4\x3c\xdb\x90\x6a\xae\x7d\x44\x77\xca\xe1\xe6\x36\x41\xca\xf6\x86\xdb\x16\xa9\x24\x82\x51\x07\x40\xb5\xf4\xa7\x21\x65\x09\xa5\x57\xa4\x2a\x46\x8c\x19\x8b\x08\xea\x2b\x4b\xb6\x8c\xf1\x0d\x9d\x91\x73\x36\x3a\x08\x4a\xc2\xa6\xd2\x4d\x52\x01\x76\xcb\x3e\x57\xae\x90\xef\x3f\x61\xc1\x40\x8a\xc4\xd4\x17\xa9\x21\x20\xe9\x94\x30\x07\x4c\x04\xef\xae\x4e\x71\x65\xdf\xcc\x8c\xd2\x3e\x67\x28\x22\x02\xdc\xf9\x2a\x6b\xbc\x8a\xad\x01\x47\x85\x45\xb9\x51\x2e\x62\xab\x16\x21\x8c\x94\xe1\xbf\x1c\x9a\xf3\x92\x2d\xc5\x32\x51\xb0\xa7\xd0\x35\x95\x72\x08\x20\x51\xd2\x5e\x84\xe2\x44\x75\x7e\x5c\xfd\x06\x06\xcf\xeb\xe6\x5c\x6d\x5c\xe4\xb6\x46\x81\x35\x04\x80\xb8\x63\x85\xe5\x2e\xa4\xfb\x96\x1e\xa4\x59\x80\x98\xaf\x19\x83\x05\x3f\xcf\x6e\x55\x8e\xe8\x9c\x42\x46\x64\x56\x8c\x7e\xcb\xb4\xcc\x8f\xef\xdf\xbc\xfe\x1e\xa4\x74\xa0\x3b\xee\x09\xf9\xd0\xfb\xc3\x97\xa7\x7f\x9b\x3d\x49\xfd\x50\x08\x78\x87\x5f\xdc\xf8\xf4\x7a\x3e\x26\x09\xf5\x87\x67\xe7\xa1\x88\x8a\x09\x65\x48\xfc\xe1\xd9\xd9\x61\x78\x76\xf8\x6d\xe8\x93\x25\x4b\xa4\x7f\x3a\x48\x28\x3c\x0f\xcf\x0e\x42\xff\xe3\x47\xec\x9f\x87\xbc\xc4\xd3\xaf\x42\xb1\x9d\xfa\xd8\x4a\x5f\x2e\x83\x06\x86\x67\x67\x7e\xee\xed\x79\x78\x66\xcc\x23\xcf\xcf\xcb\x0d\x9e\x87\xfe\x0c\xd0\x97\x97\x20\xf1\x87\xe2\xdb\xea\x0b\x19\x5f\xf3\x66\x2e\xe6\x2c\x08\xd3\x06\xa0\x0e\x66\x63\xea\x57\x20\x52\x56\x21\xd2\x6e\x56\x74\x3f\x5a\x52\x46\xc4\x67\x8e\x32\x7d\x0a\x19\x43\x78\x7a\x9b\xf1\x24\x2b\x16\xe7\xf5\xfe\x97\xd1\xc5\x0f\x5f\xfe\xad\xdd\xe2\x7c\x1d\xfa\x31\xba\xe4\x20\xfd\x2e\xf4\xa3\x04\x50\xbe\x03\x52\x72\xc5\xdf\x7c\x63\x60\xfa\xf1\x23\x5f\x38\x77\xe1\x88\x24\xa5\xc2\x75\xe5\x2f\x11\xbc\xea\x1b\x68\xb9\xaa\x66\xb5\x67\x87\x85\xca\x42\xae\xd4\x9f\x41\x20\xc2\xce\x66\x75\x2d\xe9\xa7\xc2\x90\x6f\xab\x1b\x7d\x5a\x68\x94\x2e\xc7\x8e\x26\x8f\x67\x84\x50\xe8\x71\xa4\xf4\x40\xae\x79\x6f\x0e\xa3\x19\xc0\x88\xce\x5d\x1d\x95\xde\xe5\x5f\x14\x3f\xe3\x35\x01\x65\xad\xc9\x84\xa4\xf3\x42\xdd\x39\xeb\x7f\xe5\xaa\x51\xb7\x30\xbc\x99\xfe\x34\x25\xcb\x85\xe7\x42\x80\x5c\xed\x04\x8c\x61\x52\x46\x84\x3e\x9d\xf7\x9f\x7a\xfc\x87\x68\xcc\x94\x52\x0d\x9d\xa4\xe4\x12\xc5\x30\xad\x5f\x1f\x27\x8a\xf1\x96\x0f\x0f\x2a\x06\xa5\xea\x3e\x0b\xfd\x25\xda\x5f\xa2\x7e\x0a\x62\x44\xb2\xc3\x83\xc2\x44\x04\xb4\xf5\x43\x9f\x60\xe1\xe2\xc3\x4b\x9f\x3d\x3d\x08\xcf\x7c\x65\xf7\x85\x7e\x87\xd9\xe0\xce\xe5\x71\x04\xb4\x89\xc6\xd9\xe1\x77\xe1\x41\x78\xc6\xcf\x15\x82\x75\x71\xff\x5c\xb4\xcf\xcf\x9f\x9b\xc2\x9e\x3a\x08\x7d\x4f\x17\xf3\xfe\xcf\xff\xfd\xff\x79\xe2\x82\xce\x68\x1e\xde\xd0\x02\xa4\x60\x0e\x19\x67\xbb\x44\x70\x7e\xd1\xd6\x76\x27\xa6\x83\x47\xb4\x9c\x98\x2e\xde\x30\x31\x5d\x4c\x4c\x6c\xcc\x69\x10\xef\x9a\x2c\x53\x8f\x5c\xe1\xe2\x36\xe1\xbc\xa9\xec\xb6\xdb\x74\xbf\x0e\x7d\x3a\x07\x49\x11\xbf\x04\x4a\x31\xf8\x89\x79\xfc\xbf\xfe\x7c\xc9\x67\x5e\x89\x10\x1f\x3f\x32\x1d\x06\xc6\x3d\x2e\x1a\x7a\x5a\x24\xe0\xcd\x97\x94\x79\x63\xe8\x01\x11\x1a\x00\x8d\x13\xe8\x4d\x52\x32\xf7\xd8\x0c\xaa\xd2\x5e\xba\xc4\x98\x4f\x96\x93\x23\xd9\xea\x22\x11\xff\x3e\x82\x8e\x59\x54\x20\x78\xd3\x71\x81\xd5\x82\xa3\x89\x5f\xbb\x94\x72\x95\x5c\x4b\xd4\xbc\x9f\x5a\xed\x74\xf7\x66\x9f\x10\x4e\xf1\xea\x90\x06\xfd\x65\xda\xfd\x14\x30\x18\x74\x2a\x21\xfb\xe1\xdd\xeb\x0a\x78\x6d\x78\x26\xa8\xea\x8a\xba\x98\x90\x68\x49\xfb\x08\x2f\x96\x2c\xdb\x41\x88\xef\x1d\xe1\x8b\x19\xfa\xe2\xaa\xf5\x75\x0f\x9c\xc8\xc8\x4d\x33\x54\x71\x9a\xe4\x9a\xe8\x4f\x2a\x94\x46\xe8\x0b\x48\xa8\x0d\x66\xad\x9d\x9e\xec\x87\x34\x11\xd1\x41\xc4\x6e\x10\x60\xe1\x8c\x54\x4a\x12\x0f\xf1\x41\x49\x62\x37\xff\x25\xdb\x88\x45\x12\xc7\x31\xc9\xf5\xf6\x0c\x1c\x4c\x07\xde\x8c\xb1\xc5\x70\x5f\xba\xb5\xcd\x08\x65\xc3\x6f\xbf\xfd\xf6\x5b\x19\x75\xa9\x76\x59\x5a\x22\xf8\xdd\x20\x62\x0a\x41\x52\xbc\x04\x3b\xa0\xe2\x3b\x5d\xfd\xb6\xb1\x70\x3d\xfc\x93\xb3\x6b\xc0\x40\x05\x82\x32\x0e\xea\x92\x62\x92\x0f\x15\x0b\xe7\x00\x55\xd1\x6d\x0f\x11\xdf\x24\xb7\xfb\x77\x78\xbd\x21\xce\x79\x27\xa2\x21\x4f\xb5\x74\xdb\xe8\xc7\xe1\x0f\x52\x08\xea\x31\x30\x25\x57\xd4\x8d\x88\xd9\xb4\x1b\x90\xd1\x82\xcf\x79\xf8\x4d\xe5\xb1\x78\xa2\x8b\x3d\x40\xb4\x3c\x26\x8b\x6b\x41\x01\xbc\x3b\x3d\xb2\x96\x49\x52\x06\x72\xf1\x4e\x15\x97\xe7\xfd\x9f\xff\xe7\xff\xe5\xdf\xe8\x23\xc2\xe0\x28\x41\xd2\x08\x75\x6d\x04\xfe\xe9\xd5\x8b\x63\xef\x58\x34\xe3\xbd\x7a\xf1\x70\x4f\x4f\x33\xd3\x06\x9c\xcd\x20\x52\x7d\x8f\x1f\xab\x32\x0f\x10\x5f\xc5\x31\xaa\x0c\x8f\x1e\x11\x1e\x8a\x46\xd6\x47\xc2\xbf\x8a\x31\xbc\x7a\xe1\xf5\x7e\x5a\x70\xea\x1e\x24\xc1\xc3\xc5\x44\x39\xd7\x06\x34\x54\x00\x39\x2f\x22\xd0\xed\x61\xce\xab\x09\xe7\xe1\xbc\x2b\x80\x99\xc7\x88\x47\xaf\x71\x24\xe4\x1e\xd4\x43\xd8\x03\xde\x02\xa4\x0c\x45\xcb\x04\xa4\x0a\xda\x3d\x81\x6a\x1f\xbf\x30\x6c\x90\x50\xab\x7c\xfc\x22\x08\xbd\x85\xe4\x50\xc4\xb9\x99\x2d\x8d\x28\xff\xd5\xe1\x61\xfc\xed\xf8\xeb\xc3\xfe\x21\x8c\xbe\xed\x3f\xfb\x6a\xf2\x75\x7f\x1c\x7d\x1b\xf7\xbf\x8a\xe1\xd7\xcf\xe2\xaf\x9e\x45\xdf\xc5\x4f\x1b\xd6\xee\x41\x21\xae\x94\x45\x09\x1d\xc0\xda\xd8\xfb\x41\x85\x32\x7b\xb8\x28\x6b\xcd\xb2\x01\x6f\x45\xc9\x0f\xd4\x12\x34\x38\xce\xcf\x23\x5d\xe8\x01\x1e\xa0\x1f\x28\x8c\x39\xfe\x47\x04\x63\x18\x31\xef\x0a\xb1\x59\x26\xef\x00\x38\xb6\x77\x86\xf8\x68\x36\x40\x4f\x9a\x69\x48\x69\xe1\x12\xc7\x30\xf5\xde\x00\xca\x60\xaa\x08\x05\x5e\x19\x50\x8a\xa6\xd8\xfb\xf8\x85\x10\xec\x2d\xe5\x96\xf1\x52\x92\x40\x0f\x4c\x01\xc2\x94\xa9\xc2\x74\x01\x23\x34\x41\x30\xf6\xc0\x98\x5c\xc2\xc7\xb7\x27\x32\x49\xd7\xba\xfb\xe2\xc4\x6a\xe1\x21\xef\x0b\x33\xd3\xd0\xcf\x7e\xd6\xed\x8f\x13\x4b\x08\x58\xbb\x47\x74\xc1\x7f\xa9\x7d\xf2\xc7\xc1\xe4\xd7\xc2\xf8\xf0\x56\xd1\xb7\x42\x0c\x2f\x91\x61\x06\xa3\x8b\xd2\xa0\xca\xed\xd4\xee\x04\xb5\x09\xcc\xc8\x78\x9b\x12\x11\xe4\xef\x31\xf9\x94\xef\x4f\xd5\xaf\xc0\xff\x18\x51\x30\x4e\xa0\x86\x4c\x33\x86\x7e\xfc\xc8\x7e\xd4\xb4\x84\x34\xe6\xf4\xc6\x4b\xc6\x08\xf6\x26\x24\xcd\x10\x4e\x9e\xa4\x4e\x10\xfd\x31\x70\x4d\x58\xb6\x78\x99\xd7\xc7\x9f\x58\x67\x63\x9d\xd4\x99\x66\xd0\x39\x8a\x63\x01\xb0\x96\x18\x78\x0c\xb0\x07\xe2\xd8\x13\x36\x41\xdb\x47\xb3\xb6\xda\x91\xca\x95\x1b\x33\xec\x8d\x19\xee\xab\xb0\xc6\xde\x9c\xf5\x9f\xf1\x22\x5f\x56\xe9\x79\x4e\xc1\x25\x14\xb7\x8f\xc6\x1e\xf1\x5c\xab\xb3\x2c\xa9\x2d\x37\xd0\xb1\x37\xab\xcc\x37\x50\xbd\x4f\x21\x86\x29\x48\xee\x51\xfb\xfe\xec\xf2\xab\xa3\x6f\xd3\x63\xf2\x87\xd2\xbe\xbf\x52\x5a\x30\x23\x0f\xab\x3f\x4a\x5b\x2a\xe0\x8d\x70\x4d\x99\x65\x8c\x13\xc8\xa9\x0e\x7e\x1b\x94\xf4\x6f\xae\x0e\x1b\x90\xda\x89\xe2\xeb\xc0\xcc\xef\xa4\x85\xdf\xfc\x4a\xa9\xbc\x4f\x28\x62\xf0\xbd\x88\x0f\xd6\xf5\x06\x31\x0b\xf8\xb6\x9a\x17\xdd\xe4\xee\xf0\x37\x52\xc3\x65\xf3\xca\x73\xa0\x73\x12\xc3\xc4\x0f\x7d\xb5\xeb\xf9\x57\x39\xfb\x32\x69\x3d\x03\x54\xb4\xf0\x8a\xf7\x7b\x3b\x24\xf5\xfa\xf4\xb4\xd2\xea\x7a\x74\x46\x52\xe6\x89\x39\x08\x0a\xc7\xad\x6a\xee\x40\xbd\x54\xbd\xdb\x2a\xee\x09\x70\xf1\x25\x7a\xa3\x4d\xb2\x3a\x22\x9f\x55\xef\xf6\xd0\xae\x42\xf1\xa1\x34\x1d\x6e\x9c\xd3\x03\x0b\xfd\x2f\xab\x51\x2e\x33\x44\x73\x21\x9d\x6a\xe2\x11\xa0\x9d\x9a\x87\x07\x3f\x2d\x12\x80\x6a\x4c\x1d\x1e\x1a\xfe\xb5\x47\xb4\x23\xed\x25\xe7\x1d\x09\x5a\xe9\x96\x30\x6e\x1b\x14\xb2\x6a\x47\x1e\x93\xb2\x1d\x4d\x17\x6b\x1a\xb8\xb2\x75\xbb\x92\x40\x2a\x90\x24\xe4\xca\x4c\x3e\x9b\xfb\xe1\x41\x46\x5e\x57\xe2\xb7\xbb\xf2\xb9\xa6\x51\xbf\xa9\x24\x7f\x3f\x7e\x64\x6f\xc0\x05\xf4\x94\xc1\xb8\x37\x07\xe9\x05\x8c\x3d\x40\xbd\x8f\x1f\xfd\x97\x97\x30\xbd\x26\x18\x7e\xfc\xe8\x7b\xe0\x12\xa0\x44\xdf\xee\xc6\x93\xd1\xc9\xd6\x3d\x34\xdc\x93\xf7\xae\x23\xe2\x66\x57\xd4\x3c\x36\x4d\x78\xca\x51\xa8\xc6\x2c\x66\x4b\x47\x62\xa7\x3b\xd8\x31\xc7\xa6\xcb\xd8\x05\x16\xe7\x21\x79\x5c\x2a\xf8\x20\xcf\x4b\x87\x81\x99\x1a\xae\xb8\xad\x67\x00\xc7\x09\x3f\x36\xa5\x1f\xe5\xbe\xe4\x3b\x94\xee\x63\xc6\xd8\x82\x0e\xf7\xf7\xc1\x02\x0d\x34\x33\x33\x88\xc8\x3c\xf4\xd4\x78\x80\x1a\xcb\x2c\x85\x13\x3f\xf4\x75\xf9\x98\x44\x34\x57\x61\x9f\xee\xff\xe3\xed\xcb\xc5\x82\xfd\xe3\x6f\xdf\x1d\x1d\x7d\xff\x0e\xcf\xc0\xbe\x20\xcb\x11\x65\xa9\x30\x6f\xeb\x4f\x97\x28\x86\x74\x3f\xde\xff\xc7\x4f\x07\x0b\xf6\xcb\x9b\xff\x44\xd3\xa3\xef\xbf\xa6\x7f\xfb\xc6\xb0\x47\x64\x21\xa3\x29\x65\x73\xe3\x24\xae\xa7\x5d\x27\x8b\x36\xb4\xc1\x1d\xed\xc2\x8e\xac\x2c\xed\xce\xc8\xca\xa7\xed\xf2\xae\x45\x9e\x73\x03\xf6\x55\x65\x0a\xec\x5f\xc0\xeb\xbb\xe7\x5c\xc9\x9b\x2f\x93\xb7\x4f\xdf\x1d\xff\xa1\x38\xd7\x93\x94\xc4\xcb\x88\x79\x2a\x17\xe4\x56\xf8\x56\xad\x87\xf6\x5e\x62\x06\xd3\x45\x8a\x28\xf4\x5e\xc6\x22\x0a\xbd\x97\x54\xf7\xf3\xc7\x63\x57\xe7\x6c\xd1\x9f\x11\xda\xfd\xb6\x54\xab\x55\x63\x34\x75\x6b\x5c\x43\x95\x89\x54\xfe\x12\x34\xcb\x7c\x1e\xfa\x87\x5f\xf9\xa5\x4b\x4f\x4d\xe0\xa1\xdd\x70\xff\xf9\xe6\x35\xbf\xca\xe6\xe0\x21\x1d\xf1\xaf\x33\x58\x76\x3e\xe9\x6f\x4b\x5e\x69\x1d\xd4\x1b\x1c\xf7\x62\x03\xdc\xa3\xa8\xf2\xed\xdf\xbf\x3d\x84\x3f\xff\xfe\x87\x3a\xf0\x4f\xdf\xbc\x3f\x51\x86\xe7\x5b\x39\xec\x7f\x20\xa9\x47\x21\xe6\x6f\xa5\x9b\x87\x67\xbb\xaa\x39\x59\xcc\x3f\x0f\xfa\xd6\x07\xfd\x8f\xaa\xd2\xc3\x12\x47\x9a\xe9\xb8\x39\x20\x99\x39\xdb\x97\x13\x2e\x33\x3c\x1c\x03\xf9\xbc\x84\xf7\xeb\x43\xbb\x01\xa4\x29\xf6\xf5\x80\x0f\x9e\xb3\x1b\x0f\x93\xe1\x16\x2b\xc0\x8f\xca\xce\x08\x75\xa2\x2a\x3d\x10\xae\x3a\x9b\x48\x2d\x2a\xc9\xa9\xba\x51\x89\xcf\xe8\xe1\xa2\xd2\x57\xdf\x7e\xf3\x80\x51\x88\x1f\xdc\x6b\x58\xef\x9d\x9a\x6a\x0f\x09\x8d\xd4\x64\x6a\x11\x49\x4f\xd8\x8d\x4a\x72\x5e\x0f\x17\x99\x96\x14\xa6\xff\x17\x25\x73\xd8\x97\xc9\x76\x1f\xf8\x01\xc5\x87\x8b\xba\x5b\x73\x34\x98\x84\xde\x1b\x7e\xa9\xe9\xd4\xe2\x97\x9e\xb2\x1b\xbf\x3e\x88\x98\xfd\x0f\x17\xbf\x5e\x8b\xbc\xdd\x3a\xbb\xb0\x10\xea\x09\x72\x91\x36\x91\x8b\xf7\x8d\x69\x6b\x5b\x0e\x35\x98\x59\xde\xdf\x95\x58\x6d\x56\x59\xbc\x1a\x6b\xec\x29\xc5\xf5\xa8\xcd\x28\x1f\x38\xd6\xe9\x79\xdc\x15\xd6\xad\xc1\x88\xf3\x51\x3d\x00\x79\x6b\x8e\x6b\xde\x80\xfb\x16\xd1\x46\x64\x9c\xd2\x3b\x67\xbd\xa3\xeb\x83\x93\xaf\xde\xbc\xf8\xda\xc9\x7a\xfb\xca\xa5\xa0\x0d\x03\x9e\x67\x01\xbd\xf9\xd8\xc1\xd8\x69\x86\xf6\xcb\xc2\x25\x53\x66\x4e\x55\x49\x06\xc6\x25\x1b\x12\x26\x15\x74\xfc\xff\xfe\x8c\x5c\xc2\x54\xfd\x4e\x21\x5d\x10\x4c\xd1\xa5\xb4\x7d\xef\x9b\xba\x15\xbc\x25\xe3\x2c\x74\xfd\x21\xc7\xd2\xfa\x53\x45\xb4\xa2\x8b\xb4\xb2\x21\x5c\x24\x20\x82\x33\x95\x80\x55\x9d\x39\xfc\xac\x91\x37\x59\x7e\xcb\x8b\xbc\xc9\x0c\xa6\x9e\x8a\x89\x27\x8f\x12\xf9\xae\x60\x32\x58\x6b\x63\x29\x87\x68\x41\x10\x93\xfe\x15\x8a\xb3\x91\x1f\x84\xfe\x51\x1c\x7b\xca\x16\x71\x0b\xad\xfd\x8c\xe0\x95\xe7\x5e\xd8\xf5\x06\x37\x6f\xf2\xc8\x6d\xdb\x52\xa4\xa2\x25\x6d\xde\x94\x33\x3e\xc2\x0c\xd0\x53\x15\x09\x43\x4d\xbf\x4d\x74\x84\x62\xf7\xd2\xb4\xd8\xb7\xf4\xe6\xe3\x65\x72\xd1\x97\x71\xbd\xa4\xbb\x86\x9f\xd3\xc4\xe7\x2a\x14\xcf\xd5\x18\xe0\x29\x4c\xe5\x11\xab\xc5\x2f\x22\xbf\x32\x23\xd3\xa9\xb0\x64\x9a\x93\x18\x24\xb9\x2f\x22\x9b\xae\x1f\xfa\xff\x25\xf3\xb9\xd1\xdd\x97\x0a\x8f\x41\x74\x11\xa7\x44\x10\xf5\x0c\x30\x14\x59\x40\x7a\x21\xea\x14\xe1\x5d\x61\x84\x9b\x3b\x56\xa4\xb9\x40\x6d\xef\x46\x86\x64\xbd\x63\x60\x8c\x70\x0c\x3f\xf9\xa1\xdf\xd7\x82\xb8\x94\x88\x59\xc6\x08\x24\x64\x5a\xbd\xa1\x9b\x69\x0d\xd1\x51\x3f\x6b\xc7\x6a\x5b\x87\x7a\x6d\x6e\xbd\xb9\x03\x65\xa6\xd0\xae\xad\xe6\xe6\xf8\x31\x07\xd3\xd2\xa2\x34\xed\xcf\x6e\x9d\x8c\x49\x7c\xdd\x7a\xc0\x59\x73\x0b\x7b\x6f\xa6\x50\xf8\xfe\xd1\xa5\xfa\xa1\x9d\x00\x55\xae\x5f\x1d\x62\x46\x1e\x87\xcf\x3b\x8d\x7c\x1b\x53\x9c\x10\xc2\x60\xcd\x85\xd0\x6e\x3b\xb7\xd9\xb1\x64\xc9\x12\x84\x61\x9f\xc2\x88\xe0\x18\xa4\xd7\xf6\x76\x8b\x11\x9d\xa3\x3c\xde\x6b\xcb\x0d\x80\x23\x49\x53\xb7\x9a\xee\x06\x03\x54\xa4\x9a\xaf\x2c\x77\x08\x8e\x44\xc4\x9f\xba\x98\x3e\xdf\x2f\x93\x0b\x73\x1a\x48\x8b\x1d\xcb\x6e\xa7\xf2\xa8\xd8\x70\x55\x5b\x94\x6a\x2a\x52\x24\x23\x1b\x8c\xe4\x1b\x1b\xee\x48\x2f\xb3\xf2\xce\x52\xd7\x0e\x04\x22\xf9\x9b\x4d\x15\xd8\xb7\xce\x99\xf0\x40\x10\xc4\x85\xe4\x83\x1b\x6e\xa0\x16\x24\x8f\x55\x2a\xd6\x6b\xaf\x50\xe3\xec\xe9\xd7\x7c\x28\x5f\x85\xfe\x12\x27\x50\xbc\xe1\xcb\x7f\x18\x9e\xf9\x40\xdd\xb9\xe7\x9c\x36\x92\x0f\xda\x55\x55\x02\xce\xf7\x72\x6a\x49\x5d\x4d\x5e\xfa\xe7\xf6\x2d\x60\x73\x41\x8d\x3e\x1d\xce\xad\x1c\xf7\x11\x16\x7b\x4b\x50\xbb\x1e\x48\xd0\x14\xf7\x19\x59\xd4\x5c\xec\x6a\x3c\x73\xd8\xf1\x32\xcf\x8d\x04\x15\x8f\x14\xc0\x60\x8a\x40\xd2\x47\x11\xc1\x94\xb3\xc5\x24\xed\x4f\x53\x60\x2f\xb5\x30\x88\xfb\x65\x4c\x3e\xfd\xa2\x0e\x84\x5f\xc6\x09\xc0\x17\x2d\x10\xb2\x38\xbe\xe2\x5c\x4c\xb4\xae\x5b\x9c\x91\x65\x1c\x58\xc1\xc9\x49\xfa\x43\xd2\x4b\x7e\xa8\xc6\x96\x5b\x5b\x03\x81\x35\xe6\xfc\xc0\x66\x50\xb7\x86\x15\x83\x2c\x4f\xd2\xf5\xaa\x74\xee\xb4\x3f\xd6\x5a\xec\x90\x4d\xc8\x25\x21\xba\x72\x37\x77\xa8\x81\xe5\x4f\x96\x49\x22\x65\x8c\x4d\xdc\x4c\x73\x87\x42\xeb\x59\xee\x42\xbd\x6e\xd7\x7e\x2d\xdc\x1a\x3f\x9a\xa3\xd1\xc1\x3b\x48\xc1\x4b\x04\x71\x89\x8a\x70\x1d\x37\x2a\x69\x47\xe7\x0d\xba\x65\xdc\x96\x19\x53\x0c\x6e\xcb\xab\xe4\x96\x77\xe8\x7d\x4d\xa1\xeb\x31\xeb\xdc\x7a\x77\x88\x22\x97\x08\x5e\xad\xc3\x65\x6e\x1f\xc4\x1f\x94\x80\xe2\xf1\x22\x49\xdb\x19\x3c\x36\x1c\x59\x87\x6a\xd9\x06\xc9\xb2\x05\x22\x45\x13\x80\xf7\x8b\xda\x47\x4a\x2c\xfb\x78\x51\xbb\xed\x0c\xba\x51\x28\x9b\x90\x27\x7f\xe2\x7f\x2b\xfc\xd7\x7c\xd3\x3d\x6f\x00\x39\x8c\x47\xbd\x03\xda\x4e\xe1\xcf\x2d\xe0\x24\xb1\x8b\x7c\xbe\x20\x4e\xfb\x52\x42\xd4\x2f\x80\x35\xf4\x55\x64\x0c\xb1\x48\x6a\x7f\x9c\x2b\xd1\x92\xf2\x9c\xe5\x14\x59\xcd\xa2\x11\x7c\x3a\x23\x57\xa2\x50\xe5\x92\x35\x4b\x57\xeb\x91\xc7\x02\x1b\x54\xa3\xe9\x24\x27\xda\x06\x7a\xff\x09\xdd\x96\xfb\xc1\x05\x35\x5b\x2a\x69\x43\x04\x18\x51\x4e\xa7\xe6\x4a\x8b\xa0\xf4\x0d\xad\x96\x41\x6a\x58\x4a\x0b\x91\x49\x34\x6b\x97\x42\x15\xbb\x8b\xc5\x88\xdb\xca\x58\xb7\x4e\xd8\x36\x35\x78\xe8\x10\xa3\x96\x5a\x2b\x36\xd2\x64\x9d\x2c\x74\x48\x62\x37\x09\x15\xd2\xf6\x75\x47\x95\x28\xb9\x9e\xa6\xa8\xa1\xb9\x7a\xbd\x50\x43\xe5\x92\x16\x88\x73\x3c\xc2\xe5\xef\x50\x29\x96\x39\xa0\x3e\xc8\xe0\x7a\x13\x94\x52\x56\x94\xca\x1c\x84\x7e\x55\xf9\x04\x94\x8b\x77\x31\xe2\x69\xa3\x43\xf2\xf3\x36\xe4\x4d\x12\xea\x3a\xeb\xa6\xda\xfa\x75\x26\x4e\x02\x97\x2c\xe0\x64\xb6\xf7\xf6\xbb\x26\xf1\x52\x8d\x2d\x92\xb1\x71\xb0\x6d\x92\xce\xf5\x9d\x90\xf5\x5c\xb2\x14\xb0\x2d\xe1\x2a\x16\xb2\x55\x18\xb6\x26\x9a\xe4\xf6\xc0\x9a\xe1\x50\xe6\x5c\x05\xb6\x02\xd4\x82\x09\x46\x01\xa8\xa6\xdf\xd0\x6d\x84\x51\x87\xec\x0f\x1c\xa4\x39\x79\xe8\x41\xe8\xbf\xd4\xcf\xb7\x06\x4c\xd9\x63\x5b\x48\x6a\xc1\x6c\x47\x30\xfa\x8e\xb4\x14\x47\x4b\x36\xd3\x29\x29\xb2\x10\x7f\xeb\x18\x5f\xb4\x73\x2d\xea\x50\x3d\x22\x49\x7f\x1e\xf7\xbf\x6e\xd1\xc6\x76\x90\xa2\x25\x76\xd8\xa6\x9a\xed\x8c\x30\x3b\x8c\x96\x21\x7b\x98\xc6\x0f\x15\xc3\x2b\x6f\xb1\x4e\x27\x6b\x63\xa4\xd3\x7e\xd3\x89\x98\xae\x92\xed\x02\xb3\xb5\xd8\xeb\x9d\x8a\x3c\x2a\x34\x8a\x08\x9e\xa0\x74\x7e\x52\xc6\xa6\x63\xf9\xa5\x45\x04\xd5\xf5\xb0\x4a\xb7\x7f\xf7\x48\x55\x9c\x73\x17\xdc\x52\x75\x55\x64\x83\xbb\xc5\xaf\x16\x3c\xec\xc6\xb6\x0c\x9b\x1b\xd2\xf8\x0f\xcb\x6c\x66\xdd\xe1\xac\x61\x24\xf3\x41\xe4\x2e\xad\x30\x90\x71\x1a\x39\x57\xaf\xc3\x3a\xdc\x93\xc9\xee\xa5\x38\x97\xcc\x8a\x55\xb1\xb4\x0a\x79\x8f\xc1\x42\x0e\x5f\x41\xe0\xbd\x04\x07\x9d\x91\x2b\x91\x00\xec\x28\x32\xd9\x11\x2d\x63\xb3\x8c\x25\x16\x40\xd2\x6c\xb3\xda\x22\xd4\xb0\xc2\x2f\x14\xdb\x54\x9f\xfc\x2c\x67\x4b\x54\x69\xde\xe2\x77\xb7\x33\xb3\x79\x1c\xf9\x4a\x13\xd3\x0e\x55\xf5\x41\xe8\x3f\xef\xb8\xab\xb6\xee\x02\x9e\x99\x8f\x6f\x6a\x83\x7e\x7f\x1e\xe0\xf4\x1f\x27\xf1\x8f\xf3\xe4\x4d\x3b\x0f\xf0\x6d\x50\x7f\x95\x87\x54\xd1\x90\x9d\xf5\xbf\x72\x5b\xb3\x57\x18\xb4\x1f\xc5\xb1\x44\xf7\x6a\xa3\x2e\x87\x23\xb4\xb8\x35\xa4\xa9\x44\x3d\x83\xef\x0a\xe8\x45\xd3\x3e\xc1\xc9\x75\xee\x72\xc6\x52\x39\xfc\xc3\x1a\xdc\xaa\xbf\x86\x53\x72\xde\xb0\x3d\x73\xa2\x29\x0d\x23\xcf\xab\xaa\xcf\x45\x99\x83\x35\x44\x57\x98\x26\xf3\xb5\xce\x97\x66\x3e\xee\x3f\xf5\xe6\x69\x9f\xce\xfb\xcf\xf8\x03\x9d\xf7\x0f\xaa\x1d\x6c\x9c\xc5\xeb\xbc\x6e\x36\x5d\x98\xd7\x9d\xf9\xdd\x76\x24\x4b\xcb\x05\x79\x5d\x64\x7b\x8b\xeb\x61\xcb\x74\xb2\x91\xb9\x56\x43\x7f\x7c\xa4\x8b\xf1\xb2\x03\x97\xbc\xb5\x25\x78\xa9\x18\x65\xc5\x30\x17\x81\x6f\x4c\x96\xd4\x68\x5c\x60\x17\x5f\x1e\x12\xcc\x5d\x14\x12\x5d\x8e\xe7\x52\x01\x50\x4f\x21\x55\x48\xc8\x41\x1c\xdb\x7e\x5e\x47\xb1\x93\xc0\x6f\x24\x75\xaa\x6e\xe4\x5b\xb8\x87\xd7\x76\x07\xd3\x82\xe1\x7d\x71\x01\xf6\xa1\xb6\x5a\xba\xe3\x8b\xf8\xe7\xbf\xfd\xe3\x9f\x2f\x7e\x7a\x75\xb4\x41\x28\x16\x8e\x50\x00\x61\x07\x89\xdf\x55\xc4\x52\xcb\x0c\x1f\x3e\xad\xbf\x28\x1d\x8a\x22\x1b\xb2\x6d\xdc\x45\xcd\xf2\x98\x7d\x27\x2b\x0b\x7a\x57\x19\x59\x1b\x81\x3e\xdf\x4e\x6a\xab\x2f\x64\xac\x56\x8e\x4a\xba\xdb\x37\x24\x86\x32\x39\xae\x64\x37\xf2\x64\xb2\xa2\x36\x8d\x6e\xe0\x5c\x3b\x7b\xc9\x16\xcd\xf3\xc2\xc4\x77\x15\x0e\xa8\xbc\xfd\xf3\xf3\x90\xa5\x4b\x58\x47\x2b\x1b\x0e\x47\x91\xa1\xd5\x25\xcd\x88\x9a\x9c\x4d\xb7\xc3\x71\x6c\x63\xff\x39\xf7\x4d\xb6\xfb\x76\x3a\xee\x3e\xa5\x64\xe9\x27\x08\x5f\xc0\x7b\xd8\x7f\xec\x3f\xde\xc6\xbf\x7d\x73\x78\xea\xf6\xc7\x44\x0c\xce\xfd\xd0\xf5\xa7\x66\x6b\x72\xee\x13\xc5\xbe\x46\x69\x1c\x01\x8e\xcf\x7e\x7e\xa6\x52\x3b\xd6\xf7\x6d\x44\x0b\x95\x2e\x32\xcf\x8e\xfe\xa9\x3d\x93\x61\xca\x61\xca\xbc\xd7\xa8\xd2\x4c\xa4\xa1\x45\x97\xb2\xcb\x25\x76\xe8\x70\xbc\xb6\xd6\x2f\xb4\x10\x68\xd7\x9d\xbc\x9c\x25\xfa\xb2\x92\x25\x72\x37\xb4\x2c\x12\x63\x0c\x8c\x31\xb8\x34\xc4\x47\xa5\x45\x4b\x93\x50\x12\xf9\x2e\xed\x3d\x03\x63\xaf\x4c\x34\x31\x30\x3e\x3c\xcd\x5c\x1f\x42\xcb\x0f\xc2\xf2\x2b\xa9\x54\xd6\xbf\x07\x63\x6d\xea\x7f\x68\x3b\x9f\xc3\xa8\x26\xd3\xff\x76\x86\xfd\x74\x3b\xc3\x7e\x6a\xd3\x52\x8c\x81\x68\xa6\x37\xd3\xad\x8d\xfc\xcb\xed\x8c\xfc\xcb\x1c\xc0\x41\x1a\xd5\x64\x84\x5e\x53\x1c\xda\xf0\xd1\xa1\x76\xa2\x33\x72\xa5\x56\x7f\x4d\x4f\xdf\xdb\x50\x36\x79\xce\x83\xbd\x9a\x28\xab\xeb\xc0\x96\x9b\xf1\xb3\x4e\xe5\xda\x12\x51\xb4\xaf\x10\x9b\x21\x2c\x43\xb3\xdb\xe7\x72\x3b\x54\x52\x14\x96\x14\x37\x26\x88\xb2\xfe\x02\x45\xe2\xc6\x35\x1c\x15\x83\x73\xed\x46\xf2\x03\x82\x89\x0c\xee\x8f\x2d\x87\x1b\x9f\x60\xf5\xd3\x90\x50\x11\xc0\x31\x8a\xf9\xed\xae\xc8\x30\x11\x21\x5c\xcb\x2f\xeb\x09\x25\x0a\x99\x6c\xae\x1d\x09\xb4\x3e\xa6\xb5\x11\x11\xba\x70\x2d\xdb\xb2\x7f\x20\x74\x03\xd8\x03\x66\xde\x1b\x22\x9d\x73\x0e\x57\x28\x9e\x42\x96\xc3\xc1\x8e\x9a\xb1\xd2\xe5\x56\x8e\x6a\x5d\xe1\xb6\x99\x43\x57\xb0\xf6\xf2\x76\x3a\xaa\xe5\xe0\x4a\x3e\x97\xcf\xf2\x7e\x81\xdd\xce\xea\xdc\xd6\x09\x55\x73\x6d\xad\xd8\x5a\xad\x52\x16\xba\x86\xa5\x4b\x4e\xc2\x56\x89\x49\x5b\xb5\x8f\xe6\xd3\x42\xfb\x28\x92\x57\x38\x07\x17\x4d\x23\x0d\xac\x7d\x40\x29\x64\x74\x1f\xcd\xa7\xfb\xd6\xfa\xec\x2b\xe8\x19\xb6\x61\x82\x12\x28\xcc\xed\x2c\x68\x8a\x8d\xf1\x89\x65\x14\xb4\x81\x47\x5b\xff\xec\xe2\x89\xa9\x1a\x36\xb9\x65\xda\x29\x0e\xeb\x0e\xa2\xbc\xb9\xf0\xb3\x4d\x7d\x43\x2b\xa0\x5d\xa4\x80\xab\xec\x13\x85\x21\x76\xc7\xb3\xb2\xe3\x84\x8b\xad\x3d\x6b\xdb\x5c\xfb\x53\xe6\x6e\x95\xb4\x95\x74\x89\x24\x92\xfe\x15\xaf\x89\x5b\xb1\x6a\xe8\x4a\x5c\xe6\x36\x66\x2b\x55\x49\xde\x98\xa0\x28\x1e\x06\x4b\x46\x22\x32\x5f\x68\x0b\xdd\x22\x7f\x4e\xe5\xc0\x8c\xe0\xd9\x69\x67\x70\x01\xaf\xaf\x48\x1a\x4b\xa2\x47\x3d\x78\xa6\x26\x99\x4c\x9a\x73\x77\x3b\x60\xb4\x46\x3c\xb1\x17\xea\x60\xf4\x38\xf5\x16\xea\xc5\x0f\xed\xab\xbc\x8d\x65\x5f\xcd\xa1\x95\xc5\x19\x30\x19\x8e\x00\x8b\x66\x70\xbd\xbb\xf3\x2d\xe1\x74\xc5\xd4\x9b\x90\x25\x8e\x07\xeb\x9f\x3b\x0f\x92\xca\x98\x2b\xc0\x64\xf7\xd5\x7d\x10\x18\x5f\x6e\x97\xc0\xf8\xf2\xe1\x12\x18\x87\x7a\x80\xe5\x9b\xfa\xeb\xd0\x1f\x9b\x95\xff\x36\x57\x36\x23\x17\xb6\x7e\xaf\x7f\xf9\xc7\xbb\xd7\xbf\xcc\x9a\xab\xde\x0e\x9a\x41\xbc\xeb\xad\xf0\x74\xbb\x5b\xe1\xe9\x43\xdf\x0a\x4f\x3b\x6c\x85\xa7\xb7\xbb\x15\x9e\xfe\xf1\xb6\xc2\xd3\x36\x5b\xe1\x7e\x99\xcf\xc3\xed\x6e\x88\x62\x14\x96\x07\xb4\x21\xee\x82\xf9\x3c\xbc\x2d\xe6\xf3\xf0\x36\x99\xcf\x8d\x03\x13\x3d\xbe\x9d\xe9\xf2\x7a\x6b\xd1\xd0\x06\xa5\xb6\xcd\x7c\xd6\xb5\xfd\xa8\xec\x84\x2b\x95\x10\x5a\x79\x7e\xa7\x06\xc3\x95\xa3\x91\x7a\x47\xa9\x76\x2c\x6a\x23\x6b\xa0\xbc\x91\xaa\x7e\xcb\x7a\xfa\x3c\x5f\xbb\xbe\x9d\x8c\xfe\x71\x6f\xa6\x32\xc7\x57\x63\x3a\xfe\x9d\x5e\xb6\x33\x95\xd9\xaa\x49\xc9\xad\x98\x91\xdc\x89\x05\xc9\x96\x91\xa9\x80\x04\x5b\xc0\x26\x9d\x58\xe9\xce\xd1\xe9\xc5\xab\xf9\x62\xfe\xdb\xfb\xbf\xb6\x36\x81\x2e\x48\x40\x38\x04\x84\x95\xd1\x46\x86\xcf\xed\x2d\x2c\xca\x2e\xf3\x05\x10\x3a\x14\xc2\x11\xc0\x32\x3c\xc1\x79\xe8\x47\xcb\x94\x92\xb4\x2f\xd2\x96\x16\x42\x3b\x96\xfd\x25\xdc\x6d\x54\xe2\x61\x16\xf9\xcb\xb4\xeb\xf4\xa9\x70\xdc\x46\xa5\xfc\x5d\x31\x89\xfa\x4c\xe7\xb2\xaf\x0b\xfe\x6c\x6d\x5b\xbd\xb2\x5d\xe8\x18\x2d\x6c\x5b\x80\xd2\x05\x31\xed\x5f\x81\x54\x24\xc2\x5e\xf4\x0f\xbd\x45\xda\x7f\xea\x2d\x92\xbe\x6d\xff\xf6\xde\x74\x68\x4e\xee\xff\xfd\xbf\xfe\xf7\xff\xea\xee\xe5\x63\x3c\x1f\xb2\xc9\x38\x7c\x1e\x36\xb9\xdc\x39\x3c\xe1\xa7\x08\xa6\x0b\x83\x64\x8e\x4e\x4d\x89\x6a\x8f\xf2\xc6\x4b\xac\x75\x88\x0e\xbf\xd2\x2c\xbf\xb4\x27\xaa\x43\x39\x28\xf7\x9c\x33\x5f\x79\xbe\x68\xd3\x57\x17\x1f\x52\x07\x9c\xdc\x1e\xea\xeb\xf8\x19\x5d\x6c\x96\xda\x48\xc3\xbb\x08\xae\xf3\xa9\x31\x1a\x05\xd7\x66\x0e\x0e\xfb\xf2\x98\x44\x6f\x15\x3a\x39\x4c\x9a\xf9\xa7\x2a\x63\x66\xb2\xa4\xf0\xff\x67\xef\xed\x96\xdb\x36\xb2\x06\xc0\x7b\x3f\x05\x82\xa9\xf2\x88\x23\x90\x12\xe5\x9f\xd8\x4a\x98\x7c\x8a\x24\x27\x9a\xd8\xb2\xc6\x92\x93\x71\x1c\xaf\xab\x09\x34\x49\xc4\x20\x1a\x01\x1a\xa2\x69\x5b\x55\x7b\xb5\x0f\xb0\xbb\x97\x7b\xf1\x3d\xcb\xf7\x28\xdf\x93\x6c\xf5\x1f\xd0\x00\x1a\x40\x03\x04\x29\x3a\xe3\xd4\xd4\x58\xc4\x4f\xa3\xfb\x9c\xd3\xa7\xcf\xff\xc1\x21\x08\xaa\x22\x98\xc5\x33\x69\x69\xd9\x2b\x9e\xb8\x54\x63\xfa\x6e\x4a\xc3\x0d\x21\xdc\xa4\xe5\xbf\x3e\x78\xc5\x16\xb1\xcc\x03\x09\xbc\xa7\xe9\xc6\x51\x05\x8d\xb3\xbb\xdd\x02\xf9\x34\x99\xc8\x4a\x60\xde\x2e\x41\xbe\x62\x52\x2b\x06\xb5\x0b\x5e\x51\x9f\xda\xd7\x82\xc3\xad\x49\xbc\xe2\xec\xa8\x03\xf9\x8a\x49\xb0\x9b\x16\xae\x7e\xdc\x0d\xc7\x4f\x7f\xd8\xff\x4d\x1d\x56\x4b\x8f\x6c\xea\x5a\x63\x01\xac\x36\x6d\x3b\xab\xdd\xf5\xa4\x54\x66\xaa\x67\xf3\x2c\x7b\x60\xe2\x42\xcf\x89\xf2\xaf\xd7\x9d\x15\xb5\x3d\x9a\xca\xe2\xe6\x0d\xde\x34\xe9\x9e\x51\xec\x22\x7a\x0c\x30\x9c\xa2\xd0\x85\x65\xad\x01\x34\xc7\x7e\x6c\x24\x39\xd3\xd5\xce\x29\x61\xf2\x91\x3f\x5c\x26\x34\xdd\xb7\x4c\xa2\x35\xf6\x31\x32\x53\xad\x26\xab\xe3\xf0\x98\xe5\xfc\xc5\xc8\x8b\xd3\x8c\xd2\x3f\x63\x18\x2e\xfb\x74\xe3\x44\x29\x4b\xb6\xd9\x04\x28\x13\x11\xc1\x10\xbc\x16\x53\x63\x27\x7a\x1a\xab\x91\x8e\xaa\xd4\x84\xb4\x8d\x4b\x25\xb2\xdc\xfd\xaa\x42\x82\x42\x5c\x3e\x72\x04\x74\x97\x95\xb0\xcd\xbe\xc5\x6c\xaa\xf5\x2f\x96\x59\xae\x38\xa1\x00\x4e\x26\xb3\x10\x4e\x4c\xcb\xfc\x5b\x35\x63\x9c\xa1\x85\xf8\xe2\x33\x16\x5c\x9e\x12\xd0\xb7\x8c\x54\xbe\x6b\x2d\xe6\xa9\xe7\xa8\x22\xaa\x41\x82\xb6\x26\xd4\x45\xa5\x3f\x29\xcd\x0b\xf9\xfd\x20\x74\x7d\xde\x88\x48\x99\xa2\xfc\xed\x1c\xf8\x60\x0a\xbf\xd3\xcc\x1a\xae\xaf\x36\x98\x24\x36\x15\xeb\x75\x75\x88\xe1\x52\x26\xc0\xd0\xca\xcb\xa6\x15\x6a\xd5\x65\x2e\xd0\xa8\x02\x5e\x81\x7f\xee\x3a\x8e\x57\x5f\x2a\xad\x94\x34\xaa\x62\xd8\x6b\xaa\x48\xe6\x27\xa0\x5b\xb7\xae\x9d\xa5\x58\xe7\x94\xbf\x15\xbe\x7f\x05\xa6\x9b\xe2\xf8\x18\x4c\x3f\xe8\xf2\x78\x11\xbb\x52\xc1\xb7\x79\x43\x2c\x8b\x39\xb3\xae\xc0\x54\x30\x70\xea\x16\xa5\x31\xbf\xed\x38\x78\x36\x5d\xe6\x6f\xb2\xaf\x95\xa3\xb6\xa6\x68\x51\x25\x49\x94\xaa\xe7\x07\x56\xd6\x77\x2d\xed\xd9\x00\x86\x73\x37\x8a\x68\xd4\x47\x2a\x44\x70\x6b\xc8\x16\x6c\xde\x26\x9d\xa5\x12\x11\x08\x83\x69\xd4\xac\xab\xd4\x97\xdd\xbe\xb2\x94\x37\x03\xfe\x14\x1a\xc7\x49\x73\xc9\xd5\xf7\x7d\xbf\x0e\x4d\x39\xfb\x16\xb7\xfb\x0c\x1f\x59\xa6\x4d\x67\xc3\x27\xf3\x2c\x22\x13\xad\xa9\x22\x58\x0b\xd4\xac\x75\xee\x81\x65\xc2\x3f\x55\x76\xba\x20\x44\x58\x04\xfc\x8b\x53\x9d\xd0\x09\x06\x64\xf7\x58\xe6\x45\x72\x9f\x97\x38\x79\x01\x89\xc4\x2f\x79\x55\xeb\x37\x5d\x0b\xcc\xae\x86\xdc\xa3\x20\x08\xd1\x35\xf0\x8c\x8b\x10\x09\x55\xb4\xd2\x53\xd5\x15\x86\x2b\x91\x0c\xf8\xac\x6a\xf1\x5b\x6d\x27\xa8\x49\xc9\x89\x23\x18\x32\xe2\xd6\x0f\x63\x68\x87\xa0\xd5\x70\xf4\x0a\xc5\x21\xdb\x7e\xee\x38\x4e\xc2\xf8\x9a\x97\x0a\x6c\x8d\xa8\xea\x0d\x29\x26\x86\x42\x1d\x74\x55\xfa\x95\x1b\x72\x4e\x75\x75\x3f\x4a\x3b\x50\xbf\x1d\xca\x6d\xa0\x54\x4c\xd2\xb8\xc4\x00\xc7\x5b\x85\x4f\xc0\xa7\xb6\x31\x64\xd6\x1d\x8f\xf9\x71\x6a\xf7\x75\x1b\xc9\x67\x1d\xd5\xac\x44\x58\xb3\x64\xad\xb0\xcc\x24\x1f\x4d\xb6\xff\x49\x65\xad\x8a\x6a\x4b\xb9\xff\xf4\x12\x5c\xc3\x54\x23\xab\xa9\x6e\xa5\xce\x9c\x62\xd3\x31\x16\x33\x64\xd8\xc0\x37\xc8\x81\x95\xe4\x4a\x45\x22\x83\x4a\xb6\x76\xa8\x4e\xd3\x0e\xf2\xf3\xa4\xa4\x3c\xc9\xb4\x63\xa5\x26\x11\x4e\x89\xcd\x2d\x23\x4a\xdb\x1a\x35\x55\x97\x4b\x95\xdd\xe4\xac\xd7\x47\xad\xb4\x68\x0f\x5a\x33\x62\x6d\x3f\xd0\x9a\xf7\x8b\x0d\x40\x05\x15\x57\x28\x7d\xf5\xc3\xd6\xb6\xfc\x34\xb3\x5e\x35\xe6\xd4\xe5\xb6\xf3\xca\x10\x02\xc7\x61\x5a\x5c\x9d\xc7\xb6\x7e\xa6\x8d\xf2\x42\xcc\xb2\x3a\x97\xc0\x71\x08\x3d\xf5\xa9\x99\x56\xde\x68\x01\xb4\xdd\xc9\xd2\x88\x03\x03\x23\x03\xcf\x42\x08\x0d\x42\x77\x46\x00\xc3\x92\xec\xc4\x32\x7d\xb8\xa9\x0e\xa7\x81\xa4\xfe\x3d\x16\xb2\x98\xf1\x8e\x34\x49\x38\xa8\xae\xb4\x2f\xda\x0a\xb7\xb7\xe8\xbc\x80\x73\x74\x0d\x09\xaa\xdb\x05\x6d\x6a\x69\x7c\xd2\xa2\x6d\x0f\x82\xb2\x2e\xf6\xea\xd1\x9b\xa6\x00\x15\xac\x05\x43\x6d\x6b\x81\xf6\x11\xab\x11\x33\x68\xd6\xf8\x76\xb9\x1b\x2b\x53\x71\xbc\xa6\x31\x79\x76\x0b\x94\xba\x04\xa9\x1d\xc9\x10\x95\xc2\x78\x4d\x2b\xba\x99\x9b\x64\x52\xeb\xa5\x1c\x49\x8e\x36\x51\xbe\x38\x84\x51\x64\x9c\x9e\x5f\x9d\xbe\xa0\x99\xc3\x8e\x43\xb6\xa3\x06\x22\xf5\x3f\x9a\xcf\x73\x7a\x8a\x16\x30\xb4\x41\x04\x2d\xc3\x9e\x81\x10\xd8\x04\x4b\x96\xe1\xc7\xf3\x31\xfd\x63\xb6\x0c\x66\xd0\x8f\x0c\x51\x78\xac\xb3\x72\x04\xba\x77\x56\x6b\x68\x6c\x6e\x57\x29\xd6\x6e\x82\x2b\x75\xab\xb1\x12\x51\x8c\x9f\x90\x0d\xeb\xb1\xea\xab\xb0\xca\x6b\x0d\xa4\xec\x35\xb8\x7a\xc9\x08\x1d\xf8\x79\x59\xc0\xe2\xa6\xfd\xbc\xe1\x8f\x2f\x9d\xcb\xdd\xaf\x7f\x69\x5a\xbe\x2c\xad\x91\xf4\x90\xc7\x47\xaa\x4b\x21\x89\xe8\x34\x4a\xc8\xc9\x0b\x75\x0f\x32\x02\x2d\x3e\xca\x25\x3b\x11\xfb\xf9\xa6\x26\xc0\x4c\x37\xc2\xaf\x6a\xeb\x2f\x96\x91\xbb\x58\x96\xb5\xc1\x97\x4e\x8e\xf2\x38\x5b\x71\x8c\xac\x3d\x4c\x95\x7c\xf0\x22\x13\xaa\x4a\x21\xa0\x1b\xae\x2a\x87\xff\xd5\xed\x73\xf6\x99\xea\x9a\x1f\x1a\xdb\xb2\x12\x1f\x79\xc0\x52\x2a\x4b\xc2\x4d\xf5\xa1\x1a\x40\x9f\xbd\x92\xd3\x8a\x31\x18\xf3\x2a\x73\x44\xed\x48\x0a\xde\xd1\x54\x51\x16\x32\x29\xaf\xf6\x28\xfa\x81\x76\xe4\xa5\xf0\x42\xc1\xf2\x82\x7d\x03\xf9\xcf\x10\x07\x47\x5a\x66\x99\xff\x0c\xe1\x24\x84\xd1\xac\x09\x0a\xcb\x22\x8d\x99\x4e\xcf\xd6\x21\x5d\x48\x97\x93\x5c\x14\xab\x4a\x2e\xb0\xc5\x25\x3f\xf9\x1a\xab\x09\xa2\x29\x29\x08\xe0\x68\xbc\x92\xc0\x4e\xe3\xd9\x04\xb4\x1a\xcf\x4a\x90\xaf\x7b\x9a\xc3\x45\x60\xe7\x8d\x06\x1d\xaf\xc6\x1b\x22\x66\x13\xdf\x1b\x83\x08\xf6\x43\xe8\x3b\x30\x94\x2d\x03\x0c\xe9\x19\x5e\x57\x2e\xff\xd5\xef\xaa\x75\x26\x23\x64\x8e\xab\x0e\x4e\x3d\x8c\xec\xcd\x1f\x7a\xbf\x5e\x3e\xfc\xf9\xe7\xbd\x97\x7f\x56\xd7\x0c\xa4\x86\x0e\x9d\x38\xf2\x79\x80\x97\x97\xb8\x2e\x7a\xd9\x30\x0c\xa3\xd4\x06\x43\xe1\x50\x19\x23\x8e\x91\xad\x88\x0f\x77\xa3\x13\x18\xbd\xa3\xfd\xf8\xdf\x58\x99\x87\xfb\x8e\xb8\x91\x4b\x67\x63\x64\x61\xf0\xff\x4a\x69\xbb\x60\x04\x91\x5e\xaa\x7c\x31\x1f\xfa\x7d\x05\xc6\x1e\x34\xd0\x44\xd4\x34\x88\x94\x0a\xbe\x32\x5e\xbd\x1a\x98\x95\xb3\x61\xe1\xb8\xc8\xbe\x42\xc8\x1b\x33\x2d\xb6\x58\x83\x0d\xd9\x42\x25\x8b\x14\xb0\xa5\x1f\x4d\xbc\xbc\x64\x15\xe2\x6c\x35\xed\x38\x0c\x13\x99\xad\x1a\xc0\x5a\xb3\xec\xc7\x41\x3f\x95\xc6\x0b\x13\xcd\x7a\x96\x21\xf4\x15\x56\x84\xf2\xf9\xc7\xc1\x89\x1b\x91\xe9\xb3\x4c\x51\x27\xf9\x51\x9f\x29\x4a\xd6\xf7\x32\x30\xeb\x57\x26\xad\x4e\xdb\xbc\x00\xc2\x10\x2d\xde\xc6\xc1\x02\xe4\xdb\x90\x94\x8d\x5e\xff\x44\xbb\x7e\x87\xcd\x70\xe5\xa0\x85\xbf\x3e\x6c\x91\xd1\x57\xc2\xd7\x09\x5a\xf8\x6b\xc5\x18\x99\xe1\xe7\x86\x33\x14\x63\x87\x6c\xd8\xb5\xa1\x8d\x7f\x60\x25\xcc\x3d\x67\x63\xac\x15\x79\x63\x90\xcf\xd9\xdd\x6e\xc4\x91\x53\x78\x9d\x78\x63\xe3\xaf\x84\xb6\x33\x7f\xed\x58\x9b\xa0\xb0\x8b\x1d\xa7\x6b\x27\xb1\xe4\x23\x36\x6f\x6d\xc9\x8b\x0e\x85\x32\x3b\x54\x70\xa2\x2e\x30\xb3\x36\xb4\x2d\x2d\x28\xf2\x9a\x16\x63\xa2\x26\x54\x16\x32\xaa\x7f\xea\x7b\x79\x68\xf2\x02\xcf\x7a\xa7\x31\x28\x9a\x33\xd8\x0a\xd2\x0e\xb3\x4a\x43\x45\x86\x08\x3d\x56\x7c\x91\xd1\xeb\xfb\x3e\x99\x80\x51\x78\x1f\x23\x9b\xd1\xca\x71\xc4\x1c\x7b\x39\xba\x4c\xa2\x6e\x14\x9f\xb5\xb2\x64\x4b\xe9\x4e\xae\x35\xdd\xb0\x52\xec\x8f\x08\x23\xa6\xa4\xaa\xd7\xd8\x80\x94\x15\xf9\x77\xcc\x9a\x2b\x79\xfb\x87\xf9\xcf\x48\x4f\xa8\xfc\xeb\x66\x3e\x1a\x89\xa6\x2b\x8b\x31\xe2\x08\x86\x3f\x81\x88\x85\xad\x5c\xe4\x95\x62\x7e\xf7\x1c\x2e\xc8\x02\xd3\xdb\xb5\x01\x48\x65\xeb\xac\x5e\x2b\x6b\x6b\x1f\x42\xd1\x7b\x5c\xf8\xca\xf9\x87\x0d\x11\xc6\x63\xaa\xc2\xfd\x30\x42\x1e\xef\xd1\x26\xee\x51\xbf\x82\xc8\x8a\x44\xb2\x1b\xee\xf5\x3f\xde\xfc\xcf\x7f\xeb\x6f\x61\x05\xfc\x2a\x22\x03\x78\x30\x46\xde\x6a\xa0\x7a\xa0\x1a\x90\xf9\x0a\x15\x2c\x56\xed\x68\x01\x5c\xec\xfa\xd3\x5c\x38\x58\x53\x34\xe8\xa0\x82\x9e\x01\x39\x64\x88\xcf\xdf\x16\x36\xb4\x18\xad\x6a\xa1\x85\x8d\x53\x52\x4d\xa4\xec\xfd\xf6\x67\xc1\xd0\x3a\xd0\x38\x0e\x74\x46\x5a\xaf\xf5\x1d\x23\xbb\xbd\x19\x22\x6b\x51\xdc\xb4\x19\xe2\xeb\x97\x07\xff\x7a\xf7\xdb\xd3\x92\xd6\x05\x21\x8c\x62\x4f\x4e\xb2\xca\x5d\xd0\xcb\xb7\x0a\xd1\xc2\xf0\x51\x7f\x1a\x63\x82\x0d\xee\x6b\xa6\x91\x28\x65\xd5\xe3\x4b\x25\x3b\x1a\x6a\xb5\xaf\x32\x76\x95\xbe\x92\x60\x29\xc2\x61\x6c\xe3\x38\xac\xe9\xd5\x55\x1c\x21\xc1\x90\x46\x61\x13\x05\x4b\xa0\xaf\xb3\xc3\xc6\xcc\xe5\x4e\xeb\x9d\x44\x0d\x3e\x93\x31\x7c\xe4\xbe\x52\xd8\xb6\xdd\xb8\xba\xea\xd0\x75\xa0\x94\xc0\x24\xfb\x55\x77\x81\xbe\x4f\xa9\xf9\xb7\x8b\x30\x5f\x6d\xa2\xa9\xa5\x1b\x9c\x35\xfe\xe4\xfc\x55\xfc\x6e\xb9\xdf\xaa\x79\xd0\xe3\xc4\x43\x00\xf7\x43\x77\x3a\x53\xcb\xbe\x0d\xad\x5c\x1a\xc1\x26\x8a\x75\xd1\x8e\xab\x5c\x07\x2a\x5d\x5b\x99\xc6\x16\x82\x65\x26\x20\xc5\x70\xfa\x3e\xf2\xc9\x3f\x73\x87\xb7\xdb\xeb\x8f\xb9\xa9\xbf\x5c\xbc\x4c\xea\x4d\x68\x97\xa8\xd5\x56\x88\xe6\xc8\x81\x6f\x6b\xd3\x0f\xb4\x1d\x50\xca\xb4\x91\x19\x88\x9e\x41\x3f\xbe\xc8\xb8\x57\x56\x42\x53\x13\x05\xb9\x1d\xd6\xe7\xd0\x8f\x3b\xc3\xba\x52\x3c\x72\x42\x14\x38\xd4\xb8\x44\x6f\x82\xd0\x05\xfd\x19\x88\x02\x14\xc4\x01\x61\x71\x61\x0c\xe5\x5b\xf0\x7d\x00\x7c\x07\xd2\xe0\x17\xc2\xf4\xca\x37\xf1\x6a\xe4\x10\xc2\xb7\xd7\xe5\xc5\x9c\xb4\xe3\x45\xea\x98\x12\x5f\x3c\x85\xb3\x91\xf9\x95\xee\xf7\xe1\x3e\x5f\x3b\x0d\x89\xf3\xa0\x33\x5e\x36\xc7\xd1\x5a\x98\x46\x66\x75\xa0\x6c\x6d\x42\x6f\xce\x65\x9f\x96\xf4\x43\xe2\xed\xc2\xa7\xb0\x72\x49\xd9\x50\x10\x6d\x8e\x71\x5a\xd8\xe1\xfa\xdb\x57\xad\xe1\x1c\xa3\xa0\x45\x52\xee\x3a\x00\x67\xa3\x60\xd9\x14\x70\xe5\x99\x62\x69\xd0\x04\x4f\x15\xcb\x47\xd6\xa5\x9f\x6b\xd2\xb2\xaa\x36\xa9\x8c\xc1\xb3\x1d\x86\x6c\x40\x5d\xbb\xdb\x81\x8e\x39\xba\x86\x1b\x44\x47\xfa\xb9\x4e\xd1\xc1\xe0\xd9\xe5\x86\xb9\x6a\x51\x93\x69\x7d\x58\x0a\xe2\xb1\xe7\x46\xb3\x0d\x22\x2a\xf3\xc5\x4e\x71\x75\xc1\x46\x5e\x61\xf7\x88\x6e\xde\xeb\xc3\x0c\x0b\xdf\xe4\x2d\xc7\xb5\xb1\xc4\xfa\x7f\x6f\x10\x49\xf2\x07\x3b\xc5\x51\xd2\x2f\x7d\xc5\xf2\xa6\xab\x8c\x50\x2e\xb0\x94\xdc\x69\xfa\xb1\xfc\xf3\x2d\xd3\x8a\x74\x8e\xd6\x32\x01\xb6\xe4\x64\xdc\x7c\x77\xc5\xbf\x44\xa6\x0a\xc1\x84\x51\xdb\x60\xaf\x66\x54\xdd\x44\x95\x55\xd2\x47\x4c\x75\x37\x91\x13\x18\x61\xd7\x07\xb4\xe6\xf5\x89\x66\xbb\x2a\x53\x2f\x7a\xbf\xaa\x6a\x58\x1a\xb8\x9f\x18\x42\x58\x5f\x93\x27\xac\x56\x82\xaa\x55\xf4\x7d\xd3\x32\x81\xf1\xfc\x85\x31\xb6\x8c\xf7\xc6\xd1\xf9\x89\xb1\xb4\x8c\xdf\x7f\x37\x83\x59\x08\x22\x68\xcc\x01\xfe\xc7\xef\xbf\x9b\xc5\xea\x5e\xf2\xdc\xf5\x83\xd6\x2b\xb1\xb6\xec\x3f\x30\xd2\x0a\x49\x64\x0f\xcd\xb9\x34\x50\x19\x1d\x4b\xe3\x96\xda\xb4\xbd\x51\xa7\xd1\x9d\x23\x83\x56\x94\x70\xfd\xa9\x94\x3e\xc7\x1a\x84\xac\xc8\x47\xcd\x12\x57\x63\xf2\x19\x4d\x77\x63\x82\xd7\x17\xd4\x96\xaa\xef\x79\xac\x39\x49\x4b\x8a\xb7\x8b\xe9\x75\xdb\xda\x43\x34\xf1\x93\x57\x92\xb4\xf8\x48\xbe\x79\x56\x74\xe4\xd5\x4b\x04\x35\xd1\x5c\xc3\xc2\x57\xea\x8d\xa6\xba\x1f\x8a\x02\x60\x2b\x3e\xc4\x2f\x77\xf6\x15\xdf\x0d\x02\x88\x8b\xdf\xa9\x2c\x9f\x69\xae\xa7\x3d\x48\x53\x5b\x47\x77\x05\xd7\xeb\x06\xb9\x67\xd5\xb5\xf9\xaa\xe5\x54\x5f\x72\x6f\x36\x9a\x7b\x53\x88\xaa\xce\xe6\xde\x14\x95\xf5\xc6\xd2\x64\xc9\xb5\x86\xf4\xa8\x2d\x53\xea\xd8\x07\xb4\x64\xca\x76\xfa\xf6\x17\x99\x32\x63\x59\xf8\x22\x53\x7e\x91\x29\xbf\xc8\x94\x5b\x2d\x53\xae\xd4\x12\xa8\x5c\xa6\x1c\x6e\x44\xa6\x1c\x6e\x4a\xa6\x1c\x6e\x48\xa6\x1c\x36\x95\x29\x3b\xea\xe6\xb3\xbd\x32\x65\x3e\xa0\xe8\x8b\x4c\xb9\xed\x32\x65\x21\xfb\x2e\x2b\x53\x16\x3d\x0e\xdb\x2e\x53\xea\x59\xcd\xb5\xa4\xca\xb6\x76\xe7\x2f\x72\x65\xce\xc2\xbe\x31\xc9\x52\x16\x2b\x8e\x42\x68\x2c\x51\x6c\x44\x31\xff\x63\x01\x7c\x6c\x60\x64\x30\xb4\xb2\x76\xf9\x3c\x69\xf3\x7b\x9d\xed\x28\xd7\xc0\xc9\x08\xae\x94\xbf\xf6\xf3\x22\x69\x9d\xcc\xa9\x96\x36\x93\xc8\x2e\x32\x26\x0b\x38\x66\x7f\x8f\xd1\xfb\xec\xf7\xf8\xfb\x5c\x40\xa1\x6b\x3a\x9e\xb9\x9e\x13\x42\x5f\xb3\xb2\xc8\x91\x17\x25\xd0\xb0\xc9\xab\x02\x1c\xd1\x17\xd6\xdc\xf5\x8c\x52\x27\x9b\x2e\x67\x56\xe4\x3a\x67\x79\xb3\xca\x7b\xb5\xed\xdc\x59\xd7\xdf\xac\xc5\x9f\x5b\x3b\x6f\xbf\x30\xe8\xbc\x9b\xda\x78\x01\x63\x9a\x11\x45\xeb\x6f\x12\xd5\x43\xe4\xfa\x7f\x3e\xa6\x00\x42\x25\xb4\x36\x19\xcf\x19\x23\x0b\x60\x01\xbb\xb5\x81\x58\xe7\x1a\x6d\xd7\xcb\x59\xb7\xaa\x9f\x7d\x49\xe9\xa8\x1c\x05\xd7\xce\x51\x64\xfe\xf0\x8a\x53\xa5\x15\xa6\x4e\x7d\x0c\xc3\x4c\x8d\x29\x3a\xf4\x15\x0f\x49\xd6\x39\x0d\xcc\xd6\xf5\x9e\x2e\x42\x74\xed\x3a\xd0\x00\x46\x34\x43\x21\x36\xe8\x7a\x8c\x09\x0a\x0d\x3c\x83\x46\x28\x28\x8b\xd3\xae\x31\xae\xa6\xac\xd6\xe6\x8c\x8e\x29\xc7\x81\x91\x5d\x4b\x38\x27\x30\xb2\x43\x37\xa8\x16\x6e\x0a\xf4\x53\xdd\xfa\xa8\x0d\x09\x95\x4f\x56\x50\xd0\xbd\x7a\xf2\x71\xa4\xc5\xc8\x54\x94\x76\x4f\x5a\x2f\x1d\x5d\x52\xea\x91\x66\x41\xa4\xb5\x19\xf4\x02\x03\xe1\x19\x0c\x23\x23\xf6\x1d\x18\x46\x18\xf8\x4e\xf7\x94\xf5\x45\x8c\x59\x63\xc5\x30\x55\xf9\x98\xac\x30\xa3\x0c\x97\xda\xb4\x34\xd3\x69\xf6\x92\x9c\x77\xd4\x3e\x7b\x89\xf6\x52\x4a\xfb\x5c\x6f\x3e\x81\xe9\xd1\x4f\x7b\xd7\xd1\x2b\x17\xa8\x13\x98\x40\xc3\x54\xa5\xdc\x72\x8c\x39\xee\x3f\x30\x6b\xec\xcd\x33\x10\x1d\x35\x6a\xc4\x6e\x96\x58\x7d\xf5\x6c\xbd\x13\xd7\x6b\x90\xae\xac\x3a\x56\xea\x53\x95\xd5\xbb\x71\x23\x3d\xd0\xe1\x7b\x0c\xfd\x88\xe5\xfc\x68\x77\x41\x37\x73\x69\xd4\x2c\x4a\x50\xaa\xdd\x06\x82\xe0\x19\x2b\xc4\x05\x7d\x87\x76\x2f\xa5\xbb\x6c\x8f\x8a\xe8\x76\x61\x92\xd9\x57\x50\x38\x3d\x63\xe6\xec\xbd\xd4\x1e\xad\x91\xa2\x53\x99\xae\x45\xd6\x6e\x16\xcc\xb5\xe4\x6a\xbe\x75\xa7\xe6\x61\x51\x24\xcc\x76\x91\xfa\xa5\xc7\x89\xa2\x90\x6c\x26\x4b\x07\x24\x36\x94\xca\x7e\x40\x27\xbc\xb0\x77\x06\x90\x2a\x00\x68\x18\xf9\xcd\x86\x96\x66\xa7\x46\x25\x55\xc3\xb5\x51\x2f\xd6\xe6\xe6\x67\x8d\xcf\x35\xa9\x24\x7e\x8e\x0c\x89\x9c\x99\x9f\xaa\xfe\x13\x2b\x10\x4f\x29\xc1\xc4\x81\x87\x80\x93\x74\xda\xeb\x73\xce\xa5\xa7\x57\x52\x89\xb3\x74\x04\xd5\xd1\xaf\x28\x99\xfc\x92\xbe\x5f\x7f\x06\x57\xe1\x58\x15\x8d\xda\x79\x89\x7a\x66\xe4\x3a\x92\xce\x51\x61\x3e\x61\x05\xea\xb9\x79\x46\xaa\x4f\xcf\xb7\x51\x75\x09\xbd\xc4\x04\xe3\x57\x96\xa4\x57\x50\x51\x9d\x75\xd2\x94\x3b\x00\xd3\x4b\x99\xc9\x2b\xda\x0f\x7f\x7f\x2b\x52\x4e\xee\x40\x5f\x51\xd0\x11\xe6\x8d\x8d\x4b\x39\xee\x2f\xf3\xaf\x97\x7f\x2e\x3d\xb5\x94\x33\xe6\x45\x21\xb9\x79\x54\x1c\xe9\x55\xf5\xe3\xb2\xf2\xcb\x05\xa8\xec\xbd\xb2\x42\xc5\x94\x15\x4e\xa4\x52\xbe\x12\x61\x10\xd2\x12\xe9\x62\xff\xa4\xc5\x5d\x99\x85\x8c\xf7\x71\x4c\x94\xcb\xf4\x81\x31\x9c\xa0\x10\xb2\x22\xb0\x3c\x88\x2e\x53\xe1\x44\x7a\x3e\xcd\x6d\x04\x8e\x23\xbe\x26\x25\x14\x28\x5e\xaf\xf1\x6e\xcf\xd0\x82\x3b\x1a\x7e\x75\x3f\x80\x30\x3f\x87\xaa\x13\xaf\x06\x16\xa9\x4e\xd4\xdc\xa0\x65\x63\x20\xbd\xb8\x6b\x5c\x9e\x1e\x5f\x9d\x3d\x3f\x5f\x51\xd3\x69\xdc\xe1\xb1\x7c\x85\x1c\xf2\x8e\x7b\xed\x4a\xb6\xc1\xda\xe3\x2c\xcf\xed\x4b\x4b\xe4\x32\x0c\x76\x50\xca\x15\xf1\x7a\xad\x8a\x4a\xae\x49\xb9\xda\x8d\x56\x73\xcd\x52\x57\xf2\x3b\xa9\xe8\x2a\xee\xeb\xd5\x74\x45\x69\x07\xff\xb6\x25\x5d\xf3\x55\x7b\xff\x83\xcb\xba\xea\x04\xbc\xae\x24\xd3\xeb\xb3\xcf\xc7\x59\xee\x69\xee\xcb\x17\x25\x8e\x99\xdc\xa0\x3f\x14\x5c\x71\xbf\x56\xf8\xcf\xf2\xbf\x12\x7e\xb7\x22\xb3\xeb\x88\xd3\xad\x22\x35\x6a\xba\xa3\x72\x45\x5c\xb5\x0e\xe2\x0d\xd3\x42\xe2\x6b\xfa\x42\x0c\x6b\x26\x86\xe6\x88\x55\xeb\x4c\x0b\x0a\xce\x7e\x2e\x0c\x54\xae\xaa\xeb\x3a\xd0\x98\x83\x70\xea\xfa\x7d\x8c\x82\xfe\x83\xfd\xe2\x99\x5a\x3a\xba\x0f\x17\x09\xa2\x17\x1c\x71\x99\xd1\xd5\x0f\x68\x3b\x26\x89\x84\x0d\x5c\x1f\x86\xc6\x18\xbd\xd7\xd5\x15\xe5\x42\x43\xb4\x61\xcc\xc4\x2d\x7b\xb7\xfa\xdb\xac\x8f\x5b\xed\x08\x95\x5e\x9e\xb4\xfc\x8a\x31\x1f\xe7\xad\x87\xa5\x26\x8c\xe6\x96\x6e\x59\xdd\x2d\xdd\x66\x3f\xb9\x0e\x2c\xdd\x66\xc7\x1e\x8a\xaa\x8d\x21\x2b\x0a\x81\x5a\x18\x6b\x8d\xa8\x96\xf8\x69\xe4\x85\xab\x8c\x85\xa1\x1b\xa2\x2a\xfc\xda\x32\x41\x8c\x11\xd1\x26\x85\xd9\x49\x38\x4a\xe5\x5d\x92\xeb\xbc\xc3\xd1\x75\xce\x35\xe8\x7c\xd1\xd0\xec\x13\xcf\x88\x98\xc6\x44\x37\x33\x71\x98\x19\x19\x3f\x9a\xfc\xa3\xef\x4d\x0d\x37\xea\xbb\xfe\x35\xf0\xe8\xec\xf5\xde\x49\xa4\x1e\xee\x88\xe3\x33\xe7\xfe\x5c\x13\x4d\x26\xc5\x70\xf0\xce\x49\xe9\x2f\x40\x4d\xca\x21\x64\x52\xb0\x41\xe2\xaa\xe5\x63\x9d\xf9\x11\x0c\x71\x02\x71\x4a\x79\x1a\xe6\x4b\x95\x7b\x21\x08\x61\x04\xb1\x66\x44\xb9\x88\xb4\x5a\xa5\xbf\x59\xa9\xa3\xa1\x94\x5d\xb1\xd5\x8a\x68\x3c\xa9\x77\xf7\xca\xf1\xde\xc2\x53\xa1\x35\x4a\xa5\xcb\x83\x5d\xc9\x7b\x3c\x04\xbc\xf6\x92\x59\xe7\x1a\xc5\x58\xe6\x20\xe0\x35\x40\xc5\xcb\x11\x2b\x26\xa0\xfb\xfe\x7f\x1d\xbc\x4f\x87\xd0\x28\xd7\x54\xb7\xef\x74\x41\xa7\x08\x95\x27\xd3\xd3\x29\x27\x57\x39\x17\x45\x17\xf5\x8d\x06\x67\xdf\x2a\x83\x29\x0a\x7d\x33\xc0\x14\xdd\xa6\x5b\x6e\x35\xc6\x12\xc2\x7e\x36\x48\xa1\x2d\x77\x61\x71\x1e\x7a\xcc\x65\xdc\x66\x9d\x7a\xac\x85\x6c\x2d\x6e\x87\x67\xee\xbf\xc4\xaf\x14\x46\x58\x58\xa5\x4d\xa9\x2e\xb2\x07\xa4\xeb\x96\xc8\x68\xc1\xee\x1c\xf6\xc1\x14\xc9\x45\x64\x43\x08\xe4\xbc\x08\xfa\x78\x1c\x41\xe7\x50\x1a\x8d\xfc\x96\x0a\x9d\xad\x50\xdb\xb5\xe5\x66\x05\x76\xd2\x98\xba\x8a\xd8\xda\x46\x3f\xde\xb7\x68\x99\xe9\x3e\x46\xa6\x64\x7c\x1a\x70\x03\x74\xc6\x00\x95\x2d\x1a\x9d\x5c\x8c\xbc\x58\xb2\x34\x49\xd6\x36\xf9\x69\xe9\x72\xf2\x7c\xc6\xef\x4a\xa4\x30\xb6\xe4\x37\x9a\xe5\xd7\xb3\xa5\xe5\x1a\x25\x43\xa9\xce\x05\x53\xd3\xe3\x58\xac\x12\xd8\x32\xb5\xa5\x1e\xf5\xed\x8a\xfa\x95\x0f\x5d\x9d\x75\xc0\xf6\x7b\xc6\x1c\x2e\xa1\xa7\x2c\xa2\x55\x9e\x63\x08\x9d\x55\x3a\x91\x52\x5f\x32\x9d\x0b\x65\x9b\xac\x4f\x73\xde\x3d\xaf\x7f\xe0\xb7\x43\xaf\x9e\x43\xb9\xe1\x31\xa8\x4b\x0f\xab\x1f\xed\x0e\xc4\xc0\xf5\x22\x0d\x99\x8c\x5b\xaa\x57\xe9\xf9\x5a\x22\x59\xb0\x58\x3b\x1c\xc6\x84\xc0\x14\x21\x11\x2d\xe4\x8c\xda\x55\x47\x76\xdd\x57\x2b\xf3\xe6\x56\xc6\x49\x1d\x05\xd4\xf5\x8b\xd5\xa0\xa0\xd5\x64\x07\xe1\x7d\x54\x08\x0e\xaf\x50\x6c\xcc\xc0\x35\x34\x7c\x54\x8c\x70\xfc\xdf\xff\xf3\xff\x35\x78\xd8\xbb\x01\xfc\x65\xa2\xb7\x80\xc8\x00\x06\x4e\x8e\x17\x5d\xf7\x4d\x2d\x5c\x55\x97\x0b\xd7\x1a\xee\xb7\x6e\x8f\xcb\x35\x85\x0a\x64\xc3\xe0\xeb\xa3\x05\x52\x46\xd9\x20\x70\x20\xe3\x78\x69\xd8\xd0\x5e\x2b\xbd\xa9\x20\x7d\xb2\x10\xd9\x26\xa1\x02\x1b\x0a\x21\xe0\xf3\x5b\x31\x7e\x20\x84\xd7\x6e\xc4\xc0\xbd\xe1\x00\x82\x9f\xcf\x4e\x4f\x8e\x7e\x7d\x75\xde\xb4\xc7\xaa\x7c\x08\xea\xc5\x42\xbe\xe0\x6b\x6c\x10\x09\xd9\x44\xd1\x6a\x6d\xc6\x59\xd5\x86\x23\x99\x03\x63\xb7\xcf\xd2\xa4\xa5\x0d\x0d\xa6\xe7\xcc\x1a\x26\x5b\xb2\x99\x08\x2b\xb6\x98\x89\xe8\x2e\xff\x85\x20\xef\x02\xe0\x59\x72\xe5\x29\x18\x43\x8f\x5e\x79\xc3\x52\xc3\x7d\xea\xea\x65\x70\xec\x07\xae\xfd\x2e\xdd\xcd\xa1\x04\xde\x4a\xf7\x29\x9d\xa0\x40\x46\x6a\xc1\xa3\x66\x3f\x9e\x59\x50\x69\xb3\x5b\x85\xe3\xae\x05\xb5\x46\x76\x0b\x35\x47\xb4\xe3\x4e\x26\xfd\x0f\xc8\xaf\xad\x20\x31\x03\xd1\x89\xcb\x8d\x9a\x1d\x28\xe2\xd5\x2d\x3a\x15\x34\x36\x7c\xc4\x26\x6b\xbe\xb1\x70\x18\xd7\x25\x33\x74\x10\xaa\xd8\x00\xbb\xba\x87\x63\x07\x71\x3e\x9f\x95\x39\x97\x65\xc8\xc0\x08\xa3\x10\xf6\x67\x2e\xf9\x77\xd9\xd7\x4c\xb9\x2c\xaf\x3d\xfa\x38\x57\x7a\xd4\xfc\x5b\x12\xb6\x12\x22\xcf\x1b\x03\xfb\x5d\xbf\xf0\x70\x55\x49\xd1\x17\x6c\x86\xe4\x20\xa6\x27\xf0\x35\x0c\xa3\xba\xe4\xa0\x75\x5a\xd6\x44\xf3\xd1\x8a\x35\x75\x96\x0d\x59\x83\xfc\xd6\x39\x91\x5a\xe3\xd6\x66\x46\x6a\x8d\x52\xc8\x8f\x14\xf8\x14\x45\x85\xea\x53\xd9\xb5\xbe\x53\x9b\x1f\xd9\x5c\xee\x23\xb8\x35\x08\x72\x13\xda\x13\xac\xbc\x3a\xbb\x5d\x43\xa9\xaa\x59\x8c\x46\x06\x54\x66\x9c\x2d\xca\x83\x5a\x6d\x5e\x2d\xb2\xa1\x5e\xf0\x1d\x58\x92\x06\xc5\xc9\x6d\x25\x84\xad\xc8\x4e\x1a\x69\x03\x0d\x03\xe7\x13\xe1\xca\x98\x03\x47\x4f\x4f\x7d\xb4\x06\x65\x43\x4c\xa3\x9d\xb6\xe1\x7e\x20\x94\x88\xe3\x60\xf3\x5a\xc6\xe9\x71\xf8\x72\x76\xf1\x93\xbb\x82\x96\x41\x8e\xef\xc7\x85\xbd\xca\xd1\x35\x1b\x4a\x77\x9e\x42\xfc\xfb\xdf\x23\x83\x2e\x95\xf1\x3f\xf7\x43\x91\x32\xc5\x9b\xf7\xa4\x37\x4f\x00\x06\x63\x10\xc1\xc3\x4c\x18\xfb\x1c\x39\xd0\x23\xdc\x7e\x5c\x99\x81\xc3\x07\x24\xa2\x42\x9e\xdb\x2c\x99\x82\x54\x62\x4a\x8b\x00\xab\x55\xf3\xda\xe4\xaa\x7c\x14\x8f\xe7\x5c\x48\xd2\x0f\x90\xa9\x15\x51\x4c\x75\x05\xba\x2b\x08\xe6\x15\xfb\xab\xaa\xd0\x9c\x9c\x3f\x9e\x0d\x77\xa0\xab\x70\x31\xbc\xe2\xe6\x0c\xb9\xd6\x9c\x00\x67\x62\xbf\xcb\x47\x32\x90\x4d\x33\x0f\xf0\x92\xbe\x7c\x1a\x86\x48\x51\x8f\x2e\x13\xac\x20\xdf\x31\x6b\xfa\xe5\xa7\x80\x68\x91\xe8\xfb\xeb\x0c\x50\xd2\x5a\xa2\x38\x34\x70\xe8\x8e\xa1\x61\x03\xcf\x83\x8e\xf2\xa4\x6a\xa4\xfd\x34\x46\xdf\x63\x9e\xfa\x6d\x02\x67\xee\xfa\x4f\x52\x37\x56\xf2\x76\xe6\x5a\x35\x7a\x1b\x21\x36\xf7\x41\x35\x76\x33\x7e\xb5\x32\x0c\x27\x83\x6c\x1d\x96\x0d\x07\x19\x01\x44\x81\xc7\x30\x4c\x30\x7e\xeb\x38\x7e\x0a\x0a\x28\x96\x2f\x75\x8d\xe1\x64\x6c\x35\x82\x65\xff\x68\x19\x7e\xc5\x10\x5b\x85\xde\x9f\xd0\x82\x66\xe1\x4f\xd1\x35\x0c\x7d\x2a\x1b\x87\x70\x02\xc3\x88\xc8\x9f\x4b\x14\xdf\x36\x9a\x4f\xe7\xc0\x95\x19\x74\xf2\xbb\x6b\x04\xb3\x81\x2d\x13\xb2\x7f\xb3\xe8\x65\x17\x2b\x70\x4b\xdf\xde\x2a\xc4\x9e\x23\x23\x0a\xc0\x7c\x60\x9c\x5e\xc3\x70\x70\xdb\x68\xbc\x00\x51\xb4\x40\x99\x28\x57\xf9\x52\xd7\xc8\x4c\xc6\x26\xb2\xa8\xf8\x33\x8b\xd2\xe4\x7a\x05\x56\xc5\x30\x5b\x85\xd8\x4b\x34\x87\x98\x96\x59\x25\x7a\xa3\x0d\x7c\x23\x84\x73\x48\xe4\x4d\x63\xe1\xe2\x19\x8a\xb1\xb1\x08\x59\x0f\x5d\x97\x70\xee\x85\x52\xcb\xad\x40\xbe\x4a\x81\x12\x42\x58\x95\x02\x95\x94\x01\xa8\x94\xec\xa4\x85\x50\xe9\xbb\xce\x0d\x55\x50\x2e\xba\xd1\x22\x12\xf1\xbf\xb1\xf6\x40\x0b\xe7\xf6\x79\x7b\xef\x4d\xab\x0e\xef\x9f\x9e\xbd\xfc\xe5\xd1\xc3\xdf\x56\x50\x1d\xe4\xf9\x97\x28\x10\x7a\x8e\x7d\x6e\x82\x9d\x7a\xcb\x80\xda\xe4\xab\xf4\x80\x20\xf7\xd2\x1c\x46\x11\x4b\x14\x52\xd7\x5b\xed\x1a\xe7\xd2\xa2\x1b\x23\x9c\x05\xe5\xec\xd9\x00\xc3\x29\x0a\x97\x7d\xca\x61\x36\x8f\xfa\x87\xbf\x3d\x7d\xfe\x9b\xf7\x83\xad\x4e\x6e\xb5\x01\xd6\x2c\xde\x91\xe4\x0e\x94\x61\x5f\xdb\xc4\x5c\xfa\xbc\x8d\xca\x4a\x28\x96\xbe\x42\x2b\xfd\x32\xd0\x12\x3e\x72\xbf\x26\x2b\x20\xa3\xe9\x96\x45\x61\x52\xe3\x11\x45\x9a\xcb\xf2\xe1\x2b\x2b\x03\x05\xf9\x19\xc5\xe3\x7e\x7e\xb8\xcb\x78\xcc\x33\x2c\x0d\x3a\xe1\xc8\x70\x7d\x8c\x0c\x3b\xf9\x8a\xb1\x98\xb9\xf6\x8c\x72\x65\x0e\x67\xa9\x18\x36\x61\xcf\x46\x08\x23\x1c\xba\x36\x86\x8e\x01\x28\xdb\x54\x9e\xcd\x99\x99\x29\x94\x68\x7a\x46\xb0\x26\xaf\xa9\xdd\x8a\x33\xe9\x2a\xc3\xd5\x91\xe3\x94\xd8\xac\x5a\xd9\xff\x8d\x79\xd8\xbf\x57\x8e\xa5\x26\x27\x79\x4d\xbd\x2c\x1a\xa7\x99\x6c\xc1\x8c\x24\x5e\x5e\x10\x8b\x63\x7f\x69\xe4\x92\x07\xc4\x75\x9d\x5a\x58\xe5\xd8\xd9\xac\xc9\xb1\x1c\x73\xec\xce\xda\x0b\x2e\x7d\xae\x3c\x42\xf1\xe9\x0c\x53\xa8\x0e\xc2\xb5\x25\x52\xe9\xc2\xcb\x49\x1b\xf6\x15\x60\x65\x2a\x4a\x8c\x43\xc7\xc5\xcf\x90\xd3\xae\x75\x60\x8e\x73\x68\xf3\x87\x4b\x22\xa3\x29\xa2\x48\xc7\xf1\x78\xcc\x8b\x8a\xb0\xdd\xf2\x46\x15\xb7\x68\x23\xaf\xff\xa8\x8e\x1d\x74\x63\x50\x53\x75\xb8\x4d\xd8\x43\x49\xa0\xa5\xd0\xdc\x45\xa8\x72\x8a\xda\xbc\xf8\xae\x51\x20\x4f\xdb\xe8\xde\x1c\x6b\xa5\x14\xbb\x34\x9a\x43\x58\x1d\xf4\x2e\x19\x4e\x86\x4a\x80\x74\x53\x70\xdf\xf5\x27\xa8\xf8\x9d\xe4\x44\xcc\xd5\x3e\x31\xe4\x93\x62\x92\xed\x7a\xaf\x7a\x75\x98\x20\x56\x8a\x84\x96\x9e\xe0\x77\xa5\x2f\x58\xe2\x13\x69\x20\x7a\xd8\x62\x16\xc9\x6b\xe9\x0c\x02\x18\x46\x34\x7a\x85\xd9\xc9\x0a\x1f\x5f\x3d\xda\x51\x15\xef\xa7\x41\x39\xc8\xeb\xdf\xe7\x01\xc4\x11\x53\x28\xeb\x9a\xde\x77\xc1\x7f\xba\x76\x13\x56\x76\xa3\xe6\x1e\xc2\xd2\xa8\x66\x6d\x0f\x62\x67\x87\x7a\x79\x38\xb6\x82\xbf\x4a\xe2\x25\xd0\xea\x0c\xdc\x0a\x0f\xca\x7e\xf4\xa9\x4e\x43\xa7\x5e\x16\xa8\xbe\x72\x43\x7a\xbd\x9c\x8e\xc7\x49\x52\x4a\x2a\xb9\x01\x0d\x98\xce\xd0\xe2\x88\x3e\x76\x21\x62\xc0\xda\x86\xb7\x37\xd2\x7f\xf7\x69\xd5\x95\x38\x74\x71\x45\xc3\xae\x26\xd2\xa4\xd6\x86\x5e\x25\x7f\x41\x6f\xd0\xf5\x60\xf4\x05\x14\x87\x4e\x75\x67\xf9\xcd\x21\xaf\x98\x74\xf2\x99\x20\x2e\xb3\x87\xd5\x79\x27\x35\xa2\x50\xd5\x8e\x56\x14\x2d\xec\x86\x02\xd2\x4a\xf7\x1a\xd9\x2a\x1b\xa4\x83\x86\xd9\x29\x2b\x9f\xd3\xab\x14\x55\x1c\xae\x9c\xb3\x20\x95\xb4\xb8\x97\x94\xb4\x10\xe0\x4a\x7d\x07\x76\xc1\x70\x72\x7b\xb9\x08\x25\x9a\x27\xd5\x0f\x12\x42\xe7\x84\xbf\x96\x90\xb8\x72\x60\x7e\x2e\x0d\x02\x92\xf3\x94\xee\xae\xad\x6c\xe2\x22\x30\x59\x11\xe7\xd6\x7a\xd2\xff\x51\xd5\xbd\xdb\x36\x29\xb9\xf5\x06\x25\xeb\xab\x1c\x7a\x09\xb1\x41\xb6\x00\xa2\x7b\x80\x09\x8b\x26\x97\xb7\x59\x32\x90\x10\xde\xa5\x6c\x20\xb1\x67\xf8\xe3\xd5\x89\x04\x3f\x86\xc0\xc7\xe2\xc9\x56\xa9\x40\x2c\x15\xc1\x58\xcc\x10\x35\x1f\x5f\xbb\x70\x91\xb3\x1d\xbb\xbe\x91\xaa\xe8\x6a\xe8\x26\xa9\x17\x04\x7e\x9e\x1b\xe1\x24\x2f\x22\xb1\xaa\x60\x38\x17\x26\x80\x27\x2e\xf4\x08\x13\x8d\x5c\x7f\xea\x41\x36\x01\xf3\x4d\xde\xf4\xf5\x52\x68\xbb\xe6\x24\xf6\x3c\x66\x4a\x4d\x8c\x40\x75\xe5\xda\x54\x15\x62\xbb\x71\xe9\x28\xdd\x32\x6d\x9d\x3b\x49\x6c\x35\x06\xd3\x68\xf3\xbe\x9d\xf1\xa3\x7f\x1d\xff\xf2\x2b\xb8\x56\xfb\x76\xf0\x54\xd3\xb5\x33\x03\xd1\x8c\x2e\xa0\xd6\xac\x89\xc1\xf4\x83\x66\xe6\x51\x36\x99\x3d\x62\x1d\x43\x19\x99\xfd\x19\xc3\x70\xd9\xa7\xf8\x8e\x52\x0a\x9b\xf0\xae\xa9\x89\x29\xe1\x0d\x57\x21\xe5\x64\x74\x3e\x55\x55\x8e\xf9\x30\xcd\x9f\x15\x74\x56\x9b\x8a\x58\x91\x1a\xda\x4d\xe8\xa9\x8a\x4e\x56\x25\x36\xde\xb7\x74\xe3\xd4\x76\x1f\xff\xeb\xc5\xbf\x2e\x7f\xfd\x49\x4d\x6d\x92\xe4\xa2\xdd\x0b\x20\xd3\xbe\x33\xef\x4f\x2c\xef\xdb\x5a\x4f\xa7\xb2\xbd\xaf\x61\x29\x7f\x53\xae\x81\xd1\x75\x73\xd6\xac\x19\x25\xa1\x8a\xba\xc2\xf7\x7e\x71\x43\x25\xd5\x21\x44\x55\x5e\x76\xfe\x50\x80\x66\xcb\x3d\x88\x6b\xca\x5a\x0f\x69\xcb\x54\x76\x57\xdb\x64\x57\x2a\x39\x95\xf4\x7e\x6d\x54\x77\xbf\xc3\x2e\xac\x8a\xd1\x13\xe7\x81\x8a\x85\xe7\x2b\xd5\x5e\x71\xbe\x98\x24\xcc\xd3\xdf\x5a\x25\x47\xeb\x33\x9f\x67\x20\x12\xa9\x25\x47\xcd\x2b\x42\x95\x42\x2a\x69\x19\x58\x11\x54\x43\xa9\x33\x69\x96\x5d\xa5\x35\x9b\x9d\xf6\xb1\x6d\xaa\x65\xd3\xb5\xbc\xe5\x8b\xe9\xc8\xc0\xd9\x7a\x0e\x6f\xb9\xd4\xfe\x76\xec\x01\x5f\xa3\xa9\xae\x52\xa3\xcf\xbf\xd6\x19\x74\x4b\xe9\x61\xa5\xb2\x35\x3a\x6d\xfa\x35\x8c\x4f\x19\xdd\xea\x1a\xf6\xd3\xc3\x8c\x49\xe1\x46\xf3\x32\x33\x35\x06\x21\x32\xf1\x13\xd9\xef\xd3\xc8\xf9\xa5\x4f\x1c\x68\x1e\x80\x10\xbe\x05\x21\xed\xe0\xd5\xc2\x67\xd3\x18\x80\xb5\x26\xc1\x2a\x5e\xd4\x5d\x1b\xdd\x66\x93\xe6\x86\x96\x4a\xbc\x77\x56\xb4\x66\x03\x78\x6f\x62\xfe\xd3\xe0\x5d\x2b\x16\x24\xd1\xaa\x85\xab\x3d\x60\xa1\x42\x4a\x91\x67\x6d\x42\xfd\xe6\xd5\x38\x52\x64\x6a\x56\xe2\x68\x50\x84\xe3\x24\xef\xf6\x5d\x57\x1b\x0f\xc1\xd3\xe5\xc5\x78\xd0\x9f\xe2\x59\x89\x1f\x79\xf8\x28\x95\x21\x8f\x93\x3a\x31\x6d\x5a\x7e\xe4\x38\x7e\xd7\x58\x22\x7c\x36\x83\x23\x7a\x62\x94\x9a\x47\x28\x5b\xd6\x41\x50\x8e\x7f\x37\x47\x0f\xb7\x8c\x50\xf9\x97\x36\xa4\x5c\x23\x3e\x0a\xe6\xa9\x2e\x2d\x2a\xe4\xc0\x7c\x1e\x08\xf9\x90\x87\x61\xb0\xe2\x05\x9d\x88\xa1\x04\x2d\x34\x1a\xac\xbe\x22\x36\x5f\x56\x26\x98\x39\x59\x10\xed\x35\x26\xc5\xe8\xbe\x36\x1d\x37\xa4\x85\x3c\xcc\x23\xc7\x91\xac\x52\xd7\x2e\x30\x76\x8d\x93\xe7\xc7\x2f\x9f\x9d\x9e\x5f\x29\xe2\x66\xda\xae\xe2\x29\xb2\xdf\xa1\x58\xab\xb6\x77\xc3\x95\x5c\xbb\x91\x3b\x76\x3d\x17\x2f\x4d\xcb\xbc\xa4\x24\x25\x9d\x9d\x06\x08\xa1\x11\x84\xf0\x1a\xfa\x58\x84\xd8\x4f\x42\x34\xa7\xe6\x38\x72\x01\xf8\x8e\x41\x6b\x1c\x92\x1f\x59\xed\x54\x77\xe5\x6b\x30\x47\x30\x4b\x42\x5b\x7b\x44\xba\xfe\xdb\x8a\x6d\xfe\xd5\x39\x3b\x5e\xe2\xf3\xa7\x6a\x8b\x44\x3a\xbf\x1a\x9b\x04\xf5\x08\xb1\x28\x41\x69\x4d\xdd\xbb\x84\x6a\xbc\x0d\xec\x2d\x83\xfd\x78\xb4\xaf\x72\x3b\xd4\x8c\x50\xed\xff\xa9\x79\xb9\xe0\xfc\x61\x54\x7e\x21\xb7\x2b\x29\x35\xd9\x6b\x78\x7e\x1e\x13\x1c\x2c\x29\x7c\xd0\x35\x0c\x27\x1e\x5a\xf4\xdf\x1f\x1a\x20\xc6\xe8\x9b\xfc\x8c\xf5\x9c\x34\x72\x60\x27\x06\x63\x0f\xf6\x43\x18\x05\xc8\x8f\xdc\xeb\xa2\x55\x49\x31\x22\x7d\x27\x6f\xbe\xa0\x05\xb3\xd8\x68\x33\x32\x4f\x69\x9b\xf7\x93\x17\x34\x8a\x4c\x60\x02\xcf\xba\x67\xa5\xc7\x75\x4a\x28\xc8\xa3\x17\xa5\x7e\xad\x57\x1e\xd3\xd8\x2e\x5e\x05\xe9\x5e\x1e\xdb\x0d\xf4\x17\xf5\x88\x5f\xe7\xc1\x09\xdf\xe3\xbe\x1c\xce\xb7\x6f\x99\xf2\xa1\xae\x53\x9c\x41\xaf\x7e\xc3\xa6\x00\xc8\xbf\xf0\x8b\x0b\x17\x2d\x80\xc5\xdf\x7e\x06\x7c\x7e\xb0\xb4\x7b\xff\xf9\x82\x27\x62\xb4\xc0\x55\x05\x66\x8e\x69\x15\xde\xee\xc7\x3d\xd5\x0e\x99\x69\x32\x6a\x9d\x87\xb1\xed\xb8\xcc\xe2\xd1\x39\x6c\x51\xa0\x19\xef\xd5\x64\x54\x51\x25\xb1\xed\xc6\xad\x18\xfa\x28\x08\x42\x74\x0d\x74\x4b\xa8\x74\x50\x62\x06\x17\x83\x04\x4c\x85\x71\x3f\xdb\x40\xab\xb5\x89\x42\x97\x61\x48\x6f\x24\xfc\x5c\xea\x29\x2b\x7c\x9b\xad\xa2\x81\xcf\x64\x3b\x3d\x64\xb2\x8a\x45\xef\x14\x5a\xb8\xef\x2c\x51\xdc\x6b\x11\x1f\xac\x9a\xbe\x6e\x38\x54\x7d\x83\x0e\x6a\x1a\x65\x79\xa6\xa9\xd9\x39\x5f\xd4\x98\x9d\xd3\x44\x36\xea\x53\xb7\x4f\xa6\xa2\x37\x83\x41\xda\x1c\x90\x9b\x40\xc9\x2b\x8c\xc7\x6a\xf5\x9d\xd7\x26\xb5\x6d\x04\xca\x9c\x9e\x06\xda\x60\x11\x87\xc7\x5f\x1f\x30\x88\x1c\x73\xda\x70\xe1\x87\xe2\x5f\x14\x2c\x0e\xb2\x19\x50\x80\xe3\xe8\x80\x44\xe8\x78\x5c\xb1\xff\x6b\xc3\x84\xe6\xf1\x34\x00\x8a\xa8\x9f\xf8\xd7\x86\x0a\x37\xb9\x37\x80\x4b\x6a\xf8\xff\x6b\x43\x86\xba\xa0\x1a\xc0\x45\x38\xc1\xfe\xda\x50\xb1\x51\xb0\x6c\x02\x15\x26\xd2\xfe\xd5\xa1\x92\x54\x6b\x6f\x00\x19\xb9\x78\xf9\x5f\x1b\x3a\x80\x6a\x09\x8d\x80\xc3\x14\x8b\x35\xc1\xc6\x6c\xea\xda\x6a\xf2\x95\xf2\x9b\xf9\x3b\xd5\x01\xad\xab\x47\x1e\x9b\xdb\x15\x76\xdc\x76\x3a\x8d\x13\xda\x23\x88\xb3\x06\x49\x55\xe8\x71\x31\x1f\xae\x12\x1b\x85\x6b\x79\x1a\x5a\x5b\x10\x6a\xde\x82\xde\xd6\x12\xcf\x44\xe6\x19\x04\xac\x75\xf6\xa6\xcd\xf0\xc7\xf8\xb7\x3f\x17\x3f\x3e\x53\x87\xa1\x7e\xce\xd5\x45\x4a\xaa\x05\x98\xca\x06\xc3\x6d\x12\x5f\x4b\xbf\x5c\x11\x1e\xa9\x3b\x84\x20\x07\x6d\x13\x34\xab\x8a\x52\x08\x79\xa4\x53\xe1\x83\x65\xc3\x1e\x15\x11\x24\x19\x45\xcc\x32\xed\x38\x8c\x50\xd8\x0f\x90\xeb\x33\x76\x96\x0d\x85\xcc\xee\x77\xcd\x41\x4b\x79\x03\x4b\x31\xe3\xb6\x46\xee\x32\xd3\x2b\x59\x52\x38\x21\xe5\xb8\x49\x85\x75\x67\x2d\x76\xb0\xba\x93\x4b\x2b\xc0\xcd\xcc\x16\x70\xa8\x4e\x28\xd6\x2d\x97\xda\x31\xc5\x76\x43\xb4\x55\xa3\xe8\x57\x9a\x57\xc9\x46\x0d\xab\x4a\xd4\x76\xa5\x65\xdc\x59\x51\x05\x92\xde\x28\x6b\x45\x3b\x03\xd1\xf9\x0a\x55\x1f\x85\xfb\xae\x49\x17\x59\x05\x6c\x5b\x14\x9a\xbb\x08\x61\x14\x19\xac\x97\x2d\x46\x46\x04\xae\xa1\x81\x42\xe3\x34\xb2\x41\x40\x4b\xe3\xdb\x0d\xf2\xea\xd7\x6d\x7c\xae\xdf\x74\x39\x41\x71\xbb\x04\x88\xcc\xc1\xbf\x9a\xf4\x40\xf6\xef\xe6\x45\x87\x5d\xf8\xe3\x3d\xfc\xe8\xe7\xd3\xf2\xea\x64\x44\x57\x71\xe0\xfb\xa2\x0b\x3f\x1b\xc6\x9d\x13\x81\xc4\xb6\x15\x4c\x3c\xc8\x7a\xb1\x65\x0e\x9f\x18\xe0\x73\x7e\x05\xc5\x6e\xf1\x2b\x84\x8b\x4d\xc8\x2f\x1a\x0d\xd4\xcb\x79\x22\x6d\x9d\xee\xc1\x09\x36\xe6\x61\xab\xfa\x47\x9a\x1c\xbe\x7c\x06\x34\xc1\x47\x34\x3d\xa3\xa5\x98\xcc\xd4\x9f\x92\xcb\xdb\x28\x8b\xc6\x72\xb4\x9c\xc7\x66\x49\x0a\x09\x06\x63\x1f\x5c\x4b\xbc\x52\xe7\xac\x2b\x49\x05\xc1\x60\xac\x10\x87\x28\x7c\x2e\x6b\x13\x41\x4a\x0f\x66\xe1\x1c\x7f\xc2\xb2\xa1\x2c\x41\xc1\x8a\xfc\x0e\xe9\xa8\x3e\xf2\x3c\x63\xc7\x6c\x02\xc8\x5e\x91\x47\x15\x72\x13\xe4\x2a\x78\x15\x4d\xd8\x52\xff\xd6\x14\x27\xaf\x87\x08\xe1\x13\x64\x1f\xa3\xd8\xa7\x99\x19\xfb\x19\x91\xac\x75\x53\x5a\x4d\x2c\xb0\xc6\x83\x64\xee\x1f\xa0\xd3\x25\x36\x32\x03\xd7\x61\xe5\xa5\xfc\x70\x82\x9f\xe1\x23\x2b\x07\x9d\x4a\xbc\xb4\x0c\xf6\xd5\x3c\x02\x1b\xa8\xc9\x7a\xcc\x65\xbb\xf8\x4a\xd5\xce\x16\x5b\x45\x2a\x59\x50\xc6\x74\xd2\x47\xba\xd9\x2a\x12\xa3\xc0\xd8\xf5\xa7\xed\xfc\xd8\xff\xf3\xdf\xff\xf3\xdf\x66\x21\x31\x8c\x9d\x87\x83\x24\xe3\x57\x3f\x33\x2c\x97\x6a\x49\x2d\x12\x7d\x32\xb2\x21\x15\x7f\x78\x50\x96\x7a\xf9\x28\x2d\xaa\xf0\xd4\xf5\xdf\x31\xb1\x56\x86\xe2\xff\xfc\xf7\xff\xfe\x5f\xff\xb7\x4e\x60\xe7\x7a\x29\xbe\xe5\xe9\x60\x96\x17\xf9\xab\x44\x7a\x19\xfe\x1a\x72\x35\xed\x0c\x43\x7d\x56\x26\x51\x88\x2a\xf9\xab\xba\xbe\x1b\xd9\x15\x09\x43\x4b\xcc\xbb\x09\xb7\x6f\xc2\xd0\x86\x56\x65\x67\xfa\x82\x65\x55\x6d\x7d\xb9\x8d\x3d\xf8\x65\xf3\x75\xd8\xfb\x8e\x3d\xa7\xaa\xee\xd0\xb5\x08\x5d\x21\x39\xab\x53\x43\x45\xc2\x75\x3e\x37\x34\xb1\x4d\x45\xa9\x9c\x96\x34\xf7\x8d\x72\x5a\x47\x31\xe7\xc4\xcc\x67\x39\xa4\x9a\x09\x3b\xd2\x68\x76\x42\x94\x23\x99\xfc\xef\xf4\x67\xfa\xe5\x12\x95\x46\x3f\x1d\x26\xb1\x22\x68\xe6\x67\xd4\x55\xae\x6f\xa4\x21\xaf\x47\x49\x26\x52\x46\x0b\x0d\x39\x9c\x22\xdc\x97\x9a\x01\x6c\x58\x3f\x7e\x72\x16\x9e\x5e\xec\xde\x7f\xa4\x6d\x5a\xaf\xb1\xfc\xb1\x05\x69\x58\xfe\x8a\x52\x4e\x04\x96\x57\x33\xe0\xbf\xab\x66\x94\x06\xff\xaf\x7c\xcf\xc2\x08\xe2\x3e\xa6\x23\x09\xde\x36\x46\x18\xa3\xb9\x54\x58\x6a\xdf\x32\xd9\xb7\x06\xc6\xf1\x0c\xda\xef\x58\xb3\x20\xda\x4e\x83\x66\xf2\xb8\x7e\x84\xc3\x98\xa5\xb5\x0e\xda\x19\x4e\x6b\x27\x5a\x66\x44\x34\xa4\xff\xcc\xb2\xee\x15\xb0\xbe\xff\x48\x7e\x9c\x2a\xeb\x63\xce\xf0\xc8\xfc\xb4\xc9\x61\x91\xe9\x3d\x92\xf4\x1c\x11\x97\xb3\x86\xc3\x8f\x1f\xdd\x89\x51\x6c\x3f\x62\xfc\xfe\xf7\xd4\xa4\xf8\xfb\xdf\x7b\x37\x37\x0a\x73\xa1\x3c\xdb\xe2\x3a\x4a\x01\x59\x14\xc8\x15\x20\x6c\xdc\x3d\x22\x08\xdd\x39\xf7\x5f\xf2\x81\x5f\x10\xca\x2a\x9f\x9b\xa6\x99\xaf\x6a\x19\x45\xab\x89\x18\x3c\x2b\x06\x80\x18\xcf\x06\x1e\x9a\xba\xa2\x35\xb0\x8a\x00\x8f\x3d\xd7\x7e\x67\xcc\x20\xeb\x17\x1a\xb9\x53\xdf\x70\x35\x12\x9f\x36\x64\x5e\xcc\xf0\xbd\xc6\x7c\x13\xf9\x63\x04\x42\x67\x2f\x9a\x81\x10\xf6\x27\xdc\x34\xbe\x69\xe6\xe9\x4e\x4f\x96\x0f\x66\xbf\xad\xd2\xf5\x82\x2f\xc4\xf5\xa7\xfd\x12\x13\x5f\x25\xe9\x57\xbc\x53\xcd\x24\x8b\x82\x8d\x86\x16\x6e\x23\x8f\x56\x7a\x8e\xe6\xfd\x87\x2d\xf4\xf0\xc8\x75\xe0\x18\x14\x2c\x98\x25\xda\x93\x3b\x9f\xe6\xde\xf7\xd0\x14\x19\xee\x7c\x9a\xcb\xc2\x79\x6c\x99\x51\x68\x9b\x96\xb9\x07\xa2\x08\xe2\x68\xcf\x9d\x4f\xf7\xc8\xb3\x7d\x1b\x79\x28\x1c\x04\xa9\xbb\x47\x1d\x41\x51\x37\x6d\x0c\xa6\xb0\x3f\xd4\x34\xe6\xc9\xcc\x3c\xed\x71\x68\xc4\x01\x3b\x62\x80\x6d\x73\x9b\x8c\x4e\xc0\xfa\x8a\x9e\xa7\xd2\xd3\x83\x2f\xa9\x3f\x69\xd1\x90\x4e\x85\x2a\x7a\x98\xc8\xb9\x6e\xaa\xf1\x53\xbe\x4b\x7d\x54\xec\x8a\x38\x71\x54\xcb\xcc\xe9\xc9\x7a\x73\x69\xd3\x92\xca\xb5\xdf\x91\x49\x1a\x28\x34\x10\x9e\xc1\x70\xe1\x46\xab\x35\x49\xdd\x1c\x06\xbd\xc6\xed\xe6\x9a\xe0\x4f\x1e\x7d\x6b\xd1\xf7\x32\x8a\x81\xe7\x2d\x0d\x1f\x61\xda\x32\x2e\x22\xa8\x04\xbc\xff\xe3\x44\x97\x9a\x3b\xc0\xa7\xa1\x3c\xc1\x35\x86\xca\xc0\xdc\x4f\xa1\x5b\x11\xcd\x24\x48\x97\x40\x85\x6a\xde\x9d\xf9\x28\x1b\x73\xc6\xea\x6e\xed\x52\xf8\x87\xfc\x60\x4d\x97\xb5\xcd\x6e\xa3\x83\x54\x01\x93\x42\xd2\x66\x08\x45\xd0\xd0\x9d\x68\xed\x6e\xca\x7e\x24\xdd\x4d\xb9\xab\xdb\xb0\xa3\x7e\x80\x78\x01\xa1\x6f\x3c\xa4\x69\xe5\x0f\xf6\x0d\x7b\x06\x42\x60\x53\x81\xb1\x86\x56\xb6\x85\x33\xa6\xd0\xee\xf3\x8a\x13\x32\x6a\xd9\x95\x75\xe0\x56\xfe\xda\x56\xe3\xf8\x05\xec\x93\xc9\x31\x2e\x69\xcf\x50\x04\x7d\x23\x68\xb0\x29\xb7\x80\x57\x1e\x34\xe3\x95\x97\x44\x03\x3a\xf3\x6f\x9b\x5d\x6a\xf5\xa5\xca\x77\xcb\xbe\xf0\x20\x88\xa0\xf1\x2b\xa8\xcf\x73\x55\xc8\xa1\x64\xe5\xa2\x6a\x84\xeb\x0f\x06\x15\xad\xbd\xea\xd6\x57\xf2\x66\xe1\x9d\x72\x55\xde\xdc\x84\x65\x4e\xa5\x1f\x36\x56\x32\x93\x3d\x4d\x4d\x4a\x9b\x57\x2f\x1f\xbf\x7f\x1f\xfe\xb6\x88\x76\x57\x50\x2f\xa9\x8d\xa0\x2f\x6c\x76\x4a\xa5\xb2\xc6\xa0\x17\x0a\xa3\x47\x8d\x3d\x6f\x2d\xe6\xae\x44\xca\x59\x94\xf0\xea\xee\x6c\x5c\xf9\x7e\xac\x72\x1f\x56\xd3\x87\x8b\x0b\xe9\x7e\x21\x90\xae\xfb\x86\xac\x0a\xa8\xb4\x60\xf2\x5c\x86\x01\x46\x84\x43\xe4\x4f\x4b\x18\x7c\x4b\xb3\xdb\x0a\x08\xad\x3e\x80\x4b\x90\xda\x09\x3a\x8f\xc5\xf1\xfc\xc6\x2a\x5c\x53\x61\x96\xdf\xdb\x36\xc4\xf2\xf3\x20\x3d\xc1\x7d\xb8\x48\xb0\x6b\x80\x29\x70\xfd\x4e\x70\x2c\xf9\x06\x87\xfb\x39\x6b\xfa\xc1\x7e\x2d\xde\xdb\xb6\xec\x35\xb5\x8c\xae\x32\x08\x03\x40\x3f\x93\x77\x74\xb3\x1a\x59\x59\x4f\xee\x3c\x8e\xf0\x33\x80\x6d\x1a\x85\x61\x3a\x7d\x1f\xf9\x69\x8d\x79\xd3\xa0\x46\x23\x5a\x29\x90\x2f\xd7\x83\x13\x4c\x17\xfb\xa6\xa8\xbe\x44\x06\x19\xcd\x98\xb3\xe1\xf4\x00\x5e\x75\x00\x76\x73\xfa\x65\x0f\xae\xc6\xe7\x1e\xab\xa5\xcd\xff\x21\x63\xc4\x1e\xbe\x85\xe2\xe3\xf1\x1f\x1f\xc2\x7d\x67\x12\xa9\x43\x37\xd9\xb4\xca\xa3\x37\x2b\x22\x81\xe8\xba\x8c\xf9\x32\x2f\x80\x56\xee\x84\x5c\xe0\xb8\x88\xb3\xa2\xb3\xb8\x98\x85\x20\x52\x37\x0d\x96\xc6\xdc\x86\x7a\xd3\x8a\xaf\x97\x6f\x62\x69\xee\x20\x2f\x57\xb8\xac\x3c\x2d\xd9\x6f\xb3\x10\x4e\x44\x5c\x49\xb4\x67\x66\x73\xe6\x59\x01\x0a\x33\x7f\xf9\x92\xd7\x8a\x36\xf7\x1c\xe9\x96\x98\x52\xf1\x25\x71\x27\x79\xef\xfb\x00\x4c\xe1\x48\x0a\x2d\xc1\x70\x7e\xa6\xac\x6d\xad\x27\x9b\x97\x54\x95\x4e\x81\xb4\x15\x95\xa5\x75\x46\xdf\xb7\xcc\x5c\xe0\x4c\xe2\xc6\x2f\x8f\x9a\x51\x7c\x6b\x3d\x55\xac\x55\xf4\x55\xce\xd9\x9b\x84\xf5\x6c\x86\xb5\x2a\x79\x63\x0b\x0e\x4b\xb9\xe7\x1e\x70\x43\x5a\xf2\x6b\x8f\x9c\x8d\xb4\xc8\x00\xba\x05\x37\xd6\x1f\xaf\x1e\x3c\x9b\x7b\x91\xba\xca\x5d\x81\xb1\xde\xa7\xed\xe5\xe8\xf4\xc7\x20\x4a\x67\x9d\x27\x09\x53\xd0\x0e\xb5\x7f\x4c\xa9\x8c\x16\x9d\xb8\x21\x2d\x70\x88\x7c\xd1\x1c\x31\x53\xeb\x33\xcb\xec\xd2\x30\x13\x3e\x50\x1a\x76\xc2\xea\x93\x94\x47\x8f\x88\x2f\x69\x84\x99\x24\xa9\xa7\xb5\x4f\x26\xf3\xd4\xaa\x14\xda\xd4\xbe\x55\x6a\xd0\x12\x44\xd2\x87\xf3\x31\x74\xfa\x36\x4d\x01\x4c\x23\xb3\xf9\x5d\x83\xde\x35\xc4\x5d\x55\x28\x14\xdf\xd1\x44\xa0\x04\x21\x04\x29\xca\x84\x0c\x4d\x0b\x4c\x67\x44\xe9\xca\xdc\x23\xf1\x33\xe4\x35\x38\xe9\x2f\x10\xb8\x18\x78\xee\x07\x2a\xea\x05\xd0\xf3\x68\x8a\xb7\x84\x5c\x80\x01\xdd\x8a\xf7\x4a\x96\x56\xd1\x37\x9b\xe5\xfc\xf0\xa7\xd0\x64\x92\xfb\x7f\xba\xa7\x4b\xb3\x90\x56\x10\xb6\x41\x44\x9b\x41\x41\x43\x01\x6c\x43\x62\xbf\x95\x11\x48\xeb\x2c\xbb\x59\xc5\x4f\x3a\x62\x4e\x21\xf4\x1d\x18\xde\x86\x97\xfd\xd7\xeb\xc7\xd7\x7b\xd3\xa9\xb3\x82\x19\xc4\x47\x34\x9e\xc3\x57\xd7\x57\x34\xa5\x60\x6d\xce\xa9\x58\xa1\xb0\x37\xac\x06\xee\x7a\xcf\x93\x2a\x60\xb7\xc6\x9d\xc4\x99\x45\x3b\xfe\x8d\xe3\xed\x7a\xef\xfa\xe4\xe8\x34\xfa\x51\x2d\xbf\xdf\xe5\x63\x54\x49\xee\xd9\x6e\x26\x7c\x6d\x62\x59\x26\x93\xc0\x09\xc2\xce\x8a\x4d\x25\x2a\x65\xf9\x36\x61\x9d\x8f\x8c\xec\xf7\x95\x32\xbb\x64\x3b\xa0\x6b\xae\x4d\xd7\x2e\x11\xb7\xdb\x19\x5b\x14\x36\x93\xf2\x54\xd3\xaa\x1c\xd3\x37\x7c\x23\xf4\x5d\xa7\xff\xf1\x23\x83\xf0\xcd\x8d\x99\xdd\x22\x5c\x62\x6e\x9a\x58\x9a\xf0\x73\x43\xbe\xdc\xf7\xa6\x06\xad\xb1\x44\x47\x2d\xb7\xab\x54\xbd\x94\x9e\x14\x89\x32\xcf\x0e\x0c\x9e\x60\xdd\x5e\x14\x5d\x07\x66\x8a\xa7\x70\x06\x2d\xfc\x28\xae\xc4\x0e\xd7\x1e\xca\x51\x24\xa9\x17\xe6\x81\xd2\xbc\x75\x02\x23\x7b\x7b\x10\xe5\xc0\xc8\x0e\x5d\x5e\xfa\xbc\x21\xbe\x9a\x86\x65\x6e\x74\xc7\xc9\xe5\x6f\xea\x36\x9e\x9c\xc0\x9d\x30\xb7\xff\xa8\xad\x57\x1e\x3e\xa9\x7e\x5e\x83\x7b\x97\x25\x6c\x95\x63\x9f\x26\x9c\xd5\xb5\xa4\x67\x9c\x3e\x8e\x96\x2d\x6a\x72\xa4\xf1\x6d\xc5\xe8\x35\x32\x24\x6d\x78\x3d\x98\xba\x93\xbc\xa9\x94\xdc\x73\x7d\xc7\xb5\x81\x74\x0c\xe9\x48\x9a\xe5\x4b\xe0\x75\xbd\x9f\xba\xfe\x3b\x18\xfe\xc0\x8d\xb6\x1d\x54\x19\x51\xc4\xd2\x56\x9e\xe9\x34\xc4\x55\x6a\xf6\x9e\x3f\xdf\x57\x6f\xf6\x7c\xe6\x47\x30\xc4\x86\xb0\x5f\x55\xb6\x7a\x21\xe0\x78\xc6\x0a\x15\x49\xd1\x55\xae\x4e\x63\xa6\x3a\x80\x07\x21\xbc\x76\xe1\x42\x03\xd4\x65\xec\xa6\x13\x78\xf3\x69\x54\x81\xbc\x14\x42\x17\xec\x5d\xf3\x4d\xd6\x22\xca\x87\xbc\x62\x9e\xf9\xa2\x55\x4b\x2b\x00\x59\x9f\xb2\x24\x87\x41\xe9\x4c\x85\xde\xae\x55\xc0\x49\xe7\xa3\xca\x22\x57\x95\x80\x66\x25\x29\x5a\xc1\x59\xd8\x27\x34\x8b\x65\xb5\xf3\x42\x34\x4a\x82\xaa\x25\x43\x1b\x79\x95\xd2\xb2\x16\x2d\xdb\xc0\xbf\x06\x91\x11\xa2\xd8\x77\xa0\xa3\x88\x17\x51\x1e\xc2\x43\x6b\xa8\x61\x4d\x2c\x3d\x47\xaa\x0c\x88\x85\xf2\x0c\x29\xc6\xb3\xa5\xeb\xdc\xc8\x06\xa1\xc3\xfa\x3b\xf4\x73\x22\x59\xa6\xe6\x32\x27\xfb\xcd\xf6\x7f\xc8\x8d\x54\xd1\x0f\xbc\x66\xb8\x6e\x9b\x41\x9c\x30\xa8\x19\xc7\x33\xe0\x4f\x4b\xcb\x8d\xd7\x8c\x5a\xdd\x04\xdc\x2c\x46\xc6\xbc\x42\xb1\x31\x03\xd7\xd0\x98\x03\x07\x1a\x36\xfb\xb6\x81\x11\x0b\x24\x65\x24\x6c\xf4\x0d\xb2\x54\xd7\x8f\x21\x95\x79\x5c\x7f\x6a\xa0\xd0\xe0\x68\x16\x2f\x95\xb5\x07\x6f\xb7\x90\x6d\x2b\xcf\x97\x5b\x7f\x2d\xef\xdc\x44\x73\x70\x06\xff\xb2\xee\xe0\x59\xec\x34\x40\x4e\x1b\x9e\xc0\x65\x7f\xb1\x99\xf6\xf8\xd6\xa0\xf2\x0c\xd4\xb3\x8d\xb3\xd6\x55\x04\xec\x64\x71\x4c\x4c\x11\xb2\x46\x73\xb3\x78\xd2\xaf\x28\x23\xc2\x94\x03\x33\xf3\xbd\x92\xc8\x85\x6e\x0d\x5e\x45\x0b\x55\x17\xc6\xae\xcd\x5b\xb9\xb0\xff\xf0\x9f\xf1\x53\xef\x8f\xff\x04\x2b\x57\x93\x00\xcf\x6a\xde\xd5\xad\xb2\xcc\xcc\x21\x5c\xc4\xff\x6b\x69\xca\x25\xac\xaa\xa8\x51\x90\x8d\x99\x98\x7b\x6e\xcf\xe0\xd8\x9d\x59\xeb\x8b\x2d\xab\x4c\x47\xfa\x62\x05\xe9\xc2\x0a\xb2\x6e\x35\x93\xeb\xc3\xec\xd9\xa7\xdc\xab\x5b\x1d\xe5\xb1\xd5\x8a\x67\x52\x06\x84\x5c\xd5\x58\xcf\x5f\x54\x11\xfd\x0c\x75\xd0\xbc\x88\xfc\x45\xdf\xdc\x32\x7d\xf3\x8b\x82\xf9\x45\xc1\xcc\x6d\xf8\x35\xa9\x5a\xab\xe9\x58\xb7\x17\x03\xf2\xdb\xde\xc1\xf2\x41\x80\x1b\xc7\x80\x64\xcf\x46\x2a\x5e\x52\x4a\x54\x5a\xe5\xde\x64\x29\x67\xb1\x8c\xdc\xc5\x52\xcd\xf5\x86\x82\xe1\x72\x40\x89\x02\x95\x52\x97\x29\x0e\xb8\xdc\x97\x38\x13\xa3\xed\xae\x69\x8c\x6b\x36\xb8\x26\x29\x62\xf9\x5a\x68\xf3\x89\xc7\xa0\xac\x25\x97\x42\x74\xec\x96\x72\x56\x0e\x46\xb1\x91\x73\xcb\x11\x8e\x8f\xff\x78\x34\xfd\xed\xeb\x87\xef\x56\x89\x70\x4c\xe2\x68\x34\x8c\x39\xd8\x0d\xd6\x11\xee\x48\xd8\xa4\xed\x46\xac\xe8\xb6\x81\x67\x00\x73\x35\x63\x0c\xa3\x6c\x30\xda\x67\x16\x19\x29\x64\x34\xb2\x86\x0a\xcb\x43\xf9\xfb\x4b\x1f\x83\xf7\x7d\x56\xb0\xb0\xd2\x6a\x91\xb4\x4d\xe7\x0f\xe7\xf4\x54\x21\x63\xa4\x0b\x35\x11\xd5\xe1\x7e\x21\x34\x77\x01\xf0\x2c\xb9\x42\x45\x60\x7e\x85\x8d\x95\xc1\x2a\x9b\x52\xa6\xff\x22\xbd\x22\xf5\x59\xaf\x00\xe8\x25\x7d\x96\xc9\x26\xa9\x66\x39\x67\x91\x8f\xac\xe4\xba\xf0\xdc\x3a\x90\x3d\x5c\xd1\xee\xa6\x42\x51\x64\x1d\x93\xd5\xf0\x1a\x1c\x23\x07\x3e\x73\x69\xf9\xa6\x8f\xb9\x63\x78\x06\x89\x52\xc8\xba\x2b\x1b\x5f\xb9\x73\xb2\x9b\x81\x8f\xbf\xc9\x3d\x36\x41\x3e\xee\x47\xee\x07\x78\x68\x0c\xbf\x0e\xde\x67\x6e\xdf\xd4\xce\x2f\x63\x25\x2a\x0f\x5b\xcd\xa6\x7e\xa5\x5b\xe6\x07\x1e\xc4\x97\xb6\xcf\x40\xbc\x21\xa6\x29\xa9\xed\x2a\x98\xe9\xaa\xe3\x5d\xf2\xda\x3c\x97\xec\x80\xdd\xde\xde\x79\x7d\x7e\xf9\xf3\xbb\xab\x9f\xfc\x23\xed\xf3\x5a\x41\x87\x19\xf2\x33\xca\x08\xee\x46\x71\x04\x52\xca\x4e\xe8\x45\x2d\x06\xa8\x24\x00\xcb\xe4\xd1\xd5\xa2\x7f\x08\xa7\x30\xa6\xf8\x22\x87\x53\x94\x2c\x09\xae\xeb\xe4\x2d\x22\xb1\x35\x3d\x4c\xe1\xdc\xf5\xdd\xdb\x3d\x80\xe7\x7b\x47\xcb\xaf\x4f\xbc\x92\x46\xfa\x5c\xcc\xee\x2e\xd1\x80\x1a\xa3\xd6\x76\x0c\xb3\x5f\x0b\xc0\x35\x95\x37\x96\xf9\x23\x05\xb1\x01\x7d\x0c\xc3\x20\x24\x27\xb4\x1b\x45\x31\xa4\xe5\x33\xb0\x6b\xbf\x83\x54\xa7\x8b\xd0\x04\x2f\x40\x08\x8d\x9d\x19\xc6\x41\x74\xb8\xb7\xb7\x58\x2c\x06\xb4\x1e\x14\x0c\xc9\xcd\x81\x8d\xe6\xbd\xed\x3c\xbb\xcb\x3b\x13\xa8\xdc\x0c\x95\x56\x48\x65\xe9\xb0\xf6\x1e\x05\xb3\x2c\x6f\x82\xd1\x7d\x3f\x0e\x65\x45\x93\x63\xea\xe5\x8b\xa7\x15\x1a\x5b\xbb\x3e\x2d\x6f\xac\xd7\xf2\x37\xb3\xad\x58\x68\x59\x90\xa9\x69\x99\x74\x3a\x6f\xf2\xd9\xc2\xd5\x76\xff\x76\x69\x0b\x70\x30\x1d\x18\x84\xd2\x0e\xf7\xf6\x66\xd0\x0b\x1c\x18\xbd\xcb\x53\x9b\x96\x7e\xda\x29\x7a\x92\xa2\x4d\x30\xac\x28\xcb\x54\xfa\x3d\x1e\xec\x95\xc3\x66\xfd\x60\xea\x1c\x72\x3d\x64\x8a\xd1\xcb\x30\x9a\x7c\x5d\x17\xad\xeb\x85\x70\x7e\x03\x80\xc0\xe5\xd9\xa2\x22\x65\xe8\xe2\xcc\xf8\x19\x96\x35\x8b\x5f\x11\x5a\xfc\x6b\x56\x21\x03\x3f\x81\xd7\xd1\xc5\x19\xfd\xfa\x46\x36\x01\xa7\x10\x82\x23\x83\xac\xfb\x1d\x5c\x1a\x3b\x93\x10\xcd\xd9\xa5\x20\x44\x13\xd7\x83\xca\x6c\xc8\x46\x58\x52\x44\xde\x95\x18\xd6\x41\xcc\xea\xff\x27\xd8\x88\xf1\x0c\xfa\xd8\xb5\x01\x2e\x12\x70\xc1\xfa\xdb\x90\xb9\x9a\x05\x3f\x0d\x90\x3e\xe7\xe8\x39\x6c\xda\x93\x66\xf9\xfe\x67\x3d\x33\x0c\x8e\x9e\x05\x0a\xdf\x25\x0d\x1a\x2a\xed\x7e\x85\x24\x6a\xa1\x3a\x72\xf2\x4b\x46\xd2\x48\xaa\x96\x9f\x6d\x54\x9a\xdd\x2c\x49\xa9\x2e\x9b\x8b\x10\x41\x13\x0f\xf5\xc3\x34\x53\xf6\x8a\x7b\xa8\x57\x89\x6f\xcd\x8a\xb7\xf9\xaf\x4b\xad\x53\x35\x32\xa4\xeb\x34\xed\xec\x12\xb9\xe4\x46\x67\xc0\x44\x78\x3e\x89\x31\xb0\xdf\x4d\xa9\xcb\x84\x55\xe1\x3c\x4c\x27\x71\x4c\x7e\xd3\xed\xff\x8d\x59\xed\x81\xfa\x55\x2c\x81\x2b\xc2\xf9\x75\xe4\xd3\xa9\x39\x5b\x51\x05\x9d\x4a\xdb\xa0\xd8\xea\xa0\x75\xcf\x98\x5a\xf8\x88\x8f\x24\x80\xe2\x70\xff\xdf\xff\xef\xff\xd1\xd5\x31\xad\x72\x1a\xac\x4c\x8f\x5e\xad\x80\x7e\xfd\x7c\x54\x56\xeb\x8c\x9b\x6a\x13\x4a\x73\x51\xb7\x49\xd5\xa4\x3b\xed\xd5\xa4\xdb\x53\x9c\xa1\xf7\x7c\xb9\xfb\x0a\x23\x3d\xc5\xb9\x2a\x6b\x71\x5d\x60\x5e\x5d\x1f\x75\xf1\x2c\x1e\xdf\xae\x3e\x1a\xff\x04\x8f\x9e\x5c\x3e\xf7\xd6\x9e\xf2\xbe\x09\x4d\x94\x87\x5e\x58\xe6\x8f\x2e\xfe\x29\x1e\x1b\x6e\x64\xcc\xd0\xc2\x08\x20\x0a\x3c\x68\x8c\x63\xd7\x73\x12\xdd\x73\x90\x2a\x9f\x0c\x0f\xdb\xac\x73\xd6\x04\x03\x24\xae\x7d\xb6\x12\xcd\xc4\xcc\x2e\x05\xa0\x52\x75\xb6\x03\xc1\xa9\x56\x76\x7a\x1e\x4e\x81\xef\x7e\x00\x82\x78\x74\xaa\x79\xac\xd3\xee\x6d\xa2\x85\x0f\xc3\xa8\xef\x84\x28\x70\xd0\xc2\x17\x82\x3f\xbb\x5c\x63\xf0\xa6\xdd\x77\xf3\xf6\x6e\x3a\xb5\xac\xb5\x9b\xeb\x10\x88\x37\xeb\xad\x6d\x39\xda\x5e\x73\xe0\x50\x46\x12\x94\x0d\x14\x32\xb5\x61\x31\x43\x11\x34\x42\x18\xa0\x88\x90\xdc\x92\x56\x56\x5c\x00\x1f\xd3\x4a\xfb\x33\x66\x11\x29\x97\x63\x1b\x46\xff\xac\x48\x2d\x84\x17\xb8\x18\xce\x23\x23\x72\xfd\x2a\x11\xbb\x5e\xf9\x13\x5a\x1f\x57\x02\x53\xe5\x6f\x1c\x02\xdf\x9e\xf5\xd9\x07\xf2\xc8\x62\x37\x2f\xd9\xc7\xdf\x08\x2d\x5a\x5b\xf9\x5b\x15\x91\xfc\x40\x20\x6c\xf1\x6b\xc3\x01\xcb\xc8\x00\x53\xb4\x45\x08\xe2\x5c\xfb\x17\x17\x2e\xb4\x9a\x4e\x16\xbf\xcf\xf9\x1f\x4b\xc7\xaa\x2f\x2e\x5a\x81\x60\x5a\xac\x03\x26\x7a\xfe\x1b\x1e\x46\xde\x9f\xbb\x1e\x8c\x30\xf2\x8b\xc8\xa5\x71\xeb\xe2\x6e\xc4\x9a\x72\x93\x41\xc6\xe8\xbd\x56\x43\xe0\x2a\xaa\x95\xc7\xd5\x2a\x7a\x3a\x56\x44\x02\x76\x06\x03\x6a\xd2\x8d\x94\x00\x38\x63\xb7\x3a\x5d\xbc\x18\xf3\xf6\x17\x6e\xa3\xf9\xdc\xc5\xea\x95\x1f\xf3\x7b\x9d\x2e\x3d\x19\xb4\x41\x95\xda\x6e\xb9\x3e\x9e\x41\x83\x6c\xa7\x68\x75\xce\xae\x32\xe1\xac\x49\xac\xa0\x48\x55\x54\x7b\xd5\xe5\x23\xfa\x05\xb8\xab\x25\x93\x17\xc9\xc1\xa8\x43\xbe\x89\x68\xb2\x17\xbb\xb4\x11\x5a\x3f\x70\xed\x4c\xda\x0c\x3d\xbd\xb8\x28\xf0\xc4\x85\x1e\x2d\x01\xed\xfa\x53\x8f\x37\xc2\x4d\x45\xe7\x84\x36\xc9\x38\x8c\x2a\xc9\x29\x6d\x72\x95\xa8\xa4\xe3\xb2\x3a\x3a\x79\x05\x2c\x37\x6e\xae\xdf\x39\x29\xac\xc9\x1e\xa9\xbb\xd8\x12\x2b\xc1\xe6\xec\x02\x05\x1d\xb3\x13\x75\xf5\xf6\xec\x02\x3f\x4f\xcf\xce\x7f\xf8\xf1\xfd\xc1\xea\x76\x81\xf5\xf8\xab\x55\x50\x6a\x0d\xf2\x39\x08\xdf\x11\x0d\xe2\x76\x6d\x04\xf7\xdc\x87\x8b\xf0\x9f\x4f\x35\x5b\xe3\xad\x1e\x34\x96\x56\x0c\xb2\x94\x05\x19\x72\x79\x7a\x56\xae\x88\x80\x9c\x93\xbf\x3e\x53\x83\x54\xd5\x88\x92\x53\xb3\xa4\xc2\xda\x57\x92\xa2\x02\x75\x36\x84\xed\x30\x4b\x94\x46\x4f\x95\x86\x4e\xe9\xc4\x4d\xd1\xa0\xa9\x09\x98\xbb\xde\xf2\xd0\xf8\x09\x7a\xd7\x90\x70\xe3\xe2\x23\xaa\xb8\xaa\x1b\x59\xc6\x90\x67\x11\x84\x30\x3b\x93\x00\x38\x8e\xeb\x4f\x0f\x8d\xfd\xfc\xdb\xcd\xbc\x4e\xc2\x08\x23\x36\xad\xa6\x19\x86\x3c\x55\x5b\x1e\x2b\x7f\xce\x29\x63\x7a\x86\x8f\x2c\x29\xb8\x4b\x99\xe4\x90\xe6\x68\x65\x4a\x55\x24\x31\x62\x82\x33\xae\xe3\x04\x4f\x73\xcf\x78\x40\xb1\x51\x80\x58\x90\x50\x7d\x75\xca\xa4\x98\x74\xba\x4b\x32\x1c\xfd\x33\x3a\x9f\x55\x1c\xbe\xa3\xe3\xe2\xf6\xce\xe8\x5f\x5e\xfd\xfc\xc7\xe3\x1f\xff\x88\xb7\xf5\x8c\x56\xc3\xa9\x35\xd8\x03\x40\x00\x17\x02\xd7\xbb\xdd\x73\xfa\x97\xfb\xf6\x23\x14\xce\x57\x0a\xee\xde\x1a\x5b\xbe\x1c\x55\x76\x91\x00\xd8\xb0\x3d\x14\x3b\x86\x87\xa6\x53\x1a\x48\x06\xc3\x6b\xd7\x96\xe2\xc8\x52\x54\x80\x20\xd8\x66\x8b\x7e\x95\x39\xbf\xc0\xfe\x9a\x2b\x45\xa6\x56\x4b\x13\xa6\xf1\xd4\x76\x34\xe9\x46\x5f\x2e\xd1\x94\x25\xdc\x56\x87\xe3\xac\x1c\x92\x96\xd2\x46\x1f\x04\x2e\x46\xef\xa0\x5f\x13\x9d\x73\x45\x9f\x69\x12\x9f\xb3\x92\xc9\x85\xac\x9f\x7e\x92\x07\xe6\xd0\x7e\x16\x55\x81\x39\x2d\x92\xde\xda\xab\xc3\x5d\xf9\x90\xd8\xff\x5e\xc0\xbe\xac\x5f\xb7\x11\x34\xd8\xff\x34\x46\xc9\x19\x36\x54\x20\x2b\x5c\x53\x88\x03\xab\xae\xbd\x95\x69\x43\x6f\x23\x67\xd8\xad\xe6\x66\x5e\x83\x1d\x3f\x09\xb8\x93\xb6\xda\x9f\x31\xcc\xf4\x8e\xbe\x64\x4d\x27\x92\xcb\x6d\x3d\x30\x19\xcf\x8b\xd8\xee\xb9\x6d\xce\x3e\xa2\xf4\xb3\xc8\xe5\xb4\x73\x1b\x9f\x4f\x6d\x9d\x2e\xb5\x13\x42\x9c\x73\xd7\x87\xc6\x62\xe6\xda\x33\x72\x9e\x19\xd0\xc7\xa1\x0b\xb3\x76\x56\xc7\x8d\x02\x0f\x2c\x0d\x1a\xc1\x3a\x46\x63\xe3\xf9\x0b\x63\xe7\xf7\xdf\xcd\x08\xcd\xa1\x11\xd0\x66\x1b\xbf\xff\x6e\x1a\x47\xe7\x27\x46\x04\x3c\x6f\x59\xd1\xcc\xa0\xfa\xce\xba\xa9\x60\x0e\xde\x4b\x63\x3c\x03\xef\xdd\x79\x3c\x37\x44\x47\x95\x35\x93\x01\xf9\xb8\x65\xfa\x31\x91\x9d\xf4\xc9\x60\x5e\x99\x49\xd4\x01\x11\xfc\x84\x16\xc6\x1c\xf8\xcb\x0c\xf6\x1d\x94\x10\x40\x59\x9e\xf3\xed\x20\x93\xbe\x9a\xba\xb4\x25\xaf\x9d\x18\x73\x15\xb7\x7b\x10\xa2\x79\x80\xbb\xf2\xbf\xe7\xe6\x6a\x99\xdf\xd2\x2b\xdf\x25\x8e\x78\x9e\x7a\xc6\x57\x55\xe7\x92\xa7\x2b\x8c\xf4\x7d\xf2\x1c\xca\xeb\xa4\x1d\x96\x3c\x07\x3c\x43\x12\x9f\xa6\xd5\x88\x68\x20\x40\x68\xd8\xf0\xb9\x1c\x7c\x0b\x1a\xb3\x5a\xdb\xea\x4c\x79\xbb\x3d\xad\xf9\xf4\x87\x3f\x5e\xbd\x5c\xde\xc7\xdb\x15\xf1\x56\x06\x9f\xf6\x00\xf7\x80\x8f\xe3\xf9\x2d\xeb\xca\xbf\x1d\xa3\xe9\x39\x7e\xf4\xfe\x2f\xa7\x2b\x57\x65\x46\xe3\x19\x34\x1c\x17\x4c\x43\x30\xdf\x4e\xb5\xb8\xde\xb8\x2a\xa8\xa7\x2f\xd6\xd1\xac\xb0\x9b\x8f\x81\xeb\x97\x96\xfb\x68\xa4\x94\xeb\xb9\x2c\x87\xd5\x4d\xc1\x57\x3d\xae\x4b\xf4\x6a\xa9\x51\x19\x6b\x4a\x66\xf2\xf4\x27\x01\xbe\x81\x8d\xe6\x7b\xa6\x28\x77\x13\x4e\x21\x21\xdd\xb7\x63\x0f\xb0\x3a\x8b\x42\x37\x27\x4f\xbf\x7c\xf6\xd4\x38\x49\x81\xfd\x48\x2f\x0e\x43\x61\xfe\x5d\xd6\x77\xfc\x4d\xdf\x97\x97\xcd\x4b\x55\x47\x60\x1e\x78\x09\x01\x47\x87\x95\x32\x47\xe9\x60\x65\x8f\xae\x50\x51\xc5\x13\x65\xc1\x4a\xb5\x33\xb6\x82\x4b\xf8\x67\x0c\x79\xec\x57\xaa\x0e\x89\x6b\xb5\x8b\xd9\xc0\x0c\x5f\x46\xf0\x98\x36\xf0\xcb\xe4\xa7\x19\xec\xda\x36\x4c\xf0\x98\x59\x73\xa4\x7a\x39\xc2\xbc\x73\xfb\x73\x23\x2c\xee\xda\xc5\xcb\x4c\x0c\x41\x72\x6d\x9b\x66\x78\x2e\x55\x2b\x97\x26\x69\xec\xf8\x70\x61\xb0\xea\x0c\xd5\x6d\xf1\x36\x87\xef\xa4\xae\x8c\x8c\xf3\xf4\xe2\x36\xcc\xf1\x12\xd3\x00\x11\x69\x4f\xe3\xf2\x88\x11\x3d\x2d\x4e\xff\xbe\x66\x65\x88\x62\x43\xb3\x54\xd8\x60\xfc\x94\xd5\xa9\x7f\x63\xdd\xdb\x57\x95\x89\xe0\x0f\x71\xc1\xc7\x28\x51\xa1\xb5\x14\x9e\x95\xb5\x93\xcf\xfc\xa0\x6e\x4c\x87\x99\x0a\x62\x2d\xbb\x10\xb0\xd0\x88\x63\xc0\xcb\x70\xd6\x37\xd9\x2c\x2c\x39\xe3\x65\xe6\xa3\x96\xb8\x99\xa9\xc6\x6a\xd3\x1a\x00\x8a\xe6\xb2\x55\x7b\x94\x17\xc1\xa4\x49\x74\xa1\x9d\x24\x08\x3e\x4a\x08\x30\x5d\xe5\x1b\xcd\x30\xcf\x16\x71\x93\xad\x35\xe5\x06\xaa\x73\xa7\x2a\x9a\x42\xa3\xea\x48\x3d\xbb\x3d\x6d\xf8\xe5\xbf\xaf\xf6\x86\xc1\xaf\xc7\x2b\x34\xbb\x93\xe8\xd0\x2c\xab\x16\xad\xa6\x38\x85\x66\xad\x20\x38\x05\xae\xd7\x84\xd3\x95\x95\xee\x2d\x68\xae\xfa\x38\xf8\xed\xc7\x8b\x5f\x77\xd5\x5d\xac\xd7\x10\x45\xf6\x1f\xde\x63\x95\xb7\x13\x65\x60\x5b\x84\x20\x08\x60\x68\x94\x55\xf2\xcb\x0a\x13\x7f\xf5\x02\x53\xdd\x75\x06\xdd\x8a\xb6\xa0\xe7\x57\xc1\x8b\xf3\xe7\xf7\xc3\x6d\x8d\xb6\xe9\xb2\x9d\x27\x0e\xa1\xe7\xa1\xdb\x65\x64\xb3\xf9\xc3\xf1\x8f\xe3\x7f\xfd\xa2\x2e\xe1\xe4\xb9\x11\xfe\xec\x4a\x38\x25\x89\xb3\x57\x14\xbe\x86\x1b\xf1\xc4\x8f\x28\x06\x9e\xb1\x00\x4b\x03\x23\x63\x0e\x7c\x30\x85\x49\x54\x02\x01\x6e\x44\x0b\x3b\xf1\xcc\x40\x68\x00\x7f\x89\x67\xae\x3f\x4d\xe3\x71\x18\xbe\xb6\x3d\x10\xa7\x95\x5f\x3f\xfb\x92\x8f\x7e\x40\x20\x74\x34\x0b\x68\x28\xec\x52\x49\x41\x64\x1f\x19\x18\x82\xb9\x31\xa6\xe3\xb1\x6c\x1b\x10\x42\xa3\x6f\x04\x30\x8c\xa8\xd3\x87\xdf\x22\x57\x7d\x78\x0d\x43\x9a\x8f\xa3\x12\x47\x3a\x89\xdb\x5c\xbd\xb8\x09\x05\x4d\xb5\xbc\xbd\x89\xb4\x5c\x06\xb6\x42\x5a\xee\x58\x20\xae\x8a\x9a\xe8\x12\xf4\x5d\x80\x63\xb6\xe2\x2a\x17\x60\x53\xd5\xb6\x0d\x1a\x2a\x5a\xa7\x17\xb1\xf4\x94\x65\x0a\x35\xf6\x2c\x0b\xd3\x3c\xdb\xeb\xfd\x31\x52\x94\x42\x21\x2a\x1c\xbd\x71\xc9\x03\xc5\xb3\x35\xa4\x1b\xe8\xdb\xaa\xaf\xf1\x8e\x27\xa9\xe6\xab\x42\x06\xc7\x54\x55\x59\x94\x4c\x51\x9c\x42\x06\x55\x8b\xc2\x38\xb5\xd3\xe7\xa7\x45\xb9\x5a\x4f\x90\x72\x2c\xd2\x09\x93\xfa\x2e\x6e\xb1\x03\x8e\xa9\xa8\xec\xe2\xfa\xb6\x17\x3b\xab\x55\x76\xc9\x97\xf6\x99\x03\x0c\x43\x17\x78\x7d\xd7\x46\x7e\x64\x2c\x5c\x67\x0a\x71\x5f\x64\x3c\x1a\xe2\x0f\xda\xae\xc2\x50\xac\xb6\x9f\x26\x47\x26\xd3\xa7\x97\xde\xf2\x6b\x2b\xb0\xb0\x2d\x58\xc1\x5b\x5e\xf7\x3d\xf5\xa5\x68\xc6\x9f\x97\x4e\x3f\x0a\x40\xde\x32\x24\x4f\x26\x4f\xfa\x1c\xf5\xe5\xb4\x5e\x67\x26\x69\x52\x41\xa7\xd2\xa8\xe6\x41\x10\x4e\xdc\x04\x4a\x1d\x67\x11\x36\xa2\x8d\xd2\x49\xae\x23\x3b\xb0\x0a\xcd\x9b\xd2\x70\x0a\x62\x72\x27\x12\xf7\xed\xe9\x38\xe1\xd3\x0f\x5f\xff\xf2\xf2\xc3\x7c\x05\x6b\x90\x8f\x28\x9a\x7d\x7a\x0e\x16\x8e\x50\x53\x3a\x38\xaa\x55\xa3\xf5\xd9\x7c\x54\xa0\x6e\x8d\x37\xae\xea\xdf\xae\xaa\xf4\xcf\x47\xf6\x6f\x53\xf8\x60\x7b\x33\x07\xb7\x34\x3b\x70\x1b\x35\xa5\x2a\x7f\x00\x46\xc8\x1b\x83\x4c\xda\x59\x81\xe5\x57\xbc\xae\x97\xb4\x96\xa4\x8d\xf1\x7f\x6b\xea\xe3\x97\xe6\xb6\xdd\xaa\xed\x49\xb1\x2d\xbb\xd9\xe2\xb7\xc7\x9b\xef\x9f\xcd\x1f\xec\x9f\x01\xcd\x96\x24\x9b\xb7\x3f\x29\xc1\xd4\x1c\xe8\xb4\x3e\x26\xfb\x87\x89\xed\x1b\x07\xb4\xef\x7f\xf8\xf0\x7e\x32\xbc\x54\x1b\x9e\x12\x5e\x98\xff\x43\xef\x78\x2c\x8f\x8d\x6a\xea\x6c\xad\x72\xb3\x96\xa8\xae\xa5\xaf\xcc\x71\xff\xbe\x31\x1f\x17\x7d\x88\x7a\xaa\x29\xed\xe9\xae\xaa\x82\xaa\x2b\xc4\xce\x20\x70\x78\x17\x26\xfe\xf2\xe9\x2f\xa7\x2f\x5e\x3d\x3f\x3f\xad\xea\xb5\x16\xe7\x5c\x4e\x3b\x19\xe9\x22\x1e\x7b\xae\xfd\x84\xe2\x86\x3c\xee\x41\x7f\xca\x44\x4b\xc9\x50\x90\x84\x5f\x14\x74\xd4\xd8\xf7\x20\xf9\x4c\xda\xee\xf1\x22\x33\x60\x2b\x3d\x35\xc8\x2d\x01\xce\x03\x2c\x27\x6d\x9c\x23\x63\xea\xa1\x31\xf0\x8c\x14\x98\x6d\x4b\x76\x9a\x25\xf5\x6b\xc9\x9e\x32\xf2\x4a\x43\xb9\x7a\x1e\xe8\xad\xfa\x3e\x19\xd8\x7f\xd7\xc7\xc8\x4c\x4e\xed\x01\xef\xee\x46\x0e\xc1\x7b\x42\x9b\x4e\x7e\x45\x5e\x3c\x5d\x45\x61\x2e\x14\xc3\x75\x31\x9c\x67\x15\xb4\x7b\x95\x0a\x5a\xe5\x41\x94\xb9\x7e\xaf\x0e\xce\x35\x19\x4c\x11\x8c\x22\x66\x4c\x6b\x9d\xc7\xd5\x6c\xf3\x5c\x9d\x1e\x3d\x6b\xbf\x71\x42\x84\x69\x0d\xd9\x2e\xf7\x4e\x7e\xcc\xc6\x88\xd7\xdf\x41\xd4\xaa\xbb\xfa\xfe\xe9\x70\x0b\x69\x2f\xbe\x6e\x17\x1d\x64\x76\xd1\xc1\x2a\xbb\xa8\xd1\x46\x3a\xe8\x68\x23\x1d\x34\xaa\x31\xdc\x2c\xee\xb5\xb8\x0b\x2e\x4e\x5f\x5c\x3e\x3f\x3f\x7a\xba\xc2\x4e\x70\xaf\x01\x86\x9d\xee\x83\xcc\x88\x6b\xdc\x05\x89\x13\x63\xbb\x76\x82\xde\xf2\xeb\xf6\xc1\x30\xb3\x0f\x86\x1b\xdb\x07\xd5\x16\x3f\xfd\x7d\x50\x69\xe9\x6b\x94\x18\x94\x7b\xbd\x7c\x03\xa9\x0c\x80\x85\x6b\xf9\xef\xae\xc1\x06\x93\x17\xef\x1b\x2b\x08\x5c\x07\xde\x9b\xa0\xb0\x9f\x9a\x28\x36\xae\x8c\x1d\xfc\x70\xf0\xe7\xab\x7f\x2f\xb5\x2d\x2e\x62\xda\xb8\xcf\xff\xe2\x86\x96\x72\x7a\x15\x3b\x28\x7d\x93\xec\x89\xa8\xf6\x3d\x81\x59\xd5\x26\x62\xf1\x24\x52\xf0\xca\xf4\x9c\xb7\x31\xa1\xcf\x9a\x6c\x17\x28\x2d\x13\x97\xa2\x71\x81\x56\x9b\xeb\xb2\x09\x08\x0f\x1e\x6b\x53\x20\xda\x60\x65\xaf\x25\x7b\xb9\xcd\x4c\x87\xb9\xc1\xb2\xdb\xb5\x6e\xf2\x0a\xd9\x6d\x86\x16\x27\x9c\xcc\x98\xed\x48\xd7\xf1\x9c\x5d\xbe\x20\xd5\x84\x8d\xe9\x82\xc1\xca\x99\xc6\xb2\x0f\x4b\x97\x8b\x60\x4b\x80\x55\x01\x27\x69\x80\xa6\xa0\xd2\xe5\x76\x7a\x40\xbe\x42\x64\xf3\x54\x1d\x09\xe9\x46\x60\xf6\xb5\xca\xad\xb0\xa2\x04\x9e\x7d\x3d\x80\xe1\xdc\xa5\x23\x44\x52\x4b\xe9\x23\xa7\x91\x08\x5f\x90\x42\xa8\x5b\x5b\x0c\xd6\x17\xfc\xa5\xaf\x0e\x52\x66\xfd\xd4\x5d\x1b\xf9\xcc\x61\x06\x3c\x77\xea\xf7\xe7\xae\xe3\x30\x2b\x7b\xcb\x4e\x1e\x8f\x93\x26\x21\xe6\x25\xb8\x86\x06\x88\x0c\x31\x91\x4a\x4d\x5e\xd7\xed\xa7\x9c\x9a\xdc\x04\x9c\xdd\x11\xa9\x51\x7f\x2b\x82\xa3\xf0\xf0\x18\xd8\xef\x9c\x10\x05\x26\xe3\xb2\xae\x2d\x4d\x94\x1b\xa3\xdf\xda\x28\xa8\xaf\x7a\xd0\xbc\xee\x71\x06\x0b\x69\x79\x2f\xfd\x81\x4a\x50\x2e\xaf\xb1\x9b\x4e\xe9\xba\x2b\x6a\xd7\x38\xbd\xd9\xe8\xd5\x7d\xd4\x9b\x8d\x55\x68\xab\x2e\xa8\xf6\x4a\xa2\x5a\xed\x5c\x95\x76\x6d\xd6\xd5\x63\x89\xd2\x21\xac\xdb\x37\x2f\x0a\x52\xd9\x72\x15\x5c\x43\x69\xd6\xbe\xa2\xe7\x77\xf5\x87\xbb\x49\x97\x28\x11\x86\x0b\xa1\x2d\x3e\x5c\xa4\x04\x2b\x9a\x9f\x09\x7d\xa3\xbc\x17\x5a\xd5\x77\x9a\x16\x7e\xb7\x4c\xca\xc1\x66\xc2\xde\xfa\x5a\x31\x29\x71\x88\xca\xc0\x4d\x8f\x36\x13\xce\x81\xeb\x55\x14\xa7\x30\xc5\x4b\x06\x7f\xa5\xbe\xb0\xb4\x1a\x80\x6d\x5a\x87\x21\xe4\x24\xdc\x97\x25\x16\xdb\xc8\xbf\x86\xcb\xc8\x10\x9b\xd1\x10\x85\xb2\x75\x21\xdd\xf4\xd9\xdb\x20\x26\x07\x46\x32\x0f\x3f\xa1\x79\xd4\x41\x6d\x97\x89\x4a\x9a\x2a\xc6\x56\x67\xc8\x4a\x32\xad\x47\x45\x42\xa2\x13\x52\x13\x92\x23\x4f\x2e\x5f\xb0\xca\x32\x1f\x6c\x96\x62\x4e\xdf\x07\x1e\x70\x7d\x23\x8e\xa0\x61\x83\x08\x1a\x13\x14\x1a\x78\xe6\x66\x0f\xf1\xce\x69\x45\x9f\xc7\xae\xcc\x89\x27\x08\x15\xd2\x4a\xea\x41\xd9\x38\xf7\x8b\x47\x13\x65\x73\xc0\x84\xc0\xe1\xb8\x11\x91\xfe\xe4\x33\x59\x64\x48\x0a\xdf\xaf\x3e\xdc\x5a\x65\xa6\xc5\xb6\x0d\x99\x3c\xcf\x4e\x17\xdb\x73\xed\x77\xab\x1e\x2e\xe4\x91\xce\x30\x59\xf7\x48\x03\x61\xac\xbd\x62\x51\x4e\x54\x59\xb9\x8b\x86\xa7\xdc\x9a\x9c\x7d\x41\xbe\x6e\x56\xe7\x18\xba\x3e\x3e\x91\x63\x21\x2a\xc3\x50\xeb\x25\x70\xfe\x7a\x20\xbe\xdc\x45\x81\xbb\x7a\x51\x58\xa1\xe8\x05\xae\xcf\xb2\x76\x2d\xd3\x8d\x2e\x5c\xdf\x6f\xe0\x05\xa9\x43\xaa\xeb\x6b\xa0\x14\x79\xce\x1a\x50\xfa\x02\xce\xd1\x35\x34\x26\xe0\x1a\x85\x2e\x63\xba\xa5\xc8\x7d\xe9\x07\xae\x5f\x81\xd4\x16\x78\x8d\x30\x08\xcb\x37\x58\xf5\x9d\x76\xc8\xd5\x0a\x19\xed\xd6\x09\xd6\x09\xfa\xd7\xa8\x39\x6b\x21\xff\xe2\xf3\x47\xbd\x34\x84\x3e\x9f\xae\xb0\xfd\xa8\x6d\x2b\x27\xd0\x83\x58\xb3\x56\x77\x3d\x71\x38\x74\xb4\x7a\xfa\x70\x80\x3f\x85\xe1\x1a\x28\x84\x2d\xc7\xd0\xd2\xa9\xb5\x49\xa0\x95\x5d\x85\x83\xa2\x91\x55\xc5\xe1\xc8\xb8\x15\x32\xd3\xc6\xee\x7a\x8d\x28\x35\x72\xea\x2a\x16\x94\x9a\xa1\xf5\xcd\x27\x35\x03\x15\x6c\x27\x9c\x2a\x4f\xa4\x79\xea\x15\xfa\x59\xdd\x6e\x62\x16\x33\xb3\x8e\x42\x9a\xf4\x66\x44\x31\xff\x23\xa9\xce\xc9\xa6\x49\xf5\x1a\x01\xd3\x8a\xa2\x8d\x4d\xc5\xd6\x8e\xb4\x8f\x2d\x56\x3d\xda\x4e\x8d\xb1\xc3\x26\x6a\xc7\x49\x8e\x7d\x2b\x15\x8f\x93\x1a\x76\xb2\x0e\xa5\xa2\x4b\x75\x63\x25\xcf\xc8\xca\x1e\x54\x95\xff\x73\x25\x27\x2a\xf7\x37\x6d\xda\x83\xfa\xc3\x24\x0a\xa6\x8b\xfd\xaf\xd5\x51\x96\xe4\x0c\x8a\x13\x27\x7c\xe2\x8b\xef\xc2\xaf\x8a\x3f\x5b\xd7\xaa\xce\x13\xd6\xaa\x9e\x32\x32\x97\x4b\x88\xb1\xeb\x4f\x9b\x65\xd9\xe6\x8e\x67\xe6\xe2\x77\xfd\x6b\xf7\x16\x7d\x5a\x67\xf4\xf3\x34\xb9\x57\xf4\xc5\x5f\x51\x95\x6e\x22\x74\x65\x40\xd0\x48\xe2\x62\xd1\x3b\x6f\x81\x53\x96\xce\xbb\x06\x75\x5d\x1f\x9b\x6b\x94\xb4\xd6\x25\x66\x75\x23\x63\x35\x15\xb0\xe8\xc6\x36\x28\x11\xd6\x77\x4d\xee\x4c\xbc\x32\xdb\x3a\xa4\xc8\x6c\xd9\x8e\x69\xee\x8f\x2a\x9d\x7a\x0b\xe7\x81\x59\xe6\x36\xc8\x50\x21\x73\xe5\x48\xc6\x70\xf2\x9b\x5a\xc0\xe9\x63\x86\xab\x0d\xf6\xcc\x87\xf5\x8b\xa0\xcb\xce\x28\xb9\x24\xba\x62\x96\x1a\x8e\xa7\x53\x5a\xc7\x8b\x3f\xc6\x78\x31\x1b\xe2\x94\xad\xb3\xbe\xcc\xb5\x02\x84\x2d\x7c\x0a\xc7\x68\x3e\x07\x46\x04\xc9\x39\x83\xa1\x31\x8f\x09\xc7\xf5\x20\x9b\x99\x01\x1c\x27\x84\x51\x54\xdf\x27\x56\x5b\x04\xbf\x15\xda\x99\x47\x32\x0f\x7a\x06\xa3\x08\x4c\xa1\x01\x99\x3b\x85\x76\xbc\xe9\x80\x84\x9a\xfa\xa0\x0a\x33\xcc\x90\x01\x9f\xe4\xaa\x5e\xa7\x75\x8b\xdd\x1d\x2a\x55\xdb\xaa\x51\xb5\x9d\x57\x1b\x37\x4e\x2d\x4b\x4e\x6e\xde\x62\x85\x3e\x3d\xe1\x21\xe2\x42\xe5\xed\x99\x69\x21\x36\x64\x6b\xe3\x6d\x08\x83\xe9\xf7\x9b\x09\x84\x11\xb4\xe3\xb0\xbc\xc0\x6d\xe7\xe2\xa0\xb6\xaa\x51\x6b\xc9\x4d\xbd\x90\xab\xea\x12\xb7\x1e\x21\xf7\x8c\x55\x66\x4a\x34\xea\x5b\xa1\xa0\xb5\x05\xc6\xdd\x8e\x4a\xb1\x89\x18\xb8\xbf\x96\x52\xc1\xa9\xf0\x4a\xa6\xc2\x8d\x29\x15\xc5\x51\x78\x5d\x17\xb9\x8f\x7a\x13\x85\xa1\x90\x52\x22\x9a\xc6\xd4\x26\x93\x48\xdb\xb0\x5d\xde\x47\x3e\xf5\x83\x1c\xca\x7c\x16\xb4\x3c\x29\x9f\x8a\xc1\x4f\xe8\xa4\xe4\x0f\xcd\x5e\xa4\xb5\x9c\x20\xab\xbd\x98\xfe\x10\xa9\xfd\x55\x3e\x40\x56\x06\x2a\x8d\x29\xe2\x43\xe6\x0b\x0d\x55\x4f\xbc\x0a\x23\xa9\x6c\x8f\xc3\xd8\xb7\x35\x42\x79\xd5\x83\xa7\x49\x94\xbc\xf8\x4d\x2a\x63\x12\xf1\x27\x94\x77\x7c\xfa\x6c\x2e\x42\xaa\x45\x2c\x54\x21\x8f\xaa\x0c\xf2\x6d\xb1\xde\x90\x47\xcb\xb5\x87\xf2\xf3\x6b\x98\x47\x55\xb5\x54\x55\xd6\x69\xe3\xa5\x9d\x23\x29\x56\x50\x6c\x90\xe6\x35\x91\xbe\x28\x0a\x55\x8a\x82\x87\xf2\x7d\x1a\x8a\xc2\xd0\x6a\xdc\x69\x83\x2a\xc6\xf3\x00\xfa\x35\x91\x62\xe4\x91\x15\x09\x7f\x9d\x0a\xc8\xea\xb2\x2a\x15\x45\x9e\x2f\x68\x55\x86\x55\xa5\xd4\x6d\x89\x35\xb8\x3d\x83\x77\xe7\x21\x06\xb7\x23\x99\xae\x3f\xac\xe0\xaf\x25\x97\x32\x63\x37\xa5\xbe\xcf\xc3\xd4\x5d\xe9\xa4\x5e\x43\xec\x02\xb3\x29\x02\xdf\x31\x80\xe7\x25\xc7\x74\xa4\x13\xca\xb0\x29\x23\x29\xa7\x79\xb6\x01\x72\x49\x1e\x17\x1e\x04\x11\xa4\x19\x08\x7c\x29\xac\xf7\x19\x32\x68\x09\xcf\x70\xae\xb7\x8e\x4a\x33\x3b\x3f\xe3\xa4\xfa\xe7\xe5\x66\x76\xde\x6d\xb6\x38\xe5\x0a\x23\xfb\x65\x32\x6f\x61\x5c\x65\xaf\xd3\xeb\xe7\x3c\xe3\x63\x33\x76\xf6\x2b\x42\x12\x0b\x97\x50\x02\xa3\x91\x0c\x51\x50\x32\x49\x64\x08\x63\xe1\xe2\x99\xeb\x4b\x64\xf4\x95\x3e\xd1\x7c\x11\xe2\x6e\xc5\xda\xdb\x3c\x78\xa6\x9e\x29\xe9\x45\xce\x6c\x9d\xac\xd5\x36\xe8\xbb\xea\x74\xfe\xab\x84\x7b\x37\xd5\x42\x2b\x02\x7e\x3b\x17\x93\x36\x1d\xe5\xbd\x3a\xbe\xb7\x3b\xbe\x7b\x9b\x71\x2d\xde\x5f\x63\x4c\xb7\x76\xbe\x7c\xf9\x2a\xb0\x9f\x4a\x3a\xa9\x50\xac\x57\xad\x3d\x43\x3d\x94\xb2\xc6\x98\xf5\x9c\x96\x03\x60\x9b\x29\xda\xc6\x04\xf9\xb8\xbf\x80\xee\x74\x86\xfb\x63\xc2\x6d\x44\xd5\x7b\x41\x6e\x2a\x02\x94\xbb\x7b\x3f\xb6\x4c\x10\xba\xa0\x3f\x03\x51\x80\x82\x38\xa0\x65\xa7\x63\x28\xdf\x82\xef\x03\xe0\x3b\x90\xcc\x98\xca\x25\xd2\x4a\x77\x8d\x93\xe7\xc7\x2f\x9f\x9d\x9e\x5f\x55\xf3\x75\x25\x34\x93\xa9\xce\xa1\x1f\x1b\x99\x5f\xfd\x50\x34\xe5\x13\x93\xa0\xb2\xa2\x07\x9d\xf1\xb2\x04\x70\x75\xda\x08\x28\xfb\xba\x28\xb3\x93\x36\x51\xfd\x5b\xe5\x1e\xbb\x9c\xa1\xc5\xe9\x3c\xc0\xcb\x13\x64\x3f\x63\xa7\xba\x1c\x04\x12\xe0\x65\x26\xce\xbe\xca\x48\x33\x03\xd1\x55\x4b\x3b\xcd\x3a\x56\x25\xe6\xa2\x5a\xd8\x93\x10\xcd\x4b\xb2\x3a\x5b\xd5\x05\xec\x74\xe2\x67\xf3\x00\x85\x58\x35\x6d\x76\xc7\x98\xb8\x5e\x95\xa3\x62\x45\x26\x47\x37\x33\xad\x81\xd5\x77\x90\xfd\x45\x63\xd7\xd5\xd8\xd9\x66\xd1\x0d\xff\xbf\x5d\x8d\xfd\xc8\x71\xc4\xa6\xdf\xd2\xe0\xb4\x94\x00\x73\x8a\xb3\x00\xb0\xd1\xa8\x4c\x42\xb9\x92\x2c\xc7\xa2\x89\x60\xa2\xac\x92\x2c\x96\x07\x62\x8c\x6c\x34\x0f\x84\xd6\x90\x9f\xa3\xc5\x95\x68\xde\x4f\x8c\xc3\xf7\x5c\x14\x4b\x60\x21\x69\x42\x5b\x7e\x90\x61\x9d\xf2\xc3\xa7\x61\x88\xc2\x42\x60\x52\xaa\x78\x1b\x6e\xd4\x77\xfd\x6b\xe0\xd1\x99\x97\x35\x35\x15\xdd\x5e\xd0\x64\xf2\x25\x9e\xe9\x73\xd0\x70\x5b\x38\x1b\xea\x77\xf1\x51\x69\xc8\xb3\x1e\xbe\xd6\x7b\xc8\xa4\x25\x22\xbe\x9c\x33\x0d\xf2\xcc\x04\x03\xa4\x42\x8c\x6e\xa5\x9e\x5b\x3f\x6f\x24\x71\x6c\x4b\x8f\x9c\x0c\x39\x6e\xef\xa9\x53\x9c\x66\xf6\xe0\xc1\x29\xa0\xb5\xce\x9e\xdc\xf3\x5b\x7e\xfc\xac\x23\x78\x66\x5b\xe2\x67\xda\x86\xd0\x1c\x74\x1f\x42\x73\xd0\x22\x84\x66\xdd\x51\x34\x99\x40\x9a\x83\x06\x81\x34\x07\x2b\x07\xd2\xd4\xc6\xd2\x1c\x74\x19\x4b\xb3\x05\xe1\x34\x1a\xa6\xea\xba\xf2\xd3\x2d\x76\xf5\x17\xd1\xf3\x33\x12\x3d\xeb\x0f\xf4\xed\x96\x3e\x5d\x6a\x4c\xf9\x22\x7b\x36\x91\x3d\xb9\x01\x4a\x48\x43\xb7\x1d\x2d\xcb\x51\xf8\x01\xf9\x9a\xc7\x89\x6a\x87\xe4\x88\x81\x55\xc1\x58\x7d\x6f\xd3\xab\xde\x94\xfe\x43\x73\xb2\x9b\xca\x22\xd9\x93\xac\xf6\xad\x63\xb2\x67\x69\x6e\x2e\x6b\x8c\x4a\x8d\x84\x06\x0a\x0d\x27\x04\x53\xda\x3e\x96\x5f\x6a\xf1\xf1\xe6\xb3\x19\x38\xc8\xb6\x0c\xf2\xff\xef\x2d\x63\x30\x77\xc8\xff\x81\xf0\x9d\x83\x16\xea\x46\x04\x9d\x7e\x7f\x45\x31\x92\xd3\x02\x4f\x9a\xaf\x95\xfc\xd8\xe3\x97\xfc\xe9\x55\x83\xa7\x13\x3d\x26\xa9\x91\xaf\x59\x1d\xbf\xae\x0a\xbe\x36\x68\x3e\xf7\x53\x76\xf5\xf8\xd3\x86\x6b\x5e\xed\x98\x4a\x9e\x5e\xa9\x06\xb8\x4e\x1c\x01\xd7\x44\x59\x81\x85\x3d\x29\x77\x0a\x38\x73\xd7\x4f\x75\xd3\x49\xd2\xa1\x23\xe9\xc5\x25\x97\x33\x88\xf2\xc5\xd5\x55\x41\x3e\xdd\xf4\x37\x28\x14\xd6\x58\xbd\x34\x47\xb4\xf9\xda\x1c\xff\xc6\x68\x7f\x71\xf4\x7e\xb8\x9e\xee\x06\x9b\x2d\xbc\x61\x24\x4a\xce\x9a\x2b\x70\x74\x55\xa1\xde\x8d\x4e\x79\xc3\xc5\x06\xbe\xf2\xb6\x12\x74\xc1\x81\x6d\x36\x0c\xf9\x05\x8e\xc3\x63\xef\x1a\xc5\xfb\xee\x1a\x97\x17\x47\xc7\xa7\xba\xe2\x6f\x6b\x11\x57\x48\x4b\x8a\x69\xfe\x27\x48\xbf\x47\x8e\x63\x5c\x8a\x40\xf0\xad\x36\xb6\x8a\x59\x6e\xa3\x99\xd5\x17\xdd\x0d\xf3\x36\x56\x16\x4e\xda\x91\x81\xb5\x45\xec\x6b\x6e\x62\x8d\x02\x5f\xa3\x0e\x43\x5e\xb9\x03\x1e\xb8\xde\x4f\xd0\xcb\x37\xa7\xaa\xab\x37\x31\x03\x21\xb0\x09\x37\xa5\x31\xaf\x7e\x4c\x0e\xa6\xc8\x40\xbe\x57\xdd\xc1\xa1\x2b\xd9\xb9\x4b\x42\xb1\x3d\xe4\x8b\x50\x64\x39\xc8\x27\x15\xdc\x7c\xa8\xb7\x1f\x55\xf4\x12\xbb\x7d\x76\x96\xe5\x8c\xf2\x82\x77\x58\x66\x10\xa2\x79\x40\xfe\x10\xdb\x8c\xdb\x5f\x7f\x21\x84\x73\x01\xf0\x2c\xb9\xf2\x94\xcc\x9d\x5f\x61\x83\xf2\x98\x7d\xf5\x1a\xac\xbc\x34\xc5\x5f\x32\x44\xf1\xb0\x8a\xfe\xc8\x64\xbc\x4b\x56\x55\x8a\x4e\x3e\xb1\xb4\xd3\xc9\xcb\x24\x49\x3f\x2d\x38\xc1\xed\x12\x25\x0a\x96\x69\xf8\xb5\x25\x97\x0d\xb0\xa4\x20\xed\x49\x88\xe6\x06\x7c\xef\x46\x38\xa9\x19\xd2\x08\xb1\x6a\x8e\x0b\xc2\xa9\xeb\xf7\x31\x0a\xfa\xc3\xfd\xa2\x0a\x69\xaa\xa2\x98\x28\x90\x57\x54\xe5\xee\x13\x0a\xdb\x8b\xdd\x3e\xb5\xcc\x8e\xd1\xfb\x94\xcc\x24\xeb\x3c\xff\xa6\x8d\x82\xa5\x9c\xd9\xaf\x94\xaa\xb2\x50\xd4\x6d\x1d\xd5\xe9\x1c\x2f\x12\xc4\x55\xcf\x32\x53\x17\xe2\x16\xe6\x29\x55\xfb\xae\x98\xa5\x93\x5a\xb1\x56\x56\xb0\x5a\x33\xd3\xcf\x5d\xdb\xfe\x6b\xd9\xb4\xab\xe4\xa6\x5b\xb6\x66\x77\x57\x59\x73\x2d\x9a\x79\xd4\x5a\x35\xf7\xc1\x75\x9f\xea\xb8\x9b\xd6\xcb\x2f\xee\x9f\x7c\xf8\xe1\xde\x4f\x9e\xba\x66\x66\xe0\x92\x13\x9f\xa6\x1b\x54\xb6\x22\xe7\xe7\x2e\x5b\x43\x96\x16\xf9\xd5\xa4\xa5\xa7\x91\xb4\x2b\xef\x4f\xbc\xd8\x75\x0a\xdb\xb2\x74\x33\x87\x68\x61\xf8\xa8\x3f\x8d\x31\xe6\x2a\x7a\x7e\x3b\x97\xbe\x6a\x23\xcf\xb0\x91\xd7\x8f\xe6\xfd\xc7\x4a\x63\x66\xb5\x09\x80\xb6\x73\x01\xd7\xfd\xb2\xce\x77\x39\xee\x57\x3a\x0d\x32\x06\xf7\xd7\x26\xf6\x4d\xca\xaf\x41\x10\x3c\x83\x18\x98\x56\xd1\x9d\xdb\x30\x02\x9b\x7c\x62\x1e\x4d\xd5\x6e\xe6\xe2\xe7\xe6\x69\x09\xb0\x26\xdd\x47\xad\xac\x0d\xa5\x18\xf3\x5f\x8f\x87\x7b\x25\xfc\xb8\x72\x65\x49\x0c\x79\x43\x4d\x3b\x13\xe5\x5f\x85\xfc\x08\x82\xd0\x9e\xe5\x71\x2f\xa7\x3a\x2c\x66\x34\x63\xa3\x96\x08\x32\x33\xd2\xcf\xcf\x48\xbe\xdf\xca\x87\x9d\x47\x46\x17\x9d\xc3\x0b\x92\xe1\x85\xeb\xb7\x0c\x6d\x5f\xbd\xfd\x5d\x0b\x24\x37\x13\x95\x15\xa8\x4e\x39\x5c\x1c\xc1\xb0\x1f\xb8\x7e\xae\xe0\xd8\xba\x52\x31\xea\x75\xcf\x8e\x9a\x3a\x34\x95\xd5\x3a\xce\xfd\x50\x81\xb5\xb0\x49\xb3\x34\x48\x65\x94\x16\x84\x98\x5f\xc6\xec\x61\xd9\x2a\xd4\xc9\xe8\x85\xae\xd7\x45\x57\x58\xb4\xea\xd4\xda\x67\x54\x10\x21\x8f\x12\x23\xa1\xd6\x6c\x77\x77\xce\x2f\xc8\x13\xf4\x26\x0d\xa5\x0a\x5c\xbf\x9f\x7b\xb0\x2a\x4a\xea\x8f\x78\x1e\x5c\xa1\x0b\x22\x13\x14\xc2\xa3\xd2\x20\x23\x9e\x9c\xa8\x73\x9c\x1c\xd4\xfb\x76\x0a\x98\x17\x6a\xcd\x66\x91\x5f\xe2\xec\x57\xe1\xdf\xe9\x60\x82\x1d\x92\xc0\x50\x97\x04\x86\x2d\x48\x60\x58\x24\x81\x61\x33\x12\x18\x6a\xba\xf7\x5a\x30\xab\x86\xa7\xa8\xb6\x79\x7d\xe5\x96\xad\x8d\x0f\xac\xba\xa9\x4c\x43\x70\x0d\x30\x08\xd9\x89\xc5\xd3\x55\xa9\x04\x38\x46\x18\xa3\xb9\x7c\x86\x05\x21\x9a\xb8\x1e\xbc\xdd\x13\xcc\x94\x84\xd1\x54\x20\x21\xe7\x80\x69\x99\xae\xef\x62\x17\xd0\xce\xcd\xb5\xd6\xba\xd6\x96\x81\xf6\xa7\x55\x11\x80\x1a\x8b\xcd\x4a\x99\x7c\x88\xbc\x98\x99\xdb\xdb\x4a\x11\xf3\x42\xbc\xda\xa2\x25\xb6\xe4\x0f\x3c\xa2\xde\xee\xb6\x75\xa4\xb2\xab\xb1\xe3\x08\x23\xa2\xe2\x0e\xa6\xd0\x87\x21\x33\x71\x34\x5d\x97\xd4\x1f\x60\x35\x87\xa9\x9c\x50\xe4\x83\xb1\x07\x9f\xa2\x29\x8a\xf1\x2a\x35\xb3\x2a\xa8\xc7\x71\xaf\x5d\xe9\xa4\xd0\x73\x1a\x64\xc1\x47\xc4\xf0\x81\xc7\x27\xd9\x1c\x70\xc9\xf2\xba\xb6\xde\x35\xb0\xe3\x68\x65\xf5\x17\x3f\x72\x6b\x1c\xb6\x1c\x09\xd4\xd2\x51\xad\xfb\x19\xda\xca\x5f\x0b\x39\xdd\x43\xf6\xbb\xb7\x68\xc5\xe2\x68\xf5\xef\xe6\x5e\x2b\xd3\xe1\x1f\xe5\xed\x32\x59\xc9\xe7\xd1\x9a\x22\x5d\xb8\xc9\xa8\xb5\x31\x4d\x8a\x95\xd8\xb4\x39\xed\xc9\x93\xd9\x78\xb9\x1f\x3f\x53\x9b\xd3\xee\xf2\x31\x6a\xac\x69\x49\xdc\x09\x0f\x7c\xd1\xb6\x90\x31\x5a\x2d\x35\x8d\x0d\x87\xd6\xf0\x76\x30\x9a\x60\x64\x05\x9c\xf2\xb0\x9e\x4d\x63\xf4\x5f\x7f\x1c\xbf\x70\x7e\x3c\x7f\xb5\x09\x8c\x16\x32\x6f\xd8\x9a\xb7\x10\x9d\x74\x62\x2b\x20\x33\x89\xe9\xda\x34\x3a\x9d\x7b\x2f\xa7\x67\xef\x5e\x76\x83\xce\xc4\x94\x9d\xb8\xd1\xfa\x8d\xf7\xac\x9e\x55\xfb\x36\x71\xcd\xff\x6a\x8c\x6d\x29\xb8\x60\xd3\x58\x7e\x77\xfa\xf2\xd9\xf1\x93\xa5\xab\xc6\xb2\xba\xf3\xd7\x43\x11\x81\x60\xaa\xb2\xce\x32\x61\x30\x44\xf9\x7d\x64\x99\x76\x14\x1d\x33\x39\x81\xea\xc0\xe4\x9d\x10\x02\x87\xc6\x99\xb0\x27\x92\x9f\x89\xf6\x5d\xa2\x57\xdb\x33\xe0\x4f\xb9\x42\x20\xa2\x26\xf8\xa5\x37\x35\xd6\x30\x1e\xa1\x51\x25\xdf\x1a\xfc\x3f\x4e\x84\x28\xe9\x84\x4f\x54\x3f\x37\x22\x52\x32\xd1\xde\xc4\xc2\xd3\xf0\x46\x16\x54\x14\xf5\x7d\x84\x25\x35\x22\x89\xed\x78\x53\x1a\x5c\x65\x48\xff\x71\x65\x8f\xc0\x43\xcc\x35\xa7\xd7\xc9\x4f\xea\x09\x3d\x79\xa3\x4b\x12\xec\xf6\x86\x82\xf0\x1d\xa4\x2e\x58\xf3\xbf\x5c\x07\xfa\x98\x36\x39\x50\xca\x6c\xa5\x80\x21\x60\xe0\x29\xa9\x14\xff\x14\x10\x04\x9b\xfd\x80\x46\xb8\xbc\x4e\xe3\xd2\xd9\x04\xf2\x51\x31\x09\x6c\x12\xd2\x28\x42\x15\xfe\x19\x03\x4f\x31\x56\x5b\x08\xeb\xcd\x31\x8d\xd3\x49\x47\x57\xa3\xa3\x16\x1f\x52\xb8\x7d\xd7\xec\x27\x61\x1e\x2d\xd8\x0e\x79\x99\x19\x44\x36\xcf\x79\x5e\xbd\x02\x57\xf7\xaf\xf6\x1f\xeb\xc5\x39\x2b\x4f\x04\x3e\xf5\x82\xa9\x8e\xdb\x78\x12\xd6\x32\x39\x73\x24\xce\xc3\x2b\x8b\x31\x6a\x25\x0f\x4c\xdc\x30\xc2\x3c\xba\xd0\x14\x2c\xcb\x03\xe2\x1a\x7d\xb1\x65\x21\xb3\xc2\xc9\x26\xc2\xc9\x22\x18\xf6\x13\xf3\x8d\xd8\x9b\xd2\x44\x04\x25\xca\xd3\x50\x92\xe0\x3a\x4e\x34\x99\x30\x5a\x52\x55\x1a\x7b\xb3\x69\xba\x3a\xd8\xfd\xe3\xf2\x74\x76\xf1\xb4\xbd\xdc\x52\x38\xd2\xa4\xf5\x18\xc5\x8c\xf8\x4c\x2e\xb5\xf4\x68\xbf\x59\x5e\xf5\x31\xcb\xc9\xad\x39\xc3\x1a\x64\x0d\x6b\x69\xd4\x86\x1c\x12\x25\x67\x07\xbf\x25\xc8\x5b\xc1\x76\xd1\x54\x9f\x4f\x3e\xfa\x96\xc7\x08\xbd\x1d\x7b\xc0\xd7\x48\x52\x4e\x34\xf4\x52\xc1\x91\x06\xec\x0a\xd3\x3b\x13\x0f\xd7\x2b\x11\x66\xb7\x40\xcb\x1d\xc4\xa3\xdd\x37\xbe\x7f\x26\x4f\xff\x79\xf0\xfe\xe2\xe5\xf9\x6a\xfb\x27\x61\xc6\x4c\xfe\x63\x42\x47\xc2\x86\x3b\x4b\x9c\xcd\xe2\xbc\xb0\x71\xe5\xbc\x01\xc1\xd8\x23\xf7\x83\xc4\xd4\x35\xd2\x08\x4a\xe9\x4a\x27\x7b\xa0\xe6\xe5\xac\xfb\x8c\xcb\x7e\x22\xf0\xa5\x22\xb0\xa5\x66\xd8\xea\x94\x01\xb3\x6d\xa6\x80\x08\x54\xd6\xcb\x13\x30\x54\xea\x58\x9d\xd1\xb4\xe2\xf2\x0a\x71\x8b\xe6\x86\xc2\x15\xcb\x99\x3b\x0f\x60\xcc\x22\xda\xa6\x57\x8f\x81\x10\xa6\xb5\x22\x99\xaa\x17\x51\xd8\x02\x64\x29\x9c\xf2\xd9\x53\x57\xe4\x95\x54\x1a\xd2\x0a\x75\x2c\x45\xbc\x58\x08\x2b\x42\xae\xb5\x92\x2d\x31\xa1\xca\x4c\xb6\x25\x87\x96\x2b\xc7\x6c\x9c\x4d\xbb\xd7\x57\x0f\x66\x3f\x00\xd0\x50\x71\x6f\x55\x06\xa7\xcc\xe8\x26\x95\xbb\x19\x3e\x20\x1f\x5b\x52\xc1\x9a\x72\x59\xf2\xf7\x71\x14\xa9\x05\x9a\x6c\x46\x34\x86\xf3\x66\xdd\xae\x9b\xd5\xbb\x19\xae\x56\xef\xe6\x8a\x4b\xfc\x05\x2f\x7e\x83\xa8\xba\xf2\x7a\x36\x5c\x1f\xa0\x09\x7d\x05\x35\x94\x08\xfe\x4f\x5c\xe8\x39\x0a\xe9\xbf\xbc\xb8\xcc\xb0\x65\x71\x99\x56\x12\x5b\x3b\xef\x4b\x03\x75\x39\x95\xed\x36\xc1\x0f\xa4\x5d\xd0\x92\x29\x84\xc0\x71\xd1\xe6\xd9\xc1\xbd\x19\x9e\xfd\xfa\xf0\xa2\xc4\x8e\xd7\x56\xeb\xa1\x8b\xd1\x50\x79\xe8\x73\x9f\xad\xbe\x43\x67\xff\x96\x9d\x8e\x6f\x29\x55\x43\x67\x93\xaa\x4f\xe6\xfb\xb1\xaf\x3d\x83\xcc\xee\xc8\x08\x5a\xeb\xdb\x20\x74\xae\xcd\xb7\x46\x04\xc3\xbe\x8f\xb0\x3b\x71\x6d\xc0\x89\x61\xd3\x1b\xe4\xc7\xd9\xd9\x03\xbc\xfb\xab\x7a\x83\xb0\x9e\xd4\x3a\xc7\x65\x71\x29\xb5\x07\x9c\xfc\x74\xf5\x41\x97\xb3\xb2\xe6\x13\xe7\x92\x18\xf4\x95\x6b\x7e\x74\x4e\x1c\x79\xa8\xa4\x24\x72\xa7\x01\x89\x88\x70\x9f\x8d\x53\xc7\xc9\x93\x7f\xef\x1d\x2f\x5c\xb5\x34\xa5\x47\x18\xd7\x2e\x5c\x88\x05\x18\xf3\x65\xff\x81\xbe\x67\x8b\xdb\x2b\x3d\x10\x4e\x0b\x19\x08\x5a\x41\x5f\x99\x48\x76\x89\x80\xf4\x33\x6e\x73\x94\x57\x4c\xaf\x95\x8d\xa4\x49\x5d\x74\xf9\xda\x23\xe5\x58\x49\x15\x11\x3b\x8e\xfa\x1a\x55\x2d\xd3\x70\x92\xf4\x83\xd9\x82\x95\x73\xe4\x40\x2f\x3b\xa1\x37\x85\x03\x6a\x06\xa2\x64\x72\x25\x25\x2a\x4b\x0b\x53\xca\xc7\x57\xd1\xdc\x5f\x5c\x6a\xf7\xb0\x4e\x8d\xbe\xc9\x6b\x4f\x81\x26\xa4\x1b\xc1\x38\xf9\x90\x1a\xc4\x92\xf1\x59\x05\x61\x31\xa7\xcf\x0f\xc0\x34\x33\xd9\x94\x8b\xb1\xf3\xdf\xdd\x81\x96\x7d\x42\x7c\x2a\x07\x58\xfe\x7d\x25\x54\xe9\x5c\xd6\x09\xd2\xa2\x90\xe5\x46\x47\x31\x9e\x5d\x84\x88\x86\xe8\x9d\x70\x3e\xdd\xe4\xa4\x6a\x8e\x9b\x4a\xfc\x04\x20\x8a\x16\x28\x94\x85\xb4\x0b\xe9\x52\x11\x4b\xab\x60\x2a\xf9\x98\xf4\x5d\x8e\x2f\xd5\x2d\x35\xd6\xc4\xf4\xba\x45\x9c\x7a\x3f\xac\x0f\xee\xdc\x8e\x73\x51\x04\xff\x31\xbb\x63\xac\x0f\x0d\xf9\x6f\x57\x62\x83\x3f\x0c\x44\x81\x56\x05\x46\x8e\xb3\xe3\xad\x1b\x31\x35\xaa\x6f\x25\xce\x14\x59\xc8\x25\x6a\x53\x04\xae\xa1\xac\x33\x5d\xd2\xdf\x6b\xd7\x8d\x25\xd9\xac\x4a\xf6\x8f\xb1\xeb\x91\x17\xfd\x08\x03\xc2\x2a\xd6\x21\xc6\x7d\x7c\x42\xb3\x4e\xaf\x96\x01\x3c\xfc\x78\x11\x8f\x3d\xd7\x3e\x1c\x5a\x17\xa1\x7b\x0d\x30\x3c\x3c\xb0\x2e\x42\x84\xa9\x82\x77\x78\xef\xc6\x92\xd9\xda\xe1\x47\xc1\xd8\xd2\xe5\x9a\xd6\xcf\x70\x69\x7b\x08\xbc\x3b\x34\xdf\xf1\xbf\xcc\x1b\x4b\xe4\xb0\x30\xbb\x27\xfb\xd4\x0b\x08\x9c\xc3\xa1\xf5\x04\x42\x67\x0c\xec\x77\x87\x07\xd6\x31\x21\x14\x77\x1c\x63\x78\x78\xcf\x3a\x0a\x82\x10\x5d\xc3\xc3\xfb\xe2\x2f\xe7\xf0\x81\xf5\x02\xfe\xc1\xa6\xf2\xf0\xc6\x7a\x19\xc1\x90\x8c\x77\xed\xe2\x25\x1b\xf1\x38\x84\x80\xdc\x1c\x5a\x74\xec\x03\xeb\xd4\x71\xe9\xbc\x2d\xd6\x6a\xce\x21\x83\x85\xf6\xcc\x65\x83\x25\xe3\x3e\xb4\x5e\xc0\x6b\x18\x92\x07\xbe\xb6\x28\x04\xa2\x19\x4c\xea\xab\x1e\x3e\x4a\xaf\xfd\x40\x65\xd9\xc7\xe9\xa4\x87\xfb\xe9\x9c\x86\xc3\x9b\x9b\x72\x24\x3a\xac\xb6\x73\x09\xfe\xc4\xdf\x06\xdc\xc1\x16\xec\x7d\x0c\x21\x8e\x43\xdf\x98\x23\x02\xb5\x1d\xdc\x1b\x90\x9d\x04\xf0\x0e\xec\xdd\xac\x82\x6a\x8c\x2e\x67\x28\xc4\x27\x64\x59\xf2\xe7\xb3\x9f\xf3\xe1\xc2\x20\x8f\xec\xe0\x5e\xf2\x61\xf3\xd5\xab\x57\xaf\xf6\x9e\x3d\xdb\x3b\x39\x31\x7b\x37\x16\x46\x67\x11\xa2\xc3\x40\x8b\x3d\x91\x1b\xd3\xf2\xf3\xa3\x42\x7a\x91\xbc\xeb\xce\xe1\xd1\x14\x69\x4f\x20\x44\xf3\x73\xb4\xd8\x49\xdf\x7c\x79\x75\x5c\xfe\xf2\x20\xc6\x76\x76\x00\x0f\xd9\xc0\xdb\x91\x07\xaa\x40\x13\xf4\x6d\xe4\xb8\x7e\x87\x6e\xc2\x3b\xd7\x20\x34\xe0\xe8\xe3\xdb\x77\x70\x79\x89\xc3\x43\xf3\xe8\x87\xe3\x93\xd3\x27\x3f\xfe\x74\xf6\xcf\x9f\x9f\x3e\x3b\x7f\x7e\xf1\xaf\x17\x97\x57\x2f\x7f\xf9\xf5\xdf\xaf\x7e\x03\x63\xdb\x81\x93\xe9\xcc\xfd\xe3\x9d\x37\xf7\x51\xf0\x67\x18\xe1\xf8\x7a\xf1\x7e\xf9\x61\x7f\x78\x70\xef\xfe\x83\x87\x5f\x3f\x7a\xbc\xbb\x37\x32\x2d\x3a\xcb\x2c\x0a\xc9\x57\x7c\x2b\xb2\x90\xe5\x5a\xc0\x0a\x2d\xcf\xb2\x47\xa6\x69\x39\xa3\xfd\x3b\x13\x14\xee\xe0\x11\x1c\xbc\x8d\xf1\xe4\xd1\x5b\xf6\xee\x0e\xee\x7d\xe3\x7c\x8b\x07\x1e\xf4\xa7\x78\xf6\x4d\xcf\x1d\xed\xf8\x23\x3c\xb0\x67\x20\x3c\x46\x0e\x3c\xc2\x3b\xce\xee\x6e\xaf\xf7\xdd\x77\x07\x16\x18\xed\xdc\xbb\xeb\xf7\xbe\xfd\xf6\xfe\xa7\x9d\x48\xf9\xcc\x7d\x2b\x1c\xed\x0c\x1f\xdc\x8d\x7a\xdf\x7e\x7b\xf0\x69\x07\x29\x1f\x7a\x68\x79\xa3\x87\xf7\xee\x22\xcb\x8d\xce\xc1\xf9\x4e\xd4\xfb\x3e\x1c\x79\xa3\x87\xf7\x0f\xd9\x6f\xd4\xbb\x7b\x77\x87\xfc\xee\x59\xf6\xc8\xde\xc5\x33\x37\x1a\x70\x90\xd1\xc1\x8e\xf0\x8e\xdb\x53\x5e\x06\xea\xcb\xa1\xfa\xb2\xd7\xbb\xc3\xe9\xc5\xbe\xb1\x1c\x58\x0f\x47\x02\x45\x3b\x81\x22\x1e\x84\x90\x86\xa5\xec\xec\xbd\xfe\x3f\x8e\xfa\xbf\x81\xfe\x87\xfd\x3e\x41\xca\x9b\xbd\xa9\x65\x9a\xbd\x6f\x6c\x09\xa8\xfe\x28\x33\x03\xea\x8a\x7d\x3e\xd9\xc1\x62\x2e\x36\x81\x0c\x05\x99\xab\xf3\x24\x85\x74\x44\x21\xed\x32\x74\x00\xcd\xd7\x0e\x2c\x44\x90\x08\x7a\xdf\x7e\xfb\xf0\xd3\x4e\xa8\xf5\x96\xe5\xed\x8e\x2e\x71\xe8\xfa\x53\xba\x73\x8e\x39\x42\x77\xfc\x9e\xf5\xf0\xfe\x57\xa3\x11\x20\xf8\x52\x3f\x12\xf5\xf8\x33\x61\xf9\x33\xa8\x97\x20\xc2\x4b\x68\x93\xe1\x63\xc7\xeb\xdd\x58\x32\xb1\x66\x10\x94\xc1\xc1\xef\xe1\xef\x3e\x01\xfc\xef\xbe\xd9\xa3\x18\x62\x9b\xcd\x34\x2d\x7f\xb4\xff\x8d\x9f\xe2\xc2\xdf\xdd\x65\xb8\xcd\x51\xb0\xdf\xbb\x13\x7d\x3b\x3c\x78\xf4\x3d\x2c\x5b\xca\x61\xf4\xdd\xf0\xe0\xeb\xbb\x77\xa3\x6f\x0f\xf6\xef\x3f\xfa\x7e\xa7\xec\xc1\xef\xbe\x7b\xf8\x69\xf8\xf8\xa0\x67\x95\x3c\xf0\xf0\xde\xdd\xe8\xd3\xf0\xe0\x51\xaf\x77\x58\x31\xc6\xf0\xe0\xd3\xc1\xc1\xfd\xd2\x41\xc8\x57\xee\x3e\xbc\x47\xc7\xa9\xff\xd0\x0d\x07\x30\x14\xe0\x54\xd0\x7b\x1e\x68\x56\x34\xda\xb7\x50\x16\x78\x3d\x77\xb2\x93\xdf\xfa\x7e\xaf\x47\xe0\xd6\x2b\x85\x9b\xe5\xef\xee\xde\x81\x5e\x04\x0d\x77\xb2\x13\x7d\x37\x7c\x3c\xa4\x30\x3c\xb8\xdf\xcb\xf1\x07\x7f\x77\x58\xba\x96\x9d\x7b\x43\xca\x55\x1e\x7e\x22\xac\x83\x8c\x39\x3a\xa0\x83\x7e\x54\x0c\x42\x39\xad\x9b\xbf\x7e\xd0\xbb\x53\x36\x38\x67\x59\xc3\x83\x4f\x3b\x74\x78\xfe\x1d\x97\x7e\xe7\x5e\x0a\xbd\x9b\x3b\xd2\x19\xfa\x03\x88\xe0\xc3\xfb\x87\xb0\xe2\x10\xa1\xda\x42\x7f\xbc\x5c\x8b\xbc\x96\x67\x56\x70\x24\xa2\x41\x06\xff\x05\x81\x3d\x1b\x98\xbb\x58\xec\x2c\x66\xa2\x23\x82\x67\x8c\xa1\xb3\x03\xd3\x39\x88\x77\x5f\xbf\x11\xcf\x52\x9e\x30\x85\x78\x27\x89\x68\xa5\x87\xff\x29\xb0\x67\x3b\xc9\x6b\x7e\xef\xe3\x57\x5f\xc1\xc1\xc4\xf5\x9d\x1f\x96\x3b\xbc\x57\xa5\xc5\x3e\x43\xde\xf5\x2d\xdc\xeb\x7d\xfa\x04\x07\x41\x1c\xcd\xd8\x22\x77\xd8\x5d\xbe\x62\x9b\xca\x68\x3b\x1f\xe9\x9b\x87\xd9\x17\x2d\xfe\x61\x22\xe9\xf7\x7a\x56\xdd\x67\xf2\x93\x95\x3e\xe9\x13\x69\x1a\xde\xf4\x2a\x70\x34\x77\x23\x7b\x3d\xf2\xb4\xeb\x63\x18\x5e\x03\x4f\x96\x86\x20\x91\x87\x18\xfb\x49\xae\x42\x49\x46\x92\xf0\xe2\x4e\x76\xae\x91\xeb\x18\xfb\xa3\xd1\xc8\xff\xf4\xc9\xef\xf7\x8d\xef\xf6\x7b\x1f\x23\x88\xaf\xdc\x39\x44\x31\xde\x89\x2c\xd8\xbb\x83\xc3\xe5\x47\x3c\xb0\x81\xe7\xed\x10\xa5\xa8\x77\x63\x03\x6c\xcf\x28\x83\x9c\xd1\xc0\xfe\xd1\xbe\x85\x07\x18\x31\xc2\xa7\x42\xcf\x0d\xfd\xe4\x9d\xdc\x48\x37\xd6\x22\x04\xc1\x13\x3e\x81\xc2\xa4\x8b\x13\xc4\x03\x10\x04\xde\x92\x0e\x76\x73\x63\xb9\x7e\x04\x43\x7c\x84\x8f\xe3\x30\x42\x61\xe6\x7d\xba\x18\x11\x09\x34\x48\x62\x8b\x7b\x78\x40\xcd\x97\x3b\x3d\xab\x78\x93\x53\xc8\x0b\xe0\x4f\xe1\x4e\x6f\x80\xe1\x7b\x3c\x82\x09\x1f\x91\x1e\xbc\xc4\x20\xc4\x9f\x3e\x99\xfb\xe6\x68\x34\xca\x5f\xe7\xe7\x78\xe1\xba\x15\xc9\x97\x4e\x7d\xe7\x0e\x1e\x50\x2c\x8e\xf8\xbf\x83\x28\x1e\x47\x0c\x64\xfb\x96\xdf\xdb\x85\xbb\xc5\x1b\x91\x25\xae\x31\xfe\x48\xb0\x9f\xfd\xcc\xc8\xdf\x15\x37\xad\xec\xf7\xa4\x3b\x37\x74\x51\x7c\xa8\xdd\x11\xac\x12\x4b\xb9\x9d\x2b\x25\x57\x2b\xff\x04\x9b\x5b\xf1\x7a\xaa\x3c\xca\x14\xce\x70\xdb\x4a\x94\x8d\x46\x99\x0d\x0d\xdf\x63\xe8\x3b\xcc\xe8\x6f\x5a\x36\x57\xc1\xa8\x85\x22\x84\xd7\x6e\x24\x7e\x44\x10\x5f\x82\x09\xcc\xd1\x07\x65\x3a\x11\xc4\x3b\x98\xef\x6e\xce\xa7\x67\x78\xee\x91\xc7\x39\xf3\xf8\x09\xf8\x8e\x07\xc7\x20\x8c\x06\x2f\xc9\xaa\x06\x30\xb2\x41\x00\x4f\xdf\x07\x21\xb3\xe6\xef\xc0\x5e\x8f\xee\x76\xa4\x9e\x1d\x51\xb8\xcf\xe8\x0c\xa9\xa5\x90\xfc\x91\x98\xbb\xc9\x0f\x61\x98\x25\x7f\x8b\x7f\x59\x35\x26\xf6\xd6\x24\xd5\x91\xf7\xad\x49\xec\x79\xf4\xa1\x1c\x7b\xcd\x58\xd8\x53\x4b\xb0\xb4\x75\x0a\xac\x36\x7d\xa3\xb7\x6b\x1a\xe6\x6e\x7a\x27\x79\xbf\x47\x4d\x03\xee\x28\x4a\x16\x53\x3a\xf3\x64\x6d\xc2\xa5\x41\xfe\x06\x44\x47\x86\x87\x5f\x0d\x2d\x48\x2b\x31\x93\xbf\x68\xc5\x71\xf2\xc7\xc6\x97\x42\xa7\x76\x28\x73\x13\x2a\x8a\x46\x71\x00\x43\xce\x57\xc8\x15\x0b\x84\x53\x56\xf5\xa2\x67\xd1\x27\x80\x6d\xa3\xd8\xc7\xd1\xe8\xf5\x9b\x1b\x8b\x25\x7b\x63\x78\x26\x96\x99\x3b\xd6\xf0\x48\x39\xad\x01\x0e\xdd\xf9\x4e\xcf\x82\x23\xd5\xdc\xf8\xdd\x3b\x09\x49\xa6\x8e\x21\xb2\x87\xe9\xee\xdf\xd9\xb7\x86\xbd\x5d\x28\xff\xea\xdd\x58\x36\x0a\x96\xc5\x29\xb8\xe2\xac\x4b\xe4\x5c\x3c\x70\x1d\xf6\x69\xd7\xb1\xc4\x51\xc8\xaf\xf0\x1f\x16\x91\x6d\xe9\xae\x61\x97\xf9\x0f\x0b\x0f\x92\x75\xb0\x1b\xc9\x4f\x0b\x0f\xc4\x1a\xd8\x1d\xf1\xcb\xc2\x03\x4a\x0f\xec\x2a\xfd\xd3\xc2\x03\xb1\x26\x3e\x0f\xfe\xcb\xc2\x03\x46\x26\x23\x0e\x6c\xf2\x37\x19\x80\x52\x0c\x1f\x81\xfe\x4d\x9e\x24\xc4\xc3\x1f\x24\x7f\xd2\x97\x39\x76\x32\xb8\xb2\x30\xd9\x91\x40\xa2\x5c\x1a\x88\x49\x88\x92\x3b\x5e\x33\x44\x0b\x3c\x0f\x2d\x8e\x7c\xe4\x2f\xe7\x28\x8e\x8e\xa8\xe5\xee\xf0\xab\xe1\x4d\xcf\x0a\xa5\x21\x12\x5a\x7f\x6f\xc3\x30\xc0\xe4\xcf\x3f\xd0\x98\xee\x04\xc4\x3c\xa5\xe4\x6f\x14\x4e\xe5\x8d\xcb\xfe\x4e\x99\x00\x06\x53\xba\x37\x84\x71\x8e\xfc\x1d\x30\x3b\x17\x19\x60\xdf\x02\xd4\x36\x04\xbc\xc3\x7d\x2b\xf2\xe2\x69\x61\x7b\x94\x6d\x07\x28\xc4\x80\xc1\x1c\xbc\x83\x97\x5e\x3c\xdd\x49\x69\x8d\xd1\x19\xd9\x04\x22\x66\x82\x2d\xcf\x93\x96\x07\x62\x3c\x43\x21\x99\x8f\x93\x32\x52\xa9\x79\x16\x9d\xb5\x80\x22\x66\xfc\x48\x39\x43\x9e\x94\xd1\x70\x8a\xec\xad\x1e\xe3\x39\xb6\x02\xec\x09\x60\x53\x60\x4a\xbc\xd1\x4f\xc6\x4e\x8d\x8a\x03\x6e\x4a\x5c\x0b\x20\xe7\x20\x7c\x77\x14\xbd\x80\xe4\xf4\xa3\x00\xcd\x73\x16\xba\x91\xd3\x19\x9a\x56\xc9\x14\xb9\x8d\xb3\x77\xc3\x87\x14\xf6\xcf\xb6\xe3\xd1\xb7\xd3\xd1\x98\x59\xb5\xe5\x60\xf4\xe5\xde\x4d\x5b\xd6\x19\xcd\x40\x08\x9d\x5f\x5d\x3c\x23\xcc\x93\xc8\x18\x12\x5e\x85\x00\xc6\x0f\x47\x72\x35\xe2\x64\x36\x71\x3d\xc8\x31\xec\x7a\x50\x10\x00\xdf\x6c\x82\x0e\x6e\x7a\x56\x5c\x3a\x5c\x42\x2c\x5c\x48\xa7\x34\x42\x76\x2a\xbc\x86\xde\xe1\xd0\x8a\xe0\x9f\x31\xf4\x6d\x78\x38\xdc\xdf\xbf\xcf\xc4\x05\x17\xf9\xd1\xe1\x7e\x4a\xe2\x63\xe4\x2c\xc9\xbf\x21\x58\xfc\xc0\xff\x64\x8d\x61\x0e\xf7\xad\x10\x7a\x80\x30\xaa\x64\x4f\x9f\xab\x4e\x32\xfa\x31\x05\x89\x99\xb3\xcc\x19\x45\x9f\x22\x24\x85\x91\x7d\xe6\x3b\x44\x0d\xd1\x1d\xc9\x38\xd8\xff\xc7\x4e\x61\xa8\xfe\x30\x33\xda\x71\x14\x15\xf7\xa8\xb8\xa9\x9a\x1e\xaf\x9c\xec\xc1\x09\xee\xcb\x33\x4d\x5f\x5a\xe1\x38\x9d\x43\x0c\x46\x1f\xa9\xc4\x39\x97\xd0\x17\x80\x29\x87\x66\x09\x22\x25\x34\x90\x77\x42\x1f\x78\x97\x28\x0e\x6d\x2a\x5f\xb4\x9c\x0b\x75\x3d\x4d\xf9\x6c\x02\x69\x36\x39\xaa\x49\x68\x22\xc7\x0e\x5d\x1b\xf9\x4f\x90\x8f\x93\xbf\x5d\xf6\xd8\x0c\x44\x67\x73\x72\xc8\xe4\xc1\x2e\x5e\x30\x2d\x53\x3c\x5f\x2d\xda\x24\x4f\xf5\xb8\xe8\xfe\xdd\x3e\x0d\xc4\x91\x94\xbe\x23\x8c\x81\x3d\x23\xcb\x7a\x46\x44\xf5\x43\x27\xf1\x79\xb0\xdf\xa1\xc5\x76\x34\xfb\x65\x5b\xcf\xc3\x29\xf0\xdd\x0f\xf4\xc0\x62\xd7\x80\x75\x01\xa6\x90\xfd\x1d\xb3\xbf\x21\x06\xec\xf7\x3c\xf5\xc2\xb0\x61\x2e\x40\x88\x5d\xdb\x0d\x80\x8f\x0f\x91\x75\xc9\xce\x2d\xf6\x6c\x60\x09\xcf\x05\xfb\xed\x51\x4f\x09\xfb\xdb\xad\x50\x31\x7c\xb8\x9e\x6c\xe9\x8f\x53\x88\x2f\xe3\xb1\x83\xe6\xc0\xf5\x0f\xb3\x8a\x2e\x11\x41\x82\xeb\xfb\x3b\x0b\xd7\x77\xd0\x62\x20\x4e\xf0\xc1\x0c\x45\xb8\xd7\xe3\x1b\xc1\xbc\xc3\x04\x2a\x42\x73\x23\xd5\x93\x83\x28\xf0\x5c\xbc\x63\x0e\xcc\x44\xd4\x12\x3a\xd6\x77\xc3\xbb\x77\x77\xf0\x08\xbe\xde\x7f\x33\xc0\xe8\x29\x5a\xc0\xf0\x18\x44\x70\xa7\xd7\xb3\x30\x91\x23\xf1\x51\x10\xbc\x0c\xbd\x82\x05\xb8\xfe\x43\x70\x10\xc2\x39\xba\x86\x47\x78\x67\x9f\x29\x46\xfe\x08\x0e\xfe\x40\xae\x9f\x99\x08\x15\xbd\x02\x02\xab\xde\xf7\x64\x09\x87\x78\x77\x64\x0e\x4c\x2b\x3f\x3c\x91\x3e\x90\x8d\xbc\x5d\x73\x6f\xcf\xdc\xc5\xbb\xfe\x8d\xe5\x46\x47\x7f\x80\xf7\x4c\x0e\xa2\xce\x56\x95\xd3\x83\x99\x0a\xbe\x1a\x8d\xf0\xdd\xbb\x3b\x26\x79\xc1\x60\x22\x04\xa7\x2d\x63\x02\x5c\x0f\x3a\x4c\x47\xe6\x52\xd7\xa7\x4f\xe9\x5b\x03\x48\x46\x8e\xee\xde\x15\x7f\x25\x14\x4e\xc6\xbb\xbf\x3f\x64\x6f\xb2\x7b\x04\x8a\x8c\xfb\x7e\xfa\x64\xde\xdf\xbf\xa7\xbe\x47\x44\x62\x36\xf7\x73\x84\x9f\xa0\xd8\x77\xb4\x66\xaf\x37\x27\xf3\xfe\xfe\x7d\xf5\x67\xc9\x47\xcf\x98\xe7\xf9\xa9\x6b\x43\x3f\x82\xdd\x7e\xf6\xa0\xe4\xb3\x15\x5b\x4a\xe8\xe4\xeb\xd8\x55\x42\x2c\x52\xad\x2f\xa2\xe2\x92\xf5\x71\x8e\x1c\x78\x68\x86\x13\xfb\xde\xe3\x47\x0f\x89\x80\xbc\x80\x21\x1d\x88\xc8\x25\xef\x08\xa7\xaf\xb0\x04\xaf\xe8\xa7\x32\xad\x68\xb4\xff\x4d\xf4\x2d\xfe\x26\xda\xdd\xed\xc1\xdd\x91\x2f\xdc\x0b\xcf\x00\x9e\x0d\x26\x1e\x42\x21\xfb\x33\x04\xbe\x83\xe6\x3b\xbd\x7f\xf8\xc2\x9e\x92\x6e\xe3\x1b\x0b\xfa\x4e\x44\x64\x97\x9c\xe1\x80\x3d\xd0\x1f\x52\xc4\x09\x0f\x06\x55\x86\xe8\x10\xfd\xc4\x36\x53\x85\x1f\x8c\xd6\x64\x02\x24\x2c\x0f\xe7\x1c\xa2\x50\xd8\xa4\x3e\x62\x64\x5f\x21\xe4\x45\x87\x1f\xe3\xe0\x8a\xf6\x1e\x62\x27\xee\xc2\x4f\x7f\xb9\xf4\x88\x3f\xf3\xed\x90\x46\x09\x11\x95\x84\xa8\x47\x5c\x32\x21\x2a\x3c\xf9\xf9\x3c\xc6\xfc\xf7\x8d\xc5\xa2\x1b\xc0\xd8\x83\xe4\xec\x20\x8f\xc4\xc1\x09\xaf\xb0\x70\xf8\xd5\x3e\x1d\x5f\xfe\xcd\xbe\x20\x5f\x41\x6c\x34\xf9\x52\x22\x10\xdc\xdc\x61\xec\x3a\xf6\x19\x40\x9c\x1d\x28\x18\xb4\xe1\xdf\xf1\x07\xec\xc1\x11\xe4\x07\xa6\x63\x0a\x63\xd1\x5b\x6a\xc5\x25\xf3\x7e\xbf\x83\x2d\x05\xb1\x62\xf6\x0a\x19\x60\x40\xde\x1b\x8d\xe4\x51\x6e\x7a\xe4\xc3\xfd\xe1\x68\x34\x8a\xd2\xef\x91\xa1\xd1\xe8\xed\xc0\x8d\x5e\x26\xf3\xc1\xaf\xa3\xfe\xf0\x4d\xef\x7b\xf6\xef\x21\xfb\x27\x1d\xdb\xec\x59\x6e\xf1\x8d\x5d\xfe\xc6\x2e\x7b\x63\x37\xfb\x06\xf9\x74\xf6\x15\xea\xa5\xf4\x07\x02\x83\x03\x81\xc0\x91\x69\xf6\xac\xec\xa3\x6e\xee\xd1\x14\xbf\xf4\xe1\xaf\xf2\x03\x33\xf2\x00\xad\x00\x86\x8a\x00\xfb\x6a\x34\x02\xe9\x9e\x0e\x47\xe0\x9b\xf0\xbb\xd1\xfe\xdd\xbb\x5f\xed\xc0\x8c\x98\xfa\x1d\x7e\x1d\x4a\x8b\x1e\xf0\xcb\xbd\x6f\xc2\x7e\xbf\xe7\x4e\x72\x4f\x13\x16\xa8\x7e\xfe\xa3\x0a\x2a\xb9\x67\x29\x59\x8c\x43\x08\xde\xdd\x48\x4f\x4b\x84\x2d\x16\x22\xe6\x36\xca\x7e\xdd\x92\xde\xca\x6d\x90\xdc\x9b\xfd\xdc\x8b\xd4\x98\x5e\xfa\x72\x16\x51\xf9\x91\x87\xbd\x9b\x1b\x77\xb2\xf3\x55\x1e\xbd\x0c\x61\x5e\x2b\x84\xb9\x4a\x84\x79\x3d\x81\x2f\x7b\xe4\x49\x9e\x64\x82\x35\xfc\xda\x56\x80\xfd\xdb\xec\x3a\x7b\xdf\xd8\xbb\xbb\x25\x58\x53\xbd\x9e\xc1\x9a\x44\xa0\xb9\xa7\x25\xbc\xe5\x88\xc7\xcd\xfc\xac\x22\x78\xe1\x4d\xcb\x23\x9e\xb3\xb0\x1c\xa6\xbf\x1b\x5a\xfe\x20\xe5\x5f\x23\xd3\xcc\x22\x50\x50\x18\xd1\x98\x25\xbe\x56\x78\x2e\x9d\x83\xe5\x0f\xb2\x1c\x6f\xf4\x95\x9a\x06\x2d\x7f\x90\x63\x84\xc5\x27\xf9\xa4\x2d\x7f\x90\xe5\xba\x23\x37\x1a\xf8\x08\x73\x91\x4f\x31\xdf\xde\xa7\x4f\x65\x8f\xa4\x53\xed\x7d\xfa\xa4\x9e\x5a\xf1\x7a\x32\x91\x1b\x8b\x08\xa3\x2f\x83\x12\xa7\x13\xa3\x51\xd9\x01\x08\x25\x53\x4b\x81\x3c\x71\x71\xe6\xd4\xb6\x4e\xad\x51\xee\xe8\xf5\x1b\x7e\x1a\x90\x85\xa4\x27\x42\x44\x08\x20\x1a\x45\x32\x0b\xed\x59\x99\x43\xc3\x67\x00\x90\xdf\x11\x5c\xdd\xbd\x53\xe4\x7f\x50\x73\x3b\x45\xf2\x76\xfa\x86\x31\xbf\xbb\x77\x0b\x13\x84\xaf\x01\x39\x22\xee\xde\xdd\x41\x23\xf6\x77\x66\xaa\x77\x18\xa7\xe4\x83\x09\xe3\x84\xd9\xb3\x3c\x81\x57\xb2\x7e\x7a\x06\x14\x86\x46\xbd\xef\x51\xfe\xbd\xc3\x7d\xcb\x6e\xb5\x1c\x5f\xc9\x1d\x6c\x86\x4c\x67\xb4\x13\xee\x7a\xbd\xbd\x83\x3b\x2e\x75\x79\x26\x5a\xbb\xf4\x56\x6a\x59\x71\x6e\xd2\xb8\x88\x78\x64\xef\x0e\xbf\x89\xbf\x85\x12\x5b\x81\xaf\x63\x15\x5b\x11\x53\x48\xf8\x4a\xbc\xbb\xdb\x73\x46\x3b\xce\x6e\x01\x3a\xbd\xbd\x03\x2b\x37\x93\xdc\xa0\x85\x19\x09\x5e\xe0\x32\xaa\x3d\x41\x8b\xa2\xdf\xb1\x28\x3d\xb4\x82\x9e\x85\x56\xa0\xfd\x74\x4b\x12\x34\x14\x51\x4e\x09\x09\x15\x69\xc8\x6d\x35\xef\xcc\x21\x6e\x01\xbe\xcb\x98\xe8\xf3\xe9\x13\xfd\xd7\x15\x9b\x05\x70\x5a\xdd\xb7\xbc\x11\xa3\xb2\x10\x46\x78\x07\x5a\x6e\xcf\x72\xe8\x2f\xea\x07\xb7\xeb\x3e\xcd\xf1\xfb\xd5\x28\x87\xf0\x4f\x9f\xaa\x01\xab\xbc\x5f\x90\x42\x9c\x44\x83\x62\xf8\x8c\x47\x0e\x51\x9c\x64\x99\x6c\x3e\x82\xaf\xdb\x00\x2b\x96\xbf\xd5\x1f\xca\x0c\x89\x6e\xd2\x39\x41\xce\x7c\x34\x2f\xf0\xa2\xcc\x13\xf3\xec\xa1\x93\x23\xfa\x70\xb4\x13\xe7\xa9\x7d\x77\xae\xa2\x7f\x6f\x54\x78\x90\x45\xa9\x90\x55\x07\x23\xf8\xda\xcd\x4b\x96\xe1\x68\x27\x28\x8c\x5d\xe0\x20\x6c\xec\xc2\x83\x37\xcc\x75\xec\x8d\x0e\xfe\xb1\x13\x8e\x0e\xfe\x61\xbf\xb6\x85\xde\x23\x7f\x66\x20\x0d\x74\x07\x68\x30\x8b\x50\x62\x16\x13\xc1\x66\xac\xe9\x28\xda\x1d\x7e\x33\xcd\xb1\x8d\xa9\x16\xdb\x98\x8a\xb0\xab\xd9\x68\x67\xc2\xb8\x16\xc8\xf3\x8a\x69\x39\xaf\x98\xa5\xbc\x02\xdc\x70\x8d\x65\x8d\x9c\xe2\xf5\x9b\x3b\xa8\x1c\x4c\xcc\x6a\x9d\x5d\xe1\x2e\x2e\x95\x1b\x25\x58\xba\x14\x82\x6e\x0e\x82\xae\x16\x04\xdd\xdd\xdd\x1e\xca\x83\xcc\x2d\x80\x8c\x4d\x4e\x3d\x68\xf5\x24\x39\x78\xd0\x8d\xd0\xff\xb6\x0a\xc0\xfd\xe1\xf6\xc0\x91\xce\x25\x01\x97\xd2\xae\xc0\x6c\xd9\x7b\xd0\xbf\x76\x43\xe4\xb3\xd2\x65\xaf\xdf\xc8\xc6\x65\x1c\x2e\xb9\x83\xb8\xfa\x2d\x38\x4a\x62\x63\xfe\x8c\x61\xb8\x64\xfd\x26\x51\xb8\xf3\xf7\x39\xc4\xe0\x35\xf5\xf7\x9a\x7f\xdf\xc5\xbb\x7f\x37\xdf\xfc\x9d\xc6\x42\x1d\x61\x1e\x3d\x2f\x05\x45\x59\xfe\xe8\x23\xb7\x4a\x1c\xfe\xf3\xf2\xf9\xf9\x20\x00\x61\x04\x77\x62\x9f\x05\x50\x10\x25\xfe\x46\x2c\x49\x6d\xf0\xf0\xcb\x0d\x1e\x3e\x8f\x39\x82\x49\xcc\x11\x5c\x18\xd4\xe8\xb6\xf3\xf7\x63\x14\x7b\x8e\xe1\x23\x6c\x84\x10\x38\x06\x5b\x21\x6b\x31\x49\xe6\x6f\x60\x30\x35\x16\x2e\x9e\xd1\x2e\xae\x06\x5f\xc8\xe0\xef\x34\x86\x23\x8c\x7d\xdf\xf5\xa7\x57\x30\xc2\xd1\xa7\x4f\x21\xfc\x33\x76\x43\x19\xc8\x20\x08\xcc\x5e\xe2\x29\x13\x11\x65\x4f\x9f\xff\xf8\xf6\xc5\xe9\xe5\xf3\xa7\xbf\x9c\xbe\x38\xfc\x6a\x68\x91\xdf\x47\xc7\x57\x67\xbf\x9c\xbe\xfd\xf1\xf4\xfc\xf4\xc5\xd1\xd5\xd9\xf3\x73\x71\xe3\x97\xb3\xd3\x5f\xdf\x3e\x7d\xfe\xfc\xe7\x97\x17\x97\xe2\xda\xd5\x8b\xa3\xf3\xcb\x33\xf2\x94\xea\xd2\xdb\xb3\xf3\xab\xd3\x17\xe7\x47\x4f\xc9\x3d\x3f\x93\xe3\x61\x5a\xd7\x30\x64\x5e\xb3\xe1\xe0\xc1\xd7\x83\xfd\xdd\x83\x87\x0e\xdc\x7f\xf0\x60\x68\xde\xf4\xee\xfc\xff\x01\x00\x00\xff\xff\x55\x7b\xf6\x5b\xab\x36\x07\x00") +var _bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJs = []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\xff\xec\xfd\x7b\x77\xdc\x36\x92\x30\x0e\xff\xaf\x4f\x41\x21\xfb\x28\xe4\x8a\xa2\x5a\x4e\xb2\xbb\xd3\x19\x5a\x8f\x22\xdb\x13\xed\xd8\x89\xd7\xb2\x77\xdf\x39\xb6\x8f\x0f\xd4\x84\xba\x31\x62\x03\x3d\x04\x5a\x52\x47\xee\xef\xfe\x1e\x5c\x09\x80\x60\x5f\x24\xd9\xc9\xec\xef\x49\xce\xb1\x9a\xb8\xa3\x50\x28\x54\x15\x0a\x55\x60\xce\x50\xc2\x78\x83\x47\x1c\xec\x54\xe8\x12\x13\x94\x82\x8a\x8e\xe6\x53\xfc\x1b\x3a\x84\xb3\x19\xc8\xdf\x03\x74\x3b\xa3\x0d\x67\x20\x6f\x73\x1a\xc4\x68\x7d\x8d\x1a\x90\x03\x34\xbd\x40\xcd\x41\x4d\x61\x75\x80\x09\xe6\x18\xd6\xf8\x37\xd4\x78\xa5\x47\x94\x5c\xe2\xf1\x21\x22\xd7\xb8\xa1\x64\x8a\x08\x07\x1f\xf3\xcb\x39\x19\x71\x4c\x49\xca\x73\x94\x93\x9c\x65\x77\xbf\x5e\xfc\x1d\x8d\x78\xa1\x86\xf1\xba\xa1\x33\xd4\xf0\x45\xca\x73\xf0\xe9\x13\x62\xaf\x68\x35\xaf\x11\xc8\xef\xae\x61\x3d\x47\xc3\xdd\xc1\x32\xdb\xb9\x86\x4d\x42\xcb\x6b\x8a\xab\x64\xb0\x43\xcb\xe7\x62\x24\xc5\xc9\x6c\x56\xe3\x11\x14\x4d\x17\xe8\x96\x23\x52\xa5\x77\x53\x59\xf9\x75\x83\x2e\xf1\xed\x90\x89\x1e\xe0\xbc\xe6\x85\x9b\x9c\xcf\x68\xf5\x2a\x5e\x2c\xc8\xc9\xdf\xe8\xc9\x0f\x91\x29\xb2\xcc\xf2\x74\x90\x13\xf3\x99\xa5\x34\x8f\xf7\x92\xe5\xdc\xa4\x97\x74\x99\xe5\x5d\x90\xcf\xf9\x04\x11\x2e\x26\x40\x1b\x76\x08\x09\x25\x8b\x29\x9d\x33\x7f\x1d\x14\xcc\x19\x9e\xce\x6a\x74\x20\xaa\x84\xf5\x2e\x20\x43\x01\x8c\xb7\x87\xaf\x33\x56\x3b\x53\x0b\xd2\x06\x31\x4e\x1b\x34\x6c\xbb\xc8\xee\x1a\xc4\xe7\x0d\x49\xd4\x3a\xbc\x39\xff\xef\xd7\x85\xc6\x93\x94\x67\xcb\xdc\x19\xe2\x16\xd5\x96\xd9\x06\x60\x32\xe9\xf7\x81\x92\x83\xa7\x73\x8e\x6b\x76\x88\xc8\x88\x56\x98\x8c\xbb\x39\x04\x3d\x2a\xe2\x02\xd3\x12\x28\x4b\xbe\x98\x21\x7a\x99\x9c\x2f\xa6\x17\xb4\xde\xdb\x03\x4c\xfe\x08\x33\x0a\xcc\x51\x23\xc6\x7e\x1c\x81\x9f\x2e\xc9\x97\x31\xe0\xf2\xbd\xbd\x15\xdd\xf1\x62\x44\x09\xe3\xcd\x7c\xc4\x69\x53\x96\xa5\x4d\xdf\x35\xbf\x8b\x59\x43\x39\x15\xd5\x8e\xcd\xd8\x86\xb6\xc3\x9d\x55\x88\x02\xff\x0e\x6f\x87\x6a\x6d\x31\x91\x70\x62\xa8\xb9\xc6\x23\x94\x66\x39\x9c\xcd\x5e\x21\x0e\xfb\xb2\x6b\x3a\x82\xf5\x39\xa7\x0d\x1c\xa3\xbe\x32\x2b\xf0\x90\x1f\x47\x51\x6a\xe8\xa5\x8a\xe6\xd2\x55\xd8\x29\xd6\x0a\x95\xed\x76\x1e\x23\x7e\x3e\xbf\xa8\xe8\x14\x62\x92\x66\x39\x36\xf4\x07\x5f\xa6\x80\x4a\x44\x00\x65\x59\xa6\x2a\xb5\x2c\x4b\x7e\x0c\xe6\x44\xa1\x46\x05\x86\x34\xe5\x59\xa6\x1a\x85\x25\x2f\x66\x90\xb1\x1b\xda\x54\x79\x53\xf2\x02\x4d\x21\xae\x45\x3b\xbb\x7a\xae\xec\x75\x83\x18\x22\x3c\x85\xd9\xe7\xcf\x9d\xc4\x26\xcb\x62\x3b\x47\x4e\x08\x60\x72\x0d\x6b\x5c\x81\x6c\x07\x97\x96\x2e\x15\x3f\x41\x86\xfe\xed\xfb\x42\x62\x38\x4a\xd1\x3e\x18\x82\xfd\x46\xfe\x0b\xb3\x25\xaa\x19\xba\x13\xb3\x10\xe7\x01\x19\x83\x5d\x83\x25\x7c\xc3\x7e\xf8\x52\x4c\xab\x2e\xef\x4e\xe6\x7c\x42\x1b\xfc\x9b\x24\xc2\x43\xf0\x13\x64\x78\x94\x80\x7d\xbc\xdc\x31\x2b\x33\xc1\x4c\x00\x32\x05\x02\x3b\x40\x56\xcc\x28\xe3\x29\x98\xcd\x2f\x6a\x3c\x72\x77\xa9\xd8\x37\x13\x04\x2b\xd4\xb0\x61\xbd\xcc\x96\xb9\xee\xcf\x5b\xa4\x76\xc1\x6d\xb3\x2e\xe6\x80\xac\x18\xd5\x08\x36\x27\x75\x9d\x66\x79\x04\x25\x36\x24\x32\x57\x68\x31\xaa\x29\xbc\x7a\x14\x22\x13\x23\x25\x8f\x4c\xa1\x1f\xb0\xf1\xae\x46\x62\x09\xff\xd0\xdb\xd2\x34\x56\xa8\x9d\xe8\x20\x79\xb0\x41\xc3\x6d\xc3\x0b\x4e\xaf\x10\xc9\xf6\xf6\xba\x39\x72\x07\x66\xc7\x9b\xa3\xa7\x83\x14\x77\x15\xe4\x70\xf8\x9f\xe7\xbf\xfe\x52\xa8\x0d\x84\x2f\x17\x29\xcf\xf2\x11\x25\x1c\x11\xfe\x76\x31\x43\x43\xf0\x77\x46\x09\x58\xc6\xe6\xda\xee\xa4\x47\x40\xf2\xb6\x8c\x5a\x49\x90\x15\x35\x1d\xd3\x39\xef\xc5\xf5\x11\x9d\xce\x28\x41\x84\xb3\xc3\xd1\x9c\x71\x6a\x37\xc0\x01\x43\x9c\x63\x32\x66\x3d\x9c\xa0\x42\x67\x79\x7c\x40\x12\xcb\xb2\xc7\xe9\xa3\xa2\xbb\x02\xe0\xa9\x19\x75\x8b\xf4\xab\x11\x1b\xb3\x67\x7a\x74\xaf\x1b\x7a\x8d\x2b\xd4\xe8\x92\x62\xfe\x73\x8e\xaa\x02\xfd\x63\x0e\xeb\x14\x88\xa9\x9b\x22\x20\x6f\x37\xd7\x89\x93\x5e\x98\xb6\x44\xbb\x7f\xd5\x88\xf0\x18\xed\x9a\xb6\xb2\xdc\xfc\x7a\xd7\xd4\xcf\x9b\x86\x76\x5b\x9d\xce\xf8\x22\x05\x06\x0b\x4f\x25\xa3\x5d\xcc\x9b\x1a\xb4\x75\xdf\x20\x58\x4f\xb7\xa8\xdd\x88\xf2\x4e\xfd\xd3\x1a\x23\xc2\xcf\xaa\x2d\x9a\x18\xe9\x2a\x4e\x2b\xaf\xe5\xe6\xf9\x2b\x5a\x6c\xd1\xcc\xcc\xd4\x71\xda\x39\xa9\xa6\x98\xbc\x63\xa8\xd9\xa2\x1d\x68\xea\x84\xed\xbc\xd6\xc7\xef\xb6\x6d\x99\x7a\x20\xcb\x85\xcc\xe3\xee\x52\xb9\xf5\x3e\xb1\xf9\x0c\x35\x05\x9c\xcd\xea\x45\x2a\x52\x72\xd8\x8c\xe7\x42\xf0\x61\x7a\x73\xfa\xad\x96\x77\xf3\xa6\x1e\x02\x90\x4b\xd8\x8b\x1f\x06\x82\xe2\xb7\x05\x83\xf8\xb0\x73\xb1\x1f\x66\x30\x22\x61\xdc\xd0\xf9\x4c\xfc\xa8\x30\x83\x17\x35\x7a\x29\x77\xfd\x70\xf7\x28\xd7\x88\xf6\x1a\x35\x53\xcc\x18\xa6\xe4\xa4\xaa\xce\x67\x70\x84\x86\xbb\x47\xcb\x65\x5e\xe1\xea\x0d\x1a\x21\x7c\x8d\x4e\x38\x6f\xd8\x56\x33\xda\x61\x37\x98\x8f\x26\xa9\x43\x36\x5d\x2c\xcf\xb2\xbb\x11\x64\x28\x59\xb3\x89\x86\x17\x0d\x82\x57\x3b\xab\x8a\x9a\xb5\x1b\x0a\x3e\x83\x97\x7e\x7f\x0a\x92\x82\x11\x61\x85\x65\xb8\x52\x9e\x7d\xfe\x8c\x59\x41\xe6\x75\x6d\x7e\xab\x75\xe5\xd9\x31\x2f\xef\x96\xc3\x34\xe5\xa5\x24\xda\x33\xd8\x30\x71\x0e\x65\x2d\xda\x75\x39\xa7\x0a\x49\xce\x89\xb7\x65\x1c\xa2\xd4\x85\x6d\xb9\xbb\xcb\x8b\x09\x64\xbf\xde\x10\x4b\xde\x40\x6f\x69\x90\x09\x4e\xbc\x37\x5b\x74\xe4\xae\x6a\x19\x6b\xdb\x2d\x00\xb2\xcf\x9f\x83\x3a\x1a\xfb\x98\x3c\x1a\x3c\x14\x04\xb9\x10\xb6\x72\x28\x57\x9d\x0d\xef\x28\xb1\x0b\x13\xe2\x02\xeb\x2c\xf1\x5a\x02\xb9\xcc\x29\xb1\xab\x77\xff\xf6\x2c\x61\x14\xed\x9d\xc3\x6b\x6f\x6c\x2d\x52\xe4\xac\xec\xc3\xc5\x9c\xf6\xa1\x8d\x46\x62\xb6\x21\xb6\xd2\xf2\x6e\xb9\xb3\x05\xca\xe2\x4b\x67\x7f\x84\x64\x1d\x58\x56\x5e\x8a\x0d\xb2\xe0\xbf\xa4\xe0\x1b\xb3\x44\x07\x92\xa2\x17\x97\x74\x34\x67\x69\xb6\x13\x6d\xab\x25\xf3\x6b\x5b\xd3\x14\x7e\x75\x7b\x1e\xd9\x5f\xdb\x64\x4b\xf1\x57\xb7\xea\x1f\x03\x6b\x9b\x75\x4e\x80\xd5\xed\xfa\xc7\xc2\xda\x76\x25\xe1\x3c\x98\xcb\x23\x61\x83\x86\xbd\x73\x62\xc3\xc6\x67\xf6\x8c\x30\x1d\xfc\x98\x1a\x1d\xd5\x88\xce\x16\x4e\x5f\xc1\x4e\xcc\xb2\x4c\x1c\xe1\x25\x15\xff\x16\xbc\xc1\xd3\x34\xcb\xa9\x3a\x97\x4b\xfd\xb7\x4d\x36\x90\x2f\xdb\x9f\x6d\x66\x4b\xca\x9c\xdf\x6d\xb6\x3c\x2e\x4a\x8f\x60\xea\xc4\xec\x18\x80\xa1\xfe\xdd\x96\xb7\x87\x4f\xe9\xfc\x0e\xb2\x0d\xac\xca\xe0\xbb\x2d\xb6\x82\x5c\xd2\x6d\xa8\xe5\xe7\xcf\x2b\xda\x12\xfd\xf8\xd4\x32\xd2\x76\x48\x2d\x83\x3a\xb9\x38\x2d\x48\xf5\x3f\x98\x4f\x52\xb9\x18\x39\x38\x14\x44\x5a\x7d\xe8\xf5\x61\xf3\x0b\xc5\xef\xa7\x83\x5c\xa5\xd4\x88\x8c\xf9\xe4\xe0\x28\x33\xc2\x87\x20\x70\x34\x07\x2d\x32\xe7\x7d\x22\x79\x1f\x4e\xb8\xac\x50\x96\x49\x39\x1b\x97\x77\x2e\x69\x1b\xb2\xbc\x25\x67\xa1\x18\x42\xb3\xe5\x4e\xdb\xb4\x22\x9d\x20\x4b\x71\x56\x08\x51\x26\x75\x88\x28\x2e\xdc\x46\xcb\xb2\x5c\x43\xd7\xc4\x89\x65\x1a\x5d\x90\x11\xc8\xd2\xb0\x4d\x92\xdd\x91\x02\x33\xb9\x75\x8e\x53\x5e\xb0\x09\xbd\xf9\x85\x72\x7c\xa9\x95\xb4\x29\x29\xa6\x88\x31\x38\x16\x6c\xb4\xdf\xfb\x1a\x1a\x9c\xf3\xf5\xf3\x59\x66\xd9\xb0\x33\x27\x5d\x4f\xcb\x0a\x85\x7f\x42\x1c\xaf\x1c\xe2\xd0\xf6\x79\x3a\x81\x64\xac\x7a\x15\x22\xd5\x72\x1b\xc1\x6a\x8c\x08\x6a\x60\x1d\x95\xad\x5c\x31\xe9\x8b\x88\x48\x1c\xf3\x1a\x3d\x17\x4c\x50\x0f\xc7\x3b\xa5\x15\xaa\x0b\x3d\xc6\x42\x16\x07\x59\xae\x21\xb0\x79\x45\x5d\x01\x48\x11\xf8\x1a\x35\x62\x77\x3e\x27\xd5\x8c\x62\xc2\x37\x6f\xa5\x5b\x17\x64\xf9\x04\xb2\xb7\x62\x58\x67\x64\x36\xe7\x51\xe6\x1d\x92\x2a\x05\xed\x4c\x41\xae\x3f\x14\x01\x17\x0d\xbc\x52\xc3\x5b\xd3\x84\x3b\x6b\x90\xdb\xcf\xb6\x99\xd3\xce\xf8\xd6\xb4\xd8\x03\x0c\x90\xc7\x72\x74\x3f\x96\x2b\x63\xbd\x3c\x8f\x38\xbd\x8c\x42\xe3\xb9\xe2\x70\xed\x86\x8f\x2e\x68\xa0\x3d\x14\x34\x4a\xf2\x4e\x2e\xa0\xf2\xdd\x81\xa1\x61\xe2\x84\x63\x98\xa3\xb7\xaa\xb6\x7b\x68\x6e\xd6\xad\x45\x87\xde\x8e\x3d\xe0\x46\xba\x7e\x65\x5a\xd8\xbe\xf3\x18\x16\xf5\x8e\xa3\x6f\x1d\x82\x21\xc5\xda\xb4\x23\x53\x5a\xe3\x6d\x86\xb3\xe3\x1c\x36\x48\x1f\x34\x2d\x7b\xbc\xb6\x7e\x8e\xbc\x93\x08\xb9\xa7\x90\x6c\xc6\x6f\x41\xf1\xdc\x75\x4d\x6f\x4e\xcc\x15\xd3\xc9\x68\x84\x18\x03\xce\x0c\xa3\xf9\x59\x31\x6b\xe8\x2c\x05\xa3\x09\x1a\x5d\xa1\x0a\x64\xae\xba\x89\x29\x42\xdc\xa5\xc3\x0e\x8c\x03\x0c\x3b\x72\x4f\x49\xde\xc1\x82\x30\xbb\x7f\x71\x8e\xb6\xa5\xc2\x35\x1e\x21\xc2\xd0\xc1\x95\x38\x91\xbf\x22\x01\x7e\xa9\xfa\x5d\xa5\x74\x50\x8b\xa5\x07\x18\x12\x00\x5d\xbf\x23\x47\xd9\x15\x78\x69\xea\x45\x16\xe2\x06\x93\x8a\xde\x14\x35\xd5\x57\xa4\x0d\xaa\x29\xac\xd2\x6d\x61\xc7\xa6\x7c\xf6\xfb\x1c\x5f\xe7\xaf\xde\xbe\xfe\x99\x32\x45\x35\xd7\xc3\x50\x0c\xb4\x98\x50\x26\x8e\x0d\x51\xf5\x35\x6d\xb6\xaa\x2a\x66\xa5\xab\x9e\x23\x52\xa1\x66\x9b\xca\x4c\xd6\xd0\xd5\x05\xaf\x7c\x56\x6d\x53\x5d\xc8\x27\xb8\x32\x03\x37\x32\xc8\x36\x83\x6f\xf5\x54\x1e\x06\x89\xf6\xe2\xe8\xd3\x85\x2e\xc8\x8e\x1d\x32\x2c\x96\x5d\x41\xd3\x90\xba\xa1\x5f\xd9\x87\x6f\xb7\xb2\x82\x67\x4f\xe5\x10\xc2\xdd\xea\x06\xa2\x3d\x0d\x84\x30\xee\x36\x60\x60\xda\x37\xfc\x0e\x94\x23\x53\xe8\x48\x76\x43\x7f\xff\x89\x86\xa2\x9b\x6f\xcb\x4d\x26\xc6\xaa\xa4\xc9\x1e\xe5\xfb\x14\xdf\x62\xc2\xa4\x9e\x3e\x92\x3c\xa5\x15\xac\xbf\x8a\xda\xdd\x32\xea\xad\x60\x93\xdf\xa1\x0a\x73\xa9\xa8\x24\xf3\xba\xce\x2b\x54\x23\x8e\xda\xef\x4b\x5c\x73\xa5\xc4\x9c\x40\x76\x8e\x6a\x34\xe2\xa8\x12\xd9\x6c\xb8\x7b\x94\x0b\x0e\xfc\x99\xac\xf1\x0c\xc3\x9a\x8e\x45\xda\x3d\x35\xad\x66\xb5\xca\xbb\xa5\x4a\x50\x3d\xeb\xce\xca\xf7\x1f\x8d\x4a\xcc\x19\x42\xf9\xfe\xe3\x4a\x95\xa8\xc3\x76\xad\xd7\x8e\x86\xac\x80\x58\x55\x06\xb2\x1d\x54\x5c\xd2\xe6\x39\x1c\x4d\x5a\x0c\x41\xd9\x1d\xd2\xe7\x3d\x12\x27\xba\x2c\x2f\xb0\xb5\x15\x5a\x18\x92\x62\x6e\x61\xfe\xba\xb7\x51\x95\xa4\x18\x05\x96\x87\xb2\x6e\xc8\xcc\x4b\x1f\x90\x8e\xfe\x4f\x8d\x23\x47\x6e\x9a\x07\x1b\x91\xa7\x15\x77\x02\x80\x4a\xe0\x19\x76\x0e\xf5\x66\x2e\x16\xfd\x82\xce\xc9\x48\x09\xb0\x2e\x98\x65\x43\xf9\x77\x3f\x0c\xb2\x65\x41\x2f\x18\x6a\xae\x11\x33\xdd\x80\x2c\x77\x0a\xc5\xe1\xeb\x81\x2c\x47\x62\xb9\x88\x93\x61\x1a\x2a\x38\x7d\x49\x6f\x50\x73\x0a\x19\x4a\xb3\x1d\xde\x05\x2d\xcf\xee\x52\x0d\xc2\xcb\x79\x5d\x13\x38\x45\x61\xb5\x02\x93\x51\x3d\xaf\x10\x4b\x89\xd4\x9c\xca\xc2\xf2\x4a\x70\x55\xc9\x6c\x6f\x0f\x15\xb3\x39\x9b\xa8\x6d\x95\x72\x1f\xca\x11\x88\x5a\x52\xcc\xe9\x78\x5c\x23\x85\xfc\xde\xe5\x26\xef\xac\x9d\x5d\x7d\x9d\x92\x75\xf1\xca\xc3\x60\x20\x80\x10\x54\x39\x56\xe3\x34\x60\x90\x68\x32\x44\xe5\x27\x73\x05\x89\x72\x17\x11\x35\x73\x8c\x5a\xd4\x93\x97\x93\xee\xdc\xfc\x1e\x7d\x4c\x0a\x77\x35\xb0\x2c\xe9\xd3\x41\xb6\xcc\xd5\xd4\x4f\x46\x1c\x5f\xc7\xcc\x2d\x64\x3b\x72\xd5\x8b\x4b\x4c\xaa\x9f\x16\xb2\xf7\x9c\x8b\x5d\xa3\x58\x57\x59\x13\xe4\xbb\x7a\x93\xe8\xef\x2c\x8b\xe9\x39\x90\xed\xf0\x79\x85\x39\x6d\xee\xd3\x21\x92\x35\xdb\x0e\xf5\xf7\xba\x0e\xa5\xfa\xf0\x5e\x13\x54\x64\xdf\xce\x4f\x7e\xae\xeb\x2d\xd8\x48\x9b\xf7\x76\x8d\xd1\x8d\x5e\x26\xd3\x63\x9b\xd4\xdf\x2b\x25\xe7\x13\x7a\x23\x80\xba\x4d\xa7\xa2\x21\x7d\xec\x60\x41\x0d\x44\x2a\x18\x35\x08\x4a\x54\x07\x0d\xba\xc6\x4c\xfe\xba\xc4\x0d\xe3\x72\xa7\xe6\xa0\x86\xf6\xa7\xda\x92\x39\xd0\xe6\x86\xe2\x44\x34\xe8\x60\x97\xc9\xc0\xcf\x9d\x19\x80\xa3\x11\x9d\x13\x2e\x37\x87\x45\x54\x73\x4c\x05\xf8\x6b\x0f\xf9\xfc\x6e\xe6\x5c\xb0\x49\x53\xc6\x66\xaa\x2d\x5b\xc0\xd2\x15\x08\x45\x4b\x92\xbf\x38\x50\x27\x6f\x56\x50\x92\x02\x71\x94\x15\x17\x52\xfe\x82\x35\xf0\xb8\xe3\x96\x7e\xb2\xd1\x04\x89\x73\x37\x05\xf0\x92\xa3\xe6\x8d\xe2\x72\xf2\x0e\xad\xb5\xdd\xb4\xa0\xb1\x4c\x88\x64\x2c\x56\x8d\x46\xfe\x95\x5a\xcf\x19\x95\x52\xc5\xfa\xc2\x77\x62\xf4\x92\x09\x10\x8b\xfd\x6e\x16\xda\x24\x84\x84\xda\x02\x53\xd0\xea\x36\xb9\xe5\x98\x84\xc8\xde\xde\xc1\x15\x76\x1a\x59\xb6\x62\x82\xb0\xaa\x4e\x6b\xc8\x04\xaa\xb0\x03\x6b\x27\x61\x65\x6d\x54\x33\x94\xf8\xed\x1a\x6c\xe9\x34\x6b\xd1\xe8\x3e\xad\x2a\xf3\x10\x75\xa1\x48\xf5\xa7\x4d\x0e\x7b\x32\x07\xc7\x06\xdd\x84\x8b\x1b\x5b\xb5\x09\xae\x36\x5b\xb2\x76\x7d\xfd\x0b\x0d\xbb\x71\x79\x96\xdb\x09\x88\x79\x21\xcb\x22\x65\x7b\x7b\x41\x8e\x8b\xee\xea\xa0\x33\xdc\x54\x59\x06\xb9\x77\x6e\x57\xed\x05\xb9\x60\x3a\xdb\x0e\x96\x4b\x43\x34\x14\x77\xe7\x9f\x7a\x76\xf3\xb5\xcc\x22\xc8\x7b\xc9\x88\x77\x12\x05\xfc\xa2\xd4\xd5\x88\xae\xc2\x6e\xdc\x5e\x22\x95\x8e\x56\x1c\x6f\xef\x3f\xae\x3e\xdf\x76\x8f\xb2\xae\x7d\x9b\x19\x81\x00\x84\x4d\x6c\xa7\xa7\x79\xb5\xdd\x81\x18\xeb\x4f\xf3\xfa\xaa\x3b\xde\x90\xd7\x8c\x9d\xf5\x51\x4e\x92\x77\x46\x80\x56\x1e\xdf\x1b\xcc\xcf\x6a\x92\x60\x7d\x5a\x53\x86\x52\xf0\x4d\x7b\x93\x76\xa0\xa6\x65\xd0\x71\x7b\x49\x67\x8d\xa5\x91\x2b\xec\x3c\xa2\x69\xf3\x5a\x91\xe6\xce\x92\xa2\x55\x5a\x6b\xa2\x8e\x99\xc2\xa1\x5b\xb9\x21\x36\x9b\xd4\x6b\x09\x53\x2e\x29\xc7\x26\x75\x34\x89\x11\x12\xd4\x0b\x6f\x8c\xfd\xda\x67\x7f\x2e\xee\x19\xeb\xe8\xb4\x5f\xc2\x8d\xda\xf2\xa6\xe7\x1c\xd1\x4e\x4b\xcf\xed\x54\xfa\x9b\x69\xa7\x6b\xce\x76\xd3\xc0\x3d\x25\x3e\x0d\x9e\xb2\x5d\x38\x71\x72\x9b\xd1\x89\xdf\xb2\x17\x69\x40\xa3\x18\xd0\xdd\x81\x6b\xfa\x00\xab\x6a\x7b\x1d\x7b\x64\xfd\x7b\x15\xcc\x01\xcc\x03\xbd\xb2\x6e\xe9\x45\xf7\x84\xdf\xa4\xff\x16\x8f\x7a\xbb\xf7\xd7\x29\xde\xfb\x4b\x78\x9f\xce\x35\x42\x76\x8e\xc8\xde\x82\x7d\x43\x74\xd0\x20\x3e\xbe\xe7\xfa\x74\xf5\xf5\xed\xaa\xd8\xd8\x36\xa3\x0b\x83\x6c\x27\xcc\x81\x55\x25\x09\x62\x47\x45\xa3\x45\x2f\x53\x33\xdf\x0a\x89\x02\x5d\x75\x67\x9d\x43\x65\x76\xb8\x12\x61\xbe\x07\x86\xa3\xcd\x90\x64\x23\x1d\x93\x4c\x43\x84\x1f\x5e\xd4\x74\x74\x75\x60\xb8\xe6\xaf\xa8\xc6\x55\xe6\xc1\x3d\x66\x9a\x1b\xa9\x5e\xf4\x49\x28\xda\x01\x59\xa1\xe4\x87\x37\x68\x44\x9b\x4a\x30\x9c\xf2\xe2\x11\x6d\x54\xf0\x15\xe2\x50\xca\xcb\x4c\x4b\xb9\xce\x85\x86\x84\x8f\x3e\xa5\x75\x01\xda\x8c\xcf\x22\x65\x54\x72\x5b\xcc\x80\xd8\x2f\x6b\x52\xfd\x26\x1d\x1b\xe1\x6e\xc3\x6e\x66\x5b\x45\x0c\x3c\x5e\xde\xe6\xb4\x85\xd5\x95\x5f\xa7\xa4\xb9\x09\x34\xc5\x2e\x68\xb5\xe8\x96\x92\xa9\x6d\xa1\x06\xde\xfc\x14\x2d\x67\x32\xda\xa2\xe8\x76\x84\x9a\x19\xef\x16\x35\x19\xad\x9a\x4a\x0c\x3a\x06\x55\x4f\x97\xb5\x0e\xf2\x68\x0b\xc8\xa3\xcd\x67\x83\xec\x22\x29\x3b\xb9\xee\xfa\x28\xab\x1d\x53\x50\xa0\x78\x43\x60\x7d\x4e\xe7\xcd\x28\x02\xf6\x20\x3f\xf3\xc5\xce\xb1\xa8\xe1\x26\x4d\x05\x7a\xfa\xc2\xa9\xda\xaf\x6a\xf9\x01\x43\x72\x6f\x1c\x82\xfd\x95\x98\xb3\x0f\x0e\xf9\x62\x86\xcc\x5e\xcf\x3c\x5b\xbf\x53\x48\x46\xa8\x8e\x5f\x09\x98\x5c\x90\xa5\x92\xa5\x3e\x91\x45\x86\x3e\x03\xe6\x16\x57\x05\x14\xeb\xbf\x15\x31\xd2\xe3\x3d\xa8\x31\xb9\x42\xcd\x6a\x36\x90\x53\x5a\x73\x3c\xfb\x5d\xd5\xde\xad\xb2\xdb\xe1\x16\xc5\xe0\x7b\x5f\x4e\x60\x72\xf5\x8b\x3e\x3e\x14\xf7\x2d\x20\x29\xf5\xe1\x1c\x5e\x1c\x19\x86\x7b\xb8\x3b\x10\xdf\x4f\xda\xef\x23\xf1\xfd\x9d\xfb\x2d\x84\x97\x73\xa4\x57\xd0\x67\xab\x52\xe0\x36\xe6\x69\x11\x3a\xf2\x89\x57\x52\x2c\x94\x68\xf7\x84\x73\x38\x9a\x48\x96\x2a\xd6\xf4\x93\x8d\x9b\x7e\xd2\x69\xfa\x1c\xc1\x66\x34\x89\xb5\xfa\xdd\xc6\xad\x7e\xe7\xb5\x7a\xa5\xb4\xd3\x4c\x5f\x25\xbc\x82\x7c\x34\x41\xdd\x71\x4f\x55\xba\xd7\x78\x78\x96\x98\x32\xad\x1c\x57\x18\xdc\x64\x5a\x79\xf9\xf9\x33\x97\x04\xd6\xfd\x86\x2d\xb8\x74\xea\x32\xcb\x25\x16\x9e\x55\x9d\x71\xa8\x0d\xde\x99\xa1\x34\x27\x70\x90\x5f\x49\x51\x07\xee\x9e\x16\x35\x0b\xdc\x82\xf2\x95\x28\x21\x50\x81\x92\xb7\x52\xfb\xb7\xea\x98\xd4\xc3\x09\x95\x02\xb6\x1d\x90\xb9\x6a\x3b\x5f\xc7\x4e\xeb\x4a\x4b\xaa\x9e\x61\xad\x47\x50\x3d\xbb\x5a\x3b\x52\x47\x62\x15\xd3\x02\x52\xf5\x77\x0a\x49\x25\x1f\xb7\xb0\x94\xe4\x2c\xa7\x21\x0f\xc6\xed\x25\xc8\xc8\x96\x94\x24\x11\x39\x92\xa9\x42\x7c\x60\x34\x19\xca\xbe\x5b\xad\x8c\xb4\xa2\x76\xd7\xc8\xad\xe9\xa0\x76\x58\xd9\x59\x46\xd9\x44\x77\x59\xad\xf8\x2c\xa1\xf9\xeb\x0c\x09\xda\xe2\xa8\xc8\xa4\xca\x28\x14\x91\xb9\x77\xf3\xe1\x00\xfc\xbe\xe2\x8d\xc6\xd2\xf2\xce\xe2\xe6\xf0\xfd\xc7\x5c\x4e\x58\xfc\x70\x86\x3d\x7c\xff\xd1\x98\xf6\x93\x0a\x35\xf7\xe8\xab\x91\x15\xdf\x2a\x5a\x2b\x98\xcb\xfc\x06\xd7\xf5\x33\xc4\x78\x43\x17\xcf\x6b\x24\xca\xde\xab\xd9\x29\xbd\x46\x6d\xb3\x1d\xbd\x42\x04\x71\x1f\x72\x15\x85\xf8\x68\x92\xff\x7b\x70\x09\x65\x08\x07\xc8\x72\x59\x60\xd5\xf6\x71\xca\xaa\x1d\xb2\xf3\xa9\x15\x83\xf4\x83\x31\xe6\x92\x90\x7c\xb3\xd5\x71\x6f\x8e\xf5\x0e\x61\x92\x42\x3a\x9b\x84\xf7\x6f\x10\xdb\x1b\x17\x6c\xbf\x73\xc7\x8f\xf8\xb9\x3d\x5e\x7a\x34\xf3\xe3\x60\x87\x65\xde\xa6\x6f\x49\x61\xa8\x2f\x12\x47\xbb\xda\x8d\x6a\x8f\xc5\x54\x4f\xad\x10\x83\x72\xe7\x16\x4b\x10\x05\x79\x9d\x84\x2b\xb1\x95\x90\xb7\xc5\xee\xdf\x0e\x71\xa8\xf4\x43\x5a\x79\xe8\x7c\xc8\xe3\xcc\x47\xe0\x79\x0f\x3f\xc6\x7c\x9a\x2d\xaf\x74\x73\x4a\xce\x08\x43\x0d\x7f\x29\x18\x8f\x55\x92\x92\x5d\x3e\x69\x6b\x66\x9f\xc4\xb8\xac\x5b\xdb\x92\x54\x14\x8b\xc6\xdf\xc2\x8b\xd8\x0d\xa5\x1d\x8e\xcf\x6b\x1c\x89\x79\xb8\xac\xaa\xcf\x2f\x3c\x89\x64\x3b\x07\xff\x77\x32\x7b\x1b\x96\xd1\xfc\xf8\x3d\x44\xd8\x75\x6f\xa6\x36\x63\xd5\xe5\x61\xf9\xcf\xc6\xa9\x5b\xb0\x4f\x10\x54\xbe\x12\xbe\x26\xdc\x75\xe7\xe7\x8a\xaf\x8e\x33\xdb\x96\x3d\x11\x24\xbb\xc2\xfc\x15\xad\x90\x7c\x07\x47\x47\x86\x03\xaf\xe8\xe8\xb9\x12\x44\x35\xef\xf8\x8b\x51\xc5\xf4\xe8\x5d\x75\x5d\xad\xda\x54\x55\xd7\x94\x7f\x6e\x24\xdd\x7c\x04\x89\xbc\x28\xed\x30\x84\xa8\x99\x4a\x53\x0e\x2b\xe5\x88\x41\xaf\x62\x53\xdb\xc7\xb6\xc1\x2d\x9b\x7d\x04\xd1\xb2\xb0\xbb\xa9\xb9\xcf\x35\x4d\x8b\x41\x00\x6f\xdb\x5b\x46\x6e\xd6\x50\x6e\x48\xc4\xae\xa0\x47\xaf\x6d\x82\xc0\xcc\xe2\x17\x4a\x50\xf6\xf9\x73\xb7\xcd\x93\xd9\xac\xa1\xd7\xe8\x9e\xcd\xbe\x41\xd7\x18\xdd\x68\x5e\xfe\xdd\xcc\xa3\x33\x4f\xfe\x5d\x12\xc6\x2b\xb4\x38\xa5\x15\xb2\x16\xb1\xa4\x72\xb1\xbd\x63\x52\xe1\xdf\x48\x7b\x37\x4b\x7a\x09\x63\x8a\x01\xad\x36\xcd\xbd\xd2\xcf\xbb\x3a\x0c\x5b\xc1\x51\x63\xf8\x1b\x5e\x20\x9b\xab\xb8\xdc\xf6\x8a\xd7\x6e\x2f\xad\xda\x53\xa4\x3b\xd5\x87\x43\xf8\xf0\x0d\x5f\xa6\xbb\xed\xe8\x5c\x3c\x06\xd9\xde\x9e\x9f\xe5\x62\xad\xe0\xf9\xbd\xb9\x3a\x60\xf0\xa7\xfb\x4b\x0c\x32\x3e\x0c\xfc\x0a\xcf\xd7\x40\xe6\xa8\x6b\x52\xf0\xcc\xee\xd7\xb4\x0b\x6a\xc1\xfe\xad\x3b\x17\xbd\xe6\xef\x45\xcc\x94\xa6\xe5\x8f\x4c\xc9\x46\x90\xa3\x31\x6d\x16\xab\x2b\x98\x52\x42\x60\x53\x66\x62\xab\xcb\xeb\x42\x6d\xfb\xd8\x0a\xd0\x27\xe9\xfb\x8f\x59\x4e\xd0\xcd\xa9\x6e\x53\xaa\x2e\x26\xd4\x7e\x5b\x29\x74\x02\xd9\x69\x58\xbb\xa5\x72\x6d\xc3\xab\xc5\x7b\xa7\x5c\x66\xed\x85\x96\x92\x7a\x2a\x36\xc1\x8e\xe3\x51\x7b\xd0\x84\x25\x24\xa3\x85\x4f\x34\xd5\x38\x4e\xaa\xea\xc1\x83\x70\xfb\x60\x33\x38\x42\xbf\xde\x10\xd4\xf8\xf4\xb3\x53\xe6\x15\x24\x52\xad\xbd\xcc\xf2\x29\xbc\x7d\x0b\xc7\x6c\xf8\x5d\xce\xe1\xf8\x37\x6f\xad\x44\x82\x5a\x94\x60\x05\xdf\xc2\xb1\xb6\x60\xe1\x0d\xbe\x98\x73\xda\xbc\x62\x32\x05\x2a\xea\x6d\x3e\xe7\x0c\x35\x4a\xc0\x0a\x97\x51\x48\xcb\x4a\xe6\x01\x7e\x2b\x42\x98\x65\xfa\x10\x08\x0f\x43\xff\x5c\xda\x18\x2a\x9d\xa3\x45\x00\x5f\x8e\xea\x54\x74\x4d\x6b\x31\xda\xb0\xa7\xd8\x91\xb3\xea\x24\x8d\x1e\x51\xde\x99\xea\x9e\xb5\xa4\x04\xc0\xbe\x75\xb7\xcf\x84\x23\x67\xe4\x90\x94\xd1\xf4\x97\xf0\x02\xd5\xfe\xa3\xe1\xa0\xd4\x4b\x3a\xba\x8a\xd5\x16\xe9\xeb\x6b\xab\x83\x34\x56\x5f\xe5\xc8\x16\x96\x1a\xec\x64\x99\xe9\x95\x87\xab\x61\x79\xd7\x02\xc7\x56\x58\x3e\x10\xac\xb6\x84\x69\x30\x10\x3f\x5d\xb0\x33\x01\x76\x7c\x99\xf2\xb2\x2c\x49\x0f\xef\xa0\x57\x05\xe9\x55\x21\xc5\x89\x6e\x57\x16\x3a\x21\x8b\x0b\x5a\x2d\x86\xac\x8c\x67\x74\x20\x1b\x14\x7b\x05\xff\x4e\x1b\xcc\x23\x0d\x98\x9c\x75\x2d\xbc\x23\x90\xe0\x29\x9d\xb3\x6e\x13\x36\xcb\x5b\x1d\xb6\x5c\x79\x0b\xb6\xa1\x9e\x45\x3d\xed\x50\xbf\x6f\x68\x73\x75\x59\xd3\x9b\x73\x0e\xb9\xbc\x27\x14\xed\x2b\x79\x2f\xa2\xc8\xd9\xc6\xc2\x39\x8f\x30\x2e\x1c\x8e\xd9\x46\x66\x70\xe8\xbe\x66\x70\xb0\xaa\x44\x2f\x07\x97\x18\xd5\x8e\x41\x55\xde\x5f\x82\x5e\x5e\x4a\x4d\x4e\x45\x6f\x88\x1e\x95\xf9\xca\xbb\xae\x85\x76\x79\xc1\x26\xf8\x92\xff\x15\x2d\xf6\xf6\xd2\x23\x29\x9a\x16\x37\x13\x3c\x9a\x7c\xfe\xfc\xfd\x0f\xee\xd7\xd1\x7f\xfc\xc9\xfd\xfc\x0f\x2f\x4f\x33\xb0\xfa\x53\xff\x78\x5a\xfe\xdb\x0f\x7b\x7b\xfa\xe3\xcf\xe5\x9f\x06\x4e\xce\x9f\xfe\xdd\xc9\x39\x7a\xf2\xc4\xc9\xfa\xfe\x3f\x9c\xac\x1f\xfe\x5d\xaa\x23\x8d\x18\x3d\xfe\x4d\x9e\x51\xe6\x4d\xac\x48\x10\x4c\x93\x64\x19\x1f\xaa\xb3\xdb\x14\xa4\xcb\x5c\x20\xdc\x5a\xe3\xa5\x80\x89\x51\x5a\xe1\x77\x0c\x35\xff\x8d\x19\xbe\xa8\x5d\xed\x9f\xa3\x7b\x0e\xb5\x60\x48\xb5\x4e\x8c\xdb\xc7\x14\xd9\x2b\x5c\xf7\x14\x26\x99\x01\x49\xb4\x5b\xc3\x75\xb6\xac\x8b\x31\x8f\xf6\xef\x0b\xbb\x9d\x07\x36\xda\xa7\x4e\x9f\x28\xcb\xe3\xc6\xfd\x62\xc0\x82\x00\xb8\x86\x6c\xa8\xc0\x95\x52\xc8\x50\xee\xbc\xc3\x67\xd9\xde\x5e\xca\x3a\x76\xe0\x83\xf6\xce\xd8\x9b\xa4\x5a\x69\x63\x07\xf1\xfe\xa3\x74\x23\xf7\xa9\xc0\xec\x5d\xeb\x0a\xa5\x4b\x7d\xc5\x2e\x05\x59\xe6\x72\x3f\x41\x9e\xe1\x90\x8e\x0c\xb4\xfb\x4b\xb2\x59\x8d\x79\x0a\xbe\x01\xd9\xce\xa7\x02\x89\xa9\x93\xdc\x37\x6a\x6f\xb9\xad\x8e\xc5\xfc\xd2\x55\x09\x8d\x7f\x33\xaf\x10\xc5\xaa\x0a\x04\xf6\x68\x57\x17\xc1\x00\xc8\x51\x39\xc8\x49\x39\xc8\x59\x39\xc8\xa9\x48\xc0\xe5\x20\x87\xe5\x20\x6f\xca\x81\x7f\xe7\x21\xd5\x7c\x31\x9b\x39\x6e\x6d\xe6\x04\x0b\xf4\x33\x64\x8a\x0b\x7a\x8d\x88\x54\x71\x88\x05\x41\xfb\xe5\x91\x45\x28\xaf\xd4\xc9\x0d\xc4\x1c\x93\xb1\x3a\x90\x64\x61\xd2\x5b\xf8\x8d\x34\xb8\x47\x95\x2c\xc6\xdc\x62\xa3\x4e\x97\xb8\x9b\x1d\xe9\x0b\x76\x4b\x79\x9d\x34\x22\x7f\x99\xe5\xe8\xe9\xe0\xf3\x67\x22\xfe\x61\x4f\x07\xd9\x1d\x2f\xd1\x3e\x48\xc0\x7e\x7a\x54\x96\x25\x3a\xd6\x35\xc1\x50\xff\x60\x20\xdb\x07\xc9\xac\xa1\xe3\x46\x88\x08\x64\x9c\x27\x60\x9f\xec\x83\x04\xea\x11\x24\x8d\x1c\x82\x48\x66\xfb\x20\x69\x4c\x97\x4b\x03\x71\x6b\xde\xe0\x30\x8b\x39\xcf\x72\x2c\x86\x00\xc5\x3f\x8d\x18\x07\x2d\x71\x3b\x0e\xbc\xd9\x38\x60\x7c\x1c\x8d\x37\x8e\x76\x10\x0e\x97\x0b\x72\xea\x2b\xd5\xce\x3b\x02\x4d\xaf\xe6\xd5\x2b\x66\xcd\x4c\x85\x00\x6b\x85\x82\xb8\x4f\x9a\x28\xfb\x23\xaf\xce\x36\xb9\x6c\xf3\xa4\x16\xf5\xa6\x44\x10\x10\x9f\x32\xd0\xad\x2a\x1c\x65\x39\x2e\xdf\x7f\xcc\xa1\x20\x17\x86\xed\x88\xee\x0a\x45\xb6\xee\xd4\xd8\xce\xaa\x21\xc9\x5b\x13\x8b\x21\xb2\x42\xe9\x59\x35\x74\x5f\x8a\xec\x60\xf5\xdc\x84\x09\xbc\xa3\x8f\xd9\x30\x74\xa9\x07\x0b\x8c\x5a\x23\x6b\x74\xe4\x3e\x51\xee\x1e\x03\x0c\x59\xa9\xf2\x95\x74\xe7\xc8\x26\x78\x96\xc2\x1c\xcc\x89\xbe\x93\xe9\x1a\x89\x6d\xd5\x14\xce\x41\x6f\x43\xf6\xf5\xad\xb1\x02\x3e\xa9\x2a\x21\xa9\xf9\x54\x69\xd6\xa0\x6b\x44\xf8\x33\xa5\x4f\x88\xbc\x2f\xb7\x0c\x80\x8f\x4e\x4a\xec\x03\xd9\xce\xa0\x2c\xcb\x94\x94\x24\x78\xc7\xa4\x7c\xb2\x64\xf6\x32\xfb\x93\xd4\x44\x43\x4c\x58\x8a\x72\x92\x7d\xfe\x6c\x1f\xed\x78\x77\x43\x52\xf8\x14\xd2\x2a\x29\x18\x87\x0d\x67\xf2\xd5\x3a\x38\xf0\xde\x4a\x86\xbc\x42\xdc\x10\x7e\x98\x7a\x67\x01\xf1\x2f\x07\x0c\x57\xe3\x59\xbf\xe8\x49\xe5\x00\xac\x62\x4d\xd4\x1d\x63\xa4\x47\xb9\x61\xdf\xa8\x1b\xc8\x10\xd0\x91\xae\x3f\x15\x37\x98\x4f\xe8\x9c\xa7\x51\x68\xf3\xcc\x12\x00\x29\x91\xaf\x10\x8b\x9c\x5a\xa8\x04\xdf\x00\x73\x4c\x72\xef\x98\x44\x25\xda\xe7\xfb\xe0\x1b\xa0\x4f\xf3\xd8\x91\x0b\xb2\x1d\x62\xc7\x29\x19\x8e\x55\xea\x34\x12\x91\x06\x56\x00\x32\xce\xc3\xf7\x3d\x43\x58\x59\xda\x3e\x45\xb8\x97\x3a\x4e\x99\x4a\x6c\x62\x04\xf4\x55\xcd\xc1\xb7\x56\xda\xe9\x5b\x9f\x75\x3a\x38\x2b\x27\x3b\xb7\x15\xe2\xf7\x6b\x38\x46\xca\x46\x48\xe6\x20\x0e\xf5\x8b\xda\x07\x8b\x87\x8a\xa4\x32\x2d\x1a\x08\x4e\xc1\xd5\x3f\xd9\x0c\xc9\x89\x7c\xfe\xec\x9a\x8d\xc4\x1e\x9f\x5a\x87\x15\x86\x5b\xf3\x1c\x91\x72\xaa\x50\x5f\x48\x43\x5d\x43\x91\xcd\xf4\x6f\x81\xfa\x5f\x25\x3a\xec\x61\xbf\x5e\xf8\xb5\x32\xab\xf3\x3a\x8e\x28\xa7\xa5\xfe\xd7\x21\x74\xd2\x30\x34\x60\x15\xe0\x35\x92\x2b\xe2\x63\x5c\xb8\x53\x1d\x05\xc6\xce\x1a\xc5\x48\xbf\x5a\x63\x6f\x2f\x60\x5b\x05\xb5\xe5\x73\xa6\xeb\x28\x5e\x52\xf0\xc4\xa8\x90\x7e\xd5\xd8\x04\x55\x42\x42\x54\x96\x8d\xa8\x86\x1c\x5f\x07\x56\x95\x16\xe2\x59\x98\xd8\xdf\xb4\x62\x46\x7f\x11\xe3\x89\xb4\x0d\xb6\x51\xf2\xcb\x75\xd0\xd7\x8d\x79\x9b\x74\xc2\x7e\xaa\xe9\xe8\xaa\x4b\x8b\x83\xaa\xba\x9c\xbd\x9b\x3e\xa5\xb3\x45\xb0\x18\xc1\x7d\xa8\x2e\xe0\x5d\x2a\x58\x18\xe4\xaa\x95\x57\xb4\xb3\xa4\x7e\x2b\xa6\xc0\xca\x56\xd4\x2b\x9b\x4e\x3b\xe1\x41\xad\x30\x4f\x8a\x67\x9e\xdf\x35\x94\x19\x24\xba\xc3\xd5\xd0\x79\xfa\x9d\x4b\x2b\x5d\x93\x62\xbc\x31\x8d\x26\xb8\xae\x1a\x44\x86\xdc\xf7\xec\xd5\x8e\x42\x12\x7e\x79\x69\x12\xbd\x0d\x1b\x7b\x8b\xe5\x6f\x6f\xbd\x57\xe5\xb9\xd0\x73\xb1\xe5\x58\x29\xf4\x5f\xb6\x3d\xfc\x46\x86\xd3\xd1\x4a\xbf\xc3\x32\x7f\xc3\x63\xe1\x4b\xdb\x80\x6e\x7f\x30\x48\x0a\x7b\xc5\xe9\x4c\x92\xfa\xe9\x8c\x2f\xe4\x8e\x8b\xda\x0c\x46\x55\xe7\x83\x0e\x35\x35\xa6\x6a\xe6\xb2\xe2\x6b\x5e\x39\x7b\x9c\x67\xcf\x11\xe1\x09\x35\xfe\x80\x9f\x0e\xcc\x9d\xf5\x6e\xca\xf6\xf6\xc8\xde\x5e\xf4\xe6\x3a\xaa\xac\x08\xe8\x69\xef\xcd\x75\x4f\xcb\xf6\x92\xe1\x5e\x8d\xb7\xf7\xd7\xf7\xb4\xe8\x13\xa4\x17\x95\x77\xea\x94\x81\x17\xb5\xa2\x22\xbb\x47\xf9\x7c\xf6\x4c\xf9\x23\x94\x26\xc1\x15\xbd\x21\xee\x37\x26\x95\x90\x09\x9c\x14\x3a\xe7\x61\x92\x32\xac\x1f\x02\xf0\x50\x27\xbf\x1d\x94\x98\x37\x0d\x22\xf2\x64\x3d\xab\x1c\x3b\x31\x89\xc2\xa9\xeb\x67\x17\x80\x21\x5f\xa3\x6e\xde\x10\x50\x52\x08\xfa\x69\xce\xa4\xab\xab\x51\x83\x2f\x9c\xfd\x24\xcf\x87\xaa\x42\xfa\xb8\xcb\x81\xf6\x60\xeb\x65\xad\x68\xa7\x41\x0c\xff\xd6\xd6\x16\x33\xc1\xbf\x21\x87\x02\x8a\xcf\xf4\xcb\xda\x45\xda\x71\xcd\xc9\xca\x19\xae\x2c\x6e\x26\x92\xed\x60\xc2\x51\x03\x47\xbc\xc0\xec\x5c\x2c\x99\x60\xd6\x25\x49\xcd\xf6\xf6\x4c\x9e\x9b\x2a\xda\x41\x3c\xed\x31\xd2\x94\x87\x5c\x38\x94\xa8\xf8\xa4\x20\xb5\xcc\xf5\xcf\x1e\x85\xf0\x36\x6a\x7f\xf7\x79\xd7\xbf\xa4\xca\x87\x55\x56\xdc\xe0\x8a\x4f\xd2\xec\x69\x79\xf4\x1f\x03\xa5\xe4\xd3\x4f\x78\x0c\x5d\x55\xaa\x58\x5f\x51\xdc\x56\x9f\x20\x3c\x9e\xf0\x34\x3b\x70\x9e\x55\xc1\xeb\x83\x0b\xd8\x00\x27\xf3\xe8\xfb\xc1\x8e\x27\xee\x68\x58\x8d\x84\x5c\x39\x85\xb7\x07\xaa\x24\xc8\x89\xda\x23\xac\xf4\x4b\x2b\x15\x5d\x41\x2f\x2f\x25\x6c\xf5\x03\xf8\x50\xd9\xab\xc6\x48\x4b\x41\x0e\x2f\xf9\xc1\xd1\x60\xb0\x43\x9f\x7e\xf7\xc3\x60\x6f\x2f\xa5\xe5\x77\x3f\x0c\x02\x91\x4b\x8f\x41\x01\x80\xc6\x33\xc5\x00\xef\x84\x04\x56\xc3\xc5\x10\x60\x52\x63\x82\x0e\xe4\xc3\x10\x90\xcf\x28\xc3\xd2\x36\x0c\x5c\xe2\x5b\x81\xf4\xb2\xa5\x21\xdd\x07\xb3\x5b\x90\xab\x19\x0d\x01\x9c\x73\x0a\x72\xde\x40\xc2\x2e\x69\x33\x55\xfe\x0e\x8c\x61\xf4\x1b\x89\x66\x4d\x9a\x2d\x95\xdd\xf3\xfa\x21\x74\xfa\x36\x6c\xa4\xe9\x1e\x1c\x0d\x06\xff\xa7\xed\xfe\x87\xc1\x40\x8c\xc6\xe9\x9f\x50\x82\x80\xba\xd3\xf0\x06\xe1\x62\x98\xf9\x99\x70\x87\xfd\x2a\x38\x6c\xc6\x88\xe7\xa4\x4c\xa5\x9f\xef\x17\x35\x85\x3c\x95\xa7\x80\x20\x85\xf8\x62\xce\xc5\x46\x83\x1c\x1e\xdc\xca\xf7\x8b\x83\x6c\x9f\x17\xd5\x6d\xce\xd6\x57\x58\x38\x15\x16\x3b\x82\x91\x5e\xd4\xa8\xb8\x41\x17\x57\x98\xbf\x35\x63\x2f\x4d\xba\x9d\x4d\x09\xe4\xcf\x5a\x50\x4b\xa9\x54\x9d\xdd\x6a\x35\xea\xec\x36\x03\xca\x64\xbd\x3b\xb6\x9c\x64\xf1\xac\x05\xc8\x99\xcc\x92\xbd\x18\x18\x97\x7a\x7d\x97\xdb\x6c\xb6\x7b\x93\x8d\x68\x66\xd5\xc0\xf1\x58\x1c\x47\xe9\x9d\xc0\xa7\xf3\x51\x43\xeb\x5a\x1d\x5f\xa8\xe1\x18\xaa\x17\x0c\x82\xd4\x0c\xf9\x32\x2b\x24\xf5\x52\xc5\x51\x35\x46\x6c\x78\x27\x36\x84\x28\xdf\x48\xac\xd8\x1d\xe4\x17\x94\x73\x3a\x95\x8f\x64\x04\xeb\x34\x58\x2e\xd5\x65\x9e\x22\x7c\xa2\x25\xff\x3e\xaf\x83\x03\x1b\xa2\x40\xce\xd6\x96\xd4\x6b\xdf\xae\xba\xc0\xe3\x92\x17\x8d\x60\xf9\xe4\x87\xda\x51\x26\x5f\xa1\xb6\x29\xa0\xbe\x54\x09\xb2\x5f\x0a\x5e\xb3\xe6\xf0\x8d\xc8\x12\x93\xce\x99\x9f\xc6\xe9\x2c\x7f\x10\x7a\x7d\x31\xec\x92\x3b\xd2\x9c\xfd\x1d\xf1\x87\x84\x2c\x9f\x64\x03\x3f\xc9\x5b\x30\xf7\x8e\xc8\x71\x3a\x14\x88\x58\x82\xeb\x5a\x66\x39\x75\x3c\x02\x8f\x0d\xa7\x41\xf2\x08\x39\x3d\xf6\xa4\xad\x21\xcb\xbc\xeb\x47\x62\x6c\x20\x53\x5a\xf8\x4c\x57\x29\x90\xb1\x68\xd9\xae\x92\x16\x2e\xd7\x55\xd2\xc2\x67\xba\x4a\x5a\x04\x3c\x57\x29\xaf\xe8\x5a\x75\x34\x97\x41\x8c\xbc\xfb\x06\x31\x28\xd7\xcc\x31\xf6\xa8\x55\xd4\x52\x52\x22\x77\x86\xb3\x11\x7b\x1a\x63\xda\xa3\xfc\xf0\x23\x2e\x4e\xa1\xd8\xcc\x65\xef\x45\x66\xe9\x2b\x5e\x74\x04\x34\xe4\x04\xc9\xbb\x46\xef\x66\x29\x97\x01\xd5\xc4\xbc\x69\xeb\x2d\x2a\xf0\x2c\x32\x46\xe7\xe8\x1f\x73\x44\x46\xc8\xba\x60\x36\xfd\x0b\x38\x2f\x97\x92\xe7\x7d\x46\x6f\x48\x60\x24\x19\x41\x81\x5e\xd0\xe7\x7f\x20\xb8\x88\xa9\x3c\x22\x64\xce\x24\x06\xff\x2f\x80\x8d\xda\x8a\x1b\x42\xe6\x25\xba\x46\xf5\x2a\xb0\xfc\xaa\xf6\xf1\xff\x02\xb8\x68\x8a\xf4\x18\x80\xa1\xe4\x2f\x94\xd3\x8e\x52\x0b\x5f\xa6\x00\xec\x96\xa5\xcb\xf3\x4b\x62\xcc\x03\x95\xdf\x84\xde\x18\xc5\x99\x68\x6f\x73\x0d\x90\x18\x45\xec\x71\xc1\x66\xcf\x7d\xff\x78\x37\x00\xb0\x19\x4d\xd6\x5d\x00\x88\x32\x20\xcb\x1b\x3a\xe7\xd6\x8a\xb2\xeb\x1a\x41\x2a\xf8\x4e\x8d\xfa\x6f\xf7\x28\x97\x6c\xb5\x74\xcb\x3d\x04\x40\x7d\x39\xcf\x1a\x8c\x0e\x68\xf7\x48\xfc\xd4\xee\x85\xd4\xc7\x2b\xc1\x73\xa9\x27\x11\xea\x59\xee\x0b\xeb\x93\xf3\xbe\x2f\xed\xd4\x24\x9e\xd1\x11\xeb\x3c\xb7\x0b\x7a\x91\x7e\x6e\x66\x7c\xd1\xf3\x20\xd8\x96\x7e\x83\xd8\xbc\xe6\x1b\x68\xbf\xc2\x1a\xae\x22\x4c\xba\x7b\x27\xf3\x36\x4a\x44\xd7\x40\xd9\x33\x52\x95\xd6\x1a\x5a\xef\x7d\xc6\xd1\x14\xe4\x76\xfb\xcb\x5f\xaf\x24\x8f\x09\x2c\x40\x57\xea\xce\x62\xcf\x32\x92\xc0\xc8\xe8\x94\xce\x16\xa0\x75\x3a\x69\x92\xdf\xa2\xe9\xac\x96\xb4\xc5\xbd\x98\x71\x18\x18\x2f\xf1\x55\xe7\x09\x46\x3b\xc0\x07\x68\xa7\x42\xc0\xae\x73\x8e\xba\x61\xb3\xea\x61\x27\x99\xcd\xf9\x0b\x69\xb9\x07\xbe\x99\xa9\x3b\x0c\x79\xef\xb7\xea\xfd\x73\x0e\xbe\x51\x6e\x4b\xa4\x32\x3c\x5e\xa6\xab\xaf\xf2\x97\xc1\x31\x4e\x31\x0b\xcb\x63\xda\x46\x97\x97\x73\x96\x3b\x28\x6b\x80\x1c\x94\x56\x68\x12\x94\x55\xab\x24\xf9\x65\xb3\x57\x7a\x2d\x46\xee\xec\xe3\xf6\x08\x9e\xbf\xb0\xbe\x4f\x55\x60\x95\x8a\x8e\x04\x29\xdb\x19\xec\x96\xa8\x30\x15\xf5\x2e\x70\x19\x47\x8f\x18\x49\xe3\x10\x41\xdd\xfa\x2d\xdc\xba\x5b\x11\xf9\xaf\x4d\xbb\x37\x0c\x1d\xd8\xdb\x4b\x0f\xde\x26\xa8\xc7\x6e\xbd\x0c\xab\x2e\x51\xbc\x85\x17\x59\x5b\x44\x11\x47\x39\x69\x48\x94\x14\xf2\x96\x3a\xcc\x30\xb3\x2f\x54\xdb\x1b\x14\xed\x64\xcf\x3d\x98\xd4\xe2\xa6\xea\x7e\x24\x76\x73\xe3\x9f\x93\xde\xad\x8a\xb3\x14\x1e\x2d\x06\x59\xcc\x3f\x9a\x76\x8a\xb6\x0e\xa7\x57\x5f\x87\xf5\x1a\x12\x69\x3f\x37\xa4\x0c\xb7\x84\x7b\x81\xe4\xaa\xdc\xdb\xc3\x22\xf0\xc5\xc8\x5a\x07\x86\xa4\xcf\x56\x43\xc1\x51\x07\x2f\xd6\x1d\x56\x88\x8d\x82\xfe\x70\xd8\x9f\x7d\x0d\xb4\x83\x4b\x5c\x34\x68\x56\xc3\x11\x4a\x0f\x3f\x90\xc3\xb1\xbc\x63\xb2\x83\xc0\xad\xfd\x08\xed\x35\x18\xe9\x8a\x40\x9e\x45\xe7\x6b\xed\xd1\x27\x66\xef\x28\x87\xe7\x0c\x35\x44\x7a\xa8\x00\xdd\x38\x26\x49\xbc\x6b\x97\xe5\x46\xf4\x44\x16\x73\xdb\xf7\x9b\xb9\xc1\xee\x21\x0a\xb1\x5d\x5f\xe6\xb1\x5c\xda\xa3\xeb\x6c\xe5\x60\x27\xd7\x2f\xa9\x86\x38\xd7\xbe\x67\x86\x50\xe3\xbc\x71\x45\xa3\xbc\x8f\x8e\x4d\xba\x71\x3c\x93\xfb\x0e\x65\x4c\x76\xe8\x66\x66\xb9\xc3\xfb\xef\x53\x9b\xd6\x09\x50\x8b\x21\xea\x02\xd0\x49\xb6\x8f\xe1\x5c\x8b\x11\xb2\xc2\xd6\x26\x77\x96\xb3\xbf\x10\xf7\xb7\x4c\xfc\x1c\xe8\x10\x78\x9d\xd2\xa0\xcb\x06\xb1\x89\xdc\xcd\x6a\x3f\xab\x87\x42\x2e\xcd\x5a\x79\x23\xdb\xa1\x6f\x6b\x5c\x73\xbb\xef\xb6\x3d\xf4\x3a\xd3\x0c\xbc\x6f\x90\x16\x25\x9f\xd1\xbb\xeb\xe8\x43\x8a\x60\x68\xd6\x74\xd8\xb7\xfc\x43\x65\x47\x56\xe0\xd9\x31\xef\x8e\x6f\xa8\xde\x52\xec\xda\x2d\x87\xcc\x23\x40\x6f\x09\x46\x74\xb6\x58\x4f\xb3\x76\x7a\xae\xda\x3d\x73\x24\x77\x7d\xe2\xb7\xed\xbf\xd3\xbc\xf7\xf6\xd0\x6e\xd9\x67\x94\x19\x03\x8a\x40\xdf\x2d\x81\xe2\x58\x0e\xf4\x03\x65\x0b\xb1\xe8\x1a\xa3\x9b\x83\xd6\xcb\xc0\x1f\xfb\xb1\xe2\x9a\x58\xbc\xbe\x37\x96\xfe\xa7\x66\x97\xb8\x96\x92\xf4\xaa\xdb\xec\xa8\xbd\x50\xbe\xf6\x3d\x58\xe7\x05\x5a\xef\x9b\xe5\x4d\x94\x6a\x2f\xe9\xe8\x6a\xe3\x87\x84\xd2\xf9\xec\x43\x63\x1b\x28\x8d\xb4\x01\xa1\xb9\xb8\x53\x2c\x47\x9b\x21\x2d\x4a\x00\xc8\xb5\xe3\xc2\xe5\xea\xab\x58\xa3\xf4\xd8\xd0\x7c\x6c\xad\xb5\xd6\xe3\xc0\xf5\x1e\xa6\xd4\x26\xbc\x1b\xb2\x21\x96\xf6\x81\xdd\x49\xec\x10\xec\xa3\x7d\x70\x08\x5d\x7f\x40\xac\x24\xe8\x26\x79\xd6\xd0\xd9\x6f\x54\x6c\xc5\x6f\xe6\xb3\x9a\xc2\xea\xc0\x9a\xa3\x28\x54\x6c\x43\xd2\x77\x22\xdd\x23\xd8\xa0\x26\xb1\xa7\x55\x18\xac\x41\xb3\x09\x41\xd0\x06\x19\x8f\x1c\x64\xcb\x7c\xde\xd4\x43\x92\x4f\x11\x9f\xd0\x6a\x08\x66\x94\x71\x90\xcf\x60\x03\xa7\xca\x63\x81\xbb\xef\x47\x35\x1e\x5d\xc1\x8b\x5a\xec\xde\x7c\x0a\x6f\x5f\x88\x91\xe1\xdf\xd0\xf0\x68\x20\xab\xd4\x35\xaa\xdf\xc9\xd1\xb3\xe1\x77\xb9\x9a\xc7\xab\x79\xcd\xf1\xac\x96\x32\x3f\xac\x2a\x65\x02\xfb\x12\x93\x2b\x19\x72\x03\xce\x39\x7d\xdd\xd0\x11\x62\xec\xbf\xe6\x48\x92\x85\x38\x5a\xca\xd7\x5c\x73\x1d\x2c\xca\xc9\x34\xa7\x9e\xc8\xff\x87\x68\x41\x6c\xd1\x8e\x74\xcc\x3b\x48\xeb\xd6\x83\x55\x85\x2a\x01\xe5\xa0\xe5\xe5\x32\xdb\x51\x25\x22\x8d\xf2\xec\xce\xdc\x56\x0b\x30\x84\x11\x18\xaa\x86\xce\x40\xce\xc4\xe9\xe3\x77\xbd\xf6\xa1\x52\x94\xbf\x74\xc7\xde\x77\x78\xf4\xca\x52\x1a\x81\x3a\x02\xd4\x79\x4b\x0d\x22\xde\x3a\x1c\x9f\xd8\x27\x0e\x0e\x88\x6d\xcd\xd5\xae\x46\x1d\x1b\xf8\xb5\x7e\xb0\xc3\x19\x77\x6b\x1e\x75\xcd\xcc\x3b\x83\x88\xb8\xbc\xee\x42\x2d\xac\xb5\x82\x35\xc7\x55\x8f\xb5\x7d\x40\xe7\x56\xc1\xc4\x21\x75\xda\xac\x7e\xdb\x13\x56\xef\xd3\xad\x3d\x10\x2a\xa3\x34\x19\x80\xe9\x2b\xc7\xdd\xf9\xe2\x56\xc9\x6b\x0e\xf3\x55\x5e\x0f\x27\x90\xbd\x86\x2b\x5f\x93\x1b\x65\x39\x41\xc6\xa7\xa1\xf1\xd1\xe2\xa7\xbc\xc2\xf2\xf5\x4f\xbf\x5b\x6c\xa7\xac\xd7\xdc\x4b\x1d\xee\x4c\x6a\x48\xd1\x25\x6d\x50\x6b\x55\xad\xac\x1d\x8d\x5f\x03\xb5\x51\xa4\x58\xd4\x1e\xcf\x55\x9b\xa8\x42\xb2\x6f\xc0\x8b\xfc\xb1\xd9\x8f\x09\x54\xa2\x5f\x57\x11\x2a\x05\xbd\x35\x0f\xf5\x55\x19\xc7\x72\x4f\x3a\x3c\x9c\x33\xc4\x1b\x38\x73\xac\xd3\x43\xaf\x73\x5b\xbd\x2a\x96\x25\xf4\x4e\x14\xa7\xd4\xcf\x90\x54\x35\x6a\xa2\xc1\x15\x75\xd7\x92\x03\xb0\x40\x1c\x23\xc3\xdf\xfc\xb4\x38\xab\x24\x7e\x1c\x68\x84\x3e\xb8\xc1\xbf\x41\x15\x8f\x42\x7b\xc2\x42\xf2\x79\x9f\x64\x00\x5e\x99\xe6\x52\x22\x9d\xba\x5e\x60\xe9\xa6\x9c\x8d\xa2\x40\xb1\xe6\xe8\x3f\xe3\x0a\x69\x74\xfb\x1f\xdd\x7a\xbe\x7b\xb4\x7c\x1c\xcb\xb7\x55\x36\x95\x7a\xd1\x43\x9b\x34\x55\xf1\xef\xf3\xe9\xec\x2d\xd5\xe3\x7a\x34\x43\xb5\xd5\xc3\x49\xad\x2d\x90\x7a\x1e\x64\xa0\x3e\x24\x94\xa7\x7e\xd2\x81\xdc\xbb\x07\xf2\x06\x2d\x33\x0f\x8a\x8b\x09\xbd\x46\xcd\x99\xa2\xc1\x3d\xd6\x68\x5d\x05\xaf\x83\x05\x3b\x9e\x67\x47\xe9\xcd\x71\x4e\xda\x65\xcc\x96\x79\x17\xaf\x56\xc9\xa3\xea\xf5\x56\x94\xef\xb4\x4c\x67\x6b\x24\x06\xdf\x4b\x9b\x09\x73\x2a\x94\xdf\xf2\x66\x8e\xbe\xfd\x68\x66\x27\x59\x37\xfd\xfe\x5c\xfd\x6e\xd1\x8a\x19\x3b\x30\x89\xbd\x62\x74\xe6\x5d\x54\x3b\x10\xa6\x41\x22\xf5\x77\x2d\x89\x2e\xcb\x92\x16\x22\x5f\x10\x83\xcf\x9f\x01\x87\x17\x7e\x5a\xb6\xb7\x47\x8b\x56\x26\x96\x11\x3c\x5a\x4d\xd8\x9d\x8a\x29\x4d\xbc\xdb\x4b\xef\xa1\x32\xd5\x06\x34\x67\x55\xb6\xe3\xbf\x2c\xc6\xd9\x31\x2d\x68\x33\x9b\x40\x52\xee\x0e\x86\xf1\x21\xed\xed\x99\x49\xf8\x96\xa3\x6e\xbb\x39\x09\xf1\x35\x33\x0e\x11\x4c\x07\xc7\x16\xb9\x24\x0c\x1c\x25\xe1\x45\x23\xf8\xe8\x03\xbd\x56\xac\xf3\x66\x2e\x67\x05\xe3\x74\x26\x0e\x5e\x38\x56\x71\x9d\xc5\x06\xcd\x86\x29\x97\x83\x3c\x15\x6b\x91\xa2\x9c\x66\x3a\x96\xa8\x60\x92\xcf\x7b\x9d\x28\x0e\x72\x52\x1e\xf9\xba\x55\x7b\xb0\x04\xfe\x50\xdd\xc7\x20\xad\xf9\x9f\x44\x4e\x96\x65\x77\xc4\x5c\xe8\xd6\xe8\x1a\xd5\x40\x61\x36\xd6\xf7\xc6\x67\xa4\x42\xb7\xdd\xd7\xcb\x11\x87\x05\x49\xa8\x22\x2b\x4b\xd3\xb0\xf2\x1a\x2b\xfa\x3e\x38\xda\x2d\x4b\xac\xe6\x00\xbb\xd7\xd5\xef\xf1\xc1\xd1\xc7\x9d\x88\x56\x05\x66\xc7\xa9\xdd\xf6\xca\xc6\x00\x64\xfb\xd0\xe9\xb1\x4d\xce\x0e\x9f\x0c\x3b\x65\x0f\x9f\xe4\xea\x6e\xd9\x28\xd1\x74\x86\x7c\xda\xe7\x64\x28\x18\xe4\x24\x5b\x2e\x37\x3b\x1e\x25\x92\xf5\x3c\x9f\xf1\x7a\x54\xef\x5b\x72\x00\xec\x25\xbb\xd1\xc5\xd8\xc7\x2c\x02\x8f\xe3\x4f\x5f\x86\xd1\x0c\xcb\x74\xf7\x9f\x00\xae\x36\x48\x1d\x02\xe7\x66\xe4\xf2\x11\x8b\x87\xef\xab\x68\x50\x68\x6f\xed\x45\xea\xe1\x6d\xe8\x1e\x57\x13\x66\x13\x5b\x42\xd8\x62\x6b\x43\x6f\x64\x6c\x84\x82\x49\x93\xbc\xb7\x34\x05\xdf\x48\xed\x16\xd8\xe7\xf1\x37\x4f\xb1\x67\x3a\xed\x59\x1c\x7d\xec\xe3\xbe\xd8\xe9\x30\xf6\x28\xa6\xc1\x8d\x3f\xeb\x09\x3d\x17\xba\x0f\x7b\xb4\x42\x35\xf2\x8c\x27\xac\xe5\x3e\xe4\xd1\xb5\x7a\x9e\xed\xf4\xdf\xfe\x78\x37\x35\xbd\xaf\xc0\xa2\x9e\x92\x57\x90\x05\xed\xc0\xc6\xec\x46\x07\xbf\xb5\x4b\x9b\x0e\x8e\x4b\x57\x41\x8e\xc7\x99\x9e\x4d\x30\x94\xb6\x1a\x6d\x10\x3f\x17\xdb\x6d\xf0\x7e\xe7\xed\x57\xdf\x06\xf0\x1e\xc7\xb6\xef\x83\x56\xbe\xf0\x32\x21\xb4\x94\xad\xc8\xbd\xfa\x37\xcf\xda\x74\xf7\x2d\x45\x4e\xa5\x19\xdd\x90\xe7\x53\x21\x95\xa0\x65\x17\xbb\x48\x67\xb0\xcb\x47\x19\x92\xde\xfa\xf7\x80\xc7\xaa\xd5\x92\x7e\xa3\xa2\x4d\x2a\x12\x02\x39\x6f\x58\xd1\xb6\xa9\x5d\x76\xea\x68\x5a\x1e\xd5\xf1\x4d\x75\x58\x40\x11\x52\xad\x0f\x1c\x80\x65\x97\x93\x76\x8f\x30\x8f\x89\x12\xdc\x83\x17\x7d\xa4\xc3\x49\x17\x98\xa5\x60\x78\xad\x5c\xb8\x80\xcc\xbe\xb1\xb1\x66\x4d\xb8\x3a\x5e\x47\x2d\x87\x8e\xd3\x88\xae\xf0\x06\x72\xe9\x21\x37\x07\x03\x10\x34\xe8\x8f\x3c\x17\x23\xce\x86\xf1\x3c\x1e\x44\x51\x89\xcc\x43\x52\xe9\x93\x4b\x8e\x1a\xfd\xac\xdc\x14\xb9\x98\x73\x4e\x89\xbc\x8c\x12\xe3\x58\xd3\xce\x35\xaa\xe9\x08\x0b\xc1\xb4\xbd\xab\x2e\x58\x8d\x2b\x69\xd0\x77\x46\x40\x7e\x57\xcd\x1b\x25\x96\x7e\x37\x18\xe4\x46\xb3\xd5\x35\xb6\x09\xbb\x08\x02\xbe\x2c\xd5\xed\x71\x07\x9e\xf1\x47\x79\x31\xb8\xfa\x0f\xfd\x3a\xa0\xdc\x0e\x62\x2a\xf9\x40\x5e\xf2\x4e\xe4\xb5\x29\x78\x00\xac\xde\xcd\x7e\x9d\xf3\x00\x54\x4b\xc7\xeb\x71\x3f\x83\xd6\x21\xc3\xa1\x7e\xa0\xef\xfe\x7b\x15\xb0\xdd\x2b\x70\xfb\xf4\x4f\x1a\x2b\xbc\x92\x61\xb7\x55\x74\x99\x34\xdb\xa1\x5b\xc4\x22\xa1\x5e\x94\x16\x66\x13\xfc\xb0\x30\x91\x9b\x66\x5b\xd2\x89\x06\x13\x5e\x39\x1b\x76\x52\xd1\x4b\xaa\xe8\xe5\x9d\xe3\x67\xa3\x4f\x19\x67\x6e\xa1\x4d\xd4\xcb\xb1\xbc\x3b\xd8\x09\xe9\x30\xee\x77\x4f\x6e\x89\x98\x23\x10\x60\xc5\x79\x99\xf1\x1d\xf3\xa1\x22\xcc\xed\x8a\xae\xe2\x31\x36\x58\x48\xb4\xed\x42\xb2\xd5\x0b\xc9\xb6\x58\x48\xe6\x2d\x24\xb0\xf7\x00\x36\xd0\x0e\xf3\x02\xed\xb8\xd7\xff\x36\x6f\x83\x45\x67\xeb\x17\xdd\xf6\xa4\x74\x56\x81\x3d\x8c\xc2\x5f\x85\x11\x6c\x7b\x8c\xe0\x3d\x76\x09\x7c\xb5\x5d\x02\xef\xb1\x4b\xe8\xe2\x54\x2c\x26\xc4\x32\x0b\x62\x47\x4a\x3c\x09\xbc\xf5\x44\xa2\x48\xfe\x64\x21\x10\x0f\x18\xe9\xa8\xfa\x02\x6d\xf9\x0a\x23\x9c\x50\x65\x1e\x69\xa9\x57\x7b\x6e\x06\xb4\x22\x5a\xa4\xe1\x99\xfb\xe3\x93\x05\x73\x03\x20\x6e\x0f\x71\x1f\xe5\xb7\x8c\xbf\x2b\x8f\x85\x7f\x76\xb3\x5b\x33\x13\xa3\x91\xbc\xbc\xd4\x8e\xbe\xdf\xe8\x8c\xae\xf6\xd3\x54\x59\xa3\x00\x6d\x8b\x79\x5e\x6a\x27\x90\x3d\x13\xbd\x74\xac\x59\xf1\xe5\xe5\x1a\xcd\xaf\x28\xe1\xb5\x75\xcf\x2b\x61\x3b\xb2\x47\x32\xd3\x94\xa1\x31\x2c\xbc\xd2\x6c\x99\xfb\x29\xf7\xbb\x44\x33\xef\x48\xdb\x86\x37\xbf\x4a\x8b\x18\xe7\x70\x37\xb4\x02\xcf\xf5\xee\xa8\x40\x2e\x4d\x84\x5b\x98\x98\x2d\x39\xa5\xea\x1a\x4a\x53\xf9\x4a\x3a\x83\x9b\x42\x9e\x82\x67\x34\x79\xf5\xea\xd5\xab\xe4\x6f\x7f\xfb\xdb\xdf\x92\x9f\x7f\x1e\x4e\xa7\x4a\xc1\xd7\xc6\x75\x94\x7e\xca\xda\x08\xc3\xfb\x20\xa1\x24\x91\x97\xc9\x89\x72\x56\x56\xc9\x7c\x49\xf2\x77\x82\x68\x7f\x17\x5a\xb5\xd1\x06\x53\x6b\xd1\x4d\x3a\x0d\x6c\x3d\xe4\xd9\x08\x0d\x3e\xc2\x29\x6f\x7d\x96\x87\x56\xa6\x4e\x6f\xec\x8e\x45\xef\x07\x1f\xa5\x10\x2d\x17\x49\xe2\x62\x9f\x84\xba\x6e\x89\xc4\x51\x68\x1a\x16\x0d\xf5\x5e\xda\x89\x76\xbb\xe4\x5a\x4b\x5f\x0a\xf3\x79\xe7\xbe\xd3\x1b\x77\x0f\xfd\x6e\x09\x11\x57\x84\x42\x2e\xaa\xb6\x6f\xb6\x13\x6c\x9f\x2c\xa8\xf8\x19\x39\x25\x6f\x68\x5d\x5f\xc0\x3e\xda\x1d\x02\xd4\x13\xd9\x4c\x55\xf7\x29\x84\xe2\xf6\xbb\xf6\x40\xd6\x2c\xa0\xd1\x95\xb6\x08\x7d\x6b\xd2\x0e\x18\xe2\xf3\xd9\x57\xb5\xe3\x91\x98\xb9\x2a\xbc\xac\xbc\xbf\x34\xc1\x01\xf3\x8d\xa2\xdf\xaa\x2a\xdb\xc6\xbe\x55\xb5\xb6\x89\x7c\xab\x6a\x98\xb8\xb7\x26\xac\xf4\xfa\x1a\x6d\x00\x72\x15\x95\x76\xc6\x17\xd2\xc4\xb1\x3f\x2a\x6d\x0b\x25\x90\xeb\x0f\x37\xac\xed\x8c\x2f\x5e\x78\xd1\x3d\x37\x8b\xb6\x2b\xa3\x25\xbf\x88\x84\xdc\x95\x05\x5e\xc2\x75\x0d\x86\x21\x77\x65\x7b\x2f\x63\x71\x77\x67\x7c\xf1\xdc\x46\x0f\x5d\x1f\x77\x57\x36\xf4\xdc\x0d\xbe\x6b\x5a\x31\xa1\xbc\xfb\x1b\xf2\x96\xc1\xb4\xe5\x55\x03\x99\x13\x9b\x28\x88\x5e\xe0\x1c\x1a\x5e\x30\xd8\x6e\x94\x59\x0f\x2f\x33\x73\x11\xd0\x06\x8d\x75\x56\x29\x08\x1a\xcb\x30\x47\xda\xe8\xd9\xf0\xff\xd9\x70\x75\x37\x6e\x1c\xdf\x6e\x57\xb1\x75\x0c\xfa\xf4\x8b\x6c\xde\xb1\x13\xc0\xb7\xa7\xdf\x97\xab\xe2\xf7\x7a\x25\x36\xef\xb5\x8d\xdc\xab\x4c\x24\xfd\xb0\xbd\x7e\x99\x9e\x61\x3d\xef\x8d\xd9\xdb\x66\x6f\x3e\xa0\x76\xc7\xf6\xf5\xe7\x63\x58\xac\xcb\x36\x0a\x7d\xdb\x6b\x6a\xe8\x38\xaa\x0b\x58\xd7\xf4\xe6\x84\x50\xb2\x98\xd2\x39\x3b\x91\x26\x4d\x8e\xf7\x86\x58\x36\xc8\x8a\x59\x43\x67\x29\x18\x4d\xd0\xe8\x4a\xba\xe2\xb8\xa6\xb8\x72\x38\x39\xa6\xa2\xec\x77\x39\x77\x8f\x17\xf0\x70\x35\x0c\xfb\x1b\xc7\xae\x68\xa9\x10\x17\xa2\x85\x9e\x47\xc3\x08\xbb\x25\x42\x58\x1e\x65\xcb\x6c\x93\x63\xcc\xb9\xbd\xfd\xaa\x67\x18\x1e\x51\x32\x04\x52\xd9\x88\x6b\x2c\xa8\xce\xb8\x5e\xcc\xf8\x44\x86\xf5\xe9\xe7\x79\x8d\xf3\xfe\x2d\x2e\xb9\x45\x4f\x46\x09\xef\x76\xe8\xa8\x17\x55\xd7\x20\x07\xea\x8e\xfa\x53\x83\xaa\x4f\x68\x81\x40\xe6\x38\x84\x07\x15\x6e\xd0\x88\x47\xab\xa9\x2c\x25\x4d\x6c\x00\x73\x89\xca\x07\x98\xcc\xe6\x5f\xd2\xfe\xf7\x2d\xba\xe5\x2f\x30\xaa\x2b\x37\xdc\xd5\x43\xad\x18\xfe\x25\x75\xb5\x96\x1b\xcd\x93\xa3\x5b\x0e\x1b\xf4\x25\xe3\xb2\x88\xa9\x9e\x34\x08\xfe\x8e\x33\xad\x2b\xd4\x1c\x1a\x77\xb2\x07\x72\x4b\xfe\x93\x86\xbf\x9d\x33\xd4\xac\x16\xd0\xe7\xf2\xd6\x71\xfb\x50\x36\x6b\x2c\xd0\x56\x06\x14\x0f\x02\xd8\x28\x51\x42\x99\x72\x55\x0d\x9d\x55\xf4\x46\x2b\x09\xee\x29\x75\x8b\x39\x3d\x96\xc4\x1d\xb7\xe3\xd1\x7e\x82\xbf\x4c\xfc\xcd\x87\x38\xee\x3f\xa9\xeb\x8d\x1d\xf6\xfb\xae\xeb\x17\xfa\xf2\xbf\xbf\xed\xf3\xf9\x74\x0a\x9b\x45\xda\x7d\x84\x15\x55\x3a\xf7\xb9\xdc\x27\xda\x96\xe2\x7f\x26\xa8\x41\x29\xcf\xef\x1c\xc7\xd2\x9e\xa7\xc5\xc5\x0c\x0d\xad\x74\xcb\xc0\x32\xcb\x59\xd7\x14\x82\x64\xc7\xa4\x18\xd1\x39\xe1\xc3\x41\x4e\xb7\x6a\x5a\xa2\x89\x68\x16\x77\x9b\xa5\xd9\x31\x35\xcd\xee\x04\x91\xcc\x99\x71\xbf\x82\xb4\x27\x79\x06\x72\xac\x9c\x46\x3b\xee\xe5\x7d\xd0\xcd\xe0\x08\xbd\x13\x45\x37\x80\x9e\x85\xd3\x9d\x8c\xa5\x1e\x3c\x7a\xd3\xf1\xd5\xf3\x55\x6f\xe2\x44\xff\x6a\x3f\x59\xc6\x79\x08\x9e\x5f\xa3\x66\x41\x09\x02\x56\x1a\x1c\x02\xb0\xcc\x59\x69\xef\x58\x55\x48\x7e\x42\x9b\x29\xac\xf1\x6f\x86\x38\xe4\x24\xdb\xf1\x23\x04\xf8\xe5\xb5\x5b\xf1\x2c\x47\x25\x2a\x18\x6d\xf8\x4f\x0b\x47\xd6\x02\x39\x70\x44\x4a\xee\x01\x0d\x65\xd6\x57\x8d\xff\x66\x35\xee\xc4\xd5\x12\x1f\xcf\x10\x8a\x5b\xcd\x6d\x04\x37\xf6\xf6\x48\xe8\xfc\x12\x65\x39\xf1\xb4\x1f\x27\x55\xd5\x6b\x43\x11\x77\xf5\x1d\xf8\xf4\x3e\xb5\x03\xdb\x31\x77\xd9\x24\xbc\x2c\xb4\xa7\x89\x16\x04\x7a\x9f\xdf\xd9\xc8\x29\xde\x1d\xa1\xed\x42\xea\x96\xb5\xa3\x76\xd3\xe6\x90\x38\xc8\x10\xdb\xfb\xcb\x95\x54\x03\x56\x55\xca\x62\xe6\x20\xd6\x19\x7a\xe0\x51\x2c\x36\x9f\xf8\xeb\x50\x7b\xe8\x7a\x57\x05\x6b\x62\xe0\xf6\xad\x72\x78\x95\x70\xd6\xbe\xf9\x73\x5c\xe8\xb6\xc1\xa0\xc1\x37\x76\x90\xfa\xd9\xaf\x8e\x76\xe3\xc4\x88\xde\xc8\x16\xdf\x7f\x8b\x17\x6d\x73\xb5\x4b\x7b\x55\xb4\xf3\x54\xf9\x2c\xb2\xf7\x3d\x27\xf4\x1d\x6f\xb1\x8e\x42\x4e\x64\xa4\x3c\xb7\xfe\x8d\x62\xfe\x01\x45\x99\x30\x46\x5f\xa4\x89\xa3\x88\x47\xf2\xae\x4b\xc5\x30\xd2\x21\x8f\x85\x28\xf7\x06\xb6\x63\x8c\x5d\x48\xb8\xb4\x99\xa7\x5b\x10\x38\x25\xf6\x67\x8b\x54\x60\x9f\x38\x0b\xbb\x06\xb9\xf2\xdd\xa3\x9d\x6e\xf7\x47\xae\xfc\xb9\xb2\xf5\x15\x2f\x61\x57\xac\xa9\x10\x2c\x53\xb2\x6a\xdb\xac\x00\xe4\x84\xde\x28\x01\xf6\x35\x1e\x5d\xb9\xc6\xae\x11\x13\xae\x4e\x1c\x05\x2d\xfa\x4a\x08\x87\xd4\x48\x11\xd6\x68\xb0\x8a\xbe\x1d\xd5\x7f\xde\x3b\x0e\x3a\x52\xe6\x42\x2c\xa2\x5e\xee\x3f\xec\x83\xb7\xef\x05\x66\x27\x64\x91\x82\x9b\x09\x15\x1b\x58\x9e\x2d\xc1\x43\x5e\xa6\xc2\x51\x7b\xcc\xc9\x3b\x75\x62\x90\x36\x43\x19\xe0\xb5\x84\x91\xe9\x1d\xf3\x97\x06\x12\xae\x60\xb4\xd1\x6d\x61\x07\xac\x91\xab\xc2\x4b\x63\x38\x41\xba\x26\x80\xa7\x4e\x78\xc7\xf2\xfd\xc7\x08\x50\xd5\xd8\x7b\x03\x85\xf4\xc2\x8e\x96\xfe\x3b\xfe\x7b\xb3\x03\x0e\x17\xe4\x60\xbe\xe1\x12\xe8\x72\x87\xa9\x43\x1c\x5b\xac\xed\x43\x7a\xc4\xff\x1b\xa3\x1b\xc1\xc6\xb8\x43\x73\x1b\x8d\x9c\x24\x0e\x45\xdb\x58\xfa\xf2\x02\x19\x7c\x5d\x65\xc6\xb6\x32\x87\x36\x7d\x57\x51\x9e\xba\xd7\x32\x6f\x63\x91\x9b\x62\xb6\xeb\x6f\xfb\x02\x37\xa1\xdc\xbf\x70\x73\xc2\x64\xba\x6c\x19\xf8\x06\xec\xa3\x58\xf0\x26\xcf\x7e\xd4\x20\x61\x34\xd8\x86\xc2\x9c\xb6\x84\xf1\x14\xb5\xe5\xa2\xb1\x83\x1a\xb3\xaf\xfb\x1c\xba\xbd\xf7\x6f\xdf\x09\xa9\xd0\xec\xd7\x6e\x8a\xde\x77\xe6\xc2\xd3\x8f\xab\xda\x06\x0f\x9b\x49\x23\x26\xc7\x19\xb7\x68\x4a\xf0\x89\x9b\xbc\x76\x3e\xa9\x2a\xe7\xb5\xd1\x66\xbe\x92\x54\x51\xfb\x84\x67\xdd\xc3\x21\xd1\x85\x79\xb6\xfc\x92\x8e\xae\xe8\x7c\xb3\x87\xd8\x8f\x32\xb4\xdd\xcd\xc6\x36\x81\xcc\x80\xf9\x44\x23\xdf\xaa\x21\xde\xf9\xde\x7b\x72\xd7\x41\xcf\x72\xfb\x40\xa5\xc6\x07\x50\x5f\x08\x57\xdf\xff\xcf\x03\xc3\x3b\x76\x1e\xbf\xc8\x00\xb1\xf2\x89\xca\xa7\x42\x45\xbf\x4a\x83\x4c\x71\x48\xcb\x17\xa3\xde\x93\x80\x76\xe7\x0a\x96\xe4\xd7\x99\x52\x43\xba\xd1\xd7\x5c\xa3\x99\x10\x99\xdb\x82\xef\x3f\x86\x71\x32\xda\xed\x61\x51\x3f\x6a\x8f\x18\xee\xa3\xc0\x08\x27\x5a\xbb\x33\xfb\xce\xc0\xdc\x99\xad\x19\x76\xd4\x2a\xc8\x35\xe3\xe9\x35\xd3\x71\x43\x56\x9b\xf0\x4d\xe7\x86\x04\xac\x9f\x75\x4b\x29\xec\x9c\x7b\x6b\x6e\x30\xe3\x1c\x99\x40\xa9\x9d\x85\x5f\x15\xeb\xce\x72\x06\xea\x01\x9c\x6b\x27\xb6\xcc\xd4\x6b\x09\xa4\xb9\xe7\xdd\xa3\x9d\x15\x33\x38\xda\x02\x55\x62\x30\x75\xe7\xae\x2d\xa6\x25\x4c\x55\x53\x26\x67\x9d\x2b\x17\x03\x8d\x80\xf3\x0c\x62\x13\x74\xd1\xa5\xc3\x13\x9a\x18\xf7\x2d\x7c\xac\xeb\xa0\x36\xe9\x98\xf8\x81\x0c\x87\xa4\x6c\xe3\x45\x91\xc0\xe4\xcc\x27\xf6\x20\x27\xf6\x88\x3e\x76\x46\x3e\x74\x2d\x98\x36\x02\x28\xd9\xe8\xaa\x46\x9f\x98\x2d\x49\xda\x44\xcd\xfc\x3b\x58\x79\xa9\x71\xae\xd6\x0a\x5b\xee\x78\x63\x6d\xf3\x43\x94\xc7\x2b\x08\x75\x54\x4d\xba\x52\x17\xb7\x9d\xa6\xd4\xaa\xad\xb4\xdc\xf5\xfe\x63\x8f\x6f\x22\xad\xa0\x79\xa0\xfa\xce\x65\xb1\x2f\xe7\x75\xad\x7c\x0b\xe8\xe2\xfa\x5b\x70\xdc\x62\x3e\x82\x2d\x97\x1c\x4e\x1b\x9a\xdc\x7e\xca\x68\xe6\xda\xb5\xa4\x39\xa2\xdd\x4f\xe3\x91\xd2\x3f\x3b\xdd\x14\xc7\x37\xa5\x75\x90\xe8\x7e\x1b\xcf\x88\x5e\x27\x2a\x8a\xc7\x70\xf7\x68\x99\xd3\x15\x3a\x46\x39\xc4\x83\x76\x23\x08\x49\x6e\x87\xac\xd3\x37\xd2\xcc\xc4\x57\x7d\x38\x9c\xc1\x00\xb4\xf0\x05\x49\xab\x27\xfd\xff\x2a\x64\x73\x0f\x56\xbd\x3a\x81\x8d\x34\xd9\x31\xfb\xc0\x3c\x12\x7c\x57\xad\x05\x70\x35\xe8\x52\x3f\xd6\xeb\x76\xd7\x5e\x9b\x6b\x92\x87\x11\x4b\x99\x0c\x00\x68\xd5\xcc\xde\xfb\x7f\xd2\xea\xa6\xed\xde\xd1\xfa\xe7\x31\x32\x0a\xde\x33\x72\x8d\xb9\x7c\xd9\xf0\x0a\x31\x16\xf8\xc5\x52\xa7\x24\xf8\x19\x2d\x12\x3e\x41\x0d\xca\x93\xb3\x04\x4e\x13\x36\x81\x0d\x26\x63\x91\x96\xb8\x4e\xa8\x34\x5c\x54\x4f\xfb\x20\x91\xcb\x91\xa4\x98\x78\xa5\x8c\x5f\x1c\x6d\x48\xb3\x0f\xb2\x44\x9c\x58\xc9\x82\xce\x13\x46\x93\x1b\x94\x8c\x20\x49\x2e\x28\x9f\x24\x23\x5a\xd7\xf0\x82\x36\x90\xa3\x84\x92\xa4\xe5\xcd\x81\xc3\xeb\x31\x6f\x8d\xd6\x3a\x2d\xec\x9b\x77\x1a\xf8\x4f\xf6\x22\x0b\xb1\x98\x6a\x84\x96\x77\x06\x66\x28\x77\x87\x40\x96\x39\x8e\xb8\x5d\xb6\x2f\x65\xcd\x03\x22\x6f\xdd\xf7\xf6\x2c\x72\x9a\x4d\x18\xf1\xc8\x2a\x65\x8d\x4e\xaa\x75\xc7\xea\x27\x3b\x22\x81\x9f\x61\x3d\xb5\xfa\xc9\x9b\x78\x81\x0d\x86\x63\x02\x17\x09\x1c\x84\xe5\x60\x27\xa2\x17\xe3\xd9\x1d\x18\x38\xcf\xdd\xfe\x97\x4c\xd8\x04\x3d\x5e\x66\xdd\x00\x00\x38\x3b\x66\xc5\x14\x36\x57\x27\x4c\xbe\x20\x1c\xa5\xd9\x10\x3e\x3d\xb2\x89\x6f\x10\xe3\x0d\x16\xec\x54\x9a\x0d\x6d\xc9\x06\x5f\xcb\x27\x1f\x79\x88\x6b\xbe\x0e\xb6\x47\x49\x99\x77\x1e\x2d\x88\x53\xdc\xd3\xe4\x87\xe4\xd1\xda\x8b\x6e\xc1\xbf\xa9\x36\x22\x9e\xb1\xbf\xb8\xc2\x63\x2b\xc6\x4c\x0e\xd3\x38\x71\x99\x40\xf6\x4b\x9f\x59\xa3\x36\xd3\xb4\xe5\x83\x00\x98\x57\x68\xe1\x86\x4a\xe0\xd9\x9d\x0e\xa8\x7f\x85\x16\xa7\xb4\x42\x41\x48\x48\x75\xf7\x00\x5c\x51\x94\xd3\xf1\xb8\x46\xfd\x41\xea\xda\x9e\xf3\x40\x70\xd2\x84\xb4\x37\x06\x5e\xbe\x4d\x50\x95\xf6\x6a\x40\xc1\xc8\x5c\x63\x29\xbe\xde\x5c\xbe\x9c\x07\xc6\x91\xed\x88\x5c\x18\xb6\xe1\xfa\x58\x30\xd8\x70\x0a\xbf\xb8\x33\xe8\xc5\xe8\x50\x62\x5c\x11\xd1\xd1\x89\xfb\xb7\x71\xcc\xbf\x9d\x8d\xd1\x5a\xc6\x4a\x5a\x29\x90\xc0\x39\x9f\x7c\x5d\x79\x64\x8d\x3b\xf6\x6d\xdf\xa4\x6c\xb5\x8b\x6a\x3a\x82\xf5\x39\xa7\x8d\x38\xe3\xe2\x65\xdd\x22\xca\x6a\xf7\xd4\x46\xfe\x0e\xf7\xda\xd8\x8b\x0b\x6e\x14\x6c\xf9\xa0\xd5\xd7\xbf\xc4\xe4\x4a\xed\x5a\xc5\x77\x6a\x8e\xf4\x1c\x71\x8e\xc9\x78\x8d\xd7\xf4\x4d\x35\x66\x2d\x23\xdb\xaf\x2d\x73\x78\xdf\x87\xf8\x2e\x57\x9a\x65\x29\x35\x3f\x96\x79\x8e\x34\xd8\x4f\x95\x57\x9f\x77\xb3\x0a\xf2\x87\xb4\x14\x95\xeb\xdf\x7f\x74\x0b\xb8\x53\x90\x79\xd2\x7a\x61\xde\x13\x3f\x26\x8f\xdc\x6c\x63\x14\x06\x67\xb4\xf7\x2c\xca\xbe\x46\x32\x58\x00\xc4\x44\x4b\xab\x64\x71\xcd\x5c\x48\x7e\x17\x9a\xca\xf4\xc5\x6a\x17\x5c\x5a\xe7\x78\x46\xd9\x31\xb2\xa6\x2e\xad\x97\xf1\x53\x91\x02\x72\x9a\xe5\xf4\xe9\x60\x6f\x4f\xaa\x9e\x98\xe4\xbc\x03\xa5\x54\x0b\x1c\x67\x86\x7e\x8c\xf0\x10\xa1\x81\xf3\xb8\xe6\x18\x4c\x15\x62\x0d\x01\xac\x5a\x27\xc5\x9b\xd1\x71\xd7\x71\x80\xe9\xc4\x78\x62\x3f\x6e\x1f\xe6\x98\xe5\xd4\x59\xb9\x63\xf3\xd4\x53\x39\xb3\xcf\x2a\x29\xe5\xcf\x0c\x34\xb2\xa7\x83\x55\xad\x2a\x72\x9d\x47\xe4\xa2\xa1\x1c\x28\x73\x1f\x0b\xad\x18\x13\x0b\x1f\xe8\xb8\xca\xb8\x55\x4e\x2e\xde\x7f\xcc\xa9\xbc\x83\xec\x11\xba\xd8\x7b\xf4\xd1\xdc\xc6\xaf\x7c\x09\xa6\xbc\x36\xaa\x95\x78\x73\xfe\xdf\xaf\x0b\x28\xbd\xe3\x74\x58\x2a\x16\xeb\x88\x09\x56\xab\x73\x47\x6c\x7c\x2e\x6a\x79\x5c\x5b\x9b\x85\x6a\xbe\xa3\x2c\xa7\xef\xd9\x8a\x41\xaa\x13\x52\x59\x5b\x05\xe3\x8b\xb0\x7c\xc4\x7a\x6a\x78\xa3\x1e\x62\xa6\x5a\xe4\x0b\x95\xc6\xab\xed\x1a\xf4\xcd\xee\xbd\xa0\x5a\x79\xfd\x6c\x0a\x58\x45\x43\x50\x47\x91\x1a\x1d\x84\x05\xae\x07\xc8\xf6\x12\xdd\x21\x0c\x3c\xdb\x41\x46\xc5\xfb\x26\xf4\xf4\xe2\xa3\xe4\x1a\x73\x2c\x67\x50\x31\x73\x03\x45\xe6\x68\x84\xcc\xbd\x42\x62\xf6\x4c\x5e\x69\xbf\xff\x98\x43\x01\x5a\x63\x0a\xae\x2d\xbb\xed\x56\x18\xc2\xf2\x53\x31\xab\xe7\xa3\xab\xf4\x53\x71\x23\xc9\x1d\xf5\xad\xfa\x96\x59\xee\xb9\x96\xce\xe3\x32\xd7\x27\xe9\xbb\x0e\x62\xc2\x52\xe8\xbd\xbe\xde\xdb\xc3\xbe\xd2\x38\x46\xd1\x0c\x59\xf0\xa9\x9a\x3e\x8c\x5d\xdc\x6d\x33\xe7\xc4\x00\xe2\x37\x54\x79\x85\x5c\x3b\x74\xaf\x94\x3b\x5b\xfa\xb0\x59\x7d\xfe\xbc\xcd\xac\x7c\x87\x13\x7d\x23\x1f\xac\x9e\xbb\x3b\x2d\x45\x08\xb7\x9e\xce\xfd\xc7\x1c\x0e\x67\xb0\xd9\x52\x2c\x63\xf4\x2b\xb2\x9b\x1c\xd0\xca\x0b\x98\xde\x53\x8f\xf5\xf3\x0a\x78\x33\xb1\xb2\x19\x53\x7e\x60\x9f\xdb\x7c\x4d\x89\x52\x3e\x28\x92\x8e\x37\xe1\xe2\xed\x04\x6a\x47\xc4\x6b\x1f\x01\x9a\xe7\x7f\xf7\x79\xe7\x26\x3f\xce\x54\x3d\xf7\x55\x9a\x02\xc3\x06\x3c\x95\xee\x7c\x07\x5f\xa6\xfe\x03\x26\x14\xd8\x98\xb5\xaf\x95\xbc\x3e\x83\x77\x4a\xc8\x7f\x15\xb5\xe3\x0a\x6a\x62\x44\x71\x27\x00\xde\x03\x1e\x0b\x3c\xb7\x6d\x9d\xa7\x9a\x77\xc2\x35\xb8\xe9\xed\x90\x8e\x36\x53\x41\x50\x72\x41\x61\x53\x1d\xb2\x09\x6c\xd0\x81\x96\x52\xfe\xb8\x2a\x08\xd4\x60\x28\xd1\xcb\x6a\xe4\x05\xaa\xd5\xf3\xb1\xf8\x3b\x53\xae\xae\x31\x51\x0e\x5e\xd7\x78\x2b\x75\x9e\x12\x72\x38\x46\x07\x47\x07\x97\xdd\x97\x7d\xf9\x8a\x52\x79\x62\xd3\x5a\xe3\xe4\xe2\x0a\x2d\xe6\xb3\xee\xc2\xf6\xf5\x73\x0d\xeb\xd4\xf3\xc3\x14\x69\x52\x96\x39\x6e\x1d\x70\x8a\xe4\x03\xe3\xcc\x4a\xf2\x26\x29\x60\xcd\x08\xe4\xe0\x10\x32\x86\x38\x3b\xc4\xd3\xb1\x5d\xd9\x19\x6a\x18\x25\x07\xe3\x06\x21\x52\xcc\xc8\x18\x98\x67\x7a\xf7\x6e\xaa\x41\x95\x6a\x68\x19\x83\x0f\x41\xb7\x7c\x13\xbf\x98\x56\xa2\xdc\x00\x40\xad\x87\xc8\x78\xa1\xf5\xc1\x4a\x56\x00\x36\xd2\xb6\x53\x66\x55\x88\x13\x75\x3f\x60\xb1\x4e\x9d\xde\xf2\xed\xa0\xe7\x2d\x55\x34\x29\x50\x0a\x56\xe8\xd7\xb9\x38\x12\x6a\x7a\xd3\x75\xa0\xee\xb5\x24\xb5\x41\x91\xf6\x5d\x42\xa3\x9b\x7e\xa2\x9b\x3e\x23\x11\x74\x7d\xd2\x9e\x02\xfd\x38\xdd\x16\x3a\x90\x7e\x5e\x9a\xe9\x26\x78\xec\x35\x2d\x21\xa9\xa5\xb1\x3f\xff\xdb\xe7\xcf\x1b\x17\x7e\xfa\xc3\xe0\xf3\xe7\xce\x0a\x74\x8b\x6f\x36\x68\x59\x54\xbe\x73\xcc\xb2\xe1\xea\x75\xed\xdf\xe0\x4e\xa1\xb8\xcd\x70\xb8\xc4\x0f\xdb\x44\xf1\x91\x6e\x49\x8b\xbe\xd6\x58\x23\x3b\xfe\xc9\xd6\x3b\x7e\x77\xfd\x72\x6f\x81\x41\xdb\xa2\x5b\x77\xbf\x47\x37\x89\x0f\xb7\x58\xc9\x38\xc0\x23\xab\xe9\xd5\xda\x9c\x54\xf5\x63\xf8\xb1\x18\xdc\x8a\x6e\xc2\xf2\x65\x59\xae\x87\xd0\x2a\xb8\x38\x0d\x6e\x4d\x0f\xfb\xe8\x55\x9c\x14\xaa\xf0\xc8\x1d\x72\x68\xd9\xe9\x75\xd4\xf0\x3b\x87\x1a\x6a\x0b\xec\x6f\xef\x12\xeb\xcf\x00\x0c\x13\xf0\xed\xfe\x7a\x60\xec\x7f\x0b\xf2\x04\x28\x76\x43\xd5\x91\xec\x08\x86\xb5\xca\x69\x37\x5e\xb4\xc1\xc8\x11\xa6\xea\x59\xda\xd2\x53\x2d\x3c\x9c\xf6\xbf\x05\xc9\xf2\xdb\x9c\x6c\xb0\x7e\x3b\x3d\xf7\xed\x7a\x2f\xa7\x42\xe6\x57\x3c\x53\xd7\xb9\x4b\x6b\x6d\x62\x5a\x1d\x12\xc5\xb4\x0f\x91\xf2\x11\x60\x23\x8d\x69\x0f\xe1\x02\xff\x1d\x1f\xe1\x29\x70\xbe\x68\x33\x34\xac\x26\x88\x99\x72\xdf\x60\x52\xd1\x9b\xa2\xd6\xbe\x0a\x8b\x49\x83\x2e\x4b\xc0\x0e\xc1\x7e\x3b\xc6\x7d\x20\x3f\x05\x6b\x27\x7d\xdf\xac\xab\x7d\x08\x64\x44\x11\x97\xb7\x99\x62\x36\x85\x7c\x34\x01\x59\xc1\x26\xf4\x26\x5d\xbd\x35\x1d\x14\xdf\x90\x04\x38\x35\x7a\x48\x81\x64\xc1\xd7\x71\xe0\xb6\xb9\x06\x31\xf4\x75\xed\x9d\xed\x62\x0b\xe6\x59\xff\x3e\x55\x93\x12\x49\xd3\x39\xe3\xaf\x04\x04\x05\x3b\xbd\x89\x63\x16\xc7\x25\x8b\x86\xcd\x26\xa5\x4f\x0d\x18\x55\x54\x89\x6d\x5d\x93\x98\xef\x56\x02\x9c\x40\xa6\xdb\xec\x6f\xc5\x1d\x9f\xd3\x88\xae\x17\x91\x26\xe5\xea\x6c\x14\xbe\xd1\xc2\x80\x44\x92\xed\x64\xe3\x9e\x51\x50\xc4\x33\x46\x38\xc1\x40\xdc\x24\xe8\x26\xe6\x14\xc3\x6f\x97\xac\x68\x37\x98\x73\xd0\x7c\x67\xe0\x91\x2e\xfe\x31\x87\x75\x8a\x72\xa2\x0e\x26\xcf\xa7\x9a\x40\xe9\xf5\xf2\x6e\x77\x8a\xa1\x4b\x8b\xde\xc1\x0a\x39\x77\xd8\x99\x5b\x88\x49\x1d\x39\xda\x94\x72\x11\x45\x15\x72\x76\x7d\x5b\xd2\x6e\x05\x59\x66\x13\xc1\x5a\x85\x64\xd5\x7f\xc4\xde\x56\x81\x02\xbf\xe2\xee\x56\x7d\xbe\x9e\x34\x90\xc9\x2b\xfb\x7b\x7b\x9f\xdb\x28\x44\x70\xd7\x19\x97\x0e\xf3\x97\xa3\xf2\xfd\xc7\x9c\x94\xe0\x17\xca\x27\x98\x8c\x93\x4b\x3a\x27\x95\xb2\x6a\x76\x62\x98\xa3\xf2\x53\x31\x27\xf8\x1f\x29\x8f\xfb\xc1\x6f\x35\x7f\xd6\x64\xef\x48\x5a\x0d\xa8\x26\x8e\x41\x83\x2e\x51\x23\xfd\xcf\x0f\xdb\xdf\x0c\xe4\x54\x96\x43\xb6\x9c\xbd\xb8\x75\xef\xba\x76\x88\x6d\x49\x3a\x83\x63\xfb\x20\x81\xa3\x86\x32\x96\x80\x7d\xe4\xe6\x50\xe7\x65\x8c\x0b\x61\xf9\xac\xac\xcd\x72\xb4\xe5\x68\x83\x43\x40\x3b\x34\x3d\x84\xb8\xe1\xf0\xa2\x46\x87\x7c\x31\x43\x07\xa8\xc2\x9c\x7e\x5d\x75\x4c\x05\x39\x5c\xe3\x71\xc5\x99\x24\xe4\xd0\xb5\x4f\x98\x22\x0e\x0b\xeb\x42\xd4\xbd\x7d\xc2\xec\x19\x6e\xf8\xa2\x6b\x08\x97\xf4\xd5\xf6\xe3\x38\x8a\x8e\x56\xd9\x29\xe8\xcb\x08\x63\x2b\xa2\x5e\x48\xaa\x17\x23\x2b\xad\xcb\x6d\xb0\x5d\x7f\x18\xad\xf1\xb8\xf6\xfb\xca\xb3\x5c\xbf\x01\x37\x03\xcc\xc3\xd1\xf9\x4e\xe7\x54\xdf\x82\xf4\xc9\xb8\x07\xf7\x44\x00\xf5\xee\xf3\x2b\x6b\xe4\x36\x1e\xeb\x05\x64\x06\x47\x0f\x30\xa9\x31\x41\x7f\x7c\x07\x27\xad\x15\x48\xeb\xea\xe4\xee\x62\xce\xa4\xbd\x6c\x10\xef\x48\x3e\x8c\xc2\x44\x3b\xa4\xdd\x3d\xda\xc4\xe8\x49\x7a\x42\x36\x7e\xf6\x26\x90\x3d\x43\x6c\xb4\xb6\x3c\x32\xc1\x94\x73\xe5\x9e\xb0\x6b\x93\x21\xed\x36\xba\x56\xa4\x32\xb6\x83\x5e\x81\x30\x74\x29\xc8\x0a\x5c\x2d\xb3\x7c\xd6\xc8\xa0\x01\x6f\xd1\x2d\x1f\x82\xd7\xea\x03\x3c\x3c\x96\x93\x16\xae\x7a\x23\x33\xd9\x60\x40\xdd\xd1\xe9\xeb\x26\x6d\x9b\xeb\x6f\xbe\x20\xe0\xcf\xbc\xae\xa5\x03\x86\x94\x04\x61\x9c\x90\xa8\xb8\x69\x18\x27\x43\x16\x64\xec\x26\x53\xed\x3d\x18\xf1\xa6\xde\x17\x88\x3a\xa2\xd3\x29\x24\xd5\xbe\xb7\xb9\x22\xed\x98\x4d\xad\xda\x71\xdf\x59\x99\x51\x8b\x43\xa0\xe5\x9d\xc2\x25\x51\x6f\xf5\x15\xff\x14\xd1\xac\x71\x19\xfd\xa6\xb5\x1e\xeb\x7b\xfb\xfd\x45\xfc\xc5\x6c\x15\x7b\x29\x0d\x82\x2f\xe5\xf6\x3b\x0e\xd5\xe0\x21\x59\x48\x98\x95\xd8\xef\x98\xac\x89\x0d\x09\xb2\xcf\x9f\xad\x07\x70\x1f\x8e\xd6\x61\xa0\x6b\x6a\x84\x99\x86\x09\xaa\x40\x3c\x43\x69\x12\xfc\x13\xc3\xd2\xe9\x9e\x1e\x96\xf1\x43\x27\x04\x96\x3e\xdf\xd4\x25\x92\x00\x93\x38\xbe\xd2\x6c\x6f\x8f\xa7\x99\x0a\x75\xef\xba\x94\xa8\x30\x1b\xc1\xa6\x5a\x15\x73\xd8\xf1\x2f\xd1\x0d\x75\xef\x1c\x73\xf2\xc6\x5d\x35\xd7\x41\x02\xdf\xb3\xe9\xfa\x3e\x83\xe0\xcf\xde\x59\xaa\x09\xc7\x2a\x18\x38\x84\x26\x70\x84\xcd\xc2\xec\xdc\x12\x22\xc1\xc2\x1d\x83\xe7\x15\xe6\x89\x34\x31\x6c\x49\x94\x1f\x67\xc7\xa6\xb6\xce\x0f\x5a\xd2\xdc\xfb\x1c\xcf\x16\xb1\xaf\xf1\x94\x13\x30\x91\x3e\x8c\xb1\x99\xbd\xb5\x8f\x62\x61\x7f\x5e\xca\xb8\x54\x9b\xbd\x6e\x8e\x1c\x9a\x7f\xb8\x77\x5a\x23\xb9\xe4\x2f\xe1\x05\xaa\x87\x40\x22\x0e\xd0\xdb\x56\xa7\x9d\xc3\x6b\x04\x72\x73\x5c\x7e\xf9\xe3\x70\xdd\x29\x65\xcf\x83\xfb\x9d\x04\x41\xf5\x07\x9f\x08\xae\xd4\x3c\x46\x07\x7a\xde\x1b\xa9\x7c\xd5\x49\x6e\x26\xbe\x79\x15\xee\xb9\x40\xdd\xe4\x50\xe9\xed\x73\xe3\x26\x3c\x5a\xfe\x45\x69\x23\xf8\xb2\x64\x10\xac\xa2\x78\xf1\x43\x2a\x3c\xa3\x32\x37\x4e\x45\xcf\x19\x92\xf5\xac\xd9\x6a\x8f\x34\x3b\x26\xae\x91\x67\x30\xfe\xdc\x2c\x97\x74\x27\x1e\xed\xd6\xae\x68\xa7\xe3\x76\xad\x37\xe8\x7a\xcb\x63\x72\x4b\x0a\xf8\xc7\x96\x6c\x46\xb4\xea\x15\xc1\xfb\xe5\x9a\xaf\x4a\xab\x8d\x44\x2d\x55\xb3\x63\xd4\x86\x75\xa9\xd0\xf9\x82\x70\x78\xab\x64\x18\xf1\xfd\x5c\xce\x41\x7d\xab\xf9\x6c\x21\x62\x88\x06\xd6\x89\x18\x4c\x76\x78\xcf\x46\x55\xe5\xde\xb6\xef\xa9\xb5\x52\xad\x6a\xe7\x07\xe5\xfb\x8f\x3b\x3d\xea\x5a\x5f\xe9\x50\x34\x48\xc6\x38\x4a\xc1\x9f\x0f\x67\x0d\x7a\xaa\xcc\x6c\x48\x99\xa2\x12\xd9\xbc\x6f\xff\x3c\x6b\x50\x32\x12\xdb\xa7\x54\x33\x99\x62\x71\xa4\x25\xa3\xe9\x01\x3b\x60\xb4\x86\xd2\x46\x4c\x7d\x56\xb0\xb9\x02\x89\x0c\x1e\x5a\x43\x32\x2e\xc1\xb7\xa2\xc9\xac\xc0\xa4\x42\xb7\xbf\x5e\xa6\xdf\x82\xa7\xdf\x66\x39\x2b\xef\xa6\xb4\x42\x43\x30\xe1\xd3\x7a\x8a\x6f\x51\x65\xe2\x5d\xff\xfc\xf6\xd5\x4b\xb0\xfc\x51\xc6\x78\x24\xd2\x70\x1a\x15\x6c\x7e\xc1\x78\x83\xc9\x38\x1d\x48\x5f\x46\x5e\x12\xd9\x7f\xe2\x3d\xf5\x30\xc8\x61\x5f\x1c\x4b\xdb\x5e\xed\x14\xe6\x93\x79\xce\x78\x4a\x2b\xf4\x4a\xce\x42\xfa\x51\x3e\x23\x97\x34\x07\xfa\x69\x70\xc4\xa5\xa0\x1c\x2c\x92\x45\x75\xb0\x72\x79\xb1\xbc\xdc\xa1\xae\xf1\x9d\xf4\xb3\x24\xca\x94\xd6\x6a\x59\x4a\x7f\x06\x43\x4d\xdc\x84\x96\xe9\x72\x17\x4d\x5a\x8d\xdb\x90\x09\x8e\xf0\x68\xab\x67\x99\x7d\x2a\x14\xb4\x4b\xed\x8b\xd0\xa9\x7c\xb7\xe2\xc0\x35\x5b\x13\xbc\x57\xe1\x89\x03\x8f\xcb\x86\x4e\x8d\x3b\xd9\xb4\x4f\xdc\x75\x8c\xc9\xf4\x06\x13\x92\xed\x1d\x9f\x20\xb1\x88\x53\xc8\xd5\x4d\x62\x5e\x63\x82\x7e\x99\x4b\xd3\xd5\xe1\xee\x40\x7e\xfe\x4f\x03\x67\x33\x69\xb3\x34\xc8\x05\x56\x10\xfe\x4e\xa0\xfc\xf7\x39\x87\x17\xe7\xf8\x37\x34\xfc\x3e\x57\x24\x42\x3a\x36\x85\xe3\x67\x0d\x9d\x0d\x05\xbb\xb1\xe3\x0c\x52\xf3\x2b\x4c\x5a\x36\x97\xce\x74\x5a\x16\x87\x37\x78\x3c\x46\x4d\x6a\x98\x9c\x6c\x99\xfb\xc0\x7b\xae\x49\x1d\xef\xba\xae\x72\x81\xde\x7d\x4b\x2b\xe3\x2c\x3b\x83\x81\x73\x4e\x5f\x52\x58\x09\x86\x5e\x50\x42\x89\x03\xfa\x7e\x58\x2d\xae\x59\x17\x9d\xb5\x56\xa6\xed\x04\xce\x6c\x87\x1b\x15\x4e\x39\xb5\x2b\x96\xe5\xbc\x54\x31\xc1\xa3\x93\x95\xc1\xd0\x7a\xbd\xdf\x8d\x11\x7f\xfd\xe6\x79\x57\x6b\xf9\x40\x12\xb0\x1f\x83\xac\x04\x05\xc8\xf6\x05\x45\xd8\x8f\x4f\x55\x1b\xd7\xa7\xf2\xc7\x7f\x0b\xa4\x48\xb3\x7d\x43\xaa\x7c\x57\x2d\xb2\x49\x15\xe3\x70\xb5\xa7\x44\x17\x92\x7d\x6b\x88\x72\xae\xd7\x10\x75\xd7\xd0\x64\xb5\xf0\x35\x0c\x5f\x60\x41\xeb\x6e\x50\x9e\x2d\xf3\x4d\x74\xc2\x96\x77\xfc\xfc\x79\xf7\xa8\x2c\x7b\x06\xde\xc2\x05\xb3\xd3\x1a\x41\x92\x7e\x5d\x5d\x71\x9f\x6a\xf8\xf5\x9b\xe7\x69\x66\x0d\xe8\x5b\x55\x32\x72\x43\x86\x69\x9b\xff\x56\x6d\xfe\x28\x7a\xe4\x96\x83\xf9\x5d\x38\x2d\xd1\x7d\x84\x25\x71\xcf\xb7\xcd\x5c\x70\x18\xfe\x77\xe5\x89\xbf\xdb\xa3\x05\xf2\xdc\x4c\x05\x6a\xa0\x9e\xe5\xd5\xbc\x7d\x3f\x37\xf0\x98\x6c\x40\x4e\x4a\xe4\x73\x02\xed\x41\x1f\xdf\x37\xe1\xe1\x1f\xee\x2f\x7d\xd2\x87\xfc\x40\x96\x7f\xa9\x03\xdf\x1e\xf0\xbc\x7b\x52\xf4\x1e\xf9\xcb\xd5\x47\xf0\x97\x5d\x73\x5e\x02\x13\x12\xb9\xcb\x70\xee\x83\x83\x91\x3a\x99\xb6\x67\x01\xbe\xec\x79\x9f\x37\x08\x56\xbf\x92\x7a\xa1\x84\xe1\xf8\x69\x86\xba\xce\x3c\x57\x1f\xdd\x64\xd5\xd1\x8d\x72\xd2\x4f\xf6\x89\x39\xba\x1f\xac\x8f\xee\x68\x9e\xef\x71\xba\x87\xfb\xc0\x3b\xde\x37\xa7\x9a\x63\x34\xc5\x04\x6f\x2e\xf9\x99\x20\x98\x9b\xca\x84\x5f\xf1\x4e\x4b\x0f\x6d\xb5\x61\xbd\x19\x7f\x96\x3b\xe2\xe4\x0d\xc4\x5c\xdb\xd0\xbb\x26\x5e\xd2\x27\xcd\x03\x7c\xe9\x97\x77\x9a\xe1\xbc\xa1\xcd\x95\xf2\x62\x56\xbe\xff\xa8\x92\x54\x78\xc9\xf2\x6e\xb9\x81\x89\xc1\xdd\x72\x87\x37\x8b\x3b\x5e\xfe\xe7\xf9\xaf\xbf\x14\x33\xd8\x30\xf7\xb1\xbb\x94\xe7\x4c\xb4\xca\x6c\x39\x82\xfa\x45\xd8\xb2\xd5\x96\xe8\x80\xc9\x27\xaf\xcf\xfe\x8a\x16\xca\xbd\xb9\x7c\xa9\x76\xb7\xcc\x31\x47\xd3\x53\xed\x06\x7e\xde\xc8\x87\x06\xda\xbd\xcf\x40\xfe\xd0\xfe\xce\x73\x3b\x05\x99\x63\xbf\xb4\x73\x04\xff\x61\x8f\x1a\x8b\xcf\x55\x9b\xdb\x65\x0d\x6a\x87\x53\xd2\x36\x76\xee\xda\x81\x4c\x45\x46\x4b\x3b\xac\x88\x28\xd8\x20\xf9\x22\xcf\xbd\x5c\x53\x73\xef\x0d\xe1\xda\x76\x7a\xd4\x3a\xc2\x95\xb5\x0a\x05\x13\xc1\xd3\xc1\x19\xbe\x42\x8b\x30\x7f\xde\xd4\x22\x73\xde\xd4\x9d\x1c\x0d\x1d\x99\xad\x7f\x67\xb6\x1d\xcf\xdb\xe8\xbc\xa9\xfd\x6f\x5d\xdc\x49\x44\x5a\xc1\x2a\x5d\x03\xb8\xe6\x7f\xbd\xb3\x18\x07\x63\x11\x02\x58\xa4\x25\xc5\xd3\xff\x8f\xc5\xc0\x95\xf7\x19\x0a\xc8\x1d\x37\xca\x5b\x2e\x5a\x0e\x2c\x7e\x6c\xb8\x4e\x9e\xcb\x63\x3d\x27\x07\xe3\xe4\xfb\xcd\x16\x56\x83\x52\x31\x0c\xa4\xe4\xef\x07\x1f\x8b\xb3\x2a\x5c\x1a\xb7\xaa\xe3\xfb\xb8\xdd\x86\x96\x27\xad\xd1\xa8\x85\x4d\x4a\xb6\x7b\x45\xad\xed\x32\xd9\xa8\xa1\x75\xfd\x96\xa6\x03\xeb\x48\xa1\x10\xec\x94\xce\xf8\x19\xe1\xf1\x44\x76\xd7\xb9\xd7\x6c\x47\xe6\x2c\x6d\x7c\xed\x9d\xa1\xbf\xff\x18\xaf\xa7\x56\xfa\x8c\xa3\xe9\xd7\x59\x64\x41\x3a\x36\xdf\x88\xb1\x1b\xcb\x30\xd5\xbc\x03\xd1\xb3\x33\x1d\x84\xcb\x6b\x69\x96\xd8\x7a\x0a\x2d\xa2\x10\xe9\x80\xf2\xfe\x63\xe8\x81\xb9\x0e\xc3\xe0\x61\xd1\x1a\x57\xef\xe3\x60\x39\xb3\x98\xb7\x23\xe2\x5a\x0b\x92\xdc\x79\x52\x49\x8a\xb3\x4a\xf0\x9e\x99\xfd\xb5\xb7\x97\xfa\xe0\xb9\xd4\x4f\x3d\x49\xa1\x1e\x7d\xae\xdc\x1d\x1d\xe0\x7a\xa4\x5d\x34\x22\x43\xce\x05\x1e\x0b\x5c\x74\x24\x2d\xb6\x48\xdc\x4b\xb7\xb5\x82\xb2\x12\xef\x52\x9e\xbe\x01\x5f\x1c\xd1\xf9\x3b\xa4\xd9\xd3\xf8\x2b\x5e\xe6\x40\xa6\x6f\x7a\xd5\xb0\xa2\x79\x43\xdf\xa3\x7d\xd8\xcc\x87\x77\xa4\x8f\xa0\x58\x37\xea\x2c\xd9\xe6\xf6\xa2\x7b\x76\x45\xc1\x56\xf0\x06\x4f\xd3\xac\x7b\x6c\xbb\xc7\x5a\x3f\x44\xfa\xab\xdb\xf3\xb4\x6f\x96\xa6\x6a\x84\x07\x6e\x87\xa7\x84\x42\x6e\x25\x45\x70\xd8\x6e\xf5\x83\xa3\x40\x09\xea\x9e\xd3\xae\xac\xe8\x54\xe8\xea\xf7\x3c\xd5\xc6\xbd\xa9\x20\xca\xd5\x31\xbb\x19\x11\xd4\x4a\x13\x8f\xc5\x54\x1d\x91\xd6\x51\xa6\x6b\x79\xe7\x9f\xee\x39\x2f\x7e\x82\x0c\x3d\x27\x1c\xf3\x85\x8c\xe6\x4a\x22\x8c\x81\x54\xae\xb4\xc7\x7d\x1a\x10\xc1\x9e\x31\x1c\x05\x63\x50\x12\x46\x7c\x18\x83\x68\xc7\x3a\xb2\xb9\xed\x39\xa2\x89\x5b\xad\x2f\xf3\x8f\x62\xfe\x07\xb3\x7d\x94\xac\xb7\x42\x2d\x7c\xe9\x6e\x62\x75\x40\x64\x59\x00\xad\x15\x35\x2c\x86\xd8\x2a\x41\x30\x79\x19\xa2\xe2\x31\x54\x62\xae\x70\xf7\xc7\xbe\x7e\x1c\x63\x3e\x99\x5f\x6c\x2e\x86\x12\xca\xf1\x25\x96\x0e\x0d\xfa\x24\xd4\xdf\x2d\x78\xdc\xfd\xe5\x50\x63\x66\xd2\x11\x42\xe9\x0d\x41\x0d\x7b\x50\x70\xb7\x6d\x04\xce\xce\x9d\xa1\xda\x38\x3f\x8a\x43\xac\xd5\xa4\x74\x48\xf7\xa8\xc6\xda\x51\x85\x32\x64\x5b\x55\x14\xaa\x60\xd3\xef\xd4\x19\x2e\x84\xa2\x35\x74\xd6\x6c\xab\xbb\x65\x48\x59\x89\x7d\xca\xb5\xdc\x61\xe5\x9d\x19\xc5\x90\x98\x01\x3d\xcb\x9d\xee\x86\x44\x3e\xe3\xa2\x0d\xfe\x4d\xbe\xa6\x3a\x35\x59\x6f\x5e\x2a\x30\x2b\x28\xcb\x9f\x9f\x8c\xf4\x5b\x63\xc6\xd9\xf0\xfd\xc7\xfc\xa2\x81\x64\x34\x39\xc7\x64\x24\xd3\xd5\xe7\x4b\x4c\x10\x1b\x82\xa3\xc1\x00\x38\x21\xc4\xb4\x61\xab\x17\xc7\x65\x42\x6f\x5e\xe1\x1a\x31\x4e\x45\x0d\x1d\x6b\xe1\x8c\xb1\x79\xfb\x75\x4a\xa7\x53\xcc\x99\x40\x40\x29\xf5\xab\x0b\x4c\x57\xf2\x8f\x89\xfd\x3b\xac\x90\x23\x2e\xa9\xfa\x9b\xb3\x42\x8e\xb9\xa4\xea\x6f\xce\x0a\x67\xe8\x25\x75\xbf\x72\xa6\x49\x7b\x49\xf5\x8f\x9c\xe9\xa8\xe1\x25\x35\xe1\xc3\x59\xe1\x0f\xbe\xa4\x41\x82\x2e\xa1\x26\xa3\x73\xd5\x87\xce\xd1\x13\xd3\x59\xfa\xcb\x51\x57\x7c\x2a\x30\x7b\xd7\x7a\xab\x75\x4b\x49\xcf\xb5\x5e\x23\xf2\xdc\xf0\xe9\x2d\x0b\x52\xf4\xc8\xfd\x60\x57\x92\x0f\xc0\x65\xf8\xa2\x4e\xbd\x59\xd9\x11\x6c\x5a\x89\x5b\x25\xf8\xb1\xd4\xf4\x0a\x7a\xa4\xae\xc5\x23\x2e\x3a\x55\x8c\x7b\xa3\xae\x73\xbe\x15\xb3\x27\x12\xa4\x0f\x2b\xac\x90\x14\xba\xcd\xef\x8d\x44\xf3\x2a\x36\xd9\x5a\xfc\x67\xf0\x1a\x9d\x4b\xe5\x07\xc8\xef\x38\xbd\x42\x64\x08\x3b\x5b\x41\x3d\x1a\x35\xd2\xff\x39\x87\x63\xf4\xc4\xd3\x26\xa0\xec\x6e\x44\x09\xa3\x35\x2a\x6a\x3a\x4e\xf5\x1d\xa5\xa7\x2e\x90\x0c\xab\x41\x89\xd6\x4d\x98\x7e\x05\x59\x98\xbf\x1e\x8d\x92\xa5\xa5\x45\xe5\xde\x5e\xea\x76\x00\x14\x61\x4f\x44\xe9\xe4\xa6\xa1\x64\x9c\x88\xa2\xc9\xd9\xb3\x3c\x51\xce\x8b\xa4\xbc\x15\xac\x5c\xe0\xd4\x78\xc3\xae\x5b\x07\xcc\x2b\xa8\xc8\x04\x8d\xae\x4e\x14\xcb\xb6\x9a\x5f\x7b\x0c\x50\x7a\xc7\xab\x5b\x98\x1b\x69\x5d\x3a\x10\x7c\x29\xa9\x4b\xd4\xa4\x53\x9a\x5c\xd9\x90\x55\x2e\xbb\xac\x8e\x04\x2b\xc8\x7b\xd4\x95\x2a\xb7\x84\xd6\x9e\x1c\x85\xf4\x18\x65\xc7\x86\x3b\x56\xf1\x12\xde\x0f\x3e\x76\x79\x79\xd5\x4c\x8e\xb2\x6c\xd8\x97\xc7\xbd\x08\x05\x48\x70\xa5\xae\x50\x60\x5b\xb0\x0c\xf2\xaf\xcd\xf8\x0d\x9a\x51\x26\xe7\x9c\xca\x2d\x15\x3b\x26\xc4\x21\xf7\x0c\x72\xf4\x16\x4f\x91\x0a\xf6\xa5\x9c\xe5\x6a\x09\xa9\xa8\x20\x47\x1c\x4f\xd1\x4c\xe6\x89\xce\x5e\xd2\x11\xac\x51\x0a\x10\xf1\x4c\x06\x15\x9d\x3b\x60\x82\xd0\x81\x2c\xa8\xe7\x85\x0b\x8c\x74\x99\x83\x67\x94\x48\x63\xaf\x3c\x1c\xfa\xe6\xcb\x15\x39\x48\x77\x36\x11\x2c\x68\x33\x6e\x44\x77\x6b\x31\xd5\xde\x59\xa9\x59\xcb\xd8\x14\x3d\x5e\x10\x3d\x2f\xe6\xaa\xb8\x66\x8a\x46\x0d\x82\x5c\xb0\xdd\xad\x7f\x78\xaf\x5b\x75\x8c\xb4\x16\x8d\xd6\xab\xe1\xfb\x8f\x59\x1b\x03\x62\x60\x22\x70\xed\xf6\x39\x71\x96\x2c\x79\x4e\xca\xdd\xa3\x1e\x0f\xe5\xa8\x64\x7e\xd4\x0b\x85\x53\x71\x13\x0c\x52\x1a\x25\x1e\xaa\x72\x5a\x4a\x9b\x65\x9b\x50\x92\x65\x96\x53\x51\xea\xfd\xe0\x63\x9b\xba\x3b\xc8\x96\x3e\xb9\x51\x53\x93\x8a\x0c\x6f\x19\x8f\x82\xed\x1e\xe6\x9a\xe2\x11\x61\x8a\xcb\xd3\xea\x17\xc9\xa5\xaa\x33\x26\x05\xef\x08\xbc\xa8\x51\xc2\x69\x22\xd7\x38\x91\xab\x2b\x58\x5d\xe5\xf3\xcd\x27\x26\xcb\x07\x6a\x51\x14\xc1\xea\x7b\xea\xf2\x18\xd4\xb6\x6f\xf6\x83\x10\x8c\x83\x3e\xe9\x7b\xfd\xa1\xa7\x89\xdc\x06\x3b\xa0\x6f\x6d\x4c\x0b\x26\x46\x6f\x4b\x70\xd3\x2f\xbb\xba\x96\x3e\x47\xd6\x35\xd0\x72\x45\xe8\x87\x43\x97\xba\xfd\x6b\xe2\x02\x26\x9c\xcf\xd8\xf0\x50\x0b\x4f\xc5\x88\x4e\x0f\x6b\x3a\xc6\xe4\x90\x8a\x3a\x87\x86\xcd\x45\xc7\x8a\x0f\xfe\x84\xab\x32\x78\x94\xe4\x73\xed\xfb\x60\x8f\x8d\xe8\x0c\x95\x02\x33\xf7\x1a\xa4\x42\xba\x7f\x9a\x37\xb8\x04\xfb\x88\x08\x6e\xe5\xdd\x9b\x33\x2b\x04\xad\xe3\xea\x45\x73\x1c\x72\x14\xaf\x1c\x73\x6a\x90\xed\x44\x5d\x1d\x70\x21\xde\xcb\x85\xdb\x5a\xa9\xd0\x3d\xb0\x22\x59\x7a\xff\x5b\x8f\xb5\x1d\x34\xa1\xe4\x5c\x4c\x64\x65\xef\xba\x2d\x39\x63\x65\xed\xf3\x60\xf5\x45\xdf\xb9\x12\x51\x28\x6b\xcd\x06\xeb\xb5\xd4\x69\x35\x1b\x2c\xd0\x6c\x08\xc6\x96\x6d\xaf\xba\x60\xbd\xaa\x8b\xf5\x6a\x33\x22\xc5\x39\x2e\x43\xc4\x6d\xa4\x39\x0b\xc7\x1c\x0e\xb0\x35\x39\x6a\xb7\x2f\xb2\x3e\x4c\x4f\xb4\x9c\x98\xb3\xf8\xe5\xca\xba\x3a\x5b\xa9\x5c\x1c\x45\xc6\x1f\x5b\xe5\x32\x85\xcd\x55\x45\x6f\xc8\xef\xf6\xf0\xba\xc6\xe4\xaa\xcf\x23\xb9\x6b\xe0\x2d\x7e\x9b\xc7\x58\x00\x38\x8e\xf5\x07\x8f\x6f\xfb\x6d\x80\xb2\xe1\x13\xd3\xfb\xb4\xac\xab\x3e\x9e\xf9\xb7\x3e\x0e\x3a\x1c\x52\x48\x0a\xb2\x63\xde\x67\x04\xae\x74\xf2\x43\x00\x1c\x4d\x78\x6b\x46\xcd\xd7\x18\x10\xcb\x3a\x90\x73\x38\x9a\x28\xe0\xaf\x7f\xb2\xb9\xd2\x00\x86\x7b\xa6\xc5\xf2\x91\xdc\x3d\xcd\x60\x04\xdb\x2e\xd1\x68\x15\xe7\xb4\xce\xde\x54\x43\x67\x99\xbb\x53\xfc\xd2\x06\xd4\x7a\xf3\x80\x5c\x59\xc9\x1b\xec\x09\xec\xab\x8e\x1e\x64\x5f\x85\x6e\x79\x03\xff\x8a\x16\x6c\x78\xf7\x9c\x70\xd4\x0c\x01\x41\x37\xa2\xc1\x13\x52\x9d\xc9\x76\x4e\x29\xe1\x98\xcc\xd1\x2b\xdd\xbd\x38\x11\xc1\xf2\x9f\xc7\x10\xbb\x85\x5b\xd4\x18\xdb\xc9\xf6\x9f\x78\xad\x7c\xfb\xe9\xec\x11\x27\x4e\x44\x0c\x69\xb7\x33\x27\x90\xee\x41\xc2\x16\x78\xb0\xb1\xf4\x55\x5f\x67\x8b\x16\x1a\xd3\x53\x7b\xd7\xa5\x59\x29\x33\x45\xcc\x15\xc5\xc5\x97\xca\x9e\x4e\x5b\x23\xa4\x5e\x4d\xa7\x5d\xfb\x6e\x5e\x39\xf3\xe8\x7f\x48\x1a\x2e\x58\x2d\x9f\x88\x16\x17\x73\x5c\x57\xa2\x70\xca\x23\x81\x12\xe3\x7b\x4e\x6b\xc6\x94\xaf\x61\xc5\x96\xcb\xe0\x89\xbd\xf2\xcf\x1f\xd8\x42\x7a\x63\x6f\x1a\x16\xf6\x8f\x70\xe1\xe3\x9f\xe9\x7f\x6c\xfe\x63\x06\x45\x6f\x0d\xc4\xf5\xa3\x5e\xfb\x38\x39\x73\x8e\x6b\x76\x48\x10\xef\xdc\x05\xe5\xec\x9f\xe0\x36\xe8\x0b\x58\x25\xda\x4b\x20\xf5\x29\xef\x2e\xbf\xba\x0d\xe2\x5b\xa9\xbc\x06\x20\xff\xc7\x1c\x35\x92\xc3\x9b\xc2\xdb\xe1\xd1\x20\x1f\x37\x74\x6e\x1c\x91\x2c\x18\x47\x53\xf9\xbb\xc7\xb6\xd0\x24\xba\x46\x73\x15\x66\xb3\x1a\x2e\xd4\x73\x6b\x5f\x7e\xd0\xeb\x51\x60\x76\xf2\x77\x78\xab\x82\xd6\xcb\x72\x29\x7f\x44\x7b\x95\x95\xb6\x56\xbe\x94\xf3\x50\xd3\x03\x6e\x4c\x0f\x3a\x9e\xc6\xd8\x06\x96\x06\xda\xac\x89\x85\x77\xfc\x66\x79\x40\x0e\xfe\x55\xff\xd7\x06\xaa\xef\x1f\x09\x35\x0f\xd8\x3a\x83\x69\x4d\x0e\x6c\x19\x1e\xb5\x1f\xd8\x31\x91\x0d\xc7\x6e\x61\x19\x1f\x6f\xb9\x63\xc3\xaf\x28\x75\x76\x21\x31\x25\x3b\x76\xc3\xb9\x30\x95\xc8\x64\x78\x68\x5d\x42\x32\xd4\x43\x93\xf3\x7e\xf0\xb1\xab\x46\xa4\xd6\x15\xb5\x18\x11\xca\x81\x2c\x0b\x72\xba\xad\xdd\x44\x60\x84\xd1\x03\x54\x09\x4c\x17\x4d\x53\xee\x6b\x88\xc0\x18\xf1\x44\xcf\x3e\x19\xc1\xba\x4e\x2e\x21\xae\x51\xd5\xbd\x4f\xf8\x6a\x23\x92\x77\x37\xf2\xc6\x29\xb1\x96\x47\x8a\x23\xf8\x8b\x84\xeb\x46\x6f\xae\x3c\xa4\x8f\xe8\x2c\x76\x36\xd5\xe3\xe8\xf5\xf1\xf4\x38\xdb\xed\x1c\xd2\xbb\x73\x5a\x4d\x83\x07\x3b\x16\x98\x23\xfa\xeb\x10\xaf\x11\x40\x54\x07\x46\x93\x54\xed\x2b\x03\x4c\x91\xd2\x7f\x52\x88\x3d\x1a\xbb\xf6\x40\x6d\x59\xcc\x42\x47\xdd\x74\x44\xd6\x0c\x97\x47\x03\x75\xf7\x26\x08\x4b\x2a\x0f\xcb\x33\xc2\x53\x5a\x4c\xe1\xad\xbc\xc6\xc2\x65\x98\xe8\x78\x6a\xa4\x42\x2e\xb9\x05\x39\x7e\x84\x05\xdb\x48\xbb\x16\x9a\xdb\xee\xa8\x9b\x6a\xe4\x19\x38\xed\xc0\x02\x5d\xcb\xb0\xa9\xfa\xae\x07\xef\xed\xa5\x26\xad\xb4\x99\xac\x16\x0c\xcd\x20\xc7\xd9\x3a\xad\x22\xcd\xba\xba\xc8\xa0\x08\xcc\xa2\x56\xb7\x5b\xa8\xf6\x22\xd4\x31\x6e\x3a\xbd\x39\x8f\x1d\xf2\xad\x7f\x70\x2e\xbb\x86\x84\xcf\xa7\xbd\x3c\xf6\x17\x1f\xe9\xba\x98\xe5\x1a\x81\xaf\x47\xf7\x64\x8d\x2b\x0c\xc7\x0d\x9c\x2a\x67\x6f\xc0\x7c\x1a\x01\x5e\x32\x93\x5a\xe3\xf6\xd3\x9c\x73\x41\x33\xe4\xe1\xea\x38\x86\xdb\x5a\x49\x68\x60\xfa\xf8\x4a\x42\xdb\xf2\x3a\x25\xe1\x18\x11\xd4\x40\x8e\x36\x55\x54\x74\xc9\x87\x12\xf4\x23\x90\x01\x39\xf8\x8b\x6a\x1d\x93\x71\xa2\x4b\x14\x45\x01\x82\xcb\x07\xe5\x38\xb3\x1d\x9e\xb3\x10\x20\x5b\xee\x6c\xa3\xf9\x08\xee\x01\xaf\x47\x2d\x6f\xe9\xbf\xfe\x99\x99\x35\x23\xfd\x64\xcc\xc7\x00\x20\x50\x14\x72\xd8\x47\x48\x56\x81\xc1\x7a\xe0\x8a\x92\x96\xb0\x1f\xa5\x8d\x7c\x48\x2f\xf2\xcc\x7b\x94\xd8\x8e\xc1\x00\xda\x64\x77\x91\xfa\xdd\x98\x9a\x1c\x0f\xc7\xee\x6f\xd7\xef\xba\xa6\xf3\xb0\xc4\xf3\x78\xea\x8f\x61\xdb\xc3\x3f\xb2\x11\xfa\x26\xb1\xe6\xae\xcd\xdd\x2a\xab\xcd\xc6\x63\x9c\x43\xcc\x59\xaa\x3b\xe5\xee\xdb\xf8\x7e\xc5\x4f\xcf\x72\xb6\xba\x38\x51\xfa\x1a\xfb\xcb\xd0\xb3\xd6\xdf\x7e\x20\xff\x97\x71\xd8\x08\xea\xf2\x81\xc8\xce\x13\xc1\x35\xd4\x88\x27\xa7\xc6\x3b\xe5\x07\xf2\x81\xa4\xff\x9a\x25\x07\x07\x1f\x6e\xbf\x43\x09\x38\xad\xf1\xe8\x4a\x97\x2a\x26\x90\x54\x35\x7a\x83\xfe\x31\x47\x8c\xa7\x19\xf8\x40\x4c\x31\x82\x6e\x92\xd7\x02\x30\xa2\x3e\xbe\x4c\x80\xf8\x28\x04\x57\x32\x9a\x37\x98\x2f\x4e\x27\x68\x74\x05\x12\xb1\x61\x3f\x90\x24\x49\x92\x83\xa7\xef\x79\x33\x47\x1f\x6d\xc9\x33\x82\x55\x93\x22\x57\xfd\x2b\xda\xc1\xec\x05\x6d\x6e\x60\x53\x1d\x07\xb5\x09\x15\x75\x55\x60\x84\x64\x44\x09\x6f\x68\xcd\x3a\xd5\x47\x5a\x7b\x9d\xb4\x21\x14\xbc\x86\x64\x63\x72\x0e\xef\x17\x88\x7d\x4c\xca\xb2\x7c\xf3\xfc\x97\x67\xcf\xdf\x9c\xfd\xf2\x97\xb2\x2c\x55\x21\x54\x33\xd4\x29\x2e\xfa\x97\xa5\x9f\x9d\xbd\x79\x7e\xfa\xf6\xd3\xe9\xcf\xcf\x4f\xff\xda\x56\x21\x15\xbe\x74\x07\xd3\xb6\xb1\xbe\xbb\xb0\xae\x82\x43\xf2\x9a\x32\xee\x43\xc1\x69\xc9\x80\x51\x14\xb2\x60\x34\xab\xa3\xf3\x14\xd9\x4d\x33\x90\x40\x96\x28\x9e\xc5\x2b\xb7\x62\x3a\xe1\xe8\x15\xf4\x55\xb3\x7f\x41\x9d\x1e\xdd\xc6\xbd\xe9\x74\x1a\xba\x84\x35\x43\x7d\x90\xd4\x55\x15\x46\x3d\xa3\x89\xb1\x47\x08\x71\x41\x41\xc0\xe4\x26\x8d\x42\x50\x10\x4c\xee\xa7\xe7\x2f\x7e\x7d\xf3\xfc\xd3\xb3\xe7\xe7\x6f\xdf\xfc\xfa\x37\xd5\x81\x1d\x8e\xee\x21\x8a\x6c\x35\xba\xe4\xb6\x17\x5d\x62\x8b\x4e\x02\x00\x36\x78\x3c\xe1\x06\x81\xd5\x92\x24\x82\xa6\x24\xdc\x44\x8b\xdf\xb0\x49\x05\x1c\x0b\xa3\x60\xb1\xf5\xc5\x9b\xb3\x4b\xd3\x7f\xcd\x3e\x90\xff\x8b\x48\x35\x9f\xd6\xdf\xf6\x13\x78\x43\x59\xce\xc5\x04\xc9\xa8\x1b\xc6\xbb\x4b\x59\x80\x47\x59\xe0\x88\xd3\x26\xf9\x89\x5e\x24\xdf\x34\xa8\xfa\x40\xbe\x4d\xde\x4e\x50\x42\x49\xbd\x48\x2a\x7c\xa9\x7d\x94\x27\x17\x88\xdf\x20\x44\x12\x59\xfa\x03\xf9\x16\x92\x2a\x99\xc1\x86\xe3\x11\x9e\x41\xc2\x13\xcc\xc4\x12\x24\x55\x03\x6f\x30\x19\x7f\x20\x6e\xde\x89\x90\x30\xfc\xa4\x0f\xe0\x2c\x99\xc0\x6b\x94\xc0\xa4\x41\xb0\xae\x17\x35\x25\xe3\x84\xc0\x29\xfa\x20\xd1\xfd\x65\xf2\xcd\x9f\xfe\xf4\xe2\xc5\x9f\xfe\xf4\x81\x1c\x7e\x9b\xfc\x8d\xce\x93\x11\x24\x09\xac\x19\x4d\x2a\x34\xaa\x61\x83\x86\x0a\xac\x6e\xa3\x2f\x45\xcd\x4e\xcb\x89\xdb\x74\xdb\xac\xa8\xfc\xed\xa1\x58\x09\x39\xbc\x83\xa7\x3f\xd1\x8b\x61\x72\xd2\x4a\x1f\x98\x92\x44\xd3\xce\x0f\xe4\x27\x7a\x71\xf0\x54\x16\x8c\x94\x61\x33\x4a\x04\xbe\xc8\x42\x2f\x87\xc9\x4b\x3a\x4e\x78\x03\x09\x53\x87\xaf\x5d\x45\xb0\x7e\x15\xdf\x31\x74\x0a\xd9\x26\x8b\xe8\x1f\x0f\xc3\x57\x10\x93\xe4\xa4\x9a\x62\x32\x14\x50\x90\xbf\x3e\x90\xf4\x1d\x43\x72\x5d\x04\xf3\xa1\x07\x9c\x89\x7c\x91\x91\x89\xc9\xbf\x63\xa8\x49\x0e\x9e\x26\xe9\xb9\x68\x2b\x33\x09\x0a\x39\x6d\x29\xd9\x5c\x72\x10\x26\x13\xca\x51\x22\x37\x48\x42\x2f\x55\x9f\xc9\x30\x79\x3b\xc1\x4c\xe0\x03\x24\x09\xba\x85\xd3\x59\x8d\x8a\x6e\x61\xdd\x86\x58\x85\x93\x44\x66\x99\x05\x56\x89\x17\x02\x05\x13\x86\xae\x51\x03\xeb\xa4\xc6\x04\x31\xb9\x79\x64\x59\xdb\x1c\x90\x7d\xc9\x9f\x58\x1e\x2b\x44\x5a\x0c\x26\x9c\xda\xaa\x54\x0a\x48\xac\x90\x68\xf5\xcb\x93\x0f\x44\xcf\x34\x29\x0a\xf9\xf9\xcb\x13\xf1\x4b\x0f\x47\x2f\xd4\x07\xb2\xc1\x86\x93\xaf\xfb\xb6\xde\x6d\xd2\x17\x4b\xf2\x82\xd2\xa3\xe4\x4e\xcd\xd4\x20\xf7\xdc\x90\x9c\x60\xd2\x22\xa9\x28\xd4\x5f\xc8\x92\x05\x9d\x27\x37\x90\x70\x9d\x40\xaa\x44\xea\xd7\xd4\xa7\x21\x36\x32\x88\x01\x4b\x38\x1d\x23\x3e\x41\x8d\xae\xfd\xe9\x93\xdf\xa3\xda\x26\x2c\x99\x42\xb2\x50\xad\xb0\x9e\x6e\x0e\x0e\xd4\xdf\xe7\xa4\x12\x8b\x27\x27\xf1\x81\x2c\xc5\x3a\xa8\x09\x49\xac\xb9\x33\x83\x4d\xce\xb1\x58\xf6\xe4\x2f\x88\x73\xd4\xd8\xd1\xef\x27\x63\xc4\x7f\x81\x53\x94\x66\x4e\xc2\x49\x55\x35\x88\x31\x93\x26\x6a\xd3\x29\x4a\x58\x58\x97\xf9\x75\x3f\x7d\x4a\x66\x0d\xbe\x86\x1c\x49\x97\x35\x76\x72\x98\xf0\x04\x8e\xed\xa9\x95\x20\x32\x6a\x16\x33\x81\x14\x66\x12\xe7\x52\x5b\x91\x98\x68\x1d\x7a\x1e\x9b\xef\x51\xc3\xc3\xfd\x12\x61\x5e\xd7\x2d\xff\x07\x22\x7f\x7f\x20\xc3\x55\x9c\xda\x8f\x1f\xc8\x50\xb0\x68\xe2\x9c\xf9\x51\x1e\xa7\x69\x8c\x41\xcb\xe4\xa9\x97\xa4\x82\x33\xd3\x50\x19\x7a\xec\xd9\x8f\xf6\xb0\x4c\x5b\xc6\xcc\xd4\x22\xd4\xd6\x09\xd8\x32\xa7\x5a\x8c\x21\xeb\x34\x20\x91\x96\xd3\x59\x3f\x3f\x94\x62\x26\xd9\x21\x53\x75\x81\x98\x53\x77\xe8\x31\x43\x3f\xb6\x47\x70\xd0\xc7\xd0\xe5\x60\x7e\xec\xf4\x36\x0c\xf8\x26\xbf\x84\x6a\x4f\xf2\x2f\x99\xcf\xaa\xa4\x95\xc3\xaa\x74\x47\x38\xb4\x8c\x8a\x86\xc1\x8f\x01\x23\x22\xea\x5f\x06\xc0\x75\xaa\x07\x1c\x48\x7c\x7a\xc3\x18\x67\xf1\x63\x9c\x73\x50\xa0\xde\x06\x63\xad\x8e\x67\xeb\x73\x45\x9c\xda\xa3\x2b\x31\x28\x20\x77\xa5\xbc\x3f\x00\x66\xa7\xff\xfc\xf6\xed\xeb\xe4\x20\x79\xff\x02\x37\x4c\x08\x25\xba\x97\x8f\x2a\xf7\xfd\x09\xa1\x82\xfa\x78\x19\x4b\x83\x19\x84\x56\x28\x01\xbf\xca\x02\xea\x56\xc2\x36\xfb\x42\xb5\x7a\x8e\x46\x94\x54\xdd\x66\xc3\xde\xcc\x69\xf5\xe2\xed\xeb\x0f\x64\x99\x28\xa2\x44\xe7\x95\x69\xee\xfd\x73\x75\x0a\x25\x47\x1f\xf5\x5e\xff\x40\x04\xc9\xb8\x80\x0c\x25\xe0\xd5\xe2\xfc\x1f\xb5\xed\x5a\x85\xf6\xd2\xe7\x0a\x66\xc9\x74\xa1\x93\x6c\x89\xf7\x2f\x54\x91\xef\xf4\x70\xf4\x84\x2e\x1b\x38\x45\x82\xdd\xa4\x4e\x49\x99\xf6\x7d\x5b\x50\x77\x1e\x01\x8c\x99\x83\x37\x56\xe7\xc3\xe6\x3b\xbd\xb7\xbf\xdb\x5c\xdb\xe3\x56\xac\x23\x87\x7c\x7b\x96\x83\x8d\x60\x8d\x92\x7f\x1b\x0c\x92\x1b\x5c\xf1\x89\x9c\xd8\xbf\x7e\x14\xbc\x84\x6c\xef\xe8\x83\x32\xc1\x3d\x32\x83\x93\x5f\x4f\x92\x61\x72\x3e\x1f\x8d\x10\xaa\x04\xaf\xe9\x97\x10\xd5\x87\xc9\xc9\x05\x6d\xb8\xcd\x7c\xe2\x55\xff\x2e\x52\xfd\x49\x4f\x75\x69\xd7\x6b\xaa\xe9\x25\x51\x69\x0a\x95\x65\x4e\x22\x7d\x26\x88\x03\x4f\x70\x89\x47\xaa\x94\xfc\x99\x0c\x93\xff\x9c\x33\x9e\xc0\x84\x4b\x0e\x50\xae\xe8\xbf\x5a\x50\x77\x8a\xbb\xe9\xc9\x30\xf9\x05\xdd\x24\xcf\x20\x87\x91\x22\x9a\xdc\x8a\xdc\x64\x98\x3c\x27\x74\x3e\x9e\xe8\xb2\x4b\x3d\xa7\xef\x3a\xb3\x7e\x21\xef\x14\xc3\x6c\x35\x65\x0b\x91\xe4\x30\x39\x17\x67\xfa\x1b\x19\xf3\x27\x5e\xd8\xc2\x47\x6d\xc3\xb5\x58\xb2\x85\x9a\xdd\x53\x5c\xff\xb1\x95\xec\xbf\x6f\x00\xa3\x1e\xbf\xc8\x5b\xab\xb5\xe5\x2c\xd6\xe9\xb4\xf5\x60\xde\x8a\xb2\xc3\x6f\xff\x2c\xeb\x18\x97\x80\x37\x0b\x86\x6f\x16\xe3\x03\x99\x08\x12\xc6\x17\x35\x2a\x81\xdc\xcf\xc3\xe4\x68\x30\xf8\x3f\x3f\x82\xa7\x7f\xe6\x13\x04\xab\xa7\x7f\xe6\x8d\xf8\xf9\xf4\xcf\x17\xcd\xd3\x3f\x1f\x8a\x1f\x1b\x7e\x1c\x72\xf5\x4b\x35\x72\x41\xab\x85\x6e\xab\x0a\xfa\x7b\xf2\x43\x31\x18\xe8\x3e\x55\xed\xea\xf7\x28\x25\xc7\xfb\xff\x06\xf8\xd0\x01\x1e\xea\xa5\x56\x5b\xed\xe9\xb7\x9b\x45\xeb\x72\xec\x23\x7b\x55\xdd\x3d\x3e\xe5\x75\xb6\xeb\x69\x24\xd6\x9a\xbb\x1d\x36\x74\xb4\xec\x07\xc9\x69\x6d\x7f\x6d\x78\x76\x9e\x15\x97\x0d\x85\x35\xd4\x36\x9f\x77\x9c\xd2\xfa\x02\x36\xea\xe2\x40\x3e\x43\xd7\x29\x67\x32\x04\xd5\x70\x77\x90\x4b\xb0\xbc\x41\x0c\xff\x86\x9a\x5f\x2f\x2f\x19\xe2\xc3\xa3\xc1\x72\x3b\xfb\x53\xc7\x59\x9b\x33\x14\x4a\x52\xe0\x0e\xa7\xd0\x2f\x37\x94\x11\x43\xe5\xb5\x80\xba\xf6\x08\xea\x52\x63\xb5\x31\x78\x3c\x7c\x90\x63\x15\xad\x02\x2d\xaf\x1a\xc5\x03\x6c\xb8\xbe\x9e\x4d\x68\xce\xca\xf5\x53\xf5\x96\x5e\x7a\x8f\x15\x65\xd4\x6d\x44\xc7\xa6\xd4\x22\xaf\x7a\x22\x5f\xf6\x22\x66\xc7\xfa\x94\x3d\x8e\xc1\xe9\x3f\x4d\xe4\x36\xde\xa0\xba\xa6\x8f\x62\x69\xda\x1f\xd4\xad\xcf\xf5\xc8\x97\x31\x37\x65\x11\x73\xd3\x47\x71\x87\xd9\xeb\x86\x44\x86\x55\xd6\x6e\x48\x08\xfd\x49\x7d\x89\x82\xb3\x99\x76\x2c\x29\x4b\x9c\x0b\xa2\xde\x61\x3b\xb4\x39\x92\x2c\xd1\xa1\x3b\x11\x47\x50\xaa\xa0\x7c\x70\x6c\x7d\xe2\x77\xfc\x8a\x64\x99\x66\x5e\xbe\xf9\x7e\x24\xfe\x07\xe6\xc6\xae\x98\x35\xe8\x92\x15\x17\x70\x74\x35\x6e\xe8\x9c\x54\xa7\xb4\xa6\x8d\x1f\x82\x56\xa9\x6e\x0a\xb1\xc7\xce\xe1\x25\x4a\x41\x5b\xfa\x60\x24\x8a\x0f\x13\xb0\x8f\xb2\xfb\x87\x64\xd8\xd6\xe7\x4a\x60\x34\x7a\xb7\xb4\x46\xa2\xcd\xe2\x0e\xdd\xd7\xf4\x16\xa9\x67\xd5\xda\x69\x84\x76\xf0\xa9\x16\x51\xc2\x58\xfd\x34\x2e\x4e\xa2\xe6\xb6\x68\x33\x83\xd4\x7e\x1f\x2d\x8e\xbd\xa2\xc4\x15\xe5\x70\x53\xfc\x0a\x4d\x13\xb9\xb2\x4b\xe4\xea\x47\xf0\x98\xa1\x7d\x17\x0a\xd9\xc4\x60\x46\xe7\x41\x88\x67\x2b\x9a\x19\xef\x30\x6d\x38\x0b\xf0\x8d\x6c\x5b\x7b\xde\xf0\xfc\x75\x08\x3a\x1a\x1d\x0f\xcb\x96\xd2\x8f\x87\xb6\x4f\xd5\xb3\x30\xde\x3d\x88\x87\xb9\xaa\x4a\x76\x4c\x3c\xf3\x64\x13\xa7\x5b\x14\x3d\x1f\x35\x78\xc6\x53\xfb\x82\x17\xce\x70\xa1\x28\x94\x7c\xc5\x7b\x74\xa8\x1e\xe5\x16\x7f\x67\xc7\x57\x68\x51\x82\xfd\xa0\x5b\x77\xfb\xbc\x55\xf5\x2a\x64\xdf\xfb\xa6\x1b\xf8\x9e\xd8\xc0\x83\x71\x34\x38\x80\xdc\xf4\x0f\xf1\x80\xa0\x68\x48\x70\x3e\xfa\x5b\xde\x33\xcc\xd3\x4f\xc5\x57\xb8\xb2\xf8\xfc\x79\xe0\x86\xbb\x6d\xc7\x62\x48\x94\x1c\xcf\x30\x8d\x66\x1c\xb5\x11\x37\x48\xd8\x34\xc9\x8e\x51\xeb\x25\x83\x94\x28\xea\x25\x43\x13\x34\x12\xf3\x92\xa1\xf3\x90\xe7\xd1\x80\x38\x5e\x32\x56\x6d\x28\x96\x03\xfd\x32\x79\x53\x07\x10\x71\x8f\x0d\xda\x5d\x83\xf2\x98\xaa\x1c\x59\xf6\x7a\x66\x28\x49\xd7\xf9\x42\xce\xca\xdd\x41\xcf\xd3\x2b\x26\xdd\xb9\x8f\xea\x79\x85\x2a\x71\x64\x99\xdf\x25\x5b\x86\x4e\x5d\xf4\x5c\xd0\x57\xf6\xb2\x20\x97\x20\xd1\xb0\xe8\x3c\xc6\x7f\x10\xdf\x28\xb6\x81\x54\x9d\x5f\xd0\xdb\x0d\xac\x79\xcd\x82\xf8\x10\x56\xeb\xb3\x5b\x96\x28\x30\x44\x37\xa0\x04\xf9\xae\x03\xe3\xa8\x8f\x4c\x00\xbc\x67\x50\x86\x4a\x64\xde\x69\x27\x98\x4e\x45\x63\x0e\xe0\x6c\x16\xba\x95\x44\x32\x1c\xb8\xf5\x28\x99\xb7\x61\xcd\x57\x3b\x21\xe8\xec\x6f\xeb\xda\x21\x70\x68\xf0\x10\xea\xd7\x9d\x5a\x84\x00\xb6\xe4\xef\x4e\x70\x79\x43\x6b\x12\x00\x72\x4c\x38\x6a\xc4\x3a\x5f\x4b\x61\x49\x79\xf5\x7a\xa6\x99\x37\x90\x4b\xa7\x07\xc3\xbb\x06\xc1\x4a\x64\xdf\x34\x98\xa3\xe1\xee\xd1\x32\x47\xb7\x33\xdc\x40\x65\x2e\x48\xd0\xb5\xe0\x06\x67\xa8\x61\x98\x71\x51\x8e\xcd\xe5\x2b\x92\x61\xe0\x32\x68\xa5\x4b\x0c\xff\x50\xd1\x23\x97\x5f\x69\xd6\xf5\x9b\x61\x0a\x4c\x91\x7c\xef\x69\x0e\x7c\x10\xdb\x2f\x8e\x33\x0f\xf9\x66\x6f\x25\xfd\x5f\xef\x28\x49\x93\xe9\x07\x78\xde\x30\x2d\x18\xcf\x1b\xed\xc9\xf1\x85\x3d\x6f\xd8\x13\xa6\xeb\x79\x03\xf9\x2f\x83\x1e\xb3\x6f\xb7\x42\xb7\xef\xa5\xb6\x67\x97\x40\x78\x80\x17\x0b\x7d\xa0\x6c\xe8\xc5\xc2\x07\xf9\xff\xf3\x47\xb1\xca\x1f\x85\x46\xf7\x4d\xec\xe5\xff\x79\xbc\x51\xb8\x52\xef\x1f\x5b\x3e\xd7\xba\xe3\x3f\xaa\x99\xfa\xa6\xbe\x2a\xb6\x56\xba\x1b\x9d\xf9\x1a\xb5\xbb\x51\xf8\xdd\xbb\x61\xdd\x40\xbf\x5e\xff\x71\xcc\x8e\x37\xd0\xb8\x6e\xa2\x23\xe5\x1b\x05\x64\xbf\x87\x76\xf3\x6e\x04\x47\x13\xf4\x89\xcd\x2f\x2f\xf1\xed\x10\x1c\x5f\x97\xdf\xff\xf0\x3d\xd0\x2e\xdc\x69\x33\x94\x7a\xb9\x50\x29\x97\x37\xa8\x86\x82\x79\xf8\x34\x6f\x6a\xa9\xf0\xb8\x68\xe8\x0d\x43\xcd\x27\x36\x43\x75\x2d\x7d\x0a\x0a\x86\x60\x8c\x46\x57\xd4\x4b\x3b\xca\x19\x87\x7c\xce\x2e\x60\xa3\x5e\xed\x1a\x7d\xed\x0c\x32\x8e\x3e\x55\x90\xc3\x4f\x78\x0a\xc7\x48\xc6\xca\x91\xbf\x3e\xc1\xea\x9a\xc3\x8b\xf6\x7b\xa4\x1f\x2c\xec\x0e\xf2\x29\xaa\x30\xfc\x54\x8b\x91\x08\x8e\xa0\x92\xb5\x4c\x04\x1e\x5a\xa1\x46\x08\xaa\x57\x98\x0c\x41\x8d\xc7\x13\x3e\x6e\xe0\xe2\x60\xdc\xc0\x0a\x4b\x4f\x3b\x48\x3a\x8e\xfe\x24\x7d\x31\x61\x32\x1e\x0a\x02\x06\x72\xb5\x01\x50\xf5\x49\xbe\xec\xfb\x84\xd4\x92\xb0\x21\xb8\xc8\x71\x7e\x71\x28\x24\x44\x32\xce\xf1\x21\x9a\x82\xfc\x92\x12\xce\xf0\x6f\xe8\xd3\x25\x6d\xa6\x50\x14\xfa\x8f\xd9\x6d\x72\x34\x10\xff\x3c\x11\xff\x7c\x2f\xfe\xf9\x77\xf1\x8f\xc8\x78\x22\x3e\xbf\xfb\xb7\xd9\x6d\xf2\xbd\x28\xf2\x83\xf8\xe7\xdf\x06\xb3\x5b\xd1\x90\xaa\x7f\x77\x41\xeb\x6a\x78\xa7\xe1\x02\x2e\xc0\x32\xc7\x1c\xd6\x78\xd4\xa6\x61\xb0\x5c\x4a\xbf\x2e\x4c\xde\x5e\x7f\xaa\x21\x19\xcf\x25\xc4\xde\xdf\x71\xf9\xe8\xe3\x14\x18\xf7\x16\x23\xb0\xcc\x4d\xe2\x37\x6d\x2a\x9b\xc0\x66\xe6\x64\xed\xef\xb7\x79\x33\x37\xe3\xfc\xdc\xa9\xc4\xda\x8c\x67\x54\xb9\x03\xd4\x79\x95\xfa\xb4\xd9\xcf\x6b\x7c\x8b\xdb\x6c\xa4\x3e\xdb\xec\x46\x8c\xb9\xcd\x56\x9f\x36\xfb\x85\x1a\x9e\xc9\xbe\x0c\x46\xfb\x17\xcc\x6d\xde\x18\x73\x27\x83\xb6\xe9\xb4\x4d\xfe\x19\xb2\x2b\x54\xd7\x36\x6f\xa2\xbf\xdb\x02\x6f\x5f\xbd\xb4\xb9\x53\xd8\x5c\xcd\x67\x6e\xe6\xdb\xd7\x6d\x55\xce\x9d\xac\xff\x84\xd7\xd0\x66\xfd\x5d\x7c\x78\x59\x8a\xa9\xf7\x0a\x30\x95\xd4\x16\x3b\xff\xf5\x97\xb6\x00\xa3\xa4\xcd\x7a\x89\x18\xb3\x59\x35\x72\x81\xff\x0a\x5e\xa1\x4b\x2c\x28\xba\x1d\xb3\x4e\x70\x8a\x18\xef\x28\xce\xb4\x64\x82\x2d\x42\xc6\x98\xdc\xda\x7c\xf5\x65\x33\xd5\x79\x82\xaf\x51\xd2\xe2\x12\x35\x69\x0e\x52\xbd\x46\x4d\x0b\xd8\x99\xf8\x68\xb3\x7e\x6e\xe1\x36\x9b\x38\x60\x7b\x4d\x6f\x50\xc3\x26\xee\x92\xcc\xda\xa4\xb6\xd8\x82\x4f\x68\x3b\x81\x99\xfa\xb4\xd9\x6f\xe6\x17\x0b\x9b\xd9\x88\x0f\x27\x8b\x71\x27\x8b\x39\x00\x3f\x87\x8c\x25\xe7\x2e\x5a\x33\x0f\xaf\xcf\xff\xab\xc5\x04\xf6\x0f\x67\x34\xe7\x37\xf8\xb2\x6d\x94\xc9\x2f\x9b\xf9\x76\x31\x43\xc1\x6a\x8b\x53\x3b\x5c\xed\xff\xdf\x0a\x34\xfb\xdb\x89\x93\xb9\x80\xd3\x1a\x2c\x3f\xe6\xb3\x7a\x3e\xc6\x84\x0d\xdf\x03\x58\x5d\x0b\x6e\x56\xf0\xd4\x54\x9c\xbc\x4a\x7c\x4f\xe4\x4f\x49\x14\x93\xd1\x04\x36\x53\x38\x4b\x66\x0d\x26\x3c\x99\x34\x09\x24\xa3\x09\x55\x16\x4f\x17\x0d\x82\x57\x20\x07\xca\xa9\xaf\x56\xfa\x25\x37\xb4\xa9\x46\x74\x4e\x78\x72\x8d\xd9\x1c\xd6\x17\x35\x1d\x5d\x31\xfd\x21\x9a\x63\x89\xa0\x32\x49\x4b\x6a\x92\xcb\x79\x5d\xb3\x51\x83\xe4\x3b\x69\x2c\x4f\x2c\xe3\x3f\x34\x91\xa4\x38\x21\x94\xc8\xde\x30\x19\x27\x0c\x5e\xa3\x44\xdd\x87\x2b\xb9\x13\x53\x02\x6b\x2c\x58\x79\x60\x6c\xb0\x12\x49\xf7\x13\x01\x04\xa9\x60\x4e\xe4\xbf\xca\x19\xa9\x4c\x9d\x41\x2e\xf8\x57\x35\x4b\x71\x66\x0b\xd6\x67\x8a\xc8\x7c\x78\xb7\x94\x7f\xf5\x49\xa2\x8f\xf3\xa3\x21\xd0\xa4\x54\x1e\x60\x89\x21\xd0\xfa\xf3\x73\x22\xe8\x6b\xa2\x48\x6a\x32\x17\x67\xa2\x20\xaa\x89\xe0\x55\xaf\x10\x9f\x34\xd2\x58\x44\x9e\xb0\x6a\xf5\x12\x36\xbf\xd0\xbf\x3e\x27\x97\xb4\x41\x6a\x94\x17\x70\x74\xa5\x7e\xc9\x25\x98\x13\xe9\xe3\xc5\x0c\xe2\xc9\x10\xd0\x39\xaf\x10\xe1\x89\xf2\x3e\x94\x5c\xcc\x6b\xb9\x7e\x64\x3e\x95\x7f\x3f\x27\xb0\xc6\x63\x52\xa3\x4b\xae\x7e\x8d\x90\x90\xc8\xd5\x6f\x65\xc4\x2b\x7f\xfe\x7d\xce\x38\xbe\x5c\x24\x9f\x35\x1c\xd5\x5a\x2b\x50\xb7\xeb\x02\x72\x01\xea\x4f\x94\x88\x3f\xc6\xe5\xe0\x70\x43\xc7\x43\xcb\x1d\x60\x55\x58\xa0\x2c\x05\xe2\xd2\xcb\x84\x63\xb2\x98\x8e\xd0\x71\x44\x49\x71\xa8\xf3\xcc\xdf\x62\x8a\x49\xf1\x77\x66\x38\x07\xa7\x5b\xad\xa3\x36\xe5\x2a\x3a\x2d\x9e\x5f\x0b\x1e\xb3\xa2\xd3\x97\x14\x56\xd2\xf7\x68\x6e\xb2\x2f\x20\x43\xef\xde\xbc\x2c\xc1\xe1\x21\xd8\xef\xa8\xb7\x29\xe3\xfb\xb6\x6b\x60\x2b\x29\xbe\xa5\x04\x62\x10\x6d\x2a\x26\x98\x4b\x01\x77\xd8\x49\x79\x70\xa8\x3a\xdb\x89\xba\x91\x7c\x05\x09\x1c\xa3\xa6\x40\xb7\x68\x74\xaa\x1c\x3f\xa5\x60\x3a\x42\x6f\xa4\xae\xd8\xb8\x71\x92\x5c\x49\xe4\x72\xd3\xf3\xb1\xb4\xda\x9d\x50\xb4\x57\xd1\x5e\xb4\xe1\xbc\x75\x04\x2b\xc0\x37\x46\xd2\x73\x15\x22\x3c\x0d\xf4\xfb\xc4\x73\xf7\xc0\x73\x23\x87\x12\xeb\xf4\x76\xb2\x81\x1f\x23\x01\x60\x65\x09\xa9\x3a\x61\xbd\x6e\x8a\x34\x3b\xbb\xdd\x6c\x4c\x37\x5d\x8f\x6e\xaa\x9d\xf6\x8a\xc3\xbd\x09\xdb\xdb\xe3\x85\x1e\xc1\xd7\x75\x75\x24\xa4\xfc\x2d\x27\xb8\xd6\x39\x12\xf3\xd6\xf0\x71\xee\xaa\x3d\x11\xf3\x0f\x2a\x0d\xcb\x98\x2d\xea\xcf\x81\x20\x9d\x3d\x97\xd4\xca\xb3\xd1\x88\x12\xc6\x21\x59\x19\xa1\x7f\xab\x9b\x6d\x79\x51\xd5\xbd\xbc\xce\xe9\x97\xf5\x96\xd4\x5e\x64\xd3\xf6\xfa\x7a\x02\xd9\xeb\xf9\x45\x8d\x47\xca\x2e\x55\x8a\x5d\x22\xad\xa1\x5c\xbe\xca\x08\x93\xa5\xf1\xbe\x93\x78\xcf\x2b\xdb\x99\xdb\xa7\x8d\xd6\x38\x0b\x7a\x75\x32\xdc\x7e\xcb\xf7\x1f\xb7\xba\xe9\x35\x21\xc0\x72\x22\x1a\x94\xad\xba\xb1\xea\xb9\x87\x8f\x5a\x2c\x55\x06\xc4\x82\x07\x03\x99\xbc\xf6\x32\x9e\x8d\x5e\xd8\x8c\x42\x01\x6e\x6f\xcf\x73\xf7\xcd\xad\xd6\x77\xa3\x26\xd4\xc4\xf6\xf6\xe8\x43\xda\xd0\x50\xdb\xdb\x63\x7e\x2b\xde\x25\xb3\x07\x72\xe0\xbf\x7b\x0d\x01\xaf\xc2\x3c\x38\xd9\x2e\xf8\x65\xfc\xfc\x36\x33\xc4\x20\x57\x27\xe1\xf5\xa9\xef\xf8\x40\xf6\x74\x10\xd6\x0f\xda\x77\x1a\xf0\x72\x56\xb5\x10\x4e\xc0\x6d\xc3\xcf\x73\x5b\x71\x8e\xca\xf5\x14\x4e\x33\x62\x87\x97\xb4\x39\x30\xee\x26\x57\x9b\xb7\x28\xef\x20\x5b\x50\x8d\x29\xad\x60\xfd\xd5\x0d\x5b\xa2\x1e\xd5\xe6\x0c\x35\xfd\xfe\x22\xe4\x05\x48\x96\x33\x4e\x9b\x1e\xa3\x97\x2c\x97\xfb\xae\xbf\x09\x6d\xa3\x9f\xe5\xda\x05\x7a\x5f\x33\x6b\x74\x86\x33\x4c\x08\xaa\x7a\xc7\x30\xa1\x37\x6f\x05\x83\x2f\xaf\x92\x26\xf4\xe6\x99\x5e\x38\xc9\x11\x3d\x80\x80\x61\x65\xa8\x5d\xde\x61\xf6\x5a\x8d\x60\xf7\x48\x8c\x45\x45\xa5\x21\xe8\xc6\xc4\x6c\xd5\x88\x0a\xaf\xd1\x5b\x2d\x9e\x94\x77\x26\xe0\x4d\xa5\xc5\x39\x79\xf5\x05\x36\xb5\x5f\x59\xaf\xb2\xeb\x3c\xa8\xb7\xe8\xea\x9e\xf1\x0a\x72\x20\x13\xfc\x8c\xce\x57\x53\x49\xdd\x58\x2e\xdd\x30\x40\xc6\x7d\xa5\x06\x41\x21\x67\xed\x3a\xf6\xb7\x39\x06\x36\x20\x57\xf6\x1b\xdd\x12\x1a\x50\x36\x7c\x8c\x0e\x05\x98\xf3\x58\x18\xcf\x76\xcb\xbb\xe0\x2c\xc2\x38\x7a\xd6\x15\xac\x6d\x2c\x5e\xcf\x81\x7e\xb4\x3a\xba\x1d\xa1\x66\xc6\xd7\x2a\x53\x37\x44\x19\xb9\xb7\xcf\xc8\x6c\xce\x5f\xc8\xdb\x5f\xf0\x8d\xe9\xe9\xc0\x08\xae\x07\x6a\xff\xe7\xe0\x1b\x82\x6e\xda\x54\x35\x8f\x47\x10\x32\xe2\xf6\x26\x8e\xb4\x60\xf0\xe0\x19\xaa\x51\xe4\x79\x89\x1c\xde\x69\x4d\x19\x72\x47\x5f\xc9\xc2\x7a\xec\x3e\x13\xe9\xb7\xd7\x7a\x91\xc0\x84\x9b\xac\x61\x57\xb6\x93\xea\x06\x55\xf4\x1d\x99\x61\xb2\x6a\x1b\xf8\x98\x3c\x17\xc5\xcf\x38\x9a\xa6\x5e\xa6\x8b\xa7\x91\x10\x34\xed\xcd\xbd\x9d\xd3\x0c\x93\x83\x0b\x69\x09\x0c\xb2\x42\xd3\xeb\x14\x54\x98\xcd\x28\x43\x60\x15\xa6\x3b\xb7\x9b\xe1\x0e\x01\xb2\xa2\x74\xe1\xf4\xd3\x5c\x33\x41\x6c\x22\xcb\xa9\xcb\x4a\x10\x47\x7c\x09\xb3\x3e\x30\xe4\xa8\xbc\x13\x30\x8a\x4c\xd8\x6c\xae\xcc\x46\xcc\x3d\xab\x86\x11\x44\x97\x51\xb3\x14\x39\xf6\x0a\x48\x02\x2e\x73\x97\x5d\xdf\xb2\x16\xe6\x06\xe2\x1d\xaf\x65\xe8\xb1\x21\x3b\xe8\x85\xac\x4b\xb0\xee\x05\x62\x29\x59\x52\x72\xee\xd0\x87\x95\x2c\x65\x87\xfe\xf8\xee\x27\x7b\xe9\x8c\x31\xb4\x34\xee\x3a\x9d\x60\xa4\x91\x2d\xbf\x51\x40\x52\x7c\x99\xee\x3a\x56\x88\x2e\xd0\x63\x4d\xaa\xfd\x1f\x69\x35\xef\xa9\x27\x86\xbf\xb2\xde\x4a\xb2\x0c\xfa\x0b\x78\xf4\x17\x80\x88\xff\x62\x7f\x41\x40\x26\xd8\x21\x97\x9a\x76\x48\x51\x40\x48\xe5\xb2\xae\x9e\xd6\x6a\x08\x2f\x95\xe0\xbb\xb3\x29\x5b\xa8\xa3\x71\xaf\xe2\x09\xd7\x31\x7f\xeb\xb9\x48\x25\x96\xaa\x9b\xf0\xdf\x41\x8e\x44\x11\x89\xf2\x4e\xf1\x7a\x2b\x8d\xa0\x2d\xbf\x57\xd3\x11\xac\xcf\x39\x6d\xe0\xb8\x97\x77\x34\xcb\xb4\xba\x49\xeb\xce\xe3\x0b\x33\x91\x4e\x0c\xfe\x7c\x44\x67\x0b\x4b\x22\x64\x70\x84\xd9\xe2\x35\x6a\xa6\x58\xf5\xaf\x53\xec\xe9\xb6\x7b\xa4\xf9\x60\xc4\x39\x26\x63\xd6\xbd\x59\xb6\x75\x59\xe4\x82\xd9\x25\xb8\x6d\xc1\x42\x36\xf9\xab\x8a\x3f\xe6\xfa\x7d\xea\x94\x51\x4a\x22\xa0\x44\x1b\x71\x06\x9f\xbb\x73\xc1\xe4\x1a\x73\xf4\x7c\x0a\x71\xdd\x7e\xbe\x42\x8c\x89\x95\x01\x40\x88\xfc\x66\xaa\xdd\x81\x1b\xe0\xaf\x19\xb6\x2d\xe6\xc8\x5d\xcb\x2c\x97\xe4\xea\x19\x1d\x99\xa1\xb8\xdf\xca\xb3\xf0\xee\x91\xc5\x02\xa7\x5c\x90\x64\x8b\x9a\xc0\x53\x76\x69\xa4\x17\x7e\x3a\xfb\x8d\x12\xf4\xa0\x88\x9e\x78\x3a\x93\x8f\x2f\xcd\x8a\xb6\x5a\x09\x95\x73\x2e\xaf\x9e\x6d\xe2\xa8\xa6\x04\x55\x12\xca\xe5\x1d\xae\x5a\x09\x60\x73\x89\xe1\xcb\x89\x01\x8a\x3c\x65\x39\x29\x3f\x15\x0d\x52\x5a\x82\xae\x9a\x44\xbb\xf6\x35\x07\xea\x32\x73\x3c\xdc\x89\x33\x40\x0b\xd2\xbf\x1a\x4f\xc3\xc4\xb5\xfd\x71\x84\x0a\x09\x84\x3f\xb6\x44\x31\xf0\x2c\x3a\x3d\xfc\x07\x99\x35\x4a\x76\xcc\xc6\xbc\x12\x76\xda\xcf\x14\x19\x3c\x13\xb9\xf2\x6a\x41\x97\x48\xbf\x98\xe8\xa0\x74\x97\x1e\xe7\x9d\x83\x6f\xf4\xb7\xca\xd4\x6c\xc9\xca\x06\xd4\x7c\xda\x06\xbc\x54\x24\xe8\xc2\x17\x93\x3b\x72\xf7\xfd\x80\xc3\x94\xea\x3d\xab\x02\x11\xc6\xd2\x05\xdf\xa0\xdc\x2e\xb9\x1e\xf7\x4c\xb6\x72\x10\xa8\xac\xe8\xfb\x96\xa5\x6b\x7b\x0c\x7e\x46\x8b\x84\x4f\x50\x83\xf2\xe4\x2c\x81\xd3\x84\x4d\xa0\x74\x38\xc2\x27\x28\x71\x8d\x79\x14\x4b\xac\x40\xbb\x0f\x12\xf9\x99\xa4\x98\x24\x81\xf9\xac\x38\x6c\x0a\xa5\x78\xcf\xf6\x41\x96\xdc\x60\x3e\x91\xfe\x59\x18\x4d\x6e\x94\xdf\x9c\x0b\xca\x27\xc9\x88\xd6\x35\xbc\xa0\x0d\xe4\xd2\x77\x8e\x61\x64\x58\x01\x96\x39\x43\x7c\x3e\x3b\x93\x44\xc6\xb3\x44\xfe\x92\x70\xeb\xb3\x37\x6e\x45\x01\xef\x6a\xc2\xcc\x14\x91\x6a\x46\x31\xe1\x62\xb2\x87\x8a\x2e\x1e\xaa\xf3\xfe\x10\xec\xa3\x9c\x95\x04\xdd\x24\xcf\x74\x5f\x29\xf8\x46\x15\xb1\x5a\x34\x23\x10\xe4\x77\x13\x04\xa5\x6a\xf9\xee\xc4\x8d\x1e\x3c\x04\x3f\x21\xd8\xa0\x26\xb1\x66\x43\x61\xf8\x3c\xfd\x50\x31\x08\xa3\xa7\x9f\x88\x2c\xf3\x79\x53\x0f\x49\x3e\x45\x7c\x42\xab\x21\x98\x51\xc6\x41\x3e\x83\x0d\x9c\x2a\x9a\xab\x82\x7f\x28\x7d\x1e\x1c\x8d\xd0\x8c\xa3\xea\x05\xae\x11\x1b\x82\xa2\xa2\xa3\x5c\xfc\x73\x9b\x17\xd3\x2a\xb7\x81\x3e\xf2\x62\xc2\xa7\xf2\x9f\x1a\xe4\xa3\x1a\x8f\xae\xe4\x5b\xed\xdd\x41\x3e\x85\xb7\xb2\x2e\xfe\x0d\x0d\x8f\x06\xb2\x9b\xba\x46\xf5\xbb\x59\x4d\x61\xc5\x86\xdf\xe5\x73\xf9\xeb\xd5\x5c\x6c\x04\x51\xe5\x28\x87\x55\xa5\xae\xf6\x5e\x62\x72\xc5\xf4\xa3\x30\xaa\x7d\x0e\xfc\xd7\x1c\x49\x2e\x2d\x7e\x80\x51\x92\x02\x6d\x22\xdd\x35\x58\x26\x95\x2b\x84\x9f\xe9\x93\x4c\x90\x46\x81\xc1\x39\xb2\x4a\x15\xd1\x8a\xb2\x4d\xef\x35\x68\x06\xa7\x94\x5c\xa3\x46\x40\x5b\x3b\x4b\x4f\x2e\x65\x30\x19\xd5\x16\xf7\xda\x82\x55\x85\x2a\x65\x4e\xb2\xc9\x98\xa4\xcf\x45\x35\x28\x69\x79\x29\x03\x2d\x93\x14\x08\x66\x43\x2a\x0e\x02\xc7\xd6\x8a\x96\x08\x28\x87\x5a\xee\x16\x9f\x99\xaf\xd9\xf8\xca\x8a\x04\x45\x48\xff\xf7\x6a\x11\x00\xf8\xd2\x0a\x83\x07\x43\xf0\x2b\x68\x0b\xc4\x10\xe5\xe9\x12\x98\x99\x17\xb3\x46\x36\xaa\x0f\xa0\xb4\xcb\x89\x39\x9c\xb7\x0d\x0c\x66\x5f\xce\x1d\x26\x87\x63\x15\x32\x60\x05\x73\xa2\xea\xec\xe0\xcb\x54\x30\x31\xc4\x7d\x41\xb5\x01\x5b\x92\x0f\x76\xdb\xc7\x5c\x36\xb2\xbb\x39\x1f\x49\xfe\x06\x8d\xf0\x0c\x4b\x13\xc5\xf7\x1f\x97\x3b\xa8\xc0\xa4\x42\xb7\xbf\x5e\xa6\x20\x07\xd9\xd3\x83\x23\x19\x2a\xbc\x2d\x54\xa2\x82\xcd\x6a\xcc\x65\x76\x96\x3b\xc5\x7f\xd4\xc5\xc5\x20\xdd\x1a\xed\x78\xe3\xed\xfc\x28\xda\xe9\xad\x84\x6c\x28\xdc\xbd\x3d\xaf\xc0\x6c\xce\x26\x29\xf2\x03\x0e\xb7\x90\x6e\xb5\x11\x2d\xba\xb6\x56\xea\xe2\xcc\x47\x21\x43\xac\xce\x3c\xb6\x7e\xaf\xfb\x4c\x53\xbf\xba\x64\x19\x53\x60\x44\xb8\x31\x1d\x22\x7c\x4d\x37\x6b\xd4\x17\x06\x49\x43\x7d\xee\x66\x48\xaa\xc5\x05\x97\x8f\xf6\x50\x32\x90\x28\x75\xd8\xe2\x52\x3e\xb2\x52\xec\xb9\xfe\x8b\x3c\xf7\x44\x41\x2d\xb9\x28\x8e\xa2\xb0\xcb\xc3\xf6\x03\xd3\x57\x36\xb7\x0d\x83\x2c\xba\x8e\xfd\xa0\xf7\x75\xd8\x21\xe8\x63\x63\xda\x00\xf2\x13\x7a\xf3\x5c\x8b\xb5\xaf\x44\xc3\x71\x7d\xfa\xaf\x33\x44\x52\xf0\x8d\x14\x80\x05\x47\x64\xb8\xf1\x3b\x36\xa1\x37\x43\x41\x69\xdc\x4c\x73\x17\x40\xc9\x49\x55\x99\xd6\x7b\x2c\x4a\x76\x7a\xd6\xd8\x5d\x43\x57\xee\x0e\xb4\x93\xc4\x3e\x6d\x6b\x17\xaf\x23\xa6\x2b\x42\x2b\xdf\xb1\xb5\xf0\x0a\x87\x6b\x15\x96\xab\x1b\xf2\x7c\x68\x7b\x03\x6b\x37\xae\xb7\x76\x21\xcc\xdc\xcd\x1d\x68\x90\x84\x44\xaa\xe4\x75\x78\xdd\x6a\x09\xe2\xbb\x1d\x0c\xfa\x5c\x9f\xcb\x92\x0d\x9d\x73\xd4\x48\x12\x0c\x09\xc3\x22\xf7\x2d\x75\xee\xd8\xcc\xf9\xe2\xb4\xe8\xa5\xb0\x7a\xae\x82\xf1\xdb\x53\xc8\x3e\x14\x93\x39\x26\x8c\xc9\x84\xde\xbc\x6d\xb5\x1d\x71\x0c\xf2\x55\x2c\x12\xd2\xdd\x37\xa7\xfa\x18\x34\x2a\x12\x1d\x8c\x21\xef\xa0\x60\xab\x1b\x8d\x63\xa1\x97\xdf\x22\xa2\x0a\x24\xd7\x55\x9b\xf3\xc7\x18\x63\x27\xd9\xbb\xfa\x0f\xb5\x3e\xfa\x2d\xad\xde\x1e\x0e\xf4\x1e\xb0\x43\x02\x8d\xd3\x06\x9b\x24\xa6\xa3\x8a\xee\x93\x08\x40\xed\x56\x09\x0d\xe5\x3a\x53\x95\x36\x77\xe6\x3d\xfd\x71\xdb\xe8\x0d\xae\xc6\x88\x4b\xbb\xa6\x83\x99\x0e\xea\xdf\x43\xad\xdc\xd7\xda\x3d\x83\xf6\xf6\x64\x08\x8a\x9e\x6d\x19\xc1\xa3\x47\xda\x99\xec\x77\xde\x97\x76\x63\x2a\xb9\x65\x23\xc2\xde\xca\xba\x9d\x3d\xd5\xc2\xd6\x08\xfa\xa9\xb7\x2d\x65\x57\xf1\x36\x3a\x9c\xc8\x66\xef\x73\xcc\x0b\xc9\x8e\xfc\xb5\xd2\x28\xd1\xd5\x74\x86\x6c\x69\xa8\x1e\x95\x41\x19\x1d\x33\x24\x2d\x37\xca\x30\x17\x60\x9f\xef\x03\x19\xe4\x22\x57\x46\x53\xa9\xf7\xc4\xd2\xeb\x26\x47\xdd\x2c\xb7\x9b\x9c\x44\x26\x82\xaa\xc7\x9c\x07\xbe\x4c\xfd\xa9\x9c\x2b\x41\xfb\x72\x5e\xd7\x8b\x64\xa4\xe6\x85\x2a\x31\x2d\x39\x21\x3a\x7b\xd8\x7c\x72\x97\x93\x8f\x5d\xb9\x77\xd0\xc0\x67\x80\xde\xa0\xcb\x06\xb1\x89\xbc\x66\x97\xc1\xdc\x67\x88\xc4\xc9\xf2\x06\xbc\x5f\x84\xdc\x84\x17\x8d\x7d\x94\x32\x7c\x7d\x8f\xf4\x30\x23\x7c\x57\x78\x61\xa7\xc9\x9e\xb5\x50\x2c\xa6\xf0\x0a\x9d\xd7\xf3\x71\xaa\x7d\x73\x68\x9d\x9a\x3b\xf1\xb5\xfb\x3e\x4a\x4a\xc2\x44\xbd\xfb\x51\xce\xcc\xad\xdf\xc6\xc6\x60\x5a\x73\x7e\x5f\x4f\x47\x51\x7b\xd0\x2f\x71\x87\x17\x77\x60\xf4\xb0\xcb\xad\x09\x64\xa7\x35\x25\xa1\x23\xa2\x82\x50\x2e\xb9\xd3\x14\x38\x37\x22\x0a\xf2\x4e\xc2\x3d\x6f\x66\x1e\xaa\x54\x6f\x0f\x4b\x58\x55\x9a\xad\xd7\x08\xa8\x14\x6a\x13\x7a\x53\x5c\x68\x84\xf5\x95\x4f\xdb\x10\x5b\xff\xe6\xd9\x93\x1e\x8c\x98\x20\xc9\xb1\xa3\xa6\x92\xb0\x3c\x9f\xd9\xf0\xbc\x3d\x2f\xc3\x1d\x10\xaa\xc0\x6f\x92\xdf\x51\x20\xbd\x8f\x90\xf7\x4b\x57\xb8\x0b\x97\xcd\xe3\x7a\x50\xc4\xeb\x45\x67\x8e\xab\x25\xa4\x7c\xf7\x48\x6f\x76\x65\x0e\x87\x72\x39\xf7\xb3\x67\x43\xe2\xa3\xa1\x33\x24\x27\x59\x3e\xfe\xf7\x90\xd3\x2f\xd7\x66\xe8\x92\x16\x69\xfd\x72\xcf\xac\x65\xdc\xd2\x91\x4e\x98\x2f\x9d\xf6\x00\x5e\xc5\x22\x5a\x01\x81\x4d\x6c\x2d\xba\x18\x28\xff\xa6\x60\x82\x2b\xb4\x59\x49\xab\x0e\xf3\x0d\xf8\x35\x42\x80\x2c\x65\x9b\x18\xf0\x1b\x8a\x46\xe0\xf5\xc1\x05\xec\x73\xdc\x16\xda\xc4\xfb\x74\xeb\x8b\xd8\xf3\x2b\x45\xe3\x86\xc6\x05\x6b\x03\xa1\xad\x34\x13\x58\x69\xcf\xba\xda\x48\x00\x49\x1f\x15\x2f\xe9\x98\xce\xa5\xdf\x92\x09\x64\xaf\x31\x09\xaf\xcd\x1d\xba\x38\xc3\x32\xf2\xea\x04\xda\x8b\xd2\x15\x85\x99\x29\xa2\x6a\x38\xf6\x9a\x2b\x2a\x55\x4e\x29\xd0\x75\xaf\x86\x2f\xd3\x0d\xef\xee\xc4\x50\xed\x0d\xb7\x77\xf1\x23\xce\xae\xd7\x0d\xbd\xc6\x12\xfa\x9e\x89\xfa\x89\x93\x55\xfc\x15\x2d\x46\x35\x85\x57\x5d\x53\x2a\xb7\xa5\x53\xed\x0d\x62\xc7\x0f\x80\xec\xa9\x05\x1c\x30\x83\x7c\x97\x17\x15\x66\x6d\x4a\xb6\x7c\x94\xfb\x56\xef\x8a\xc9\xf7\x51\x62\x6f\xd7\xac\xd6\x58\x3f\xe6\xbb\x40\xae\xde\x58\xb6\x93\x03\xc9\xd9\x6b\xf0\xb7\xac\xbe\x48\x90\x57\xc3\xf6\x6b\xed\xc5\x04\x66\xfa\x02\x56\x0c\xc1\xb5\xf8\xb0\x19\x98\x8c\x03\x5b\x10\xa3\x6f\x1f\x23\xfe\x8e\xa1\x46\xf5\x1a\xf3\x2c\x13\xed\x21\xde\x7c\xda\xaa\xd4\x3d\x2f\x53\x2d\x7e\x4a\x37\x5c\x35\x47\x8d\xe4\xfe\x98\x26\x95\xbb\x83\xd6\xf1\x8e\x87\x96\x41\x71\x4b\x8e\x65\x8d\xc7\x79\x5a\xe7\xad\xd6\x9c\x44\xd7\xcb\x3d\x85\xff\x3e\x9f\xce\xde\x52\xef\xaa\xa4\x95\x25\xdc\x77\x19\x67\xfa\x3a\xd4\x37\xa7\x3c\xd3\x87\xe5\xa7\x02\xb3\xe7\x46\x47\x70\xd7\x11\xe7\x05\xa5\x01\x59\x31\x43\xe8\xea\x0d\x1a\xd1\xa6\xb2\x44\xcc\xf2\xcb\xab\xb8\x5b\x5b\x36\x67\xbe\x8c\x2a\x6d\x02\xc3\xa0\xa9\x0f\xed\xcd\x91\xa1\x73\xea\xf6\x97\x93\xdc\x31\x2e\xdf\x86\x71\xe6\x07\x1a\xe0\x5f\xf5\x6d\x98\xf4\xa1\x2d\x0e\x76\x36\x7c\x0f\x46\xb4\x06\xb9\xf8\xf7\x80\x4d\x0f\xbe\x07\x1f\xb7\x18\x7b\x8d\xc9\xd5\x1f\x65\xe4\xff\xb1\xd5\xc8\xf5\xaf\x3f\xd6\x8b\xbc\x39\x3e\x50\x02\xe7\xd7\x05\x29\x63\x2a\x20\x10\x00\xf9\xac\xa1\xd3\x19\x57\xf2\x88\x0a\x0c\xfe\xdf\xa2\xa9\xd7\x90\x4f\x86\x52\x88\x55\x89\x2f\xe1\x05\xaa\x55\xa2\xb2\x6f\x85\xc1\x93\xce\xec\x6e\x99\x7f\xb2\x6f\x64\xc3\xb3\xb9\x41\xb0\x62\x46\xb8\x56\xbc\xa9\x25\x3b\xa3\xc0\x5f\x95\x77\x54\xfe\x8b\xa9\x04\xb2\xf7\x83\x8f\x85\x91\xce\xcf\x48\x85\x6e\xc3\xc0\xf7\x5c\xee\xc5\xf7\xbb\xbb\xce\x59\x20\x67\x07\xb2\x63\x7e\x70\x34\xe4\x1f\x1d\x4e\xb7\x1d\x6b\x40\x09\xa0\x7d\xff\xb9\x09\xf3\x38\xc7\x62\x0d\xe1\x35\xe4\xbd\x9c\x63\x60\xff\xfa\xe5\x19\x47\xe7\x31\x93\x34\xa8\x13\xf2\x59\xc4\xfd\x66\x70\xb9\xbb\xe1\x54\x47\xda\x23\xe1\x57\x45\x58\x0e\xc7\x4a\x52\x67\x33\x48\x80\x27\x37\x4a\x4f\x38\x51\x5f\xa1\x8e\xee\xbc\xab\xde\x11\x27\xc6\xa6\x53\xae\x30\xac\xe9\x78\xa5\x5c\x10\x35\x4a\xfe\x32\x7b\x57\xe1\xb9\x32\x45\x18\xc9\x57\xd6\x36\xe6\xb0\x7e\x74\x9d\x4b\xe7\x62\xcd\xd4\xa6\xff\xfa\x57\x90\x4b\xfd\xd1\x10\x9c\xaa\x2c\x90\x2b\x55\xec\x51\xae\x8c\x0c\xde\x4a\x97\x86\x17\x9c\x1c\x30\x19\xc8\x06\x36\x0b\x90\x4b\x4b\x1e\x19\xf4\xf8\xc1\x8c\x25\x73\xb6\xa8\xb4\xe5\xd0\x43\x54\x12\xdd\x01\xd8\x47\x9e\xe2\xeb\xac\x4a\x8f\x06\xda\x86\xf0\xdd\xac\x82\xfc\x1e\x6e\xa3\x76\x62\xfe\xf0\xdb\x21\x48\x56\xc5\xc1\x8b\x09\xbd\x01\xce\x1b\x02\x6e\x84\xcc\xbb\x65\x2b\x8a\xda\x44\x5d\x7c\xa7\xdf\xa7\xfd\x04\x57\x15\x22\x31\x5d\x0a\xb1\xae\xd8\x64\x23\xf2\xa6\xa1\xdb\x81\x15\x6d\x97\xc1\xa5\x2c\xef\x93\x93\x63\x75\xbd\x9d\xd2\x79\xaf\x1f\xf7\x16\xef\x80\x28\xd6\x62\xf4\x31\xbf\x00\x65\x47\xe3\x92\x6b\xcf\xa3\x9e\x6c\xae\x89\xab\xef\x2c\xc0\x3e\xb9\xf7\x02\x22\x58\xf0\x6c\xc2\x5d\xa9\x9d\xea\xde\xfd\x7c\x4d\xfa\x24\x8e\xc4\x17\x18\xd5\xd5\x10\x08\x69\x69\x4c\xd5\xf6\x21\xe3\xda\xa8\xb3\x76\x8f\xf2\x29\xbc\xfd\x19\xe1\xf1\x84\x0f\x07\xf6\xf2\x50\x9d\xbb\x32\x4c\xc5\x29\xeb\x9a\x9a\xdb\x2a\x2b\x3d\x9a\xb7\xa5\xda\xa7\x24\x4f\x07\xc7\x80\x5e\xa3\xe6\xb2\xa6\x37\x07\x8b\x61\xc2\x46\x0d\xad\xeb\x1f\x93\x29\xbc\x3d\x98\xa8\x51\xa8\x5b\x89\xd9\xed\x8f\x60\x08\xc0\x7d\xbc\x90\x7b\xe8\xf5\x96\x8e\xc7\x35\x0a\xb1\x42\x3b\x07\x76\x17\xfb\x5c\x1f\xe7\xad\x1c\xae\x36\xa0\x03\x2d\x90\x45\xae\x30\x38\x9a\xaa\x3b\x96\xd8\x2d\xaa\xe7\x74\x23\x7a\xdf\xcb\xda\x46\x72\x94\x2d\xfb\x2a\xf0\xee\x31\x21\x05\x8b\xd8\x0c\x52\xbe\x05\x6a\x36\xb0\xc2\xf4\xf7\x3c\x34\xb5\x3b\x24\x90\x53\x22\xc3\xf9\x29\xd4\x5b\x75\x94\xea\xf5\x0b\xb6\xb0\xac\x1c\xee\x60\x9d\xe8\xac\xa7\xec\xce\x80\x2f\x79\xdc\x53\x99\xa1\xe6\x80\x38\x8e\x52\x57\x1e\xcd\x53\xcc\x46\x5f\xe3\x60\xfe\x12\xca\xfc\x98\xae\x45\x4e\x7c\xf1\x4e\x3a\xe2\xd5\xca\x96\xc0\x6f\xec\x86\xa6\xeb\x71\xd5\x80\xd3\x7c\xb6\xcc\xc3\xa6\x3b\x9a\x01\xa5\x39\xf7\x3c\xb1\xba\x2b\x23\x76\x2c\x0b\x5d\x3c\x4c\x5a\x47\xe9\x6e\xc9\x5c\x9f\xd9\xd4\x72\xfe\x45\x77\xa5\x85\x14\xd0\x06\xff\x77\xed\xd2\x48\xf1\x2f\x29\xcd\xa4\x13\xdd\x34\x6b\x1f\x6b\x15\xd2\x3b\xf3\x35\xac\xd3\x0e\x05\x25\xf1\xf1\x72\xc7\xc6\x2e\xe5\x5a\x97\x7d\xc2\xd3\x81\xf5\x23\x13\x8c\x9b\x6b\x8b\x3d\x6e\xcd\xf4\xf4\x58\xc4\x09\x9d\x66\xcb\xfc\xc9\x0f\x83\x41\x1e\xef\xcd\x5c\x7a\x2e\x37\x61\xc0\x05\x34\x66\x0d\x55\xf6\xc5\x6b\xfd\x2f\x7c\x55\x41\x63\x02\x99\x0c\x75\x48\xec\xdb\xa4\x40\x02\x54\xf7\x27\xd2\x8f\x64\x5d\x5c\x9a\xa2\x4a\xab\xfb\x12\x6e\x5a\xb1\x86\x6e\x3d\x69\xdc\x18\xab\x64\x8a\x2b\x6b\xc1\x95\x67\xa7\x53\x2e\xf3\xe3\x77\x18\x2d\x96\x0e\x0b\xa2\xbc\x3c\x41\x5c\x2b\xd3\xeb\x09\x64\xaf\x75\x50\xd6\xf8\x08\x66\x6e\x2e\xc8\xed\x77\x61\x7e\x80\xfc\x6e\x8c\x78\xc4\x1f\xbc\xe9\xfe\x75\x83\x18\x22\xdc\x0b\x1d\xe5\xb6\x99\x65\xc7\xda\x78\x7d\x18\x8c\xb8\x53\xa1\xed\x34\xcb\x8e\x05\x51\x1f\x4a\x8b\x9c\xc1\x52\xcd\x44\x4b\x05\xab\x27\x34\x8a\x14\xba\xc7\x1c\xa2\xcd\x88\xa9\x38\xf7\x44\xf2\x35\xd8\xbd\xe3\xa2\x98\xb9\x96\x77\xe6\x97\xba\xe2\x95\xfd\xea\x77\x15\x60\xe9\x70\x2f\x0c\x5e\xf7\xe8\x1f\x02\xdf\xf3\x1d\x60\x06\x5e\xa9\x75\xbe\xdb\x95\x12\x34\xfa\xd6\xa7\xb3\x1d\x22\xf7\x8b\x4e\xae\x35\x92\x5a\xdb\x64\xbb\x51\x22\x2d\xb6\x99\x9b\x37\xa8\xb7\x48\xa4\x35\x63\x92\x1b\x69\xca\xac\x3e\xb2\x7e\xd1\x1c\xd5\xb0\xd7\x10\xd3\xce\xbc\xf2\x1e\x34\x33\x11\x04\x9c\x6b\xc1\xa0\xe0\xaa\xc9\xb8\xfd\x9b\x31\xf5\x8f\x20\xdc\xb9\xdd\xae\x67\xd1\x3e\x77\x6d\xa7\xff\x98\xc3\x5a\xfa\x0f\x7b\xd4\x2e\xfe\xff\xec\xbd\xeb\x72\xdb\xb8\xba\x20\xfa\xdf\x4f\x41\x73\x66\xdc\xe2\x84\x92\xed\x74\xfa\xa6\xb5\xb5\x73\xdc\x4e\x7a\x75\xd6\x4a\xd2\xde\x71\xd2\x6b\xaf\x71\x5c\x3d\x10\x09\x49\x68\x53\x80\x9a\x80\xec\xb8\x1d\x55\x9d\x5f\xe7\x01\x4e\x9d\x07\x98\x67\x99\x47\x99\x27\x39\x85\x2b\x41\x12\xbc\x49\xf2\x6d\x75\x57\xaa\x62\x91\xc4\xf5\xc3\x07\xe0\xbb\x7f\x45\x51\x7a\x56\xc4\x12\x5f\x71\x5c\x16\x9a\xcf\xc1\x04\x61\x90\x24\xd7\x65\xdb\x6d\x45\xf5\x3a\x0e\xa4\xcc\x22\xb9\x58\x26\x87\xd2\xbc\x5c\x5d\xa0\x70\xa5\x23\xb5\x23\x88\x6d\x8b\xee\x55\x2c\xb7\x1c\xa4\xaa\xac\x29\x30\x15\x0c\x09\x29\x71\xc6\xcd\x5b\x82\xe1\xf0\x20\x7c\x4d\xa2\x8b\xe1\x61\xf8\x4e\x24\x09\x1d\x3e\x0d\xf9\x6b\x21\xce\x1c\xfa\x52\x09\x42\x3d\xe1\x3e\xcc\x18\x8c\x85\xbf\x1a\x59\x32\x0f\x2c\x16\x29\xb9\xe4\x8c\x3b\xaf\xae\x8a\xf3\x9f\x30\x0e\xbd\x48\x55\xc3\x84\x65\x55\x7d\xd5\x43\xa1\xe9\x14\xfe\xb6\x44\x29\x34\x0d\x7a\x63\x38\x21\x29\xf4\x64\x88\x28\x09\xcf\x55\x78\xa4\xbe\xe6\x06\x7e\x84\xaf\xc7\x24\xbe\x1e\x1e\x86\x6f\xc0\xaf\x24\x45\xec\x7a\xf8\x34\xfc\x80\x01\x46\x73\xb2\xa4\xc3\x2f\x75\x01\xd5\xa3\x6e\x43\x77\x19\x7b\x93\x94\xcc\x3d\x80\xaf\x55\xe7\x9c\x62\xd4\x2d\xa9\x3a\xfa\x31\x1b\x5e\xa1\xb2\xaa\x48\xfd\xac\x63\x55\xd5\x3c\x57\xd6\x4d\x12\xab\xfe\x2a\x94\x10\x91\xf9\x7b\x6f\x4e\xa4\xcb\x09\x8c\x87\x07\xe1\x09\xc4\x22\x62\xf4\x61\xf8\x01\xc7\x30\x35\x0b\xf5\x4e\x78\xea\xc2\x78\xf8\xa5\x2e\xf2\x16\x5e\x0d\x9f\xad\xc2\x13\x30\x85\x12\x52\xef\xc1\x78\xe8\x33\x30\xf6\xc3\x53\x25\x78\x36\x39\xc7\x56\x2b\x4e\xca\x69\x0a\xe6\xc6\xe0\xe2\x10\xae\xea\xb1\x16\xde\x31\xda\x1e\x59\x28\xfb\x0e\x82\x78\x78\x18\xfe\x00\x61\x2c\xc2\x8e\x3e\x0d\x8f\x09\x66\x29\x1a\x2f\x19\xe4\x0b\xae\x20\xad\x92\xaf\x0f\x9f\xa9\x37\x30\x1e\x7e\x95\x81\xeb\xeb\xc2\xd4\x61\xd3\xdc\x67\x30\x59\xc0\x94\xee\x03\x1c\xe7\xe9\x4a\x91\x18\xa4\xcf\xd2\x25\x9b\xf5\x75\x21\xbb\xf0\xc6\x24\x66\x65\x05\x35\x78\x3f\xbc\x81\x78\x39\x87\xa9\x76\x32\x74\x53\x1b\x86\x10\x5d\xd5\xb5\x29\xa6\xd7\xb2\x3d\x80\xe3\x8a\xe3\xcd\xcc\x7f\xb1\xe8\x2b\xbf\xc0\x0a\x62\x5c\xe6\x78\xd8\x87\xf8\x12\xa5\x04\x4b\x35\xa2\x02\x69\x94\xa0\xbe\xd5\x80\x62\x55\x53\x38\x85\x9f\x8a\x1a\x82\x10\x07\x37\xfa\xd9\xa3\x99\x46\xd6\x50\x3d\x9a\x5d\x39\xdc\xdb\x93\x44\xdd\xee\x28\xfb\x78\x76\x78\xfe\xdc\x7e\x18\xde\xac\xb2\x30\xa3\x9c\x3f\x39\x9d\x81\xe7\x64\x30\x17\x79\xdd\xf0\x40\x8d\xe7\x1d\x9c\xbe\xfc\xb4\xe0\xbc\xd6\x50\x96\xfa\x59\xbe\xb7\x4a\xd2\x19\xb0\x4a\x91\xd5\x1a\xdc\x05\x58\x2c\x54\xbb\x23\xaa\x38\x3f\xcb\x8a\xe2\xe4\x44\x8f\x66\xa7\xc8\x88\xfc\x28\x96\x60\x20\x57\xa2\x47\x6b\x97\x49\x8a\xc8\xfb\x20\x49\x5c\xa8\x1d\x11\x1c\x2d\xd3\x14\xe2\xe8\x7a\x5f\x63\x78\x09\xab\x0d\xf4\x6d\xae\x97\xf3\xa1\x0a\x90\x78\x6f\xcf\xd7\x65\xb2\xa0\xbf\x78\x20\xbb\x3e\x4a\x92\xcf\x9f\xe5\xb8\x01\xe5\xcc\x7e\xcf\x7f\x3f\x83\x9e\xa0\xea\x3c\xbd\x34\x1e\xbf\x68\x61\xec\x31\x22\x3c\xaf\xff\x67\x36\xea\xff\xe9\xc9\x61\x79\x74\x46\x96\x49\xec\x8d\xa1\x07\xbc\xf7\x80\x5e\x78\x24\x15\x7f\x45\x3e\x7a\xaf\xa7\x2f\xae\xdf\x96\x84\x41\x1a\xfc\x45\x38\x5d\xab\x56\xfd\x27\x58\x88\x99\x7b\x07\x21\x1c\x30\x40\x2f\x24\x00\x8f\x13\x42\x97\x29\x0c\x7a\xbe\x0d\x24\xdf\x0c\xdb\x0f\xcf\x70\x48\xcf\x83\x75\xd6\x56\x36\x22\xfb\x19\x61\x45\xba\xf8\x7c\x6e\x5f\x64\x9d\x7d\xe1\x99\xc8\xd5\x6a\x92\x57\x80\x7a\x08\x5f\x92\x0b\x18\xfb\x0d\xcb\x8e\x6b\x97\x5d\xeb\xe6\xf7\x39\xb3\xdc\x47\x51\x7e\x93\xe6\x0f\x73\xb3\xbe\x30\xdb\x5d\xfe\x12\x5f\x60\x72\x85\x07\x0b\x3c\xf5\x77\xe8\x15\x12\x39\x08\xcf\x0e\xce\x07\x8c\xbc\x26\x57\x30\x3d\x06\x14\xf6\x82\xe0\x26\x02\x14\xfa\xdf\xfc\xee\x0f\xd5\x0f\xb4\x50\x3f\x7f\x47\x8b\x4f\xd9\x4f\xf5\xeb\x0a\xa4\xea\x57\x6a\x7e\x31\xf3\x6b\x2a\x0a\xc2\x11\xaf\x20\x3b\x16\xe1\xbf\x77\xc4\x47\x70\x89\x54\xb1\x39\xb9\xd4\xbf\x16\xcf\x44\x79\x70\x89\x4a\xe5\x85\x87\x36\xff\x28\x92\xbc\x16\xbf\x46\x94\x8a\x8f\x11\xa5\xa5\x6f\x63\xc0\x54\xfb\x74\xa6\x7e\x2c\xa8\xf9\x71\xa8\x7e\x45\xfa\xd5\xe5\x58\x7f\x9b\xe9\x69\x8a\xf8\xfd\x6a\x4e\x44\xbf\xd3\xe5\x53\x53\xfe\xda\x7c\x22\x58\xb7\x2a\x2d\xa1\xe4\xc3\x27\x35\x83\x88\xc4\xb0\x3c\x4a\xa4\xeb\xc0\x4f\x50\xfd\x8a\x13\x59\x61\x8c\x70\xb9\xfc\xdc\x8c\x6e\x31\x35\xbf\xa0\xfe\x39\x45\x13\xbd\x1e\x68\xa2\x7f\xd2\x4b\xfd\x99\xb7\xa6\x21\x10\xab\x5f\x40\x2f\x08\xbd\x80\x2c\x9a\x89\x9e\x45\x4c\xf1\x52\xdf\x9f\x12\x3d\xf9\x4f\x09\xfd\x64\x00\x78\x29\xaa\x7c\x4a\xca\x4b\x90\x10\xdd\x1d\xfb\xa4\x17\x63\xae\xfb\x35\xe9\x07\x78\x6d\xf6\x89\x95\x6a\xcf\x17\x5f\x1a\x7c\x93\x7d\xcc\x17\x5f\x96\x4a\x2d\xe2\x89\xf8\xb6\x88\x27\xe5\x6f\x0b\xdd\xeb\x62\xc1\x3e\xc9\x62\x8b\x72\x47\x97\x06\x16\x97\x34\x96\xc5\x2e\x69\x5c\x2a\x16\x93\x48\x2f\x10\x89\x64\xb1\x98\x44\xa2\xd8\x4a\x9f\xa1\xf0\xaa\x22\x6d\x2a\x5c\xeb\xfc\xd1\xfb\xff\x07\x94\xc0\x57\x11\xc1\x23\x58\x12\x67\xe5\x8f\x13\x58\x7b\x9c\xc0\xdf\xda\x13\x46\x90\x73\x7f\x8f\x8c\x34\x92\x63\x6e\xdb\xa2\x28\xdd\x40\x1e\xc9\xc4\x01\x0c\xc6\xfd\x58\xf8\xa7\x75\x39\x7c\xd9\xd9\xe1\xb9\x15\xa5\xbc\x90\x14\x12\x8e\xfc\x17\xc4\x7b\xf3\xe6\xcd\x1b\xef\x9f\xff\xfc\xe7\x3f\x43\xef\xc7\x1f\x87\xf3\xb9\x1f\x84\x73\x32\x17\xa2\xa6\xb3\x83\x73\xe1\x6b\x37\x07\x6c\x4d\xec\x31\x83\x7f\x01\x18\xdc\x10\x75\xa6\x10\xc3\x14\x30\xd8\x47\xf1\x2d\xaa\x7f\xf2\x23\xb2\x9b\xd6\x1a\xc1\xb3\x83\xf3\x27\x7e\xdf\x7f\xc2\x81\x5b\xbf\x74\x53\xd6\x1e\xd9\xa7\xec\x91\x61\xfa\xb4\x7d\x73\x53\xd6\x80\xe3\x53\x06\xbb\x40\x0a\x3e\x3a\x50\xc1\x0e\xb0\x82\x0d\xc0\x42\xb4\x0f\xd2\x14\x5c\xb7\x87\x98\xa9\xf1\xb8\xc0\x86\xe8\x91\x9c\x67\xcb\x36\x55\xf9\x66\xf0\xa9\x43\x7a\xcb\x32\x89\xf2\x90\xf2\xc0\x46\x93\x9e\x18\x9f\x1e\x67\x96\x15\xdd\x63\x3b\x68\xd2\x3b\xbd\x9e\x8f\x49\x32\x40\x8c\x9f\x72\x24\xf5\x10\xf6\x8c\xae\x2f\x70\xb6\x28\x39\x28\x11\x92\x7e\xf7\x20\x24\xa3\xdd\xc3\x10\x8d\x24\xeb\x2a\x52\x91\x4f\x48\xda\xe3\x65\x40\x98\x8e\xd8\x59\xa1\xfd\xf3\x5e\xf0\x97\xdd\x1e\x1d\xf5\xc0\x28\x1d\x60\xf8\x89\xf5\x82\x60\x10\x13\x2c\xae\x06\xe5\x5c\x09\x06\x62\x96\x41\xb8\x0b\x3f\x7f\xd6\x7e\x85\x22\x1c\xc3\x5f\x78\x97\xc1\x5f\xb2\x3c\xe6\x84\x0f\x01\x8d\xd8\x4a\x49\x4b\x6f\xf8\x00\x76\xe9\xde\x5e\x3a\x90\x63\xcf\x7e\xf5\x02\x53\x08\x4d\x7a\x24\x60\xb3\x94\x5c\x79\x68\x65\x48\x98\x95\x98\xde\x8e\x7c\xcf\x09\x9a\xf7\xd7\x0b\xa9\xd3\xea\xf9\xaf\xa4\x66\xc3\xe3\xb7\xca\x7c\xc1\x38\xa3\x27\xc2\x52\x2d\x23\xb6\x4c\xa1\x87\x09\xee\x8b\x19\x8a\xbc\x34\x42\x5a\x13\x41\x3f\x58\xad\x7a\x41\x03\x1b\x54\x56\xc8\xc2\x1e\x0b\x9f\x1a\x5d\x16\x3e\x3b\x38\x1f\x8d\x46\xb8\xf1\xd4\x47\xb4\x8f\xc9\x16\xed\x50\xff\x44\xaf\x7f\x35\xf4\x92\x03\xd9\xe5\xf8\x75\x18\x9c\x1d\x34\xe3\x13\xc1\xb0\x4f\x26\x6d\x69\x3f\x34\xe9\x95\x13\xee\x5b\xca\x57\x19\xf8\x2d\x10\x99\x68\x94\xc8\x6b\xf4\x34\xd0\xab\x09\x85\x48\x26\xc4\xa3\xc3\xbf\xe0\x7f\xd3\x05\xfe\x82\x9f\x3c\x09\xd0\xa4\xc7\xce\xf0\x39\x5f\x1f\x35\x83\x03\xb5\x39\x76\x0f\xd7\x21\x0e\x11\xfd\x09\xc3\x9f\x26\x1b\x92\x85\x49\x07\x22\x2b\x79\x6c\x44\x56\x87\xe6\x12\x56\x11\x69\x38\x9b\x7c\x07\x22\x2b\x79\x74\x44\x56\xd2\x81\xc8\x4a\x1a\x89\x2c\x4c\x58\xbf\x0b\xaf\x2a\xcb\x3f\x3e\x7e\x15\x13\xf6\xf2\xb7\xd6\x2d\x8a\xd2\xcd\x90\xeb\x04\xb6\xc7\x07\xb0\x2e\xe0\x6a\x00\x16\x49\xdb\xc3\x8a\xa4\x8f\x0c\x54\xc2\xaa\xa5\x5d\x73\x24\x6d\x00\xd4\x02\xa6\x13\x92\xce\xb7\xa2\x7a\x08\xb1\xee\xb9\x52\x8e\x6f\xba\xcb\x7e\xf1\x6a\xeb\xdc\x72\xaa\x01\x2d\xc1\x6f\xb8\xeb\xea\x85\xf1\x8b\x64\x99\x82\x04\xfd\xee\x3c\xc8\x11\x9e\xc8\xec\xc8\xfb\x09\x1a\x3b\xaa\x6c\xd1\x8c\x2d\x5b\xff\x9a\xc1\xa6\x10\xc4\xfd\x05\x60\xb3\x3f\x49\xe1\x3f\x49\xe1\x36\x9c\x56\x48\x47\x9c\xc9\x0a\x89\x60\xb2\xf2\x36\x84\x53\xc8\x7a\x34\x24\x41\xfd\x29\x41\x11\x9e\x2e\x13\x90\x76\xda\x21\x76\xa5\xbb\xde\x23\xfc\xec\xb9\x17\x61\x66\x61\x23\x65\xe2\xcd\xe2\xc6\x79\xce\x86\xf2\xd5\x24\x25\xf3\x1e\x0b\x56\x3d\x26\xd2\x78\xf2\x85\x12\xd1\x36\x13\x14\xc1\xde\x61\xc6\x26\x0f\x7e\xe1\xa7\xf1\xb5\xb2\x2b\xc4\x61\xc1\x91\xa1\xb4\x31\x6f\x32\xc6\xe3\x20\xc4\x23\xf5\x5e\x9b\xf3\xfe\x05\x66\x3c\x08\x7c\xf2\x24\xc0\x67\xf0\x7c\xc4\xce\x60\xa6\x33\x5e\xe5\x06\x6e\x46\x49\x83\x06\x5c\x61\x68\x0e\xfb\x60\x4a\x6a\x6d\xde\x85\xc8\xbd\x8d\x1a\x3b\xd3\xb7\xf3\x76\x8f\xa6\x44\x4a\xcf\xd5\x28\xcd\x5e\x12\xed\x8d\x44\x5c\xcb\x1e\x1e\x89\x08\xad\xeb\xdc\x29\xaa\x8f\x0d\x6f\x13\x61\x06\x8d\x30\x62\x08\x24\x35\x26\x3a\x6e\xc5\x82\x60\x11\x1b\xf5\x0b\x9e\x2f\xc2\xb4\x67\x1f\x70\x20\x67\xce\x3f\xf4\xa0\x30\xc7\x17\x6a\xaa\xde\x41\x78\x18\x3c\xc1\x85\x17\xc1\x80\x91\x0f\x8b\x85\x56\x12\xaf\x03\x2a\x3e\xc9\x57\x6a\x8e\x1b\x72\x9a\x9f\xba\x50\x6b\x9f\x1e\x1d\xb9\xf6\xa9\x03\xbd\xf6\xa9\x92\x60\x53\xf8\x84\x7e\xaf\x35\xed\x71\x1b\xef\x58\x75\xfb\x13\xc0\x0f\xea\xeb\x06\x33\xa0\xcd\x83\x5e\x29\x8b\x0a\x6c\xdb\xcb\x84\x64\x44\x65\x50\x72\x34\xa2\x0e\xe3\x19\x95\x7e\xef\x68\xb1\xf0\x7e\xd6\xb3\xcb\xc6\x3e\x14\x54\xa5\x2a\x1b\xf4\x48\x88\x02\xa7\xb1\x58\x11\x52\x49\xbd\x13\x8e\xd3\x1a\xb4\xc1\xec\xae\xc9\x00\xca\xe4\xd1\x4e\xc8\x18\x24\x2f\x2f\x41\x32\xca\xf9\xa1\xeb\xef\xe0\x57\xf0\xe9\x14\xb2\xe5\xa2\x77\x13\xa5\x84\xd2\x17\x64\x0e\x90\x8a\xe6\x25\x63\xd8\xa5\x74\x78\xe3\x33\xf8\x89\x79\x2a\xbf\xfc\xd0\xa5\x3a\x5b\xad\x0c\xc0\xb3\x03\xd3\x0c\x97\x5f\xfc\xe6\x6d\x36\x8b\x1d\x36\x48\xe1\x14\x51\x26\x12\x84\x1b\x0b\x3c\x3e\x02\x99\x66\xd4\xfa\x0c\x8b\xdf\x49\x10\xea\xac\x01\x03\xb0\x64\xe4\x05\xa2\x11\xb9\x84\x29\xa7\xe0\x8e\x49\x0c\xdf\x20\x4e\xec\x0c\xe6\x24\x56\x59\xbe\x23\x12\xc3\xb9\x78\xb9\xcf\x5f\xee\xff\xb7\xb7\xfb\xff\xed\xed\xe0\x57\xea\xaf\x25\xe1\x32\x4b\x3c\xa2\x61\x09\x7f\x72\x6b\x6e\xe1\x0f\x6d\x46\x97\x71\x4a\xae\x68\x9d\x6f\x66\xfe\xd0\x66\x2a\xda\x90\x0a\xcf\xe1\x87\xbe\x69\xc0\x57\x01\x88\x86\xfa\x8d\x1c\xb7\x2c\x1d\x11\xcc\x52\x92\x24\xa2\x60\xdb\x2a\xca\xb7\xa5\xbe\xc6\x86\xd0\x84\x65\x68\x9a\xce\x44\x30\xb5\xa1\x8e\xbe\x93\x83\xac\xdb\x6a\x33\x07\xd9\x16\x36\xab\x4d\xb0\xb5\xf7\x67\x01\x1f\x2b\x81\xdb\xba\x4e\x06\xdd\x96\x55\x4c\x8a\xab\xd6\x35\xd4\x62\xb5\xaf\x20\x1c\x1b\x1a\x8a\x6f\x7f\xc1\xad\xde\xd4\x92\x57\x6d\xa8\x76\xcb\xce\x00\xc2\x30\xed\xc7\x70\xbc\x9c\xf6\x41\x0c\x16\x0c\x3a\xef\xfb\x14\x52\x92\x5c\xc2\x74\x5f\xff\xa0\xfb\x22\xb4\x0a\x8a\x2a\x5b\xd9\x22\x5b\x91\x4d\xde\x3d\x5e\x6b\xda\x25\x47\x1c\xdb\x7e\xf5\xf3\xe7\xec\xe9\xe0\xbc\x78\xc6\xba\xda\x56\x27\x6a\x76\xb5\x15\x70\xb9\xba\x8a\x88\x74\xa2\x32\xdb\xd9\x8b\xa4\x51\xa3\x79\x79\x62\xc0\x80\x6b\x4d\xb6\xc6\x2f\x29\xb0\xe6\xfb\x91\x1e\x06\x43\x15\xfc\xa8\x02\xb4\x2d\x46\xdf\xc6\x10\xbe\xe9\x50\xb1\xdb\x28\x5d\x73\x95\xc7\x4a\x87\x5a\xd9\xc1\xd2\xba\x92\x75\xb4\xb4\xae\x93\x1d\x2e\xf5\x55\xb6\x7f\x5e\xc0\xad\x1e\x18\x25\xd9\x63\x83\x68\x72\xeb\xa8\xea\x18\xc0\xfa\x08\x2a\xda\xe2\xc8\xef\x9a\x05\x7f\xbf\x2f\x22\xcd\xf5\xcd\x3e\xcf\x7d\xbc\x85\xf3\xcd\x1e\x91\xbd\x30\x36\x27\xd3\x66\x4e\x14\xcd\x17\x09\xec\xcb\x0c\x98\x5d\x9d\x0b\xac\xca\xaa\xd8\x32\xd5\x8e\x5b\xe5\x12\xb9\xde\x25\xb8\x0c\x0d\xd2\xa9\x78\x5f\xef\x91\xad\xa7\xe6\xcc\x01\x37\x07\x1a\x17\xea\x28\x6e\x1f\x65\xb4\xfa\x99\xa3\xea\xf9\xe7\xcf\x37\xab\x1d\x34\x18\x03\x2a\x48\xe8\x8c\xb0\x4f\x09\x61\x1f\xde\xbd\xfe\xfc\x39\x7b\xa5\x0a\x65\xe1\x83\x07\x09\x01\x71\x0f\x09\x93\x7a\x9a\x31\x4d\x4c\xbc\x20\xf6\x8b\x36\x68\x7c\x29\x53\x81\x6d\x72\xcc\x2a\x5f\x7e\x8b\x66\x35\xaf\x2a\xcf\xcb\xd6\x75\xec\x93\xb9\x65\x25\xe1\x88\xde\x54\xfe\x16\x0e\x4b\xd3\xdd\x16\x8e\x4a\xb1\x12\x7d\xab\x85\xbe\x64\x38\xdb\xef\xc8\x1a\x11\x5c\x0b\xe2\x06\x4d\x7a\xbb\x87\xbb\x76\x68\x51\xd9\xeb\x51\x36\xa2\xbf\x8a\x01\x29\x69\x1e\xaf\xe0\x1b\x99\x95\xbf\xab\x3d\x51\x64\x76\xf1\x00\x8f\xe4\x0f\x91\x3d\xd9\xab\x28\x2b\x67\x18\xe0\x91\xfc\x61\x32\x2d\x5b\x65\x8d\x87\x0b\x85\xc9\x44\xe9\x1d\x76\xf0\x88\x3f\xad\x04\x93\x1c\x92\xe6\x21\xef\xd0\x91\xaf\x82\x66\x99\xf6\xc8\x73\x32\xcc\xd9\x80\x4b\xfa\x74\x72\xdd\xb3\xa2\x43\x09\xa4\x38\x49\xe1\x04\x7d\x0a\x42\x7c\x46\xcf\x3f\x7f\xee\xf1\x3f\x23\x26\x38\x6a\xb2\x80\xb8\x77\x63\x45\xbf\xe8\xe6\x3f\x2e\x13\xde\x78\xbc\xc1\xd5\x2a\x08\x56\x1b\x62\x28\x76\x60\x68\x35\x56\x59\xe8\x89\x9b\xd1\x53\xee\xb4\x53\x49\xe3\xdd\x1e\x69\x99\xeb\x66\x5b\x94\x65\x42\xa6\xd3\x4d\xc4\x00\xba\xbe\x39\x53\xd4\x8b\xaa\xa3\xae\x5d\x79\xeb\x98\xab\xac\xb0\xfd\x23\x4b\x77\xb5\x19\xff\x2f\x20\xd3\x97\x73\x21\x6b\x40\xd6\x86\x96\x8a\x85\xaa\x7f\xd4\x11\xc3\xee\xa2\xdb\x07\x52\x71\x7a\xdd\x80\x63\x60\xba\x2e\xbe\x65\x04\x91\xc6\x07\xfd\xa6\x12\x83\xda\x56\xc9\xc0\xde\xae\x86\xbe\x58\x6b\x4a\x6f\x1f\xfc\xa6\xb3\xcd\x6f\x55\x7a\xdb\x07\x96\xea\x40\x8d\xb4\x82\x20\xef\x76\x5c\x89\x98\xc0\x13\x92\xce\x6f\x27\xf2\xad\x1a\xb8\xdd\x4b\xeb\x83\xb6\x6c\x37\xa7\x75\xda\xfd\xae\xac\x52\x56\xbe\x2f\xba\xad\xa0\xe7\xef\x91\x4d\xaa\x9e\x58\x25\xbf\xe4\x62\x60\x5c\xcd\xe4\x39\x99\x14\x72\x08\x48\xfc\xbe\xad\xd9\xb7\xe1\x63\xf2\x2a\x99\x2a\x66\xc2\x0e\xfa\x74\x4f\xc9\x0b\xde\xf0\x21\x0c\xa2\x14\x02\x06\x7b\x37\x0d\xb9\x08\x10\xb5\x43\xe4\xbf\x50\x83\x1c\xee\x1e\x84\xaf\x72\x5f\x74\xec\xfc\xe1\xee\xe1\xba\xa1\x80\x64\xd4\x3f\x67\x7f\xfe\x06\x51\xfd\x75\x1b\xd5\xbd\xe8\xb1\x6f\xd2\x8b\xc9\x1d\x50\xa1\xb3\x54\xeb\xae\x02\x8c\xde\x9a\x35\x46\x7e\x6d\x4d\x86\xaf\x61\x51\x47\x57\x13\x88\xb4\x1c\xa4\x14\x9a\x3c\xe8\x79\x25\xbb\x2e\x88\x45\xa2\x57\x4e\x19\xf5\x7c\x11\xff\xc6\x0f\x56\x61\x21\x9b\xfb\x30\x8f\xc4\x85\x08\xac\x74\x46\xae\x9c\x01\x58\x33\x05\xa2\xc8\xc4\x5b\xec\x45\xf7\xf3\x42\x0e\x7e\xe8\xaa\xe7\x8c\xb5\x2a\xde\xfc\x88\xe2\xa6\x2a\x32\x6e\xab\x2a\x2f\xb2\x42\xb5\xaa\x50\x1f\xe8\xd5\xca\x9b\xd6\x0c\x96\x0a\xa8\xc8\xa4\xd2\xb9\xb6\xf0\xfa\x30\x2e\xb4\x56\x00\x8c\xa3\x31\x3e\xcd\xd6\x6d\xc5\xb0\x61\x68\xd5\x01\x78\xb3\xf6\x6a\xb7\x55\x96\xb8\xea\x8e\x76\x56\x6d\xac\xc5\x7c\xc4\x46\x93\xb0\x39\x17\x0c\xd2\x0e\xc8\xba\x85\xc6\xea\xc1\xa3\xc3\xec\xdc\x15\x74\x6a\x07\xa3\x63\xab\xdf\xd5\x60\xf2\xc1\xd3\xcb\x31\x95\xbb\xa5\xc9\xfa\xe2\x4c\xe8\x6f\x98\x88\xa0\x3b\xf2\x4d\xa0\xf8\x2f\x9c\x99\xbf\x4d\x88\xb0\x31\x89\xaf\xad\xe4\xe0\x37\x32\x88\x2a\x49\x87\x95\xed\x85\x31\x4c\xc0\xf5\xf0\xe9\x57\x07\x32\xff\x96\x0c\x6d\x59\x3d\x8d\x8e\x43\xe3\x0d\xf2\x49\x9e\x90\x85\x88\xf9\xb4\x65\xb8\x2c\x64\xb3\xa2\x73\xf5\xbb\x0e\x2e\xba\x48\x25\x5c\xb2\xf6\xdc\x70\xa9\x9e\x46\x2d\x5c\xca\x43\xab\xda\x48\x24\x86\x09\xdd\x07\x8c\x81\x68\x26\x05\xf8\x15\x94\xb9\x56\x54\x5b\xaf\x00\x63\x45\xfd\xec\x86\xb9\xf3\x6c\x91\x9d\x0c\x4c\x65\xa5\xbd\xef\x1d\x64\xb2\xef\xa0\xa7\x25\x77\x41\x28\x8a\x8a\xc4\x52\x55\x25\x26\x28\x81\x35\x0d\xf0\xcf\x82\x2a\xae\x2a\xf0\x2b\x19\x57\x7e\x23\xe9\xb4\xa6\x69\xb9\x59\x8b\xdf\x83\x30\x85\x97\x88\x96\xdf\xd7\x2e\xd2\x38\x21\xd1\xc5\x43\x5b\x9f\xfa\xe9\xeb\x54\x3d\x95\x05\x84\x89\x61\x0d\xf8\x64\x1c\x78\x11\x97\xac\xaa\xcc\x42\x07\x62\xab\x2a\x20\xb3\x0e\x54\x7d\x15\xd1\xed\xaa\x51\x2b\x82\xe9\x82\xd5\x0d\xbf\x34\x78\xbc\xe4\x2b\xe0\x87\x37\xea\x95\x48\x65\x32\xe4\x70\x4c\xc1\xd5\xf7\xe5\xde\x02\x19\x15\x74\x5a\x7a\xcd\x41\x9c\x62\x90\x9c\x92\x65\x1a\x95\x26\x30\x26\x24\x81\x00\x17\xfb\xd9\x3d\x5c\x71\x84\x56\xd1\x3a\x2b\x07\xae\xa3\x6f\xde\x09\xe2\x66\xe1\xe8\xff\xa5\x70\x57\x4f\x6b\x5b\x30\x0c\xf5\x59\x47\x4b\x5f\xf8\x36\x29\xbd\xad\x85\x79\x4c\xa2\x3e\x85\x20\x8d\x66\xfd\x14\xd2\xa5\xdb\xd3\xf3\xa1\x01\x3f\x03\x41\xe5\x87\x9a\x3a\xa7\xc9\xb2\xbc\x89\x18\x98\x96\xc1\xe9\xde\xd6\x41\x88\x18\x9c\x3b\x3a\xe0\xaf\x1d\x27\x4c\x10\x0a\xbb\x1c\xf7\x5b\x47\x33\xe2\xbd\x73\x90\x3a\xf4\x7c\xd7\x15\x16\xd3\x16\xa9\xbc\x2e\x11\xeb\xbe\xbd\x5a\x0b\x67\x42\x1c\xd2\x87\xb5\xf7\x5a\x90\x05\xfc\x5e\x68\xf8\xfc\xbe\xf6\x66\x68\xb8\x9b\xb6\x70\xc8\xea\x95\x73\x5d\x5f\xea\x1a\xa9\x3e\x45\x74\x65\x19\x0a\xb5\x18\x28\xdb\x6e\xda\x11\x7c\xdc\xcf\xe2\xc9\xe5\x92\x4e\x99\x2a\x2a\xaa\x9c\x67\x0c\x0b\x06\x9c\x27\x3b\xb2\x8a\x0c\x8e\xd5\xc0\xd8\xc8\x3f\x8a\x63\x18\xdb\xe1\xb6\xea\xea\x89\xf8\xa2\x6c\xe4\xff\x8c\xe0\x55\xfb\x5a\x2f\x63\xa4\x3a\x93\xbf\xda\xd6\x7b\x21\xb4\xa9\xa2\xa2\xfa\xd9\xb6\xe6\x51\x1a\xcd\xd0\xa5\x9a\xa0\xfa\xdd\xba\xae\x0e\x89\xca\xeb\xaa\xdf\xed\xe1\x23\x53\x9b\xf3\xba\xfa\x77\xdb\xba\x26\xa4\x6d\x96\xc1\x77\xe4\x9b\x97\x9e\x49\xe0\xdb\xb5\xb9\xef\x39\xed\x99\x6f\x4b\xbc\x6a\x3f\x27\x15\x17\x56\xcc\x49\xfe\x36\x71\xd7\xd8\x2a\xc3\xe6\x63\x92\x38\xc2\xbe\xdf\x2d\x36\x47\x7c\x0c\xfd\x71\xb2\x6c\x0d\x27\x8d\xd2\xba\x26\x68\x0f\x99\x0c\xaf\x65\xe5\x69\x0a\x21\x5e\x03\xb9\x65\xed\x74\x3d\xf4\xd6\x5d\x83\xeb\x75\x10\x7c\x8d\x81\xdb\x38\xde\x79\xe4\x65\x24\xef\x8e\xc7\xeb\xac\x71\x86\xc2\xd9\x90\x2d\x1c\x6e\x77\x5b\xa7\xa4\x98\x38\xe3\x61\xd2\x62\x9d\xee\xda\xa6\xab\x72\x99\x24\xb5\x17\xa1\xee\x82\x6f\x86\x2a\x46\x27\x2b\xa5\x70\xaf\xb9\xe0\x3b\x92\xc0\x76\x4d\xf2\x92\x4d\xcd\xb6\x5a\xdf\xcd\x89\x30\x67\x1a\xbf\x5b\xa0\xc0\x6a\x17\xa4\x89\xf1\xad\x93\x88\x24\x44\x89\x7b\xd7\x13\x99\x6c\x2a\x33\x70\x50\xfc\xd6\x47\x7d\x62\x54\x62\xc4\xc2\x04\xf0\x6f\xcf\xd8\xeb\xe0\xf3\xed\x6b\x54\x50\xfc\xb5\x5c\x3d\xe5\xac\x43\xf1\x66\x94\x89\x50\xcb\x7e\x86\xd9\x41\x36\x07\x17\x82\xeb\xb0\xee\x46\x95\x94\x63\xb5\x5d\x36\x5f\xe7\x34\xde\x1e\x17\xd2\x7e\x6f\x6c\x68\xdc\xdb\x71\x77\xd4\x23\x70\xd3\x61\x28\xc0\x54\x43\xf2\x17\xd6\xfe\x69\xd7\xa5\x27\xed\x96\x7e\x0e\xd2\x8b\x23\xfa\x0e\xf2\x81\x09\x54\x2c\x6a\xb6\x69\x96\x6c\x5b\xd2\x5d\x19\x4e\xfd\x60\xde\x0e\x54\xc2\x0b\x18\x07\x2b\xd5\xe4\x49\x8a\x2e\xf9\x16\x5b\xb7\x3d\x51\x3b\x6b\x4d\xe4\xa8\x58\xb7\x31\x51\x59\xe4\x10\x03\x29\x8c\xff\x81\xd8\xac\x2c\x7d\xdb\xe2\x16\x20\xe9\x14\x60\xf4\xbb\xc3\x17\xf5\xfe\x2f\xf9\x7a\x31\xe8\x1c\x52\x0a\xa6\x35\x17\xc2\x1c\xa0\xd2\xf9\x66\xcb\x69\x95\xab\xef\x4b\x1c\x2f\x08\x2a\x09\x70\x2c\x9e\x37\x49\xc8\xd5\x11\x26\xf8\x7a\x4e\x96\xf4\x28\x8a\x20\x2d\x1d\xd7\x75\xa7\xe0\x36\x97\x6b\x01\xa6\xd0\xf6\xcb\x78\x58\x0b\xb6\x28\xaf\x07\x5f\x27\x06\x4a\x2f\x17\x2a\x79\x49\x09\xb5\x45\xb6\x93\x13\xe7\x57\xeb\xca\x93\xc5\x8e\xae\x00\x62\x08\x4f\x55\xea\x93\x86\xd2\x86\x1a\xae\x2c\xc7\x8f\xc1\x1f\x01\x3d\x6e\x37\x86\x5c\xe9\xb6\x43\xc9\x55\x6a\x3d\xa2\xb7\xf0\xea\x04\x34\x0f\xa9\x19\x73\xf8\x5a\x3c\x44\xa4\xd9\x8c\x96\xaf\xbf\xdc\xee\x4c\x87\xb1\xf5\x7d\xae\x36\xc9\x43\x5c\xb0\x76\xbb\x9c\x5c\x61\x98\x56\x1f\xc1\x7f\xee\xf5\x2e\x9b\xf7\xa1\xa1\xc1\xc6\x1b\x73\x2b\xaa\xd2\x04\x5e\xc2\x96\x5c\x8c\xe0\x48\xe0\x6f\x4b\x88\xcb\xfb\xba\xa2\xc6\xc1\xd3\x67\xab\x20\x94\x1f\x1d\x08\x92\x9d\x31\x7c\x8b\x0b\x13\xa2\xd6\xfc\x94\xd0\x8d\xd7\x31\x85\xeb\xeb\x80\xdd\x27\x9e\x4d\x39\x39\xf6\x2a\x65\x80\x2d\x3b\x8c\x3f\x85\x09\x60\xe8\xb2\xee\xe8\x6e\x66\x7b\x45\xa6\xe5\x22\x97\x20\x96\xd4\xc1\x26\xf8\xb3\xa7\x3e\xc7\x49\x12\xbd\xc2\x31\xc4\xac\x75\x45\xef\xe9\xc1\x7f\xb7\x18\x0a\x59\x2c\xe8\xcb\x2c\xd7\xba\x35\x57\x22\x71\xf3\xd1\x35\x9a\x39\x48\xa7\x08\xf7\x13\x38\x61\x7d\x3b\x13\x7c\x56\x49\x25\x3c\x7d\x67\x90\xa3\xd8\xbe\x41\x1b\xd7\xa0\xb3\x16\xb3\x62\xc1\xbf\x1f\x74\xbf\x68\x42\xa4\x09\x88\x0f\x14\xa6\xfa\xac\x2b\x47\x6c\xf1\xfd\x5c\xce\xf1\x6c\x81\x7d\x9d\x60\x5e\xbc\x97\xab\x2a\x2c\x70\xd9\xde\x9e\x9d\x8b\x5c\x60\x90\xfc\x60\xe7\x2d\x55\xac\x71\x30\xb0\x52\xd9\x0d\xb2\xd4\x74\x9f\x3f\xaf\xd9\x84\x95\xf6\x2e\x58\x65\x93\x94\x6f\xde\x41\x10\x5f\x97\xa3\x19\xb5\x9c\xe3\xba\xe3\xa8\xb7\x59\x5a\xa0\x07\xc7\x62\x6d\x41\x2e\xb0\x19\xed\xd6\xed\x40\xfe\xee\xbb\x55\x10\x2e\x50\xb5\xa0\xae\xfb\xd6\x38\x15\x1a\xf1\xe2\xce\xcc\x46\xee\xda\xfa\x79\x24\xb2\xca\xf2\xd5\x47\xf4\x85\x36\x09\xe8\xd8\xea\x6e\x75\xab\xf5\x78\xa5\x05\x1a\x7d\xb9\x22\xfd\x05\x48\x19\x8a\xd0\x02\x3c\x3c\xeb\xb8\x06\x94\xaa\x67\xda\xb7\xa0\xc0\xae\xfd\xd8\x88\xd0\x5d\x25\x61\x1c\x1a\x46\x95\x50\xc4\x86\x2c\x43\x71\xe8\x9b\xdc\xc2\xb5\x17\x81\x95\xd3\xf8\x89\xef\xd9\x97\x4e\x96\x9b\xb8\x01\x57\x1c\x06\xc8\x0f\x01\x2d\xee\xc0\x6c\x2e\x86\x32\x58\x59\x9d\x9c\x1f\x45\x04\xff\x40\x6a\x64\x41\xa2\x00\xaa\xe9\x65\x06\xe8\xab\x39\x67\x90\x8a\xab\xad\x9b\xf6\x43\x5f\x37\x52\xbf\xd8\xa6\x54\x60\x32\xeb\x6f\x99\xc9\x14\xe6\x3d\x7d\x91\x8a\xb7\xe4\xe9\xf9\x10\x90\xe2\x76\xb5\x2e\x8d\x2a\x3e\x01\x9e\x9f\x6b\x59\x3c\x51\xe4\x0d\xc0\x0e\x39\x64\xa1\xd0\x4f\x2e\x56\xd8\xa1\x28\x8c\x6b\x78\xd6\x6e\x3a\x47\xa9\x69\x6f\x2e\xf7\xa6\x95\x62\xf2\x98\x2c\x4a\x0c\x45\xb9\xd4\xfb\x46\x65\x55\x5b\x8d\x68\x2d\xe2\x66\xa1\x88\x1e\x8b\xea\x12\x2c\xd9\x8c\x54\x8b\x42\x62\xe7\x9e\x6e\x73\x62\xd5\x9f\x79\xac\xd3\x4d\xe5\xd4\xd9\x88\x0e\x3a\xeb\xeb\x64\xad\xad\x2b\xec\x44\x10\xdb\xb5\xad\x07\xef\x48\x20\xf2\xb6\x8d\xdd\xc0\x46\x66\xbc\x26\xb9\x75\x75\x99\x4b\x61\xaa\xd6\x91\x4e\xb6\x74\x1e\xda\x58\xa6\x5a\xe2\xe1\x96\x67\xd9\x17\xe1\xb1\x35\xce\x22\x5a\x59\x73\xa8\xbf\x06\xed\x82\xb9\x9b\x70\x06\xa8\xb4\xc7\x2b\xb5\x2d\xe7\x5e\xdf\xac\x2a\x53\x6c\x51\xdb\x54\x95\x86\x2b\xdf\x37\x0c\x55\x15\x2a\x36\x6a\x2c\x8f\x4a\x46\x62\xda\xce\xae\xb6\x59\x53\xaa\xd8\xae\x91\x29\x96\xe5\x0a\xca\x5e\xad\x41\xac\xa0\x4a\xd9\xed\x36\x6e\xbf\x87\xb6\xeb\xb6\xc0\x13\xd4\x33\x1d\x3a\x66\x76\xf5\x5e\xe1\xe7\x51\x27\x4d\x01\x8c\x11\x2b\xdf\x06\x75\x35\x40\x3c\x2f\x73\xbd\x75\x15\x38\x7e\x7f\x70\xd8\xe0\xd7\x56\x92\x21\x75\x3a\x8d\x2b\x8a\xc8\xd2\x65\xff\xdf\x95\x11\xbf\x73\x2e\x29\xd4\x19\x46\x75\xbc\xf0\x72\x04\x4d\x67\x93\x03\x96\xa2\x79\x2f\x08\xe1\xc8\xd5\xae\xfa\xba\x63\x39\xb8\x9b\x90\xeb\x4c\xc5\x3b\x97\xd1\xcf\xa1\xfd\x54\xe5\xec\xb6\x20\xb1\x8c\x50\xb0\x3f\x21\xe9\x94\xb0\x7d\x3b\x58\xca\xad\x79\x6d\x1e\x9b\x4e\x72\x6c\xfb\xa9\x8a\x98\xe2\x8c\x4f\x20\xc4\x82\x6a\x33\x08\x57\x5a\x39\x60\x67\x60\xe8\x9c\x28\x51\xb5\xea\x8b\xdc\xb3\x53\xc2\x4e\x00\xa5\x57\x24\x8d\x7b\xd5\xbe\xb4\x25\xa8\xa8\x80\x33\xf7\x13\xc4\xe1\x1d\xef\x3c\x23\xf4\xea\x83\x38\xc8\x08\x25\x6f\xf8\x51\x59\x32\x10\xd9\x28\xda\x81\x92\x5e\x8a\x68\x28\x88\xb7\xfa\x9e\xf4\x7c\xde\xc8\x20\x21\x53\x11\x5d\x28\x14\xc1\x3a\xb2\xb5\x2d\x38\x82\x33\x89\xae\xea\x14\x87\x7c\x9e\xe2\x05\x05\xd7\xef\x67\x00\x5f\x50\x3f\xdc\x3d\x54\xbe\xd2\x4e\x63\x19\x31\x7c\x13\xf2\x99\x57\x16\xce\x0a\x47\xf4\x64\x96\x02\x0a\x7b\xfe\x0f\x62\xb1\x3c\xbd\xc0\x0e\xe7\x53\x10\xc7\xc7\x09\xa0\xb4\xe7\x8f\x41\x74\x31\x4d\xc9\x12\xc7\x7d\x69\xb9\xca\x66\x70\x0e\xfb\x09\x9a\xce\x18\x9f\x4b\x0c\x5d\xe3\x28\xb6\x27\x3d\x52\xdb\x35\xd9\x12\xd5\x5c\xac\xc7\xb6\xf3\x78\xbc\x7f\xf3\xfa\x7b\x90\xd2\x81\xee\xab\x77\x83\xe2\xa1\xff\xd3\xcf\xf8\x6d\xfa\xe1\x1f\x33\x5f\xaa\x8e\x86\x5f\xdc\xf8\x54\xa4\x9e\xa1\xfe\xf0\xec\x3c\x14\x32\x6b\x28\x9c\xb1\xfc\xe1\xd9\xd9\xd7\xa1\x1f\xa3\x4b\xff\x3c\x3c\xfb\x2e\xf4\x45\x44\x38\x3f\x14\xf8\xd0\x1f\x93\x4f\xfc\xf5\x37\xe7\xe1\xd9\x41\xe8\x7f\xfc\x88\x3d\xcf\xf3\xf8\x1b\x67\x95\x84\x4c\x49\xb9\xb8\x55\x05\xcd\xa7\xaa\x0a\x4d\x23\x3f\xf4\xf7\x01\xa5\x90\xd1\x7d\x34\x9f\xee\xf3\xca\x12\xd8\x22\x6b\xb9\x2c\xa6\x18\x0a\xdf\x44\x14\x91\xaf\x41\xc2\xca\x2f\xf5\x28\xd0\x7c\xda\x9f\x24\x4b\x14\xeb\xa1\x7c\x5b\x1a\x7d\xf9\x4d\xd5\x7c\x10\xee\x8b\x24\x4f\x95\xb3\x3a\x0c\xcf\x9e\x7e\x15\xfa\x72\xc5\xfb\x0b\x8d\xaf\x21\x5e\x26\x49\x78\x76\xa6\x3e\xf0\x92\xa2\x1c\xd0\x12\xb5\xb3\xc3\xef\xc2\x83\xf0\xec\xfc\x3c\xcc\x8a\xf0\x3a\xe7\xe7\xe7\xe7\xe1\x04\x24\x14\xd6\x8c\xba\xf8\x74\x1e\xfa\x33\x40\x5f\x5e\x82\xc4\x1f\x8a\xba\xab\x2f\xa4\xe2\xee\x46\x06\xf3\x7b\x2b\x43\x18\x37\x22\xea\x60\x36\xa6\x7e\x45\xb2\xc0\xac\xd2\x85\x3a\x46\xee\xed\x82\x69\xda\x7e\x66\x80\x0f\xe8\xac\x57\x71\x8f\xaa\xce\xfa\x86\xab\xe0\x22\xe2\x07\x79\xd5\xd7\x84\x44\x20\x39\x65\x24\xcd\x64\x89\xa5\x32\xbf\x2d\x61\x7a\x7d\x02\x52\x30\xa7\x02\x2b\xe0\xf0\x26\x85\x93\x14\xd2\x99\xbc\x60\x76\x0f\x56\x2b\x63\x26\xe7\xfb\xee\xcb\xc7\x24\xb5\xe1\x87\xb8\xc9\xb3\x03\xaf\x54\x2a\xa6\x77\xa7\x3f\x9f\x0c\x4e\x52\x32\x47\x14\x66\x39\x85\x68\x70\x83\xb3\xfb\xc2\x2f\x07\xa5\x61\x03\x6b\x70\x22\xe1\x42\xf0\xbc\xfc\x6e\xa8\x78\x10\x3f\x08\xf5\xaf\xdd\xd1\x08\xcb\xab\x44\xb4\x1c\xec\xed\xe1\xcd\x2e\xc6\xcf\x9f\x69\x2f\x08\x55\x23\x12\xe6\x9c\xd6\x80\x2c\xe2\x65\x27\x28\x81\xbd\x60\xc0\x66\x10\x3b\x32\x26\x15\x6b\xcd\xc1\x42\xd7\x61\xc1\x8e\xfa\x6a\x02\xc8\x89\xa1\x41\xcc\x50\xc4\xcf\x6c\xdf\x7a\x22\xe9\xf0\xc2\x44\x36\x82\xc5\xee\x38\x2c\xf3\xf7\xb6\x94\x00\x88\xe0\x3d\xf6\xa0\x34\xc8\xe5\x8a\x72\x82\x52\x24\xef\xe2\xb3\xb3\xd6\x22\x83\x29\x15\xd2\x14\x67\x13\x85\x92\xa5\x96\x75\x65\x19\x3d\x26\x4f\xac\x48\x1c\x91\x08\x97\xdd\xfc\x72\xb9\x0c\xba\x59\x1f\x54\xa3\x2d\xc8\x39\xb3\xc9\xef\xef\x96\x7d\xfb\xcf\x77\xa7\x3f\x5d\xbc\x7b\xd6\xee\x96\x7d\x16\xfa\x68\xe2\xab\x7b\xc0\xca\x35\x7e\xf6\xf4\x20\x3c\x33\x99\x12\x04\x68\xf8\x81\x2e\x49\x31\x7d\x29\xc8\xfb\xe4\xa6\xd0\xe4\x41\xe8\xd7\x5e\x60\x94\x12\xf7\x15\x6e\xd5\x5a\x58\x5f\x8f\x32\x34\x44\x78\xea\x5d\x21\x36\xf3\xf4\xde\x18\x0c\x06\xe5\xab\xb3\xe5\xdd\x3e\x5e\xd2\x6b\xe1\x7f\x35\x98\xa2\x49\x9b\x6b\x59\x40\x60\xc1\x37\x3f\x64\x1c\xb9\x87\x67\xe7\x2b\x09\x09\xfb\x0a\xec\x08\x51\x85\xc1\x77\x0b\x52\x0d\x3e\xcf\xda\xe2\x88\x60\x6f\x02\x50\xb2\x4c\x61\x2d\x48\x4d\x3b\x9c\xc8\xc8\x4d\x49\x6d\x13\x8b\x54\x58\x0f\x9a\x6b\x13\x0e\xa5\xdd\x97\x91\x0e\x75\x9b\x56\x20\x75\x05\xdd\x10\xba\xc3\xed\x6d\xfd\x5e\x2e\x13\x14\xe6\x56\x08\xeb\x59\x32\x7e\xaf\x48\xb3\xd8\x20\xac\xbd\xcf\xb3\x73\x3e\x44\x32\xbf\xdb\x71\x0a\x63\xbe\xfa\x20\xa1\xc3\xdd\xc3\x30\x85\x14\x96\x83\xed\x51\xc8\xd4\x84\x10\xa4\xbd\x1b\x29\x6a\xf2\xfd\x50\x53\x95\x43\xdf\x57\x59\x92\xd8\x48\xcb\x86\x07\x33\x08\x62\x79\x59\x9e\xaa\x28\x3c\x3d\xff\x6c\xa1\xe0\x32\x8a\xc7\x33\x40\x67\xe7\x7e\x30\x50\x5a\xd3\x1d\x93\xd9\xfb\x60\x6f\xcf\xbf\xb9\x19\xbc\xf8\x9e\x97\x58\xad\x84\x45\x81\x83\x33\x14\x64\x0c\x9f\x11\x5b\x2e\x7c\x3b\xfe\x95\x58\x4b\xb7\x20\xc4\x12\x78\x58\x13\xf2\xc5\x84\x7c\x8e\x8a\x9a\xab\xdb\xb1\xcc\x68\x5a\x5d\x8d\xb1\x09\x2d\x58\xba\x1a\x61\x26\x34\x70\x4d\xc0\xdc\x93\x21\x5c\x05\x03\x99\x33\xd3\x5e\x00\x2d\x81\x29\x2e\x97\x1f\xee\x1e\x88\x48\x66\xed\x70\xfb\x01\x91\x9c\xb7\x4e\x53\xd2\x19\xb9\x7a\x2d\xb0\x60\xf7\x70\xbb\x04\xa3\xf2\x77\xae\x25\xe7\x94\xd3\x73\x03\x49\x37\x54\xe4\x8a\x19\xab\x10\x4d\x94\x68\x3c\xb1\x78\x25\xe2\xae\x4c\x6d\x09\x29\x49\x46\x9f\xdd\x94\xc9\x6a\x75\x71\xaf\x56\x92\x2c\x0a\x6d\xfc\x64\x03\x30\x26\x29\x93\x06\xe5\x94\x24\x90\xf7\xdb\x83\x7c\x38\x9d\xbb\x51\xb7\x99\xe4\xd6\xa4\x8f\xaf\x02\x84\x6b\xca\x07\x72\x34\x75\x34\x5a\xb6\x9a\xd6\xa6\x34\x4d\x04\xab\x35\x84\x42\xe2\x98\xeb\x6d\x24\x08\x52\xbd\x3f\x2a\xf1\x8f\x3c\x09\xee\x8f\x2e\xc5\xf0\xdd\xbb\xef\xbe\x7f\xfa\xd7\xae\x74\xa9\x4d\x62\x64\x2b\x7f\xbe\x2e\xa9\x54\x2d\x41\x5a\x53\x8a\xf4\xc0\x24\x49\x65\x42\xeb\xe3\x47\xf6\xf1\x23\x53\x43\xd4\x72\xa3\x2f\xdd\x52\x1f\x4d\xdf\x9f\x9d\xf9\x22\x04\xf2\x99\x4f\x97\xe3\x39\x62\x02\xde\xd6\xe4\x65\x9b\x59\xb3\x65\x80\xf1\x8e\xfa\x1c\x5d\x17\xbe\xbb\x66\x56\x39\x01\x63\x98\xa8\xea\x13\x92\xaa\x45\x7a\x29\xee\xe5\xac\xae\x79\x2e\xce\x2c\x6b\xcb\x88\xbd\xa2\x25\xed\x23\xbc\x58\xb2\x4c\xe4\xc5\x84\xc7\xa2\x2f\xf0\x96\x43\x31\xf6\xb3\xb1\x2e\x12\x10\xc1\x99\x74\xa5\xe5\x73\x56\x24\x81\xc4\x3d\xf9\xc0\x81\x93\x8d\x4a\x4d\x4f\x91\x8c\xde\x9c\x2c\x29\x64\x29\x58\xf8\xa1\xef\x97\x45\x65\xb9\x31\x3a\x46\x7f\x7b\x30\x34\x92\xea\xac\xba\xfd\xaa\x11\x92\xad\x61\xc8\xa1\x96\x89\x19\x25\xe0\xcc\xb3\x86\x9d\xe9\x3a\x0f\xbe\xf5\x21\x36\x5e\x32\x26\xd1\x94\xef\x25\x39\x38\x8d\xaf\x39\x40\x8e\x19\xf6\xc6\x0c\xf7\x17\x29\x9a\x83\xf4\xda\x9b\xb3\xfe\x33\x0b\x26\xa7\x68\x8a\x3d\x84\x5b\x2d\xcf\xe1\x81\x69\xf6\xec\xe9\xd7\x8a\xcd\x5b\xe2\x04\x8a\x37\x72\xe6\x0e\x7a\x8d\xc3\x00\xe1\x4b\x44\xd1\x38\x81\x9a\xdb\x0b\x7d\xcf\x44\xb5\xe0\x63\xfa\x32\xb7\xcd\x74\x12\xe6\xc8\x6e\xa6\x28\x70\xcd\x9f\x93\x15\x11\xaf\xeb\x0e\x4b\x07\x2e\x95\x11\x71\xce\xfa\x5f\x55\xa3\xa0\xaa\xf9\x2c\xf4\x13\x84\x2f\xfa\x4c\xe4\xa8\x16\xc4\x42\x4e\x88\xec\xea\x5d\x69\x54\xae\xc9\x32\xf5\x34\xbe\x3c\x6f\xe6\xb3\x8b\x5d\x77\xe0\xd1\xcb\x55\xee\x84\x35\xcd\xdf\xbe\xad\xf9\x52\xb2\xbc\x3f\x8d\x69\xcb\xe1\x95\x78\x8b\x2d\x8f\x6c\x9b\x12\xeb\x7a\x8a\x2f\x63\xf6\xd4\x06\xe6\xb4\x4b\x99\xfa\xae\x0c\x20\x5d\x02\xcd\xfd\x11\x5b\xd7\x17\xe8\x70\xf6\xdb\xb7\xf3\x0d\x54\x6d\x95\x32\x25\x87\x3c\xe9\x35\x99\x4e\x11\x9e\x7a\x64\xc9\x9c\x12\xb9\xcd\xa5\x71\x5b\x53\x2e\x15\x96\xa6\xdd\x4e\x14\x2c\xc3\xc3\x37\x5d\xb0\x44\x32\xe6\xf7\x31\xc1\x13\x94\xce\xf9\xab\xf9\x92\xb2\x37\x80\x45\x33\xce\x19\x1b\x89\x49\x41\xea\x93\xe5\xcc\xb7\x98\xe3\x2a\x83\x07\x51\x37\xb3\x77\xe0\xa5\x04\xa9\x1e\xb2\xf2\xb6\x81\x2e\xf9\x47\x4e\xbf\xdf\x42\x9c\x21\x17\xe2\x6e\x8f\x9c\x79\x49\x7a\x90\x49\x74\xc8\x05\xc4\x9b\x30\x92\xef\xf8\x7c\x1e\xab\x41\x81\x5c\x8c\xfb\x3b\xe4\x3e\x7d\x43\xae\x9e\x2d\xff\xda\x52\xd3\xf1\xa7\x3d\x81\xa6\xea\xf5\xd1\xd0\x17\x0b\x98\x91\xf7\xf2\xb1\xce\x28\x40\x97\xa8\xb0\x09\xd8\xda\x21\x9d\xc7\xac\x96\x67\xf4\x9d\x1e\x0a\x4d\xa3\x11\xc1\x6f\x1e\x2c\xe9\x26\x47\xe7\x90\x0a\x97\xd3\x26\x59\x5a\x0f\x2d\xfe\x8e\xfb\x32\x2d\x9b\x4c\x49\x76\xbb\xf2\x62\x4b\x0b\xd2\x40\xfa\xb5\x91\x0d\x37\x1a\xaf\xd9\x8d\xf8\xc1\x20\x4a\x20\x48\x8f\x92\xa4\x57\x96\x50\xb2\x72\x50\xa4\x57\xb1\x1f\xb2\x01\x8a\xed\xec\x40\x34\x59\x4e\x85\xe1\x64\xb2\x9c\xe6\xde\xc3\x14\x81\x44\x7c\x11\xbf\xd6\xb7\x6e\xd3\x0d\xc9\xa6\x45\x5b\xe6\x9b\xec\x5c\x7c\x91\xfd\x97\x86\xcb\xbf\xe9\xc7\x35\x44\xa2\x3d\xff\x94\xa3\x92\x27\x7c\x50\xbb\x5d\x5f\x64\x32\xe9\x5f\xcd\x10\x83\xdb\xba\xbc\xec\x06\xdb\x6d\x80\xfb\xbb\xba\xe8\x77\xfb\x87\x27\x57\xd7\xcb\x76\x57\x97\x3a\xb7\x09\x1e\x13\x90\xc6\x72\xf0\x7d\x1d\xfa\x4d\x9f\xde\x1a\x11\xac\xd5\x95\x08\x70\xae\xa5\x03\xaa\xc4\xf9\xb9\x12\xd0\x98\x82\xe6\x8d\x2c\xef\x3c\xd9\xd7\x3e\xcb\xf3\xa0\x6e\x77\x96\x53\x4a\x1e\xee\xd9\x49\xc9\xc3\xe2\x79\xef\xfe\xe0\xcb\x18\x84\x10\x8f\x14\x15\xbc\x81\xd2\x34\x86\x11\x89\xe1\x87\x77\xaf\x8e\x75\x56\xcc\x1e\x0e\x9a\x18\x08\xb7\x8d\x51\xb9\x54\x81\xc3\x58\xe7\x84\x3b\xfd\xa9\xcd\x89\x42\xc9\x7d\x2a\x57\xfe\xf3\xef\x7f\x7b\x3b\xfe\xf5\xe7\x3b\xe2\xf7\x4f\xd1\x14\x73\x7e\x1f\xe1\x87\xce\xee\xdb\xcb\xd2\xee\xec\xb9\xbf\x45\x9c\xff\xf4\xdd\x9b\x9f\xe2\x2f\x5f\xb4\xbe\x14\x0e\xbf\x0d\x7d\xb2\x64\x89\xa0\xc9\xb7\x76\x60\xb7\x06\x57\xb4\xa4\x8c\x88\x47\x51\xaf\xad\x01\x8d\x49\xb0\x76\xb7\x46\x34\xca\x35\x68\x3d\xc1\x61\x93\xd8\x51\x0b\x53\x08\x3e\x05\x97\xb0\x41\x9a\xd2\x64\x6a\x80\xf9\x29\x66\x9f\xa4\x03\x44\x65\xf6\xf4\xa3\x78\xce\xcf\xb1\xe7\xea\xb3\x4a\x20\x1e\x0c\x28\xb8\x84\x47\x4b\x36\x13\xc2\x9e\x69\xcf\x21\x7d\xc1\xbd\x60\x15\x0c\xb1\xb4\xa7\x24\xf8\xf4\x1a\x47\x6e\x2b\x99\xb6\x83\x14\x24\x69\x61\x14\xd7\x38\x7a\xa9\x82\xcf\x09\xcf\x2d\x97\x5d\xaa\x4a\xc1\x27\x46\x21\x63\xd0\x94\x69\xea\xc2\x2d\x22\x45\x76\x3d\x9b\x7c\x76\x1a\x5f\x84\x2c\xf7\x5c\x55\x5e\x02\x49\x97\x96\x4f\x41\x28\x73\xe4\x0f\x74\x20\xe5\xc1\x2c\x85\x93\x91\xbf\xef\xd7\xca\xa4\x0a\x3b\x60\x3b\x0c\x55\x87\x14\x21\xb7\xc8\x6d\x6d\xb6\x21\xea\x37\x5b\x23\x35\x52\x81\xf7\x2a\xd0\x52\x9d\x8b\x50\xc9\x8e\x24\x67\xff\x75\x63\xe3\xc7\xb0\xc9\x67\x29\xcc\xf0\x63\xc8\xa9\xec\x55\x07\x5b\xa1\xe2\xde\x98\x42\x66\x6d\x50\xc7\xbe\x50\xc6\x45\x30\x8f\xc2\xd2\x9a\x08\x37\x58\x13\x41\x0b\x93\x47\xcc\x8e\xad\x5f\x51\xd3\xe4\xde\xcd\xd5\xf4\xfd\x15\xed\x41\xb5\x3b\xbb\xd3\x49\x47\x39\x5b\xd2\x7a\x92\xa9\xb0\x71\xee\xef\xce\xfd\xe6\xdd\x97\x17\xe8\x70\xfa\xae\x13\x23\x96\x1f\x7d\x9f\x42\xc6\x10\x9e\xd2\x8c\x17\xcb\x1f\x4b\xbe\x7d\xea\xf8\xf2\x8a\x90\x3f\xae\x71\x24\x7e\xc8\x83\x30\xe3\xd4\xb4\xbd\x4b\xae\x1d\xc3\xa5\xd9\x5f\x55\xb3\xe2\x5b\x85\xd0\x4e\x75\xa8\x75\xce\x75\xe5\xf8\x78\x5a\x94\x33\xc3\xad\x94\x03\xae\x43\x7c\x54\xe0\x44\x07\x32\xe4\x01\xb2\x8c\xd9\xe0\x14\xbb\xd2\x9a\x4c\x32\xb9\x25\xef\x94\x4a\x92\xa3\xac\xd7\x36\x29\xc9\x43\x10\xc6\x29\x59\xc4\xe4\x0a\x8b\xd3\x71\xdd\x54\xdd\x0a\x2e\xa3\xb3\x73\xf9\x1c\x8b\xa8\x2f\x42\xa0\x34\x12\x5b\xd4\x97\x21\xaf\x7c\x7f\xb5\x0a\x13\x67\xe2\x25\xcd\x09\xda\x7c\x60\x29\x39\x8d\x61\x17\x95\xa9\xb1\x3a\x5b\x0f\x87\x2a\x78\x99\x08\x72\xe3\x1b\x73\x45\xfb\xad\xc0\xbf\x1c\x91\x97\x4f\xb7\x6c\x8b\x02\xad\xe1\x0f\x50\x2c\xb3\xf3\x12\xac\x42\xd9\x34\xd9\x25\xe7\xaa\xfb\x41\x88\x47\xbc\x91\x90\x8e\xe0\x80\xc3\x20\x24\x23\xd7\x7c\x26\x08\xc7\xdf\x5f\xf7\x84\x3d\x0e\x0e\xec\x98\xf3\x3b\x74\x34\x1a\x91\xbd\x3d\x11\x99\x8d\xaa\xbf\xe4\x79\xcf\x08\xd6\xfe\x8b\x8c\xa0\x24\x7b\xed\xcb\x8c\xc9\x55\xf9\xa7\xeb\x0b\x67\x09\x59\x8b\x43\xcc\xd4\x85\xb2\xa6\xc8\xf1\x5d\x20\x4f\x99\x1b\x78\xbe\x6f\x64\x96\xf6\x27\xe5\x4c\x2f\x3e\x3a\x3b\x12\xc1\x06\x5e\x23\xca\x4a\x37\x2d\xd4\xb6\xbf\x70\x20\x6d\x55\x39\xe0\xec\x98\xf6\x4f\x83\xbf\xf4\x10\x1d\xc0\xf9\x82\x5d\xf7\x70\xf0\xf9\x33\xa2\x03\x8e\xde\x3d\x28\x7f\x67\x1e\x62\x30\x08\xf6\xf6\x7a\x78\x74\x76\x5e\x10\xac\xf2\x8b\x40\xdc\xa2\xc1\x30\x83\x9d\x82\x9a\x04\xa1\x72\xb5\xcf\xa4\xa3\x88\xf6\x95\xcd\x81\x70\x23\x8f\x96\xc2\x2e\xb6\xd3\xb9\xf2\xc8\xa4\xf9\x9d\x0e\x9a\x3a\x82\x31\xa3\x15\x05\x95\xb8\x0e\x8d\x58\x0e\xc0\x50\x8d\x4f\x4d\x72\xfa\x3b\xc2\xae\x75\xe4\x58\xf2\x28\x6b\x49\x97\x69\xb4\xba\x3f\xd2\xec\x14\xbe\x4c\xde\xfc\xfd\xb7\xa7\x4e\xd2\x4c\xe3\x46\x83\xe1\xb0\x06\x59\x83\x05\x5c\xa5\xb2\x37\x25\x57\x2e\xbb\xb7\xca\xf2\x11\x49\x2a\xec\xe4\x2a\xab\x5c\x22\x78\xd5\x37\x70\x6f\x34\xf4\x9c\x1d\x16\x55\xd8\x1c\x37\xfb\x33\x08\x62\x19\x07\x2c\xe7\x9b\x65\x50\xc6\x97\x97\x9e\x9f\xa7\xd5\x3c\x99\xa3\x43\x2b\x87\x0f\xbf\xcd\x0c\x49\xcb\x2e\x5c\xb5\x46\x99\xa5\x77\xce\x17\x6b\x02\xa0\xda\xef\x4d\x9c\xa6\x09\xa2\x2c\x5f\x4d\x99\x23\x42\x10\xcd\xba\xa2\x42\xf3\x82\x89\x4e\xbd\x0a\xcc\x68\xae\x1e\x91\xa4\x7f\xf8\xd4\xe3\x7f\xe8\xbc\xff\x6d\x6d\x23\x4e\xcb\x4a\x93\xf3\xe7\xf0\xbb\xf0\x30\x3c\xe3\xd7\x3e\x27\xff\xd5\x93\x56\xe1\x70\x36\x24\xb3\xcd\x05\x09\xe3\x85\x8a\x53\x3e\x34\xd5\xc4\x8d\x64\x90\xa3\x8b\xfd\x65\xb5\x95\x6e\x27\x40\x3c\xf3\x18\xfc\xc4\xfa\xa9\xb0\x3d\x69\x01\x93\xbc\x45\x2e\x8a\x95\x39\xae\x9f\xa3\x51\xa4\x81\x70\xbf\x00\x2b\x01\x1d\xdb\x3a\x58\x96\x42\x11\xc1\xfd\x98\x73\x36\xa9\x07\x12\x34\xc5\xfd\x39\x8a\xe3\x44\x5b\x5e\x58\x89\xdf\xfd\x30\xcb\xfc\x9e\x7d\x13\x56\xe4\x32\x1f\x99\xcf\xc8\xa2\x68\xdc\x21\x46\xe4\x49\x2a\xb3\xda\x00\x5f\xd2\x96\xa5\x01\xd7\xc3\x23\x03\x09\x2a\x1a\xee\x02\x26\x94\x7e\x62\x72\xd4\x39\x13\x49\xc7\xd9\x5f\x40\x3a\x85\x7c\x12\x2e\x7a\xcf\x2a\x37\x06\xd1\x05\xe7\x00\x7c\x79\x04\xa3\xc8\x5a\x36\x59\xa7\x16\x2f\xda\xe0\x4d\xb5\x81\x7a\x9d\xb1\xee\x61\xa3\xc9\xaf\xe3\x85\xf3\x88\x12\x34\x68\x25\x14\x0c\x90\xad\x77\x0c\x8c\x11\x8e\xe1\x27\x3f\xf4\xfb\xfa\xa4\x96\xe9\x07\xfd\x18\x81\x84\x4c\x3b\x9d\x6f\xa2\xe5\x7e\x56\xd1\x6a\x4c\xe7\xbe\xeb\x78\xdb\xc8\x16\x95\xdb\x65\xe3\x65\x53\x55\x9f\xdf\x36\xd2\x57\x42\x2b\x84\xc4\x99\x28\x70\x1c\x91\x2a\x43\xfa\xe6\x76\x85\x9e\xbf\xc5\xa9\xaa\xbd\x58\xf8\xd6\x27\x58\x99\xfc\xd7\x49\x2c\x5e\x68\x7c\x94\x78\xa1\xb0\xa3\xc5\x19\x93\x73\x44\x4f\xa1\x77\x4d\x96\x1e\x5d\xaa\x1f\x57\x00\x33\x8f\x11\x4f\xe2\x86\xa0\x1f\xe5\x06\xf7\x00\x8e\x3d\x90\x24\x9e\x49\x2f\xfe\xbc\xcd\x5e\x58\xdb\x09\xa4\xd9\x1b\xa4\xcc\x7e\x58\x2e\x21\x09\xe4\x9c\x30\xbb\x5e\xa8\xf3\xc9\xe3\x05\xf8\xc4\x22\x69\x3c\xda\x34\xf6\x36\x4e\x23\x95\x0e\x37\xda\x9f\x84\x5f\x53\xfc\x0a\x70\x0e\xb6\xc6\xe1\xe6\xd4\x8c\x58\x3b\x9e\xd8\x3c\x74\xa8\x6f\xb6\x1a\x27\x13\x07\x00\xe9\x1c\x24\xc5\x6d\x2e\x46\xc0\x47\x28\x6f\xaa\xb9\x08\xe8\x98\x41\xf1\x3d\x5f\xfd\x2b\xc4\x17\x5d\xa2\x43\x6e\xfd\x05\x46\x68\xfa\x96\x8a\x20\x06\x08\x5b\x18\xb3\x7b\x27\x67\x65\x87\xad\x38\x21\x84\xe5\xb6\x78\xe5\x66\x74\x79\xe1\xe4\xde\x15\xbd\x70\xc8\x92\x25\x08\xc3\x3e\x85\x11\xc1\x31\x48\xaf\xed\x5b\x25\x46\x74\x8e\xf2\xc7\xaa\x1a\xc0\x31\xc0\x11\xac\xf1\x00\xdb\x60\x44\xf2\xd6\xcf\x4e\x94\x28\x41\xd1\xc5\xfa\x07\xca\x8b\x86\xdb\xaf\xe2\xcb\x1a\x74\xb5\xd3\x53\xa5\x96\xc7\x59\xe4\x50\x16\xa6\xd0\x03\x29\xf4\x30\x91\x68\x48\xf9\xae\x9f\x03\x24\xd2\xb3\x35\x77\xb5\xa1\x9c\xb7\xc8\x63\x76\x10\xf5\xca\xd8\x87\xc9\xbd\x89\x7c\x49\x3a\xad\x97\x5d\xe4\xd2\x12\x5a\xc2\x43\x9a\xd3\x0f\x3b\x64\x0f\x59\xcb\x4a\xb1\x6b\xd9\xd5\x0f\xd4\xb4\xdd\x4e\x29\x9d\x00\xf7\xc8\xc4\x45\x9d\xe1\xbd\x91\xfa\xb2\x83\x82\x72\x2b\xaa\xc9\xbc\x16\x52\x44\x8d\xf7\x03\xad\x6d\xb4\x34\x8d\x33\x40\x67\xbd\x1b\xb5\x84\xc3\x0a\x9c\x99\x42\xf6\x53\x3a\x95\x6a\xf6\x35\xc4\x44\x7f\x95\xad\x7b\xa7\x5a\xab\xd5\x52\x60\xa4\x11\xeb\xfe\x04\x46\x5f\xd2\xd9\xf4\x57\xf0\x3d\x58\x53\x97\xa7\x26\xe0\x50\xe7\x19\xf7\x73\xa9\x47\xcb\x29\xe9\xea\x34\x6f\xd4\xd2\xbb\x6d\x5f\x4b\x56\x04\x78\x63\x9c\xbc\xac\x6a\x82\x22\x88\xe9\xfd\x29\xcc\x1a\x6c\x71\xec\xb3\xf2\xb5\x1c\xaa\x8d\xbf\x68\xd2\x6b\x34\x15\x08\x4a\xe7\x6a\xce\x58\x46\xb5\x6a\x1f\xad\x0a\x26\x1b\x1c\xad\x1a\xaa\x8f\xec\x68\xfd\x57\xb1\xf4\xa8\x3a\x2e\xd5\xb2\x0c\x1d\xa8\x30\x85\x4c\x63\xc2\x9a\xa7\xa5\xaa\xde\xf6\x90\xd4\x28\x72\x7f\x87\xe4\xef\x97\xef\x2f\x11\x9c\x74\xb3\x3c\x2f\x4d\xa0\x7f\x01\xaf\xdd\xe7\xa3\x06\x48\xc7\x63\x32\xab\x76\x4b\xa7\x65\x11\xf2\x1d\x68\xcd\x47\xb6\x9f\xab\x62\x1e\x21\x3a\x10\xb1\xe8\x7a\x6c\x20\x45\x7c\x1c\x60\xd6\xda\x0e\xa4\xe0\x2a\x70\x06\x62\xce\x4a\xa9\x6b\xa7\x2d\xc6\xd3\x39\x5b\x3c\x86\x7b\xe6\xf4\xcd\xfb\x93\x2d\x5f\x32\xbc\x49\x6d\x91\x99\xdd\x33\x1c\x20\x1b\x5c\x32\x02\x9e\x8f\x0c\x23\xff\xd5\x6f\x18\xbe\x26\x15\xd7\x8b\x85\x03\xeb\xba\x1f\xbc\x79\x7f\xd2\x99\x18\x17\x58\x72\x7f\x97\xcc\x8f\x07\x87\xf0\xcd\xcf\xe4\xa7\x35\x2f\x19\x3e\xfa\x06\x32\x9c\x43\xa5\xeb\x1d\xa3\xea\xdc\xd2\x05\x93\x03\x79\x87\xdb\xe5\xfe\x56\xe9\xe4\x3f\xaf\x9e\xbc\x9e\xfc\xc7\xa7\x4e\xfe\x06\x8c\x90\x64\x0c\xd2\x7d\x0c\x2e\xfb\x63\x90\x96\x1c\x0f\x32\xed\xab\x2e\xc9\xfa\xea\x97\x5a\x49\xa7\xf2\x35\x57\x3e\x41\x22\x5a\x7f\x75\xe9\x9c\x5a\xc7\xa5\x1d\x15\xaa\xae\x33\x23\xe7\x53\x89\x7a\x85\x8c\x99\x97\xf5\x79\x15\x97\x42\x54\xab\x32\x68\x9b\x58\xaf\xd5\x25\x72\xb3\x51\xd7\x4c\xcd\x7c\x6a\xa2\xcd\x34\x86\x9b\xad\x50\xad\x0a\x01\x9e\x43\x7e\xbb\x4d\x4b\x07\x6f\x7e\x5d\x19\x16\x48\xd5\x5b\x16\x85\xe8\x0c\x8c\x39\xe6\x98\xd0\x4f\x75\x0a\xa8\xfc\xc2\x96\x29\x10\xb1\xc4\x32\x77\xcd\xb1\x1e\x95\x63\xc1\xa9\x88\x40\x0a\x63\xd9\x7b\xdd\xd2\xff\x55\x37\xdc\x35\xfe\x50\xd5\x48\x73\xc8\xb8\xcd\x91\xb6\x45\xd2\xb6\x03\x5d\xd2\x5b\x19\xe6\x07\xd9\x6c\xb7\xb0\xc9\xd2\x55\x55\xe5\x73\xf4\xf3\xd7\x76\x5b\xe3\x8d\x86\xe9\xf2\xb3\xfa\x16\x16\x45\xdc\x2f\x6b\xd8\x4e\x54\x0d\x33\xb1\x78\xa9\xad\x8e\xd4\x70\x5b\x5b\x1c\xac\x8a\x8b\xbc\xe5\x91\x16\x9c\x0a\x36\x3a\x95\x6d\x1c\x59\x43\xd7\xd2\x10\x20\xed\x99\xa7\xf2\xa9\x8f\x09\x63\x64\xde\x3f\x3c\x38\xa8\x3a\x50\xeb\x5d\xf7\x1c\x4a\x9e\xcd\x9d\x21\xcb\xf4\x46\x07\x12\x45\x9c\x0e\x0f\x3f\xfc\xd1\x9a\x06\xe8\x58\xe6\x19\x1b\x59\x89\xd8\x7c\x3f\xcb\xb9\xe6\xfb\xa1\x89\x79\xad\x12\xa5\x89\xb4\x14\x86\x7b\x04\x71\xdc\xe0\xf0\x27\x47\x4d\x21\x93\x03\xf0\x55\x8f\x22\x4b\x41\x55\x68\x25\x10\xc7\x16\x03\xaa\x6b\x94\xdc\xa2\x99\xf1\x15\x94\x34\x70\x30\x58\x2c\xe9\x4c\x2e\x83\x50\x01\x14\x83\x4a\x9b\x01\x3e\x3b\xf8\x6e\x34\x1a\xb1\x81\xcc\x14\xff\xdc\xff\x80\xc1\x38\x11\x5a\x7f\x10\xc7\x5e\xbc\x5c\x24\x82\x65\xf4\x04\x70\x87\x85\xcf\xe2\xa5\xca\x11\x36\x23\x57\x6f\x85\x4b\xa7\xdc\xa3\xd2\x83\xc8\x61\xf3\x9e\x07\x4d\x75\x48\xa9\x39\xb9\x84\x2e\x17\x46\xe8\x2a\x3e\x85\xec\x98\x70\x9e\xd7\x11\xaa\x4d\xc0\xc6\x8e\x9a\x91\x79\x1e\xd6\x79\x69\x56\x8d\x4c\xea\xe2\x6e\x77\x5c\x3a\x12\x54\x31\xf8\x47\xc5\x90\x96\x8b\x18\x30\x98\x05\xe0\x1a\xa0\x38\x84\x6d\x25\x09\x72\x57\xff\x2b\xf9\x2c\xb6\x3e\x29\xea\x44\x0a\x86\x7d\x6f\xd2\x21\xde\xb2\x51\xfa\x26\x2e\xb9\x55\xa9\x66\x1a\x1c\x09\x9f\x77\xf7\xe8\x35\x5d\x76\x43\x7f\xe5\x04\x3c\xdc\xa4\xf2\x3a\xc2\x14\x49\x90\xb6\x14\xa2\xc8\x0d\x72\x7f\xfc\xf9\xd7\xbf\xa6\xe8\xe2\x13\x6d\xe9\x9b\xd8\x9a\xab\xab\x63\xe9\x3a\xb1\x80\xad\x2c\xd7\xfd\x2e\x66\xeb\x19\xcb\x50\x17\x89\x77\xf6\xb4\xd0\x16\x5d\x8e\x1d\x2d\x9d\x42\xe6\x8d\x01\x45\x91\x87\xf0\x84\xa4\x73\x71\x3b\x85\x26\xcc\xac\x34\xc9\xca\x72\xc7\x53\x6f\x42\x52\x13\x26\xcd\xf6\xb3\x74\x9b\xce\x2f\xab\x06\xda\x68\xb2\x53\x30\x3c\xb5\x4c\xe7\xf2\xb8\xe7\x72\x2c\x8d\x63\xbf\x2e\x40\x9b\xfc\x5e\x21\xe1\xaa\xed\x4b\xac\x47\xd6\x91\x9c\x9d\x65\xe9\x94\x73\x5c\xb5\x83\x48\xb7\x95\xc0\x95\x6c\xa6\xb6\xe0\xb0\x6a\x8d\xe3\x96\xa4\x7a\xf9\x33\xa0\x91\x66\xd6\xf6\x7e\xfb\x62\xc7\xde\x1b\xc9\x4c\xa1\x68\xbe\xfe\x2e\x54\x85\xfc\x9c\x67\xa3\x34\xb2\x2b\x1d\xa8\x8e\xd0\x9d\xc6\x02\x59\x10\x2e\x47\xa2\xb8\xd3\x17\x4a\xd0\xbc\x74\x94\x4f\xb4\x95\x0c\x04\x84\xfc\x60\x47\xf9\x4d\x2a\x3b\x79\x96\xcf\xbe\x1e\xaa\xaf\xc2\x30\x58\x7f\x94\xd1\xc0\xcc\x37\xf8\x29\x82\xe9\x82\x99\xcf\xfa\x39\x2b\x91\x82\xab\xef\x45\x03\x8a\x54\xd3\xcf\x59\x89\x48\x79\x67\x43\x93\xb2\x9b\x3f\xda\x7d\xc8\x4b\xf0\x94\x2c\xd3\x08\x9a\x72\x85\xd7\x81\x4d\xce\xe7\xd7\xc0\x10\x6b\xdf\xf3\x69\xf7\x68\x53\x52\x8f\x32\x90\xeb\xc9\xba\x02\xe2\x3d\x32\x05\x91\x1e\x7d\x3d\xc2\x66\xc0\x08\x3b\x79\x0f\x76\xdc\x0d\x95\xf1\x5e\x4b\x7a\x1f\xd9\xc3\x30\x53\xee\xfd\x40\x52\x7b\x98\x4a\xfe\x67\x52\xe6\xd7\x94\xd4\x3f\xd5\x55\x5f\x83\x46\x53\xc8\x24\x0e\x31\xb9\x85\x7e\x41\x71\x50\x1f\x92\xba\x80\x1b\xf7\x47\xd0\x3c\x8b\xde\x7c\x7a\xf5\xea\xf0\xc7\xdb\x50\x38\xa8\x5b\x4d\x97\x9e\x90\xb4\x6f\xc0\x6b\x6e\xb5\xec\x8d\x76\xec\x56\x3f\xfc\xd0\xb7\x28\x01\x95\x69\xe4\x3d\xe1\x23\x93\xbf\x5f\xa8\x9a\xaf\x11\xbe\x28\xde\x7a\xb6\x37\x46\x31\x46\x43\xe6\x75\xe6\xfc\x50\x7e\x6f\x0f\x43\xdf\x66\x21\x4b\x97\xb0\xe9\x3e\xcf\xaf\x72\x5f\x66\x68\x77\x4e\x5d\x3b\x90\xf9\xf2\x08\x16\x11\x1d\xa4\x6d\x35\xff\x29\x4f\xf2\xee\x73\x2c\xbf\x97\xcd\xd7\xd3\x04\xc6\xa8\xbb\xf1\xae\x37\xe3\xda\xea\x4d\x5f\xb1\x37\xda\x5f\xf4\x0f\x30\xe6\x84\x19\x9b\x30\xe8\x78\xe0\x01\x27\x3a\x1f\xfd\x7a\x89\xea\x2b\x98\x43\xae\xf3\xf1\x9f\x20\x7c\x51\x5f\x56\x68\x10\x83\x90\x81\xf1\xd0\xd7\x9e\x54\xb9\x54\xb6\x67\x7e\xb4\x4c\x53\x88\xd9\x09\x98\xc2\x57\x9c\x3a\xb5\x28\xac\xf7\x60\x5c\x15\xf7\x4a\x12\x42\x60\xac\xa3\x46\x9c\xce\xc8\x15\x6f\xa2\xae\xa4\x19\x81\x4d\x7b\x58\xac\x6f\xc4\x21\xff\x9e\xf4\xfc\xff\xb2\x00\x53\xd8\xf7\x9f\x30\x23\x00\xd3\x67\x5a\x45\x00\xae\xc2\xca\x64\x12\x30\x77\x47\x9a\xc7\x66\x76\x00\x8a\xca\xb2\x6f\x20\x03\x2f\x20\x8d\x52\xb4\x90\x3d\x17\x69\x37\x11\x1f\x8c\x2c\xae\x0b\xf3\xaf\x21\x2b\x4d\xf2\x41\x94\xcf\xe1\x57\x9e\x47\xa4\xda\xed\xd1\x90\xb9\xb2\xd9\xd2\xd1\x68\x04\xf7\xf6\x7a\x2a\x65\xd9\x42\xae\xa2\x08\x38\xa1\x52\xb4\x49\x03\xaa\xc1\x2f\x82\x5a\x4a\xdf\x20\x0e\x65\x34\x16\xe2\x4b\x91\xbe\x38\x4b\xd8\x6b\xa1\x93\xbc\xbc\xed\x9b\x84\xea\x64\x72\xb9\xb1\x3b\x64\x1e\x6a\x24\x4a\x31\xce\x82\x55\xa0\x04\x86\x6f\xc8\x25\xbc\x0f\x10\xf1\x01\xe1\xb8\x27\x78\xb0\x29\x94\x9c\x5d\xec\x87\xfc\x9a\x67\x61\x34\x43\x49\x9c\x42\x3c\xdc\x3d\xb4\x05\xae\xdd\xc7\xe9\x07\x21\x19\xa9\x77\x7c\xc8\x21\xb2\x0a\x65\x22\xc6\x60\x07\x4d\x7a\xea\xed\x22\x25\x4c\xef\xe5\xdd\x11\x1a\x9c\x98\xe7\xf7\xd7\x0b\x38\x78\x4d\xa2\x0b\xd9\x2d\x18\xdd\x2c\x44\x9e\xdf\x01\x23\x7f\x3b\xfd\xe9\x6d\xef\x06\xe1\x28\x59\xc6\xf0\x55\x2c\x8f\x31\x71\x75\xc0\x8a\xaf\xab\x5a\xe8\x69\xb9\xec\x14\xf6\x88\x66\x4b\xc4\xf8\x81\x0b\x92\x15\x8d\xc8\x0c\xcf\x60\x0a\x69\x8f\x84\xf9\x54\xcd\x42\x5f\xdb\x80\x2b\x7c\x72\x02\x57\x5a\x62\x22\x69\x85\x76\xe2\x9f\x94\x54\x9b\x65\xcf\x9d\x1f\x13\x92\xf6\xf2\xf1\x61\xdd\xd8\xc7\xd7\x7b\x80\xe2\x90\x8c\xd8\x40\xe3\x4b\x88\x46\x67\xe7\x21\xb0\xaa\xc8\x49\x04\x61\x3a\xfa\x45\x84\xb9\x79\xc5\x6f\xb4\x1e\x08\x9d\xd9\x18\x4c\x0d\xd1\xc1\x68\x34\xa2\xab\x20\x4c\x46\xe0\x2c\x3d\x0f\xa3\x51\xfa\xe4\xf0\x2f\xd1\xbf\x01\x05\x0b\x29\xd2\x09\xf6\xf6\x7a\xd1\xee\x88\x7f\xfb\xfc\x19\x9c\x45\xe7\x56\x1b\x09\xbc\x84\x09\xc7\xa1\x51\x52\x7e\x1b\xec\xed\xed\xf6\xdc\x15\xfe\xcd\x59\xfe\x2f\xd1\x93\x27\x01\x12\xca\x99\xde\x8d\x3c\x50\x86\x85\xfa\x02\x2a\xa2\x7c\xf1\x8b\x6a\xa4\x7f\xb8\x52\x9b\x56\xf2\xac\xb9\x3b\x46\x90\x45\x41\x48\x9e\xf7\x0a\xbd\x70\x20\xd4\xe1\xaa\xf4\x56\x94\x78\x86\x43\x1a\xa2\x4a\x0d\x47\x2d\x8a\x42\xd7\x1a\xc3\xf6\x58\x0b\x0b\x58\x2b\xe3\xe7\xb4\x1b\x38\x1f\xf7\xc3\x19\x35\xdf\x1d\xaf\x30\x85\x29\x3b\x85\x45\xa9\xc8\x66\xe1\x40\xcb\x53\x01\x71\x2c\x00\xe0\x9c\x47\x49\x57\xa5\xba\xa7\x23\x3d\x43\x46\x52\xde\x0a\x26\xe9\x1c\x24\xe8\x77\x28\x67\xc2\x27\xb2\x53\x28\x22\x50\x8a\x1a\xd8\xdc\x1e\x50\x69\x11\xa8\xa2\x53\x78\x09\x31\xfb\x7e\x49\x07\x8b\xe5\x38\x41\x74\x96\xb5\xce\xbb\x3c\x8a\x63\x68\x62\xef\x0b\xb2\x48\x68\x36\x79\x03\xfc\xd0\x7f\xee\x4c\x3d\x63\x86\xa7\x49\x3f\x3d\x44\xc9\xce\xe4\x46\xad\x5e\x89\xd8\x1a\x25\x18\xe4\x4a\x66\xad\xca\xb2\x62\x4c\xc3\x1e\x74\x6e\x59\x39\x60\x2c\xf4\x76\x81\x3e\x5c\x8d\xe6\x54\x70\xf9\x5b\x0c\x25\x5b\x90\x23\xc4\x59\x27\x95\x01\x63\xf3\x77\xf7\x11\xbd\xe5\x21\x81\x38\x6e\x33\x1e\x7d\x6f\xd5\x05\x55\xab\xbd\x9e\xe5\xd4\x75\x33\xbd\x8a\x1b\xca\xa5\xea\xaa\x4c\xe1\xec\xe7\x43\x91\xa9\x0d\xe8\xc0\x1e\x0b\xa6\xef\x15\x8f\x52\xa9\xec\x2d\xb0\x3a\x3a\xd0\x2f\xd5\x15\xab\x46\xee\x26\xd9\xb4\x86\x79\x0a\x4f\xe1\x6f\x4b\x88\x23\x58\xe2\x43\xf2\x24\x59\xf5\x5d\xc3\xea\xaf\x94\x48\xb4\x6b\xf7\x54\x39\x52\x27\x69\xd9\x7c\xc4\xb8\xc8\xe6\x4d\x68\xa4\x4c\xff\x3e\x85\xaf\xf9\x6d\x7b\xfb\xa0\x11\xdd\x3c\x16\xb8\xbc\x07\x53\x07\xd3\x9a\x6d\xfe\x22\xd9\xbe\x03\x35\x8b\x3a\xa5\x8d\x30\x11\x6c\x25\x14\xfd\xbc\x23\x49\x32\x06\xb9\x33\xc6\x05\xf8\x8a\x86\x52\x55\x5b\x5c\x89\x9d\xf6\x06\x76\x73\xd4\xad\xb9\x3d\x0e\x25\xf5\xb0\xc6\x79\x64\x2d\x60\xe5\xa8\x4b\xfe\x0c\x95\xcb\x98\x25\x8b\x51\xcb\x08\x83\x55\xad\x62\x62\x0a\x99\xb0\x27\x15\x67\x2f\x2d\x85\xcc\x6c\xe8\x44\x08\xce\x54\x2f\xed\x54\x14\x52\x2c\xf5\xaf\xae\xa2\x68\x2d\x47\xea\xa4\xcb\x68\x6d\xe2\x52\x61\x9d\xb2\x89\x55\x49\x3d\xe2\x0e\x84\xd5\x25\xad\x52\x6c\xfc\x82\x62\x7d\x1f\x36\x62\x30\x2e\x62\x30\x0e\x42\xa8\xef\xff\x3a\x37\xfa\x5a\xd5\x4a\x2e\x99\xa1\x12\x46\xd5\x8b\xad\xac\x42\x8d\xf2\xaa\xb0\x42\x3b\x44\x1b\xd5\x43\x34\xbc\x0d\x3d\x92\x80\xdc\xb0\xcc\x49\x0b\x5e\xbe\xa6\x01\xf1\x5d\xcb\x4c\xeb\x0a\xea\x22\xa1\xa5\xb1\xa8\x29\x6e\x95\x0a\x53\x92\xc0\xba\xb2\xe2\xbb\xd4\x11\xd5\x15\x93\x05\x56\x6d\x53\x67\x99\x58\x88\xc6\x2e\xbf\x10\x59\x33\xfb\x92\x45\x9d\x35\x5a\x13\x68\x40\x6b\x3e\xea\xe3\x55\x30\x1a\x59\x63\x4a\x5a\x02\x25\x28\xad\x44\x5d\xda\x0f\x04\x1a\xd8\x65\x4d\xd9\xca\x27\x68\x03\xcb\x14\x11\x40\xe1\x1f\xc5\x0f\xf3\xda\x1c\xbf\x0a\x1c\x75\x66\x51\xb5\xb6\xb0\x2a\x01\x82\x11\x18\x1f\x84\x07\xed\xb4\x8a\xf2\x38\xbf\x3f\xad\xe2\xdb\x7f\xbe\x62\xbf\xbd\x5e\x5e\x3d\x02\xad\xa2\x5a\x43\x45\x67\x14\x39\x19\x63\x63\xf3\xde\xc0\xd2\xcf\x4b\xea\x79\x13\x92\xca\xc8\xf4\x73\x65\xbd\x5c\x49\xe7\x58\x54\xd0\x15\x74\x8c\xf2\xa5\x1c\x9b\x79\xe4\x43\x6c\x30\xe7\xc9\x0f\xbe\xa5\x59\x8f\x99\x5b\xcb\xf2\x66\xea\x8d\xe5\x33\xc8\xd4\xdb\x3f\x95\x23\xfc\xc5\x24\xea\x5f\x22\x78\x75\x2f\x5e\x54\xfd\xc3\xa7\x35\xa6\x73\x45\xe5\xae\xfe\x61\xec\xdd\x5c\x58\x98\x47\xba\x12\x1c\x2b\x11\xa7\x84\x17\x9d\x56\xc6\x09\xf0\x76\x93\x99\x43\x06\xea\x55\xd5\x59\x20\xdb\xfc\xe4\xd4\x19\xdc\x61\x92\xc5\xcd\x50\xda\x2d\xce\xdd\x21\xfb\xd9\x0e\x50\x36\xf4\x35\xb9\x3b\x1c\x63\x24\xaa\x5f\x15\x0d\x7d\x29\x35\xac\x3d\xec\x0a\x6c\xb2\x9f\x69\x37\x95\x45\x61\x51\x2c\x61\x5e\x5b\xfc\x78\x97\x75\xb5\x56\x4c\x3f\xae\x79\x02\x1e\x84\x25\x85\x6e\x3d\x1e\xe8\x89\xb5\xb2\x60\x2c\xcd\xbb\x65\xad\x3c\x58\x36\x43\xb6\x26\x7c\xf3\x30\xe9\x4f\x97\x8c\xc1\x94\x7a\xf3\xb1\xdb\xe9\x73\x7d\xfc\x73\xd6\x12\x31\x16\x23\x88\x19\x4c\x3d\x4c\x70\x7f\x91\x22\xcc\x84\x0b\x4a\x86\x9e\xc2\x97\xb4\xde\x87\x74\x13\x1f\x54\x2b\x9e\x26\xd2\xb1\x01\x55\x1b\x32\xd6\x30\x03\x63\x4f\x45\x09\x54\xbe\x8b\x5f\x85\x3e\xfc\xcd\x78\x31\x2a\x0c\xf2\xb3\x70\xab\x72\x65\x33\xff\x37\x6b\xe1\xaa\x23\x02\x1b\x8b\x01\x4b\x36\x61\x85\x04\x3e\xce\x82\xb9\x36\x05\x46\xdc\x70\x1e\x80\x31\x10\xcd\xe6\x5b\x9a\x8a\xdd\x9a\x15\x64\xd5\xbc\xa5\x65\xbb\xe9\x2a\x27\xd1\x9c\x7c\xa0\x8b\x93\xe8\xd6\x40\x93\xc2\x4b\x44\x2d\xfb\xa4\x4d\x00\x93\xb5\x95\x81\xe5\x9d\x7a\x57\x02\x4a\x3b\x77\xc7\xf6\x41\x27\x0b\x70\x6e\x85\xd0\xed\x03\xaa\x17\xaf\x1a\xe9\x42\xa0\x6d\x68\x1c\x57\x8d\x62\xa6\xcc\x4d\xa3\xd9\x9d\xd2\x7d\xe2\xa0\x14\x32\x8e\xab\xe2\x66\xca\x54\x1b\xe2\x21\xa7\xb4\xcb\x7d\x56\x9a\x0f\xcb\x1e\x3e\x7b\xd6\x46\x2a\xe2\x41\x9b\x63\x58\x25\xd5\x63\x0b\xba\x5d\xce\xb5\xea\x02\x53\x33\xaf\xbb\x91\x5a\x91\x37\x06\x2a\xad\x2f\xc3\x5a\x82\xa7\xed\x45\x97\x07\x6e\x4b\xe2\xdf\x86\x7d\x8b\x2a\xf6\xd2\xb4\x49\x63\xa5\x57\xae\x45\x59\xb3\xb0\x2d\x6f\x67\x6d\x11\xb3\x39\xd7\xd2\xd5\x7d\xbe\xed\xd1\xbd\xe1\xa6\xb5\x1a\x6c\x62\x41\x5a\x73\x1c\xeb\x4c\xbe\xe5\xfc\x8b\xe7\xf3\x86\xb3\x37\xcd\xb5\x22\x8f\x33\xbd\xc6\x9a\x04\x6c\x25\xaa\x59\xed\xae\x8b\x3e\x9d\x5d\x96\x36\x34\xb4\xcd\x8b\x8b\xda\x1b\xda\x3e\x32\x7d\x41\x47\xab\xd3\xdb\xf5\x80\x68\xad\x8b\x68\xad\x35\xc8\xf4\x9f\x59\xba\x79\xf1\xce\xad\x05\x90\x85\x7e\x41\xb1\x9d\x94\x55\x7f\x6f\xa8\x6b\x69\x10\x82\x70\x63\x6d\x85\x91\x5a\x01\x06\x7a\x85\xa2\xaf\x6a\x75\x11\x96\xe0\xaf\x2c\x0b\xce\x72\x33\x55\x0a\x97\x71\x51\xb8\x9c\x23\x4a\x70\x9d\xd0\x17\x17\x84\xbe\x3a\x40\x92\x16\x31\x57\x2b\x47\xea\x5d\x57\x6c\x05\x81\xc9\x27\x97\x53\x47\x58\x9f\x2c\x2c\x75\xd8\x65\xf9\x41\x59\x11\x30\x2d\xce\x32\xb0\x45\xff\xd3\x6c\x82\x39\xb5\xc4\x34\x9b\x61\x50\x50\x44\x54\xea\x2f\x45\xaa\xfa\x9c\xc6\x60\x03\x55\xa7\x76\x2d\x16\x06\xdb\x30\x4d\x49\x9a\x8f\xa3\x38\xe9\xb1\x5c\xe4\xbf\xbc\x5b\xf7\x3e\x26\xac\x3f\x21\x4b\x1c\xfb\x41\xb8\x7b\xd8\x4e\x25\xaa\x06\x7a\x6f\xde\x04\x9d\x8f\x9f\x8d\x5c\x06\x55\xa4\xc9\xb0\xe8\x12\x98\xb3\x9d\x71\x7f\xd3\x66\x55\x85\xaf\x55\xca\xf2\xc2\x57\x55\xfb\xc6\x36\xd6\xd7\x76\x92\xc5\x4a\xc6\x26\x73\xb5\x6a\xe9\xe1\x78\x27\xf6\xc4\x8e\x23\x2b\x67\x61\x5c\x32\x84\x34\x76\x1a\xb8\xd9\xe8\x0f\x3b\x8c\xfe\x60\x10\xd6\xba\x26\xea\xc5\xc4\x55\x2b\xe9\xfa\xa0\x16\x02\x57\xaf\xa1\xfb\x93\x73\x01\x73\x9c\xd0\xd0\x02\xc6\x6a\xd5\xda\x26\x41\x6f\xc0\x47\x46\x65\xdc\x2e\xd9\xd0\xda\xd8\xa0\xab\xcb\xe4\xbd\x29\xc5\x9d\x37\x54\x31\xdb\xa3\xe3\xda\xba\x05\xad\xb9\x38\x2b\x6a\xf6\xfc\x14\xb2\xcc\x8e\xa9\x76\x5a\xd6\xee\x97\x46\xaf\x82\x52\x12\xc7\x4d\x8b\x0e\xde\x40\x4e\x08\xad\xd7\x49\x4b\xbf\x53\xbd\xb9\xee\x4f\x47\xfc\xee\x9b\x2f\xff\x8e\xd1\xc1\xc5\x23\xd0\x11\x3f\x22\xcf\xd3\x7b\x8c\x3d\xb9\x86\x46\x61\xce\x2a\xa3\x55\x36\x29\xc2\xda\x38\xd3\x2a\x1d\x98\x54\x65\xde\x96\x4b\x6d\x5e\x8b\xa5\xdf\x8a\x3e\xef\xca\xcf\x76\xb3\x74\x45\x5b\x14\x24\x14\x4f\x95\xf6\xa2\x84\xfb\x3b\x87\x96\xbf\xa2\xf4\x1f\xc7\xdf\xc2\x4e\xe7\x50\x45\x9c\xc0\x0d\xc1\xd7\x1a\x6c\x12\x17\xf7\x39\x95\x33\x25\xe9\xf5\x43\xf4\x78\x2e\x0e\xf1\x91\x51\x71\xcd\x09\xa9\x5d\x7e\xb6\xf9\x2b\x5b\x13\x6d\x9a\xc2\xce\x59\x33\xb6\x8c\x5c\x51\x68\xa3\xce\xb2\xcf\x14\xb5\xed\xfa\x2a\x88\xbb\x42\xb3\xd4\xb8\x70\x57\x97\x34\x25\xea\x29\x8c\xe2\xba\xdf\xdf\xc6\x9e\xfd\x74\xf4\x3f\x5e\x9e\x1e\xee\xff\x19\x4b\x7b\xbe\x76\x98\xe2\xaa\x01\xf8\xee\xcb\x31\xd4\x99\x8f\xdd\x1f\xcb\x89\x90\x3b\x8c\xbd\x18\x02\xcc\xb4\xda\x2d\x4f\x72\xf5\xcc\xdb\xe8\x74\x14\x39\x52\x40\xf2\x62\xa4\xae\x4c\xdf\x69\x52\xa2\x9f\x75\xa5\x04\xb7\x15\x4d\xa3\x6a\x3f\xb6\xbe\x63\x1e\xec\xd5\xd2\x2d\x94\x06\x16\xf1\x50\xc5\x5a\x3c\xe8\x58\x1a\xdd\x94\x08\x24\x02\xc9\x29\x23\x29\xe7\x5c\x2b\xb4\x08\x56\x11\x3f\x28\xc6\xc4\x50\x58\xe1\x9f\x87\xfa\xa7\x8e\xa9\xab\x24\x89\x47\x71\x2c\x4e\x8c\xe6\xc8\xac\x45\x96\x5d\x44\xcb\xad\x8e\x8d\x5b\x2c\x4e\x21\x3b\x96\x42\xa3\x1f\xc4\x97\x1e\x0b\x42\xa7\x93\x68\xc1\xb9\xcf\xf6\xea\xcb\xb9\xf3\xbd\xc8\x52\xce\x76\x1f\xbc\x74\x47\xac\x09\x2d\x9b\x07\xeb\x20\x4a\x20\x48\x4f\xa5\xf1\xcb\x2b\x06\xe7\xd6\x1a\xd5\x4c\x82\xfa\x6a\xac\xef\xca\x7e\x4a\x96\xcb\x61\xb3\xab\x53\x8b\x7d\xfc\x28\x3d\x7c\x34\x52\xd6\x6f\x07\x83\xc5\xb7\xe2\x62\x53\x18\x83\x56\x5a\x09\xc4\x52\x1a\xab\x06\x92\xaf\xde\x9f\x46\xb5\x8f\xa4\x52\x49\xf7\x66\xf4\x4a\xa6\xfb\xe5\x7c\x0e\xd2\x6b\x5e\x86\xca\x9f\xa5\x22\x6f\xc4\x52\x8a\x66\xe6\xf2\xe7\x0c\x2d\x82\x10\xf6\x70\x95\x2a\x6a\x5b\xd4\xec\x8e\xd3\xe1\xa7\x48\x64\xee\xb0\xc1\x84\xa4\x2f\x41\x21\xf6\xb5\x71\xc6\xd0\x01\xe8\x77\x0f\x83\x95\x6c\x12\x56\x36\xa9\x4f\x4c\xb3\xa0\xb0\x43\xdb\x77\x4e\x7c\x1b\x89\x28\x1d\xc2\x2e\xa4\x76\x48\x67\xe4\xea\x94\x81\xd4\x04\x06\x19\xee\x1e\x86\x29\x21\xfc\xf9\x98\x2c\x31\x1b\x1e\x84\x19\x02\x59\xb2\x45\x0b\xab\x82\xb0\x80\x43\xe5\x62\x06\xbb\xb2\xb2\x0a\x99\x1c\x65\x35\x9a\x49\xa5\xdc\x84\x9f\x49\x05\x59\xb3\xa5\x86\xc9\x16\x4a\x44\x17\x29\xb4\x11\x92\xd1\x41\x88\x46\xbf\x0c\x16\xc9\x32\xba\xe8\xd1\x30\xa7\x44\xd9\xc1\xce\x35\x45\x03\xa5\xa7\xa1\x3d\xeb\x0e\x08\x3e\x7f\xee\x91\x27\x23\xb1\xbc\x6c\x60\x83\x68\x44\x5a\x1f\x8f\xf7\xc7\xac\x44\xfb\x7f\xfb\x1f\xbf\x9e\x7c\xd3\x4d\x0a\xb1\xbe\x34\x54\xc9\x39\x35\xc1\xda\x20\xff\x34\xf8\x28\x0d\x67\x94\x79\x54\x66\xde\x25\xf3\xba\xaf\x41\xe4\xd6\x8b\x3b\xf3\x1f\xb3\x41\x34\xd8\xdf\xe4\xad\xb7\x9a\x8d\xd3\xf4\xe8\x5b\x85\xe8\x55\xe8\x22\xf3\xe0\x0b\x07\x95\x6a\x20\xda\x60\xcb\x03\xd4\x6c\x0a\x3f\xcc\x9d\xff\xe5\xd3\xbe\x7c\xb8\xfb\x36\x6e\x5b\x05\x7e\x40\x09\x13\xfc\x90\x0d\x82\x4d\x57\xa4\x00\xf4\xd6\x8b\x95\x4d\xb0\xf4\xc9\x9a\x6f\xd5\x37\x33\xfd\xca\x02\x1a\x1a\xa5\x02\x39\xe0\x64\x86\x99\x86\xce\xed\x82\x3a\x5b\x66\xc1\xaa\xac\xac\x2a\x52\x03\xab\x5a\x8f\x8c\x62\xbb\x5d\x7e\x67\x8d\x40\x83\x35\x79\x0c\xfd\x6d\x5b\x57\x15\xe8\x85\x8e\xd6\x51\x0e\x9d\xa7\x66\x85\xec\x02\xf5\x16\x51\xc6\xb2\xa9\x10\xea\xa4\x86\xd1\xc2\x35\xbe\xde\x39\x73\xa8\xcc\xa8\xa9\x4c\x4b\xb6\x0c\xc9\x9b\xb7\x5d\x6a\x63\x9d\x54\x65\x15\xe5\xb0\x35\xca\x88\xac\x06\x1d\xeb\x51\x92\x7c\x7f\x2d\x8e\xfd\x1e\xcb\xd9\xc1\xe5\x29\xb3\x8a\x80\x2f\x53\xc8\x4e\xc1\x25\x8c\xb5\xdb\x24\xcd\x35\xd2\x6c\xa9\x14\x11\x4c\x49\x02\x07\x09\x99\x8a\xc8\x8d\x5b\x32\x5c\x52\xe7\xc5\xfd\x91\x30\xbf\xbe\x1e\x2f\xc6\xd7\x07\xe9\xfd\x29\x52\x0a\x20\x68\x29\xe2\xba\xbf\x34\x4a\x9d\xce\xbe\xc7\x2f\x94\x69\xb3\x14\x8f\xec\xba\x6b\xc8\x47\xb3\x65\x61\x5e\x8b\xd4\xba\x3a\xcd\x8c\x08\xbf\xc0\xcb\x89\x80\x8a\x96\x11\xa7\x43\x6e\x25\x4f\x4f\xc7\xf1\x23\x1a\x11\x81\x5f\x9b\xd5\x61\x55\xa7\xf2\x5a\xf9\x75\x25\x25\xdd\x42\xcf\x74\x9f\xb9\x60\x62\xf0\xd7\xc9\x3f\x7f\xfe\x9d\xde\x25\xcb\x46\x1d\xec\x46\x76\x1e\x74\xcb\xfd\x61\xd5\x6a\xc5\xfa\xc8\x0e\x15\xeb\x93\x20\xca\x4a\x63\x29\x75\xbf\x5d\x0a\xba\x43\xd2\x0f\x73\x6f\x3e\x44\xfd\x45\x36\xb8\x47\x76\xda\xd5\x9d\x3e\xf9\x93\x23\x93\x6f\xb7\x82\xc3\xfd\x6d\xe2\xbf\xff\xf3\xe5\x13\x30\xf9\xe7\xfb\xd6\x09\x9d\x64\xd6\x24\x65\xb0\xf4\x96\x30\x4f\x92\x67\x25\x9b\x9a\xdb\xa0\x6f\xca\x00\x6b\xdc\x08\x8b\x94\x4c\x50\x02\x1f\x7e\xa6\xc8\x86\x8c\xf3\x86\xfa\xa1\xd5\x69\x02\x43\x2c\x22\x8c\xca\xfc\x43\x52\xdc\x48\xf0\x04\xa9\x34\x53\x3b\xa5\x2b\xcb\x95\x4b\xd0\x48\x64\xcb\x9a\x1f\x35\x32\x7a\x92\x42\x0a\x31\xeb\xe1\x60\x6f\xaf\xf8\x8e\x06\x7b\x7b\xce\xe4\x83\x85\xb4\x80\x76\x82\x48\x65\x5c\xcd\x29\x2b\xf9\x2c\x93\x29\x33\xf8\x0a\x23\x86\x40\x42\x7b\xc5\x50\xad\xf2\xb2\x54\xa0\xd3\xd5\x5a\x68\x9a\xda\x20\xca\x23\x3b\x92\x5a\xe3\x57\x27\x52\xac\x01\x19\x1b\xa9\x30\x1d\x4e\x2d\xef\x04\x1f\xac\x93\x73\xb0\x01\x6b\xa7\x90\x7d\xa0\x9c\x30\x2f\xf5\xed\x1c\x83\x15\xe0\xad\x42\x76\xaf\xa6\x51\x0c\xc6\xf6\x0f\xc4\x66\x64\xc9\x4e\x97\x93\x09\xfa\x64\x04\x12\xcb\x24\x51\x1a\xa0\x96\x01\xbf\x94\x98\x0e\x96\x3c\xb1\x2a\x08\xc9\x41\x64\xb3\x1f\xbc\x9f\x16\x28\x7c\x7f\xb7\xc9\xe2\x1f\xdf\x4d\xaf\xc9\x93\xef\xff\x34\x39\x5a\xc7\xe4\xe8\xf1\xa6\xef\x57\x14\xb2\xc8\xda\xa7\xb0\x30\x23\x8e\xb5\x68\x9a\xca\x0c\x7a\xad\x29\x74\x6a\x65\xdc\x73\x11\xd2\x9b\xdb\xed\x16\x37\x4c\x23\x35\x41\x21\x48\xa3\xd9\x3d\xe6\xd0\xe3\xdd\x37\xf9\xef\xf2\x32\x25\x4b\x97\x89\xd6\x8e\xcc\x81\xf4\x38\xd5\x3f\x75\xa8\x16\xf5\xf8\x1e\x4c\xf5\xcf\x1f\xf8\x2a\x9e\x87\xb2\xe6\xd0\xf7\x43\x82\xff\x0e\xaf\xf9\xf5\x5d\x8c\xbb\xab\x69\x83\x74\x89\x07\x31\x1c\x93\xa5\x0e\xaf\x2c\x8f\x35\x61\x2f\x10\x7e\xf3\xd5\x41\xb0\x1a\x90\x31\x1f\x29\xa4\x3d\x3d\xa2\x20\xd4\x23\x1a\xee\x1e\x84\x04\xbf\xd1\x4f\x9b\xb5\x6e\xa6\xa9\xda\x57\xd3\xb4\xfa\xd0\x6f\xb6\xd0\xcf\xb1\x89\xce\xab\x61\x38\xdc\x3d\xd4\xfd\xf0\xa7\x2d\xf4\xc1\x17\x46\xb5\xcf\x17\xc6\xea\x40\x3c\x6e\xa1\x07\xb1\xde\x6b\xa7\x2c\x4f\x21\x5d\x26\x8c\x8e\xf8\x91\x22\x3a\x71\xab\x13\x42\x38\xba\xb9\x90\x58\x94\x93\x69\x6b\x64\x88\x49\x64\xbb\x3d\x66\xab\x98\x05\x77\x28\x7e\x57\xe3\x66\x60\x5a\xfc\x22\x61\xa6\x62\xb9\x14\x3f\x9a\x45\x5b\xed\xc0\x81\x1e\xd2\x28\xfb\x39\x60\x29\x9a\xf7\x82\xf0\x60\xd7\x7e\x29\xb3\x74\xec\xed\xf5\x44\xf0\xcd\xcf\x9f\xe1\x80\x81\x29\xff\xa3\x7a\xe1\x3f\xb3\xa1\x06\x7b\x7b\x36\x61\x62\xed\x5e\x3f\x10\xc9\x43\x7a\xa5\xc0\xcf\x19\xad\xa0\x20\xaa\xc3\x18\x37\x9e\x4a\x8f\x8c\x72\x5d\x43\x2c\xa6\x8e\xb6\x16\xb0\xb8\x47\x2d\xc0\xc1\x7f\xfe\xf4\xb7\xef\x67\xe3\x3f\x49\xa0\x3f\x16\x09\x54\x9d\x8e\x5a\xa2\xa4\x57\xe5\xeb\x55\x59\xd9\x95\x3e\x5a\x6c\x80\x0a\x27\x27\x67\x23\x13\x92\xce\xfb\xd3\x94\x2c\x17\x7c\x00\xcf\x9a\x43\x2e\x4e\x48\xb4\xa4\x7d\x84\x17\x4b\x4b\xbe\xc9\xae\x17\x90\x4f\x87\xef\x06\x3f\x6b\x7c\x91\x80\x08\xce\x8c\x89\xb7\x08\x90\xa7\x2d\xe3\xd5\x89\xce\xc1\x2d\xc6\xa0\x68\x26\x6f\x3e\xee\x3f\xf3\x43\x1f\x78\x3f\xbd\xf3\xc6\xa1\xf7\xc9\x3b\x7a\xfb\xc2\xbb\x0e\xbd\x8f\x1f\xfd\xc5\x2c\x05\x14\x7a\x73\xc0\xfe\xfb\xc7\x8f\xbe\xdf\xe0\xe7\x55\x3d\xdd\x68\x06\xa3\x0b\x2f\xfb\xd9\x47\x38\x41\xb8\x2a\x1b\xb8\x15\x6f\x0d\x8c\x61\x31\x30\x9f\xd5\x8a\xf9\x5c\x1b\x9a\x4f\x81\xd1\x0d\x40\x11\xda\xd5\xe0\x13\x6f\x55\xc4\x63\x3a\x93\xbf\xc7\xe4\x93\x86\x9e\x78\x96\x31\xb4\xfc\xdc\x44\x44\xab\x8a\x82\xd6\x97\x63\x49\xce\x6c\xe2\x11\x7a\x22\x69\xb1\x63\xb6\x2d\xa2\xae\xfd\x09\xea\x02\xa8\x4d\x50\xc3\x12\xb8\xd5\xdd\xff\x27\x9c\xb7\x02\x67\x4e\xb5\x95\x61\xcc\xc0\xd4\xc3\x60\xfe\x27\x32\x6f\x07\xc8\x92\xb9\x2b\x41\x39\x23\x5d\x37\x04\x76\x29\x86\x63\x69\xa6\x8a\x52\x93\x7f\xfa\x86\xd8\xd5\x33\xd7\x2f\x8c\xc0\xc0\xbc\x70\x3b\x00\x6f\xdf\xab\xb7\x40\x4a\xb6\x10\x0e\xb0\xe5\xa2\xd9\x1f\x67\xc9\x50\x42\xf7\x21\x8e\x88\xba\xdd\x6f\xdd\x1d\xe7\x06\xfc\x0a\x3e\x75\x54\x2c\x54\x9a\x80\x49\x2d\xfb\xaf\xe0\x93\x70\xc0\xf8\x6d\x09\x29\xeb\xf9\x72\xee\x7e\x78\x33\x87\x6c\x46\xe2\xa1\x7f\xf2\xd3\xe9\x7b\x3f\x8c\x81\x8e\xf7\x20\xa4\x3d\xe2\xf9\xfd\xf5\x02\x0e\x25\xa5\xb0\x2a\xeb\x18\xa4\xd5\xb4\xe1\x12\x06\xdf\x03\x0a\xbf\x7e\x36\x10\xd0\x82\x3d\x7f\xe8\x3f\x51\xde\x06\x03\x38\x07\x28\x79\x62\xbf\xd1\x9a\x8f\x60\x47\xe5\x0d\x48\x48\x24\x34\x1f\x83\x59\x0a\x27\x23\x5f\x30\x3d\xfb\x94\x92\x7d\xff\x89\x6c\xf0\xc3\xbb\x57\xc7\x64\xbe\x20\x58\xaa\x33\x56\xc1\x20\xe2\x7b\x23\x67\x19\xd2\xa0\x36\x90\x8b\x5e\x62\xbd\xb6\xcc\x6b\xe4\x78\xa8\x2a\x35\xa4\x5c\x30\x13\x1c\x83\x93\x8f\x03\x21\x04\x3a\x15\xd6\xff\x24\xed\xf9\x67\x0b\xd5\xf9\x28\x1e\xcf\x00\x9d\x9d\x8b\xb4\xaa\xe2\xf2\xda\x39\xd8\x1d\x8d\x98\xe1\x6f\xfd\x9b\x9b\xc1\x8b\xef\x79\x99\xd5\xca\xe7\x5f\xd6\x91\xdd\x6f\x38\x22\x89\x76\x37\xf1\x98\x1f\x45\xc3\xd6\xcd\xf0\xd2\x56\x33\xa1\x6c\x78\xc8\x42\x41\x0c\x0d\x7d\x3f\x9c\x43\x4a\xc1\x14\x0e\xfd\xf7\x33\x44\xbd\x17\x6a\x41\x3d\x24\x92\xb7\x46\xd0\x53\x94\x3e\xf5\x40\x92\x78\x64\x99\x7a\x0c\x82\xb9\x21\xaa\x80\x14\x55\x82\x24\x21\x57\x47\x98\xe0\xeb\x39\x59\xd2\xa3\x28\x82\x94\x0e\x77\x0f\xc3\x09\x4a\x29\x13\x23\xf6\xfd\x30\x01\xd9\x6f\x81\xb1\xfc\x87\x46\xd4\x21\x5b\xb9\xad\x43\xe4\xa2\xff\xd7\x9e\x3f\x26\xf1\xb5\xb4\x5a\x3a\xe6\x87\x7f\xcf\x1f\x83\xe8\x82\x53\xf3\x38\xee\x47\x24\x21\x69\x9f\xcd\xe0\x1c\xf6\x13\x34\x9d\x31\x2b\x18\xda\x40\x4c\x75\xe4\x9b\xa9\x9d\x8a\xfd\xb9\x0a\x63\xd8\xa6\xbf\x14\xce\xc9\x25\x6c\xd5\x65\xf3\xde\xb8\x3f\x56\xfc\xf0\xed\xef\x7f\x07\xf3\xff\xf8\x8f\xd6\xba\xed\x1a\x9e\xcf\x13\xa9\xaa\xc5\x8c\xbc\x05\x88\xf9\xd1\xdd\x3f\x3c\x38\xb8\xdd\x80\x22\x75\xec\x5a\x56\xa9\x96\x36\x41\xf3\xa9\x6a\x98\xa6\x91\x1f\xfa\xfb\x80\x52\xc8\xe8\x3e\x9a\x4f\xd5\xfa\x24\x64\x4a\x06\x0b\xac\x8b\x81\x84\xf9\xa1\x41\x9c\xc2\xa0\x30\xe9\x4b\x57\x22\x0f\x93\x3e\x59\x32\x4e\x1e\x79\x73\x90\x4e\x11\xee\x33\xb2\xe8\x3f\x35\x00\xd9\x02\x4d\x66\xb5\x7b\xf8\x55\x19\xd2\xdd\x67\x1a\x91\x29\xb5\x66\x7a\x85\x62\x36\xf3\x43\xff\xf0\xab\x6f\xd4\x9b\x19\x14\x48\x1d\xfa\x87\xdf\x7e\x93\x03\x87\xd8\x3e\xc2\x67\x8e\x5f\x61\x63\x40\xdb\x00\xa6\x23\x28\x3a\xb1\xf5\x1c\x3b\xbe\x6d\x66\xe6\xf5\x7e\xec\xab\xfb\xf9\x76\x55\x32\x77\x16\x6f\x25\x7f\xb0\xd4\x11\x66\x29\xa4\x24\xb9\x2c\xd2\x62\x52\x2c\x6a\xbe\x6d\x91\x04\x33\x94\x8b\x73\x30\xc2\x81\xb5\x82\x2c\x14\xa6\x1a\xd3\x7d\x88\x2f\x51\x4a\xb0\x8a\x8a\xbc\xd9\xb8\x76\x24\x35\x65\x91\x10\x19\x49\xa8\x69\xa3\x61\x46\x6b\xe9\x57\x9c\x42\x5b\x05\x3b\xd9\xa4\xf0\x60\x0e\x16\xbd\xa2\x98\x36\xcd\xdb\x57\x84\x37\x0b\xc0\x66\x43\x7f\xdf\xd7\x99\xfd\x54\x81\x18\xd0\xd9\x98\x80\x34\x36\x45\xb2\x37\x85\xa2\x5a\x19\xae\xca\xd1\xfd\xa1\xb1\x2b\x37\x3f\x85\x39\xed\x2a\xac\x18\x8d\x71\x74\xd1\x6d\x98\x17\xab\xa0\x38\x2e\x13\x30\xa9\xa9\xbb\xfd\x78\x7f\x68\x45\x7c\xb5\x1e\xea\x07\x63\xb2\xf8\xea\x0e\x54\x74\xa0\xa1\x8a\x55\x56\x9c\xfe\x58\x06\x70\x57\xa5\xc5\xd3\xfe\x50\xfc\x91\x85\x0b\xc5\xa3\x25\x65\x44\x1c\xd2\x59\x07\x8c\x21\x3c\xa5\xd5\x43\x92\xa6\x35\x89\xa9\xa1\x9f\x0b\x4d\x2f\xa9\xbd\xa4\xf2\xc9\xb9\x56\x59\x21\xfd\x5c\x28\x46\xe7\x6c\x91\x8d\x8f\x3f\x14\x0a\x24\x28\x82\x98\x66\x73\xd0\xcf\x85\x62\x9c\xd2\x34\x65\xc4\x43\xa9\x40\x8c\x98\x55\x82\x3f\x95\x40\xa6\xd9\x14\x03\xae\x65\x69\x3c\x14\x46\xcb\xd4\x06\x29\x7f\xdc\x1f\x32\x72\x01\x71\x8b\x41\x55\xe2\x02\x25\x59\x9b\x94\x54\x34\x78\x01\xaf\xa3\x84\x80\x0c\x09\xcc\x8b\x22\xd4\x04\xcd\x6d\x60\x26\x9e\x4a\x0b\x94\x4e\x09\xb3\xd6\x47\x3c\x16\x0a\xa5\x90\xc2\xac\x8c\x78\xaa\x18\x1a\x27\x13\x96\xcc\xee\x92\x3f\x16\x81\x37\x03\x36\xec\xf8\xd3\xfe\x90\xef\x18\xb1\x8d\x86\x14\xa6\x48\x20\x5b\xa1\x9a\x31\x19\x50\x15\xf5\x73\x69\x69\x84\xf8\x3b\x5b\x1a\xf1\x58\x5c\x93\x28\x22\x4b\xe1\x59\xa8\xd7\x45\xbf\x28\x14\xcc\x5c\x4b\xcc\xd1\xf5\xdf\xaf\x50\x12\x47\xf2\x60\xaa\xb8\x4f\x78\x5d\xba\x0f\x16\x8b\x04\x45\x8a\x11\x68\xa7\x70\xcb\x6a\xe4\xd4\x6d\x25\xc1\x00\xe6\xeb\x51\x8a\xde\xc1\x08\x49\x18\x5a\x14\xae\x84\x10\x87\xf4\xf6\x34\x74\xb4\xb5\x99\x7f\x83\xb9\xd8\x02\x61\x0c\xe3\xaa\xaf\x6b\x9b\xfd\x3b\x7c\x3e\xea\xd4\xd4\x3b\x59\x60\xdc\x46\x43\x31\x92\xfa\x81\x43\xea\x21\xa1\xe0\x07\x83\x31\x21\xac\xc7\x06\x32\x32\x05\xa7\x50\x42\x97\xc8\xc1\xe1\x67\x82\x26\x3d\x3f\xd7\xcf\x50\xaf\x34\x67\xb2\xf1\xde\x5e\xe1\xab\xd9\xff\xf2\x2b\x1b\xb8\xb8\xce\xbd\xbd\x5d\x58\xe3\xfd\x50\xfe\xc8\x8f\x34\xf9\x35\x30\xd1\x03\x0a\xf6\x95\xb6\x82\xb8\x38\x64\xa0\xbb\x57\xe9\x98\xf5\xfa\x1f\xd9\x4a\x65\x9b\xbf\x44\x93\x5e\xad\x87\x86\x92\x2d\x54\x8f\xb2\x85\xff\xc6\x0e\x4c\x28\xb4\x13\xaf\xba\x8a\x4f\x21\xcb\x05\x29\x81\x98\xa5\xd7\x1f\xd2\xc4\x0f\x76\x10\x1d\x60\xc2\x06\x9c\xb4\xed\xb1\x60\x6f\x4f\x3d\x2f\xb1\xdc\x57\xb1\x78\xd9\xe0\x48\x52\xd1\x76\xa8\xda\x52\x6e\xfb\x7c\x6b\x4a\x59\x94\xf0\x4d\x71\x0a\xab\x58\x10\xac\x2c\x3f\xba\x2b\x94\x24\xef\x8d\xe4\xc5\x06\xed\x1b\xb2\xa4\x90\xa5\x60\x31\x10\x87\x77\xcf\x58\x63\x70\x0e\xfe\xbd\x3c\x35\x68\x2f\x58\x85\x45\x57\x3c\x4e\x50\xca\xc5\xdf\xed\xb1\xbd\xbd\xa2\x57\x9e\xfd\x28\xc2\x2d\x6b\x2a\x11\xd1\xa3\x5f\xc1\x27\x89\x78\x2f\x79\x9b\x02\x30\xbb\xb5\xeb\x2b\x82\x13\xac\xe9\x83\x63\x8b\x98\x2a\x45\x71\xf2\x62\x41\xbf\xc3\xb4\xf1\x6c\xe6\x0c\x5c\xae\xfc\xaf\x94\xe0\x3e\x58\xa0\x5b\x61\x03\x0c\xbd\x6d\x42\x5b\x3b\x97\xe0\x46\x48\x4a\x6f\x50\x3c\x84\x03\x14\x87\xec\x7a\x01\x87\x4a\xac\x29\x4e\x17\xc0\x58\x8a\xc6\xfc\xea\x19\xc2\x55\x1b\x20\x98\x30\xa1\x29\x49\x60\x05\xc7\x51\x05\xb4\x07\x02\x07\x4e\x75\xbe\x8a\x9f\xeb\x1f\xc3\x83\x2d\x80\x45\x08\x71\x32\x3d\xfe\xa3\x84\x0b\xe2\x30\x41\x5b\x84\x87\x0c\x0f\xfb\x98\x41\x91\x25\x42\x7e\xb5\x8d\xcd\x23\xa0\xb2\x80\x58\x26\x33\x7d\xcc\x80\xd9\x16\x8e\x3c\x6e\x28\x6c\x1b\x3d\x52\xc2\x44\x34\xa5\xbe\xe4\x79\xfb\x0b\x90\x32\x14\xa1\x05\xc0\xec\xb1\x03\x4a\x87\x58\x78\xa2\x8f\xdd\x2d\xc0\x4b\x3a\x4c\x66\x51\x0d\x1e\x27\x8c\x6e\xe3\x3a\x92\xfe\x4b\x8f\x11\x1a\x5b\x38\x60\x38\x6b\x47\xf7\x85\x3a\x0a\xb1\xeb\x5b\xd4\x0e\x69\x57\x9a\x36\xda\xf0\x29\x34\x91\xc6\x74\xb0\x30\x47\x88\x8f\x6a\x45\xb8\x9e\x4e\x16\xd3\xda\x7f\xc2\x32\xb5\xf8\x5f\x5f\xbe\x2f\x6b\xbd\xad\x76\xcb\x1a\x68\xfd\xed\xec\x5c\xd9\x00\x97\xa3\xe5\x64\xb0\xe4\x83\x71\x90\xbc\xfc\x7d\xb1\x54\x07\xc1\x73\x88\xb7\x8c\x66\x0d\xe2\x82\x19\xa1\x6c\x98\x31\x1c\x60\x81\x7e\x24\x94\x85\x18\xcc\xa1\x38\x4a\xf2\xdf\xde\xea\xd7\xe1\x0c\x02\x11\x29\x45\x36\x1b\x91\xf9\x62\xc9\x60\x5c\xe6\xf3\x95\x5e\xb8\xe0\x18\x26\x85\x5e\xe1\xcd\x14\xb2\xb2\x0a\xfb\x66\x15\xc2\x1a\xc9\x41\x5d\x8b\x46\x8e\x00\x39\xfb\x28\x8a\x90\x14\xfd\x2e\x76\xf3\x08\x06\x21\x5b\xad\x82\x70\x06\x70\x9c\xc0\x77\x90\x2e\x08\xa6\xc5\xdd\xc7\xd2\xeb\x9b\x26\xd9\x85\x7b\x04\xda\xb5\x74\x04\xcf\xfc\x4f\xfd\x4c\x19\xc4\x00\x5b\xf2\x6d\x46\x0a\x1f\x2e\x61\x2a\x13\x12\xee\xa0\x49\xef\xd9\xc1\xe1\x68\x34\x62\x0e\x4e\x98\x64\xec\xb1\x89\x44\xe7\xe2\x62\x15\x9b\x5b\xcd\xe5\x0a\xe6\x6e\x5f\x31\x77\x9a\x4b\x86\xf3\x05\xbb\xee\xd1\x40\xc2\x1e\x8d\xfe\x76\xfa\xd3\xdb\xc1\x02\xa4\x14\xf6\x68\xb0\x83\x06\x62\x8b\xc1\xbd\x3d\x3c\x90\x29\x10\x46\xa3\x11\x52\x3f\xf9\x4b\x11\x8a\x58\xbc\x13\xbf\xf8\xab\x4b\x04\xaf\x3e\x50\x98\x52\xf1\xda\x3c\x7d\xfe\xdc\x62\x54\xab\x95\xdc\x90\x2c\xb8\x59\xd9\xbb\xbf\x4e\xd2\xd4\x78\xe6\x2d\x16\x75\x44\xb7\x63\x43\x96\xa4\x84\x9c\x3d\x67\x00\x17\x0e\xcb\x8d\xf7\x6a\xf7\x03\xb3\x8d\xf4\xee\x22\x3a\x5a\xb2\x59\xa5\x01\x92\xdc\xdf\x43\xdf\x7f\x02\x4b\x9b\x1e\xe2\x78\x41\x10\x66\xc3\xd2\xa7\x27\xfe\x7e\xa1\x42\x76\x12\x44\x04\x2b\x54\x7e\xa9\xeb\xfb\x7e\x48\xd2\xe9\xab\x98\xff\x30\x76\x20\xaa\x50\xce\x24\xc4\x0f\x39\x2e\x89\xb7\xc7\x64\x3e\x5f\x62\x71\x39\x5d\x82\x04\xc5\xc3\xdd\x83\x4a\xab\x0f\x8e\x33\x27\x29\xb9\x44\x31\x4c\xad\x03\xea\xc8\x7a\x3d\xd0\x4a\x75\x51\xf8\x58\xac\xf2\x50\x68\x64\x8d\xa8\x84\xb7\x94\x09\xbe\xf8\x13\xc2\xa2\xeb\xd7\x52\x2b\x52\x76\x8c\xdd\x15\x9b\x94\x63\xa4\x28\xb7\xe2\x37\xd8\xf7\x80\xc2\x0f\xa9\x2b\x38\xd5\x59\x76\x82\x68\xc8\xfa\x41\xc8\xce\x07\xbf\x12\x84\x7b\xfe\xbe\x1f\xac\xc2\x31\x21\xac\x2e\xa5\xd8\x25\x41\xb1\x77\x90\x93\x97\x75\xb5\xf0\xe1\x07\x02\x5d\xdb\x2e\xc8\x9c\xa8\xb4\x6c\xa6\x44\x9f\xf7\x74\xa0\x32\x85\xf9\x08\xd2\xde\x8d\x5c\x71\x85\xdd\x2c\x45\x78\x3a\x98\xb1\x79\x72\x0a\x26\xb0\x57\x34\x92\x09\x2a\xd6\xf8\xc0\x5e\xa6\x83\x95\x9d\xd2\xad\x5a\xa0\x65\x05\x03\x53\xea\x66\x31\xbe\x20\x18\x56\xd3\x10\x8b\xe5\x38\x41\xd1\xfe\x5c\x8a\x9a\xf3\xb4\x02\x35\xb4\x02\x2e\xcc\x91\x06\xa1\xd6\x5d\x71\x8c\x78\xde\x2b\x16\xa8\x07\xc2\xa9\xa8\x9a\x19\x8e\xf3\x53\x92\xb3\xbf\x75\xd0\xc8\xf0\x94\x83\x03\x37\xc0\x22\x18\x16\xc4\xa0\xd0\x16\x83\xba\x6b\x8b\xac\x6f\x6e\xa9\x6a\x08\x83\xb0\x3a\x15\x83\x39\x6b\x85\xad\xc6\xdd\xd1\x96\x08\x33\x98\x5e\x82\x7c\x30\x58\x7e\x28\xf3\x2d\x44\x47\x99\x97\x17\x7f\xa7\x56\x32\x2f\x28\x97\xdb\x6b\x34\x1a\xe1\xcf\x9f\x71\xbf\xef\xfd\xfb\x41\x70\x23\x5c\xa0\xe6\x90\x2c\x59\x8f\x86\x30\xd8\xe1\x14\x01\x1b\x44\x20\x49\x7a\x7c\xff\x05\xd9\x1d\xc5\x66\x29\xb9\xf2\xf0\xe8\x20\x64\x03\x46\xe4\x2a\x8b\xf8\xd8\x2b\xd1\xe5\x4e\xa1\xa5\x95\x08\xb0\xfb\x56\x84\x86\x57\xf6\x00\x25\x4f\x78\x79\x5a\x5c\x42\xcc\xbe\x5f\x52\x91\x81\x6f\x9c\x20\x3a\x13\x0a\x34\x34\xb9\xfe\x20\x78\x18\xd6\xbc\x10\xca\xa1\xeb\xee\xd6\x42\xd1\x46\x4d\xee\xb2\x4a\xe3\xb1\xae\xdf\x23\x85\xec\x0d\x64\xe0\x05\xa4\x51\x8a\x16\xb2\xae\x08\x06\x20\x9c\xd6\x72\xe0\x2c\x58\xe7\xb1\x27\xbe\xf7\xd9\xf3\x9f\x94\xa8\x3a\x3d\x11\x2d\x49\x17\xc5\x7d\xab\xd5\x23\x7a\x22\x5c\x65\x6a\x5b\x6f\xd9\xea\x13\x9f\x0f\x21\x6b\x3b\x17\xe8\xa0\xb6\x03\x51\xa7\x30\xf7\x5c\x05\x63\x56\xc8\x8f\xb2\x33\x4e\xbf\x8f\xe2\xac\xe8\xb9\x31\x34\xec\x05\x61\x8f\x9f\x0d\x52\xf5\xf2\xf9\x33\xa2\x39\xb5\x8b\xd0\xbb\x34\xcf\x47\xdd\xe0\x59\x6e\x99\xff\xda\x13\x2e\x54\x7e\xc0\x8b\x70\x8c\xf8\xe2\xdf\xf8\x40\x84\x61\xfb\xc8\xb7\x46\x62\x1c\x38\x46\xfe\x17\x4f\xd8\x93\x2f\xfc\x7f\xff\x82\x03\x3b\x4a\x49\x92\xbc\x27\x8e\x29\xa5\x4b\x3c\xa0\xd1\x0c\x72\x9c\xec\xf9\x22\x8c\xc4\x3b\x88\x85\xe9\x4a\x81\x75\x80\x23\x3d\x16\x16\x0c\xc8\x64\x22\x54\x34\x3b\xb9\x09\xc2\xe0\xf3\xe7\x6c\xc0\x6c\x9e\x84\x9e\x36\xfb\xc4\x68\x2e\x8c\x19\xf5\x50\x16\x22\x57\xe7\x62\x15\x3e\xfd\xea\xa0\xda\x27\xd4\x6c\xb9\xcc\x18\xa6\x4a\xc4\x60\x9d\x91\xb7\x2a\x58\xe8\xb8\x15\x37\x25\x38\xc5\xb5\x51\x49\x6f\xc6\x71\x95\x0e\xb9\x8a\xbd\x5f\x10\xca\x72\xb6\x45\x0a\x5f\xa4\x2d\xfb\xaf\x94\x60\x65\xeb\x2e\x78\x15\x2a\x4e\x5d\x34\xb9\xee\xb1\xc0\xc5\xec\x6b\x1b\xf7\xaa\xd4\xa7\x59\x3f\x19\xa9\x03\x1d\x59\x50\x45\x54\xfb\x50\x05\x40\xf9\x19\x51\x34\x4e\x2a\x23\x22\x36\x0a\x2e\x4c\x7e\x14\x41\x41\x77\x93\x5a\xe4\xcd\xc3\xb6\x3d\x43\x39\xc7\xa3\xa4\x52\xf3\xbf\xc6\xdc\x9e\xf8\xcf\xa5\x7f\xe2\x08\x24\x89\xff\x80\x66\xda\x14\xdd\xc9\x44\x97\xec\x30\x6b\xff\x09\xb6\x1c\x33\x3e\xbc\xf7\xc3\x07\x84\xbe\x32\xd1\x48\x37\x21\x9b\x35\x33\x0b\x4b\x5f\xbc\x7c\xfd\xf2\xfd\x4b\x5f\xe1\xcb\x89\x15\x5a\x77\xed\xc6\x9f\xf8\xfb\xb6\xd8\xba\x83\x18\xcf\xec\x4b\xba\x39\xd6\xca\x81\x48\x59\xf1\xed\x61\xea\x52\xd1\x71\xad\xb0\x14\xb2\x9f\x11\xbc\xca\xcf\x2e\xb4\x69\xda\x56\xd3\x82\x39\xf8\x3e\x17\xbb\x73\x94\x5b\xd3\x2e\xd8\x6a\x8e\xc3\xb5\x04\xb7\xae\x33\x62\x9f\xea\x28\xf4\x9d\x56\x9e\x42\x76\x9c\x0f\xd3\x3e\x43\x0b\xa7\x44\xbd\xcd\x78\x64\x26\x93\xe7\x73\x12\x73\xd8\xc0\xa2\x8b\x55\x87\xad\xbc\xb2\xa5\xdb\xc7\x59\xd2\x8c\xf5\xe0\xb4\xae\x80\x5b\x2e\x11\x07\x72\x2d\x90\xba\x83\x68\x9d\x9b\x8b\x0f\x27\x9f\xcd\x66\xed\xed\x2a\x9a\xd9\x5f\xe7\x1a\x95\x3b\xd3\xe4\xfa\x19\x9e\x9d\x87\x59\xfa\x1a\xfe\xa4\xd0\x50\x84\x2a\xb0\x93\x88\xdc\xea\x6d\x64\x12\x05\x99\xee\x46\x34\x97\x58\x67\xc4\xac\x87\x2c\x2b\xcf\x88\xe9\x5f\x21\x6e\x41\xa2\x12\x72\x21\x32\x3f\x94\xb5\x16\xea\x53\xb9\xec\x5d\x99\xeb\x9b\x8e\x33\x4b\xf1\x87\xca\xbb\x76\x0b\xa4\x5d\x43\x5d\xd7\x52\xce\xd6\xf1\xb1\xf6\x36\x31\x31\xea\xbb\xec\x8d\x6a\x8c\xce\x96\xa6\x19\xa3\x1d\xce\x9d\xf9\x1a\xca\x3f\x23\xa8\x0b\x42\xcf\x32\x7a\x54\x85\xd0\xdf\x1c\x14\xae\x9b\xaf\x0a\x20\x72\x69\x8e\xd2\x14\x5c\x9f\xa4\xe4\xd3\xf5\x20\x4a\xa1\xe0\x11\x75\x94\x23\x55\xa0\x77\x76\x6e\x6d\xe2\xee\xe4\x40\x17\xc0\xd6\x81\x96\xd5\x51\xb5\x5d\xc8\x59\x1b\x71\x60\x81\x42\xa8\xbe\xf1\x24\x79\x59\x83\xb5\x79\x84\x6c\x1c\x06\x74\xd2\x9b\x20\x8e\x4f\xc0\xb4\xa8\xb7\x93\x20\xce\x77\xc0\x29\x1e\x30\x85\xd4\xaf\xe7\x35\x71\x78\xe3\x9a\x13\x0c\x1c\xf7\x3d\x1f\x80\x8e\xae\x5a\x18\x83\xb4\x0f\xe7\xe3\x20\x92\x85\x40\x15\xc3\x11\xc4\x58\x8f\x3e\xf7\x9f\xa7\x23\x96\x2e\xa1\x3f\xe4\xbf\x84\x3b\x56\xb6\x36\x12\xb3\x28\x64\x3d\x7e\x0d\x30\x20\xc3\x12\x08\xcd\xdc\x2b\xac\x5f\x0e\x50\x1c\xd8\xa2\xf1\x02\xfc\x50\x8b\x95\xc3\xee\x59\xba\x0f\x07\x38\x22\x95\x38\x2c\x2d\x97\x32\xfc\x25\x0e\xfc\x85\xcd\xd8\xcb\xb9\x09\x0e\xa4\xed\x9c\x79\x06\x03\x6e\x91\x96\x2f\x4e\xbc\x81\xb7\xae\xc4\xdd\x0d\xa6\x97\xdf\xa5\x75\xc7\x3b\x1c\xe1\xd6\x13\xc1\x15\x2b\x68\xa6\x21\xbc\x14\x6e\x61\x2a\x4f\x7c\xa9\x8f\xd9\xce\x94\x94\xf6\xb7\x79\x5e\x65\x6b\x90\xec\x50\x2b\xe2\xa4\xad\x67\xe8\x7a\xe8\x68\x00\x50\xf7\xb9\xe3\xdc\x91\xa1\xe3\x20\xcc\x46\xd6\xe1\x2c\xe4\xf0\x6d\x1c\x19\xae\x62\xf4\xf5\xd9\xfe\x0e\x5e\xa2\x32\xbb\xef\x3a\xe4\x9f\xf8\xfb\xa9\x2e\xdc\x0c\x92\x12\x16\x1b\x5c\x73\xf5\xd8\x66\xae\xdd\xfa\xc7\x8d\xfd\xbf\x40\x93\x49\x27\x3c\x28\x0e\x62\xdf\x7f\xe2\x88\x0e\x5e\x46\x0d\x7b\x1c\x8d\xb1\x3c\x5a\x59\x35\xf9\x62\x3e\x29\x49\x92\x31\x88\x2e\x1c\xf7\xd7\xed\x4e\x44\xb0\xd0\x0a\xa2\xef\xc1\x38\x81\x3f\x4d\x54\x90\xa7\x2d\x1f\xf6\xcf\xb5\x82\xe1\xe0\xa1\x1c\xfb\x91\x08\xe1\xca\x21\x7e\xca\x47\x8e\xa3\x4e\x3b\x96\xaa\x3a\x5b\x26\x63\xb2\x41\xbd\x86\x97\x15\x19\x35\x2b\x46\x94\xf0\x0a\x5b\x1e\x0e\x27\xf3\x4d\x3c\xa4\xed\x61\x44\x16\x63\xa9\x0d\x11\x20\x67\x7d\x76\xbe\x53\xd4\x16\x1b\x4c\xd9\xdd\x65\x7b\x7b\x22\xd6\x3f\x65\xe9\x32\x92\x26\x51\x92\x23\x5d\xf5\x58\xf0\x1c\x0f\xf1\xa8\x3b\x32\x65\xa3\x6c\x8b\x52\xf2\xf0\xcf\x20\xd6\x55\xe4\x55\x03\xa7\x3c\x35\x51\x90\xf4\xf2\x6b\x9f\x5c\xc2\x63\xb2\xb8\x7e\x2f\x1c\xf2\xe8\xba\x61\x8c\x94\x83\x36\xdd\x97\x8e\x7d\x8d\xcb\x03\x2d\x0e\x32\x07\x5f\x2b\xff\x6b\x33\x83\x05\x2d\x36\xad\x66\xc3\x92\xc5\x75\xcd\x01\xb9\x39\x7d\xc3\x3b\x28\xe8\x0a\xe4\xf1\x58\x45\xe3\xd0\xd6\x07\x11\xad\x24\xdb\xe6\xe4\xd2\xc5\xb6\x6c\x6f\x56\xbc\x83\x3b\x9f\x95\x90\x05\x6a\xc2\x64\x0b\x52\xc5\x6e\xb2\x56\x25\x4f\xd4\x95\x86\x37\xab\x5c\xa2\xc1\x1b\x71\xe1\x42\xf1\x43\x27\x17\x3c\x3b\x57\x3f\xf9\x4b\x11\x28\x56\x09\x1b\x5b\x09\x08\x8c\x7b\x45\xb0\x53\xaa\x21\xa0\xa2\x9c\x6f\x49\x4d\x73\x65\x27\x01\x66\xa7\x92\x0e\x76\x4a\x95\x45\xcb\xc4\xa4\x06\x71\xa4\x6e\x2b\xe4\x6f\x24\x72\x14\xa8\xc5\xa4\x94\xdb\x1c\x1b\x08\x48\x05\x3b\xa5\x3a\xa2\x73\x24\x1b\x04\x23\x9d\xff\x90\x76\x3e\x65\x4d\xfa\x87\x0e\xf2\x58\x3d\x48\x21\x8f\xb5\x66\x38\x22\x21\x96\x03\x1e\xa1\x10\xeb\x21\x8d\x80\xf9\x3d\x02\x22\xe6\xf4\xf7\xd7\x42\xe6\x12\xe6\xf2\x4d\x88\xac\x9a\x21\x1e\x88\xc5\x1f\x31\xf9\x37\xc4\x8d\xcc\xb1\x40\xd0\x32\x2b\x52\xb0\x19\xcc\x10\x3c\x33\x5c\x0d\x42\x32\xda\x3d\x0c\x11\xff\x0f\xf0\xff\x52\xfe\x5f\xc2\xff\x8b\x46\xbb\x87\x6d\xf7\x06\xdf\x95\xed\xf7\x45\x3c\xb2\xe4\x63\xd9\xb1\xeb\x4a\xb3\x5d\x3f\x3a\xde\xd8\xb2\x99\x73\x1d\xf0\xbf\xc1\x4e\xa9\xa4\x58\xd6\xa5\xc4\x9f\x79\x4b\x6e\x51\xc8\x57\x82\x9d\x52\x71\xd1\xd6\x5c\xb6\xb5\xc8\xcd\x8f\x6f\x21\xe1\xc5\xe6\x9c\xa0\x84\x47\xdb\x29\x94\x4a\x8a\x6e\xe3\xa0\x15\x24\x0a\x53\x68\x00\x47\x2c\x3f\x4a\x47\x1b\x3f\x18\x8d\x46\x30\x9c\xe8\xb7\xca\x78\x3d\x08\xa7\xa3\x1b\x14\x0f\xe3\x4c\x86\x18\xf2\x9e\x86\xb1\x8c\x1e\xb4\x0c\xc9\x15\x86\xe9\x90\x0d\xc4\x5f\x4d\x5a\x4a\x70\x0c\x27\xa3\xd1\x88\x0e\x64\x1a\x83\x53\x06\x18\x1c\xa8\x2f\x9f\x3f\x57\x7e\x7a\x0b\xaf\x54\x2b\x47\x57\x00\x31\x84\xa7\x9c\x01\x83\x57\x8e\xc6\x3e\xe0\x18\xa6\xf2\xab\xaa\xf2\x0e\xfe\x2a\x5c\xc6\x1c\x85\xf5\xa7\x90\xcf\xf7\x47\x40\x8f\x73\x23\x9d\xef\xed\xf5\xd6\x1c\x6d\x90\x6f\xb1\x30\xea\xf9\xde\x5e\xfd\xc0\x73\x95\xcd\xf8\x9d\xd5\xf4\xd7\x55\x38\x6b\x42\x04\xe3\x56\x39\x0d\x76\x4a\x85\x05\x1a\xcc\x82\x70\x21\x7e\x49\x12\x96\x3f\x17\x96\x7e\xb7\x62\xce\x7b\x7b\x2d\x0b\xbe\x85\x57\x9f\x3f\xf7\xc8\x68\xf7\x20\x4c\x47\xf3\x52\xfb\x75\x60\xd9\xdb\xeb\x21\x5e\x2f\x69\x53\x4f\xc3\x65\x6f\xaf\x07\x8a\xf8\x5b\x8d\x07\xd1\x08\xec\xed\xcd\x03\x15\xbf\x69\x22\xd0\x7c\x59\x44\xf3\xa5\x44\xf3\x79\xa8\x00\x3a\x5c\x14\x50\x9c\xb8\x91\x15\x15\x11\x12\xb8\xf1\x2e\xad\x45\x9e\xa4\x02\x3b\x22\xfd\xfe\x2d\xbc\xe2\x97\x82\x6e\x6d\x39\x40\xfa\xd5\x07\x0a\x53\xf5\xba\x87\x9d\x06\x7d\x76\x8a\xa6\x69\x13\x3e\x59\xce\xdc\x93\x60\xa7\x54\x5c\x60\xd4\x94\xaf\x94\x85\x51\x53\xa1\x93\x6c\xba\xda\x1a\x34\x97\xc2\x22\xb6\x3f\x5e\xd2\xbb\xd3\x0a\xca\x97\x2f\x79\xc7\x30\x0e\x6f\x3a\x1b\xac\xee\x58\xbc\x90\xf2\x7c\x01\x71\x2c\xda\x7b\x8d\x28\x83\x18\xa6\x3d\x5f\xda\x1a\xfa\xe1\x2f\x03\x36\x4b\x09\x63\x09\xcc\x45\xfe\xca\xcc\x7f\x65\x41\x18\xcb\xa8\x72\xc1\x2a\x3c\x3c\x38\x08\x82\xb0\xb2\xe1\x14\x52\x11\xab\xea\x97\x2c\x2d\x89\xbb\x61\x59\xb0\xd0\xee\x2a\x54\xdf\xab\x72\x83\xb1\x14\x4d\xa7\x95\x1e\x39\x21\x5d\x8e\x69\x94\xa2\xb1\xc3\x85\x42\xd6\x27\xb8\xaa\xea\x12\x37\x57\x9e\x4c\xd6\x73\x05\xd2\xf4\xdf\x9f\x06\x9a\xd9\xc7\x5c\xca\x33\xe9\x20\xb3\xa6\x6d\xb6\x4d\x1c\xdf\xac\x56\xeb\x9b\x7e\x0a\xee\xe4\xb6\xed\x3e\xdb\xf3\x02\x42\xee\xa1\xe0\xb3\x2e\x67\xd9\xd9\x40\x65\x1b\x03\xdf\xb6\x0a\xde\x2d\xe8\x51\x9d\x8b\x35\xcb\xf8\xa6\x65\x92\xec\x8e\xd8\x73\x0c\xaf\x3c\x97\x57\x8e\xf2\xc8\x49\x61\x42\x40\xdc\xdb\x92\xd2\x5a\x03\xb9\xa8\xb0\xee\x64\xb5\x25\x8d\xe4\xdd\xc2\x50\xdb\x5a\x4d\x89\x3a\xd6\xd5\xa5\xac\x63\x89\xe9\x40\x22\xab\x45\x82\x45\x94\x47\xf7\xc8\x95\x97\x93\x8c\x11\x57\xa7\x7a\xd7\xa2\xdb\x1c\xcc\x2c\x97\xf8\x7d\x0b\x7e\x50\xc2\x8b\x2f\xe1\xda\x32\x40\xb5\xd5\x6f\x4d\xf0\xa7\x77\x4b\x3b\xb1\x5f\x8d\x29\xeb\x5a\xbb\x3d\x67\x72\x79\xab\x4a\x68\x87\x44\xa7\xb5\x09\xb4\x7b\xca\xad\xa4\xc8\xcd\x33\xed\xb2\x03\xa5\x3c\x4f\x20\x69\xcb\x81\x58\x17\x86\x1a\x05\xc2\x97\x48\x07\x0d\x6f\x7b\x83\x40\x6d\x67\x7b\x9c\xbb\x0c\x2b\x96\x1f\x4d\x7a\xbb\x05\xa7\x99\xbd\xbd\xdd\xcc\xa5\xa6\x80\x94\xe2\xec\xd2\xce\x4b\x3d\x3f\x9f\x62\x34\x64\x35\x9e\x8d\x65\x7f\x3c\x8d\xcd\x58\x52\x97\xb4\xda\x4f\xc7\x90\xf5\x3b\xbe\xcf\x99\x1f\xe1\x03\xea\x1f\xf8\x5a\x36\x68\x60\x86\xf3\x2b\x27\x2d\x9f\x1b\x51\x9c\xac\x71\x71\xb9\x50\xb4\x2c\xf4\x54\xd8\x99\xe1\x6e\x59\xb4\x48\x95\x2f\x62\x28\x7c\xce\x39\xcd\xbb\xd1\xf1\xb3\x3f\x07\x58\x08\x5f\x1e\xc8\x29\xd4\x40\xc4\x4e\x13\x32\x06\xc9\xc3\xb5\x8e\xac\x4d\x7f\xd1\x10\xd9\xb2\xc1\x1e\xf2\xf4\xcd\xfb\x13\xe5\xc9\x9d\x77\xe3\xac\xdc\x06\x88\xfe\x55\x80\xeb\x88\x63\x4a\x16\x80\xb1\x1a\x23\x24\x74\xf7\x55\x20\xdd\x4e\x86\xe8\xe0\x12\xba\x06\xc8\xee\x64\x84\x0d\x96\x79\x53\xc8\x1c\x4e\xed\xb7\x31\xae\x2c\xc2\xf0\xfa\x06\x0c\x12\x98\xa5\x01\xdf\x12\x24\xcb\x23\x36\xc0\xb4\x46\xac\xd2\xab\x68\x6a\x38\x8b\x29\x70\xcb\xf0\x54\x51\x8f\xbb\x62\xa2\x6b\x80\xb7\x04\xbf\xc2\x08\x1b\x30\x91\x5e\xe3\xe8\xe5\x27\x06\x53\x0c\x92\x82\xcb\x4e\xd3\xf0\x5a\x0f\x4c\x84\xd0\xde\xe7\x3d\x75\x82\xdc\x46\x12\xaa\x8b\xa8\x2f\x01\x51\x93\x86\x08\xc3\xcd\xc3\xcc\x3f\xa0\xe3\x5a\x87\xcb\xdd\x48\x6a\x20\xe3\xaf\x08\x81\x41\x3e\x16\x86\xeb\x26\x2f\xb0\x93\x27\x29\x99\x23\x6a\x49\xb6\x84\x32\x1b\x4d\x7a\xe5\x70\xb2\x12\x51\x4c\x80\xdf\x20\x0b\xaa\x23\xa9\xb6\xd2\xf7\x00\x3a\x5e\x66\x61\x6f\xe9\x88\x8f\xe5\xef\xea\x53\xcf\x0a\x9b\xa3\x6a\x69\x47\xe9\x2c\xfa\x08\x6f\x74\x47\x65\x9b\xcd\x42\x8f\x73\x38\x14\xfb\x19\x70\x58\xf6\x82\x01\x5d\x8a\xf8\x0f\xb6\xe4\xce\x35\xaa\x55\x30\x10\xf1\x66\x73\x98\x8b\xe5\x7e\xe3\x5b\x4e\x04\xd7\xd9\x0c\xb0\xc2\xb4\x99\xc9\x48\xcc\x15\xa4\x1f\xb1\x04\x5d\xfc\x84\x5c\x2c\x3e\xa4\x49\x2f\xf7\xee\x74\x39\x8e\xc9\x1c\x20\xdc\x0b\x82\x27\x2a\x1c\x85\x9e\x87\xf4\xb9\x92\x71\x80\x76\x98\x8c\x41\xdb\xbb\x49\x61\x8c\x52\x18\xb1\x0f\x29\x1a\x92\x95\x13\x22\x7a\x06\x3d\x07\x1c\xcc\x57\xda\x13\x33\x14\x5f\x65\x00\x77\x6f\x02\x50\x02\x85\xdc\x5b\xb1\x42\x32\xc8\xfa\x16\x10\xb0\x02\x4e\x34\xb8\xa1\x03\xd9\x49\x6b\x7c\x71\x4d\xb8\x8c\x2e\x22\xec\xc7\x7b\x72\x01\x71\x2f\x08\xa1\x0b\x10\xb0\xb1\x1a\x96\x5c\x50\x66\x51\x71\x22\xc3\xc2\xdf\x1e\x3c\x18\xff\x92\x10\x10\x0b\x25\x85\xec\xcd\x85\xf4\x4c\x60\x7d\x2d\x96\x4b\xeb\x16\xb0\x28\x8d\x99\x65\xe1\xf4\x04\xe2\x89\x80\x44\x7c\xc6\x56\x44\x18\x0b\x22\xe2\x93\x10\x01\x31\xf8\x2a\x1e\x1a\x9e\x6e\x80\xe2\x52\xa4\x04\xfe\xee\x39\x93\x99\xd1\x86\xfc\x49\xa5\x9c\xca\x2a\x89\xe7\x72\x3d\xf9\xfa\xb9\xef\x0f\xd5\x6f\xa1\xc6\x11\x79\xab\xb2\xba\xfa\x55\xb9\xba\xf9\x22\x5b\xd0\x8f\x56\x26\xac\xac\x15\xf1\xee\xad\xb3\x99\xec\xd3\xf3\xac\x91\xa1\xf5\x3e\xcb\xa6\x95\xb5\xc7\x5f\xb9\x9b\x33\x5f\xf2\xad\xe9\xd7\x21\xc4\x60\x9c\xc0\x78\xb8\xdb\xdb\xb5\x00\x24\x5f\x2a\xf6\x39\x07\x23\xf5\x25\xf8\xfc\xd9\x3c\x34\x46\x37\x94\x69\x91\xff\x80\x7c\x91\x36\x7e\x7a\x2d\x6c\x89\x3a\xc9\x14\x8b\xd6\x5c\x2a\x6f\xb5\xcb\x0a\xfa\x18\xe0\x18\xc5\x80\x39\xec\xe0\x1b\xbb\x11\xcd\xaa\x2e\xa4\xa9\x58\xce\x4a\xac\x9d\xa3\x2f\x48\xa3\x99\x73\x10\xc6\xf2\x5c\x74\xf3\xdc\xa4\x97\x77\x66\x1e\x64\xcd\x92\xe4\x16\xbe\x14\x39\xab\x1c\x84\x5d\x9a\x0e\x95\x32\xe3\x16\x86\xb3\x0a\xc7\x4b\x94\xc4\x7c\xb9\x5d\xfd\xfa\x21\xe6\xff\xd9\xd2\xa1\x2c\x99\x82\x78\xb4\xc2\x91\x91\xea\x52\x22\x84\x9b\x11\xbc\x9b\x04\x3b\x32\x73\x21\xc2\x17\x9c\x3b\xda\xdb\xf3\x19\x18\x97\xde\x19\x7b\xb5\xdc\x87\xcf\x9f\x7b\x78\x24\x71\x8c\xe3\x82\x79\x2f\xd0\x41\x1e\xa1\x23\xff\xdf\x80\x48\xfb\x65\xe2\x24\x8e\xbe\x60\xe9\x12\x7e\x21\x5f\x8a\x2c\xe9\x52\x90\x84\xe2\xd1\x17\xbc\x96\x09\xa2\xeb\xdb\x65\xf4\x57\x54\x78\x2f\x6d\x4d\xfb\xc6\xf4\x4c\x97\xcb\x62\x16\x3b\xcb\xeb\x62\xf2\xb1\x54\xe8\x7a\x01\xe5\xf7\x6c\x46\x5f\x78\x22\xbc\xe1\x17\x42\xc2\xf6\xc5\xbf\x8b\xca\x88\x25\xf0\x89\xff\x6f\xfb\xe0\xdf\xfd\x20\xf4\x45\xd2\x95\x51\x1e\x70\x3d\x3c\xa2\x4f\xfc\x7d\x25\xae\xcf\xdb\xe4\x12\x05\x26\x3d\x86\x3f\x12\xb0\xa0\x12\x61\xe0\x0b\x79\x8c\x3b\xb5\x1c\x37\xbc\xc1\x57\xf1\x10\x0e\xb2\xa8\xb8\x67\xbe\x3d\x4d\xff\x7c\x20\x0e\xf8\x50\x77\x5d\x59\x56\xa4\x02\xd6\xa5\xb3\xf9\x56\x97\x2f\x81\xca\xd4\xd6\x30\xaf\xac\xab\x97\xc8\xd4\xd0\x80\x6b\xea\xcd\xaa\xb2\x4c\x93\x5c\x69\x11\x5c\x53\x7d\x23\xe9\x62\x06\xf0\x70\xf7\x70\xb5\x83\x07\xf2\x61\xf4\xcb\x00\xd1\x97\x22\xf6\xa7\xb4\x42\x7c\xc5\x09\x1c\xfb\x65\x36\xe7\xc2\x07\x3d\x9d\xc2\x6b\x3d\x66\x23\x99\xce\x59\x3f\x9a\x4e\xf4\x61\xc7\xab\x7e\x30\x17\x3e\x0d\x9e\x9b\x91\xed\x1e\x0c\xcd\x6f\xaa\x7e\x84\x58\x1a\xca\x1e\x27\x28\xba\x28\xac\x3d\x9a\xf4\x76\xa1\x2a\x17\x94\x42\xb7\x6a\x15\x67\xee\x34\x34\x52\x57\x08\x2f\xde\xc1\x88\xa4\xb1\x25\xa2\xcd\x26\x98\x3b\x1b\x5d\x75\x2c\xab\x72\x1b\x5e\x21\x1a\x69\x1a\x87\x06\xcf\x7d\xea\x0f\x75\x1b\xc9\x52\xc4\xf8\x33\x9f\x49\xf0\xdc\x8f\xfd\x21\xb1\x3f\xef\xa0\x49\x96\xcc\x6c\x34\x1a\x41\xeb\xf8\x14\x67\x6d\xee\x9d\x9c\x71\x3a\xba\x59\x69\xc8\xa6\xc2\x84\xf0\x55\x3c\x82\xd9\x49\x21\xc2\xdc\xe1\x82\x9a\xd7\x1e\xbd\x9e\x73\x88\x72\x53\x09\x41\x78\x23\x42\x45\x9e\x80\x14\xcc\xe9\x30\x5d\x05\xab\xdc\xd9\x9e\x0d\xe4\xb9\x3c\xcf\x76\xf3\x03\x76\xc7\x7c\x85\x83\x65\x9a\x04\xc3\xb5\x06\x54\x97\x95\x44\x91\x81\x24\x02\x49\x9f\x2a\x35\xca\x1d\xd2\x83\x05\x75\x4d\x01\x4f\x6d\xe5\xce\x19\x3b\x1f\xc9\x23\xcd\x5d\xde\xd0\x17\x85\x4a\xab\xb0\x98\xf9\x26\x1f\x33\x4e\x28\x95\x2b\x2a\x15\x14\xf8\x76\x21\xc9\x09\xf6\x1a\x65\x5c\x09\x99\x4e\xef\x34\xa8\xa0\x4c\xc9\x93\x9b\x63\x3e\x73\x4e\x39\xd3\x4e\xb9\x04\xc2\x13\x52\x57\xa0\x61\xd2\x24\x9d\x02\xac\x42\x48\xff\x21\xb9\x8b\x9f\xd2\xe9\xda\x9a\x70\x1b\x78\x5b\x0a\x42\x91\x5f\x8f\x36\xe6\x3b\x95\xb6\x25\x28\xae\x4b\x3b\x56\x08\xe8\xaa\x63\x16\x2b\x39\x8a\x09\x80\xa8\x02\x1c\xab\xd7\x2a\xce\xa3\x2b\x28\x32\x33\x36\xf9\x85\x2f\x7e\xb0\xaa\x71\xe2\x2f\xc1\xb0\x75\x3c\x86\x06\xc4\x96\x89\xe2\xee\x1e\xa5\xef\x0d\x97\x11\x46\x4c\xa6\x79\x88\x65\xb0\xe7\xf5\xcc\xdc\x10\xa6\xa3\xb3\x73\x13\x73\xec\x04\xe1\x0a\x17\x38\x67\x14\xfb\x4c\x31\x5f\x42\x3d\x47\x6a\x3c\x18\xfb\xc1\xf3\xac\x84\x35\x03\x3f\xa8\x34\xae\x32\xc5\xf9\x50\xfd\xfa\xe8\xc7\x08\xb7\x88\x1d\xc0\xa9\x2c\x29\x2c\x07\x69\x0a\xae\x7b\x30\xd8\xdb\xeb\xc1\xd1\xd9\x79\x3e\xe9\x6d\xd7\x38\x29\x7c\x97\x77\xd5\xa4\x2f\x10\x6e\xa3\x46\x0f\x95\x9c\xdd\x06\x58\xb8\x7b\x60\xde\x0b\xc8\x84\x38\x08\xf1\x2a\x18\x56\xc0\xd1\x1a\x73\xb0\x0a\x17\xa8\x7c\xdf\xe6\xc3\x05\xd6\x2c\xb5\xd6\x6b\x39\xc6\x74\x68\x6f\xfd\x0a\x0c\x68\xd6\x78\xc9\x75\x2c\xfa\xdd\x6d\xd1\x5c\x52\xc0\xbd\xcd\x61\xbb\xc4\xf5\x90\xba\x67\x10\x29\x59\x83\xd3\x82\x4e\xc6\x75\x71\x78\x68\xaf\xb1\xd2\x5b\x59\xce\x27\x7e\xe6\xfb\xbd\xfe\xd2\xe6\xb6\xae\xcc\xab\xb8\x85\xad\xbb\x86\xc3\x7c\x3b\x14\x0a\x61\x79\x8b\xae\x42\x44\xb5\x90\xf3\x44\xe6\x37\xad\xa7\x48\x5a\xe9\xb3\xf2\x5e\x92\x55\xe7\xb3\xf8\xae\x0f\xfa\x92\x12\x03\x06\x37\xb0\xec\xef\x25\xde\x16\xdd\xaa\xc8\xde\x9e\x7a\x99\xf1\x33\xe2\x03\xdb\xdb\xc3\x3d\x98\x59\x8b\x71\x20\xe0\x9e\xef\x2b\xbd\x06\xa2\x22\xf2\xd5\x63\x9e\xb7\x2f\x99\xd6\xd2\xe4\x0d\x44\x32\xb7\xc8\x46\x78\x34\x50\x35\x3a\x6d\xf1\x63\x24\xd4\x6b\xa9\x97\x0a\x29\x73\x5b\x5f\x7b\x95\xcc\xb9\xcd\x21\xd2\x32\x20\xd4\x1d\x06\x47\xeb\xcb\xf1\xf7\x53\x48\x97\xc9\x56\xa2\xa4\x35\x62\x51\x54\xe4\xf7\x1e\xbd\xab\x48\x13\x9f\x57\x69\xe1\xdf\x3e\x94\xc3\x6d\xda\x50\x9a\x25\x69\x67\xca\x2d\x74\xd8\x55\xf1\x6d\xf4\x78\x9f\x9b\xc3\xe8\xc5\xc8\x7f\xc2\xca\x07\xd4\x13\x7f\x4f\x95\xcd\xbe\x5b\xbb\x43\x14\x90\x33\x1e\xd5\xf9\x02\x08\x33\xe5\x96\xe1\x9e\x4a\xc6\xf6\xd2\xca\x7e\x92\x42\xdb\x1d\xab\x48\x93\x64\xd1\x34\x54\xd1\xc2\xd4\xba\x47\x3e\x6a\x0e\x8e\xe2\x48\xe2\x9c\x11\x19\x6c\x90\x40\x3c\x65\xb3\x7f\x3f\x10\x5a\x8d\xdb\x8b\xaf\x13\xb8\xfc\xe6\x65\xe8\x2e\x10\xc7\xdf\x27\x24\x72\x29\xc9\xda\xb8\x21\x69\x88\x8e\x79\x1b\x1c\xb7\x37\x3a\x2e\x9b\xe6\x2b\x7a\x69\xed\x8f\xb4\xd6\xbc\xca\xa1\x57\xe4\xd4\xb6\x23\x98\xe9\x36\x01\x41\xd3\x88\x59\x6c\xe0\x67\x51\x98\xc6\x5d\x44\xd3\x6f\x3f\x4b\xc3\x51\x94\xd7\x6a\x9d\x05\x1a\xa0\xb8\x63\x20\xce\x2a\x1c\x71\xb5\xbe\x5e\x2c\xce\xc6\x5b\xd4\x91\x82\x54\xc6\x1b\xa6\x68\xbe\x48\xa0\x30\x99\x2c\x97\xbf\xd5\x1b\xf5\xb6\xa4\x4b\x6d\x3c\x31\x25\x99\x6b\xfb\xdb\x08\xd3\x49\x97\x0f\x26\x7d\x03\x22\x21\xa5\xa2\x6f\xc8\x18\x25\x22\x3d\xd9\x0c\xd0\xa3\x28\x22\x4b\xcc\xca\x79\x17\x11\x3d\xca\x71\x99\xa1\xdf\x22\x5b\x61\x58\xb2\x94\xf3\xad\x52\x24\x1d\x02\x9d\x89\x4a\x28\xf2\xeb\x18\x5b\x92\x72\x72\xbe\x5c\xa4\xba\xf7\x01\x50\x73\xf1\x03\x73\x57\xac\x82\x10\x54\xcd\xd0\x9a\xbd\x63\xe0\x0e\x39\x5a\xab\xae\x57\x32\x70\xc3\xf6\xe1\x99\x93\x04\x14\x5b\x0b\x1c\x1e\x94\x2d\x92\x4b\x7e\xfe\x7c\x83\xe2\xa1\x7f\xe0\x17\x32\x64\x36\x27\x18\x70\x28\x32\x55\x04\x25\x0e\x72\xbb\xab\xca\x8c\x9e\x9d\xf0\x28\xb3\xf2\x6a\x42\x9a\x60\x6f\xaf\xb7\x21\xd6\xf9\x07\xee\x82\x35\x08\xa0\xf9\x4a\x65\x55\xbe\x9d\x49\xdf\xcf\x34\xf6\xf6\x76\x0f\x46\x1d\xeb\x01\x69\x4a\x2f\x00\xf0\x52\x64\xf3\xfc\xa3\x41\x40\xe6\x30\x55\x20\xb0\x1c\x1f\xfe\x68\x70\x50\xee\x64\x02\x0e\x6b\xe7\x64\xe3\x07\xdc\x1b\x10\xf9\x21\xa2\x83\x39\x88\x7a\x41\xe1\x93\xb8\xc1\xe4\x57\xf1\xb3\x17\x38\xed\xad\x2b\x3d\x21\xb3\xbc\x86\x4d\x24\x07\x83\xf3\x45\x02\xd8\x9d\xea\xfd\xef\x88\x45\x47\x73\x3e\x9d\x53\x70\x09\xe3\xf7\x6a\x96\x35\x81\xfc\x42\x32\xf2\x35\x30\x74\x78\x3e\x49\x7e\xa8\x94\x4c\xc2\x0e\x8b\xf2\xd6\x5a\xb8\x7b\x3a\x05\x47\x78\x9d\xb8\x7e\xae\x50\xf7\xd5\xb1\xfd\x38\xa3\x60\x4f\x78\x7d\x5e\xc1\x86\x45\x0b\xfe\xa0\x4a\x68\x7e\x57\x42\xaf\x0c\x8f\xdb\xfb\x71\x1f\xd1\x06\xbc\xb8\x79\x61\x64\x02\x43\x16\xbe\x05\x73\x38\x84\xe1\xcb\x4f\x11\x4c\x17\x6c\x88\x57\x1d\x80\xd8\x4a\x92\x48\xcb\xea\x08\xc1\x97\x37\x6c\xe1\x62\x9e\xfe\x7f\x91\xed\xbb\x46\x38\x94\xbc\x43\x9b\x1f\xde\x88\xf4\xff\xdb\x90\xdd\x6e\x2d\x3f\x95\xd6\x82\xd7\x48\xa6\xa4\x37\x5e\x4b\x19\x94\x9c\xe1\xba\x22\x88\x4e\xc3\xde\x40\xde\x29\xa6\xf4\x5c\xe6\x46\x1f\x1d\x96\xf2\x06\x6f\x22\xe6\x94\x53\x68\x1d\xae\xe2\x98\x70\x3e\x9a\x35\xb8\xe9\xb4\x9c\xc9\xc1\x7d\xce\x44\x08\x84\xea\x92\xb8\x65\xb8\x64\xe4\x3c\xdb\x90\x6a\xae\x7d\x44\x77\xca\xe1\xe6\x36\x41\xca\xf6\x86\xdb\x16\xa9\x24\x82\x51\x07\x40\xb5\xf4\xa7\x21\x65\x09\xa5\x57\xa4\x2a\x46\x8c\x19\x8b\x08\xea\x2b\x4b\xb6\x8c\xf1\x0d\x9d\x91\x73\x36\x3a\x08\x4a\xc2\xa6\xd2\x4d\x52\x01\x76\xcb\x3e\x57\xae\x90\xef\x3f\x61\xc1\x40\x8a\xc4\xd4\x17\xa9\x21\x20\xe9\x94\x30\x07\x4c\x04\xef\xae\x4e\x71\x65\xdf\xcc\x8c\xd2\x3e\x67\x28\x22\x02\xdc\xf9\x2a\x6b\xbc\x8a\xad\x01\x47\x85\x45\xb9\x51\x2e\x62\xab\x16\x21\x8c\x94\xe1\xbf\x1c\x9a\xf3\x92\x2d\xc5\x32\x51\xb0\xa7\xd0\x35\x95\x72\x08\x20\x51\xd2\x5e\x84\xe2\x44\x75\x7e\x5c\xfd\x06\x06\xcf\xeb\xe6\x5c\x6d\x5c\xe4\xb6\x46\x81\x35\x04\x80\xb8\x63\x85\xe5\x2e\xa4\xfb\x96\x1e\xa4\x59\x80\x98\xaf\x19\x83\x05\x3f\xcf\x6e\x55\x8e\xe8\x9c\x42\x46\x64\x56\x8c\x7e\xcb\xb4\xcc\x8f\xef\xdf\xbc\xfe\x1e\xa4\x74\xa0\x3b\xee\x09\xf9\xd0\xfb\xc3\x97\xa7\x7f\x9b\x3d\x49\xfd\x50\x08\x78\x87\x5f\xdc\xf8\xf4\x7a\x3e\x26\x09\xf5\x87\x67\xe7\xa1\x88\x8a\x09\x65\x48\xfc\xe1\xd9\xd9\x61\x78\x76\xf8\x6d\xe8\x93\x25\x4b\xa4\x7f\x3a\x48\x28\x3c\x0f\xcf\x0e\x42\xff\xe3\x47\xec\x9f\x87\xbc\xc4\xd3\xaf\x42\xb1\x9d\xfa\xd8\x4a\x5f\x2e\x83\x06\x86\x67\x67\x7e\xee\xed\x79\x78\x66\xcc\x23\xcf\xcf\xcb\x0d\x9e\x87\xfe\x0c\xd0\x97\x97\x20\xf1\x87\xe2\xdb\xea\x0b\x19\x5f\xf3\x66\x2e\xe6\x2c\x08\xd3\x06\xa0\x0e\x66\x63\xea\x57\x20\x52\x56\x21\xd2\x6e\x56\x74\x3f\x5a\x52\x46\xc4\x67\x8e\x32\x7d\x0a\x19\x43\x78\x7a\x9b\xf1\x24\x2b\x16\xe7\xf5\xfe\x97\xd1\xc5\x0f\x5f\xfe\xad\xdd\xe2\x7c\x1d\xfa\x31\xba\xe4\x20\xfd\x2e\xf4\xa3\x04\x50\xbe\x03\x52\x72\xc5\xdf\x7c\x63\x60\xfa\xf1\x23\x5f\x38\x77\xe1\x88\x24\xa5\xc2\x75\xe5\x2f\x11\xbc\xea\x1b\x68\xb9\xaa\x66\xb5\x67\x87\x85\xca\x42\xae\xd4\x9f\x41\x20\xc2\xce\x66\x75\x2d\xe9\xa7\xc2\x90\x6f\xab\x1b\x7d\x5a\x68\x94\x2e\xc7\x8e\x26\x8f\x67\x84\x50\xe8\x71\xa4\xf4\x40\xae\x79\x6f\x0e\xa3\x19\xc0\x88\xce\x5d\x1d\x95\xde\xe5\x5f\x14\x3f\xe3\x35\x01\x65\xad\xc9\x84\xa4\xf3\x42\xdd\x39\xeb\x7f\xe5\xaa\x51\xb7\x30\xbc\x99\xfe\x34\x25\xcb\x85\xe7\x42\x80\x5c\xed\x04\x8c\x61\x52\x46\x84\x3e\x9d\xf7\x9f\x7a\xfc\x87\x68\xcc\x94\x52\x0d\x9d\xa4\xe4\x12\xc5\x30\xad\x5f\x1f\x27\x8a\xf1\x96\x0f\x0f\x2a\x06\xa5\xea\x3e\x0b\xfd\x25\xda\x5f\xa2\x7e\x0a\x62\x44\xb2\xc3\x83\xc2\x44\x04\xb4\xf5\x43\x9f\x60\xe1\xe2\xc3\x4b\x9f\x3d\x3d\x08\xcf\x7c\x65\xf7\x85\x7e\x87\xd9\xe0\xce\xe5\x71\x04\xb4\x89\xc6\xd9\xe1\x77\xe1\x41\x78\xc6\xcf\x15\x82\x75\x71\xff\x5c\xb4\xcf\xcf\x9f\x9b\xc2\x9e\x3a\x08\x7d\x4f\x17\xf3\xfe\xcf\xff\xfd\xff\x79\xe2\x82\xce\x68\x1e\xde\xd0\x02\xa4\x60\x0e\x19\x67\xbb\x44\x70\x7e\xd1\xd6\x76\x27\xa6\x83\x47\xb4\x9c\x98\x2e\xde\x30\x31\x5d\x4c\x4c\x6c\xcc\x69\x10\xef\x9a\x2c\x53\x8f\x5c\xe1\xe2\x36\xe1\xbc\xa9\xec\xb6\xdb\x74\xbf\x0e\x7d\x3a\x07\x49\x11\xbf\x04\x4a\x31\xf8\x89\x79\xfc\xbf\xfe\x7c\xc9\x67\x5e\x89\x10\x1f\x3f\x32\x1d\x06\xc6\x3d\x2e\x1a\x7a\x5a\x24\xe0\xcd\x97\x94\x79\x63\xe8\x01\x11\x1a\x00\x8d\x13\xe8\x4d\x52\x32\xf7\xd8\x0c\xaa\xd2\x5e\xba\xc4\x98\x4f\x96\x93\x23\xd9\xea\x22\x11\xff\x3e\x82\x8e\x59\x54\x20\x78\xd3\x71\x81\xd5\x82\xa3\x89\x5f\xbb\x94\x72\x95\x5c\x4b\xd4\xbc\x9f\x5a\xed\x74\xf7\x66\x9f\x10\x4e\xf1\xea\x90\x06\xfd\x65\xda\xfd\x14\x30\x18\x74\x2a\x21\xfb\xe1\xdd\xeb\x0a\x78\x6d\x78\x26\xa8\xea\x8a\xba\x98\x90\x68\x49\xfb\x08\x2f\x96\x2c\xdb\x41\x88\xef\x1d\xe1\x8b\x19\xfa\xe2\xaa\xf5\x75\x0f\x9c\xc8\xc8\x4d\x33\x54\x71\x9a\xe4\x9a\xe8\x4f\x2a\x94\x46\xe8\x0b\x48\xa8\x0d\x66\xad\x9d\x9e\xec\x87\x34\x11\xd1\x41\xc4\x6e\x10\x60\xe1\x8c\x54\x4a\x12\x0f\xf1\x41\x49\x62\x37\xff\x25\xdb\x88\x45\x12\xc7\x31\xc9\xf5\xf6\x0c\x1c\x4c\x07\xde\x8c\xb1\xc5\x70\x5f\xba\xb5\xcd\x08\x65\xc3\x6f\xbf\xfd\xf6\x5b\x19\x75\xa9\x76\x59\x5a\x22\xf8\xdd\x20\x62\x0a\x41\x52\xbc\x04\x3b\xa0\xe2\x3b\x5d\xfd\xb6\xb1\x70\x3d\xfc\x93\xb3\x6b\xc0\x40\x05\x82\x32\x0e\xea\x92\x62\x92\x0f\x15\x0b\xe7\x00\x55\xd1\x6d\x0f\x11\xdf\x24\xb7\xfb\x77\x78\xbd\x21\xce\x79\x27\xa2\x21\x4f\xb5\x74\xdb\xe8\xc7\xe1\x0f\x52\x08\xea\x31\x30\x25\x57\xd4\x8d\x88\xd9\xb4\x1b\x90\xd1\x82\xcf\x79\xf8\x4d\xe5\xb1\x78\xa2\x8b\x3d\x40\xb4\x3c\x26\x8b\x6b\x41\x01\xbc\x3b\x3d\xb2\x96\x49\x52\x06\x72\xf1\x4e\x15\x97\xe7\xfd\x9f\xff\xe7\xff\xe5\xdf\xe8\x23\xc2\xe0\x28\x41\xd2\x08\x75\x6d\x04\xfe\xe9\xd5\x8b\x63\xef\x58\x34\xe3\xbd\x7a\xf1\x70\x4f\x4f\x33\xd3\x06\x9c\xcd\x20\x52\x7d\x8f\x1f\xab\x32\x0f\x10\x5f\xc5\x31\xaa\x0c\x8f\x1e\x11\x1e\x8a\x46\xd6\x47\xc2\xbf\x8a\x31\xbc\x7a\xe1\xf5\x7e\x5a\x70\xea\x1e\x24\xc1\xc3\xc5\x44\x39\xd7\x06\x34\x54\x00\x39\x2f\x22\xd0\xed\x61\xce\xab\x09\xe7\xe1\xbc\x2b\x80\x99\xc7\x88\x47\xaf\x71\x24\xe4\x1e\xd4\x43\xd8\x03\xde\x02\xa4\x0c\x45\xcb\x04\xa4\x0a\xda\x3d\x81\x6a\x1f\xbf\x30\x6c\x90\x50\xab\x7c\xfc\x22\x08\xbd\x85\xe4\x50\xc4\xb9\x99\x2d\x8d\x28\xff\xd5\xe1\x61\xfc\xed\xf8\xeb\xc3\xfe\x21\x8c\xbe\xed\x3f\xfb\x6a\xf2\x75\x7f\x1c\x7d\x1b\xf7\xbf\x8a\xe1\xd7\xcf\xe2\xaf\x9e\x45\xdf\xc5\x4f\x1b\xd6\xee\x41\x21\xae\x94\x45\x09\x1d\xc0\xda\xd8\xfb\x41\x85\x32\x7b\xb8\x28\x6b\xcd\xb2\x01\x6f\x45\xc9\x0f\xd4\x12\x34\x38\xce\xcf\x23\x5d\xe8\x01\x1e\xa0\x1f\x28\x8c\x39\xfe\x47\x04\x63\x18\x31\xef\x0a\xb1\x59\x26\xef\x00\x38\xb6\x77\x86\xf8\x68\x36\x40\x4f\x9a\x69\x48\x69\xe1\x12\xc7\x30\xf5\xde\x00\xca\x60\xaa\x08\x05\x5e\x19\x50\x8a\xa6\xd8\xfb\xf8\x85\x10\xec\x2d\xe5\x96\xf1\x52\x92\x40\x0f\x4c\x01\xc2\x94\xa9\xc2\x74\x01\x23\x34\x41\x30\xf6\xc0\x98\x5c\xc2\xc7\xb7\x27\x32\x49\xd7\xba\xfb\xe2\xc4\x6a\xe1\x21\xef\x0b\x33\xd3\xd0\xcf\x7e\xd6\xed\x8f\x13\x4b\x08\x58\xbb\x47\x74\xc1\x7f\xa9\x7d\xf2\xc7\xc1\xe4\xd7\xc2\xf8\xf0\x56\xd1\xb7\x42\x0c\x2f\x91\x61\x06\xa3\x8b\xd2\xa0\xca\xed\xd4\xee\x04\xb5\x09\xcc\xc8\x78\x9b\x12\x11\xe4\xef\x31\xf9\x94\xef\x4f\xd5\xaf\xc0\xff\x18\x51\x30\x4e\xa0\x86\x4c\x33\x86\x7e\xfc\xc8\x7e\xd4\xb4\x84\x34\xe6\xf4\xc6\x4b\xc6\x08\xf6\x26\x24\xcd\x10\x4e\x9e\xa4\x4e\x10\xfd\x31\x70\x4d\x58\xb6\x78\x99\xd7\xc7\x9f\x58\x67\x63\x9d\xd4\x99\x66\xd0\x39\x8a\x63\x01\xb0\x96\x18\x78\x0c\xb0\x07\xe2\xd8\x13\x36\x41\xdb\x47\xb3\xb6\xda\x91\xca\x95\x1b\x33\xec\x8d\x19\xee\xab\xb0\xc6\xde\x9c\xf5\x9f\xf1\x22\x5f\x56\xe9\x79\x4e\xc1\x25\x14\xb7\x8f\xc6\x1e\xf1\x5c\xab\xb3\x2c\xa9\x2d\x37\xd0\xb1\x37\xab\xcc\x37\x50\xbd\x4f\x21\x86\x29\x48\xee\x51\xfb\xfe\xec\xf2\xab\xa3\x6f\xd3\x63\xf2\x87\xd2\xbe\xbf\x52\x5a\x30\x23\x0f\xab\x3f\x4a\x5b\x2a\xe0\x8d\x70\x4d\x99\x65\x8c\x13\xc8\xa9\x0e\x7e\x1b\x94\xf4\x6f\xae\x0e\x1b\x90\xda\x89\xe2\xeb\xc0\xcc\xef\xa4\x85\xdf\xfc\x4a\xa9\xbc\x4f\x28\x62\xf0\xbd\x88\x0f\xd6\xf5\x06\x31\x0b\xf8\xb6\x9a\x17\xdd\xe4\xee\xf0\x37\x52\xc3\x65\xf3\xca\x73\xa0\x73\x12\xc3\xc4\x0f\x7d\xb5\xeb\xf9\x57\x39\xfb\x32\x69\x3d\x03\x54\xb4\xf0\x8a\xf7\x7b\x3b\x24\xf5\xfa\xf4\xb4\xd2\xea\x7a\x74\x46\x52\xe6\x89\x39\x08\x0a\xc7\xad\x6a\xee\x40\xbd\x54\xbd\xdb\x2a\xee\x09\x70\xf1\x25\x7a\xa3\x4d\xb2\x3a\x22\x9f\x55\xef\xf6\xd0\xae\x42\xf1\xa1\x34\x1d\x6e\x9c\xd3\x03\x0b\xfd\x2f\xab\x51\x2e\x33\x44\x73\x21\x9d\x6a\xe2\x11\xa0\x9d\x9a\x87\x07\x3f\x2d\x12\x80\x6a\x4c\x1d\x1e\x1a\xfe\xb5\x47\xb4\x23\xed\x25\xe7\x1d\x09\x5a\xe9\x96\x30\x6e\x1b\x14\xb2\x6a\x47\x1e\x93\xb2\x1d\x4d\x17\x6b\x1a\xb8\xb2\x75\xbb\x92\x40\x2a\x90\x24\xe4\xca\x4c\x3e\x9b\xfb\xe1\x41\x46\x5e\x57\xe2\xb7\xbb\xf2\xb9\xa6\x51\xbf\xa9\x24\x7f\x3f\x7e\x64\x6f\xc0\x05\xf4\x94\xc1\xb8\x37\x07\xe9\x05\x8c\x3d\x40\xbd\x8f\x1f\xfd\x97\x97\x30\xbd\x26\x18\x7e\xfc\xe8\x7b\xe0\x12\xa0\x44\xdf\xee\xc6\x93\xd1\xc9\xd6\x3d\x34\xdc\x93\xf7\xae\x23\xe2\x66\x57\xd4\x3c\x36\x4d\x78\xca\x51\xa8\xc6\x2c\x66\x4b\x47\x62\xa7\x3b\xd8\x31\xc7\xa6\xcb\xd8\x05\x16\xe7\x21\x79\x5c\x2a\xf8\x20\xcf\x4b\x87\x81\x99\x1a\xae\xb8\xad\x67\x00\xc7\x09\x3f\x36\xa5\x1f\xe5\xbe\xe4\x3b\x94\xee\x63\xc6\xd8\x82\x0e\xf7\xf7\xc1\x02\x0d\x34\x33\x33\x88\xc8\x3c\xf4\xd4\x78\x80\x1a\xcb\x2c\x85\x13\x3f\xf4\x75\xf9\x98\x44\x34\x57\x61\x9f\xee\xff\xe3\xed\xcb\xc5\x82\xfd\xe3\x6f\xdf\x1d\x1d\x7d\xff\x0e\xcf\xc0\xbe\x20\xcb\x11\x65\xa9\x30\x6f\xeb\x4f\x97\x28\x86\x74\x3f\xde\xff\xc7\x4f\x07\x0b\xf6\xcb\x9b\xff\x44\xd3\xa3\xef\xbf\xa6\x7f\xfb\xc6\xb0\x47\x64\x21\xa3\x29\x65\x73\xe3\x24\xae\xa7\x5d\x27\x8b\x36\xb4\xc1\x1d\xed\xc2\x8e\xac\x2c\xed\xce\xc8\xca\xa7\xed\xf2\xae\x45\x9e\x73\x03\xf6\x55\x65\x0a\xec\x5f\xc0\xeb\xbb\xe7\x5c\xc9\x9b\x2f\x93\xb7\x4f\xdf\x1d\xff\xa1\x38\xd7\x93\x94\xc4\xcb\x88\x79\x2a\x17\xe4\x56\xf8\x56\xad\x87\xf6\x5e\x62\x06\xd3\x45\x8a\x28\xf4\x5e\xc6\x22\x0a\xbd\x97\x54\xf7\xf3\xc7\x63\x57\xe7\x6c\xd1\x9f\x11\xda\xfd\xb6\x54\xab\x55\x63\x34\x75\x6b\x5c\x43\x95\x89\x54\xfe\x12\x34\xcb\x7c\x1e\xfa\x87\x5f\xf9\xa5\x4b\x4f\x4d\xe0\xa1\xdd\x70\xff\xf9\xe6\x35\xbf\xca\xe6\xe0\x21\x1d\xf1\xaf\x33\x58\x76\x3e\xe9\x6f\x4b\x5e\x69\x1d\xd4\x1b\x1c\xf7\x62\x03\xdc\xa3\xa8\xf2\xed\xdf\xbf\x3d\x84\x3f\xff\xfe\x87\x3a\xf0\x4f\xdf\xbc\x3f\x51\x86\xe7\x5b\x39\xec\x7f\x20\xa9\x47\x21\xe6\x6f\xa5\x9b\x87\x67\xbb\xaa\x39\x59\xcc\x3f\x0f\xfa\xd6\x07\xfd\x8f\xaa\xd2\xc3\x12\x47\x9a\xe9\xb8\x39\x20\x99\x39\xdb\x97\x13\x2e\x33\x3c\x1c\x03\xf9\xbc\x84\xf7\xeb\x43\xbb\x01\xa4\x29\xf6\xf5\x80\x0f\x9e\xb3\x1b\x0f\x93\xe1\x16\x2b\xc0\x8f\xca\xce\x08\x75\xa2\x2a\x3d\x10\xae\x3a\x9b\x48\x2d\x2a\xc9\xa9\xba\x51\x89\xcf\xe8\xe1\xa2\xd2\x57\xdf\x7e\xf3\x80\x51\x88\x1f\xdc\x6b\x58\xef\x9d\x9a\x6a\x0f\x09\x8d\xd4\x64\x6a\x11\x49\x4f\xd8\x8d\x4a\x72\x5e\x0f\x17\x99\x96\x14\xa6\xff\x17\x25\x73\xd8\x97\xc9\x76\x1f\xf8\x01\xc5\x87\x8b\xba\x5b\x73\x34\x98\x84\xde\x1b\x7e\xa9\xe9\xd4\xe2\x97\x9e\xb2\x1b\xbf\x3e\x88\x98\xfd\x0f\x17\xbf\x5e\x8b\xbc\xdd\x3a\xbb\xb0\x10\xea\x09\x72\x91\x36\x91\x8b\xf7\x8d\x69\x6b\x5b\x0e\x35\x98\x59\xde\xdf\x95\x58\x6d\x56\x59\xbc\x1a\x6b\xec\x29\xc5\xf5\xa8\xcd\x28\x1f\x38\xd6\xe9\x79\xdc\x15\xd6\xad\xc1\x88\xf3\x51\x3d\x00\x79\x6b\x8e\x6b\xde\x80\xfb\x16\xd1\x46\x64\x9c\xd2\x3b\x67\xbd\xa3\xeb\x83\x93\xaf\xde\xbc\xf8\xda\xc9\x7a\xfb\xca\xa5\xa0\x0d\x03\x9e\x67\x01\xbd\xf9\xd8\xc1\xd8\x69\x86\xf6\xcb\xc2\x25\x53\x66\x4e\x55\x49\x06\xc6\x25\x1b\x12\x26\x15\x74\xfc\xff\xfe\x8c\x5c\xc2\x54\xfd\x4e\x21\x5d\x10\x4c\xd1\xa5\xb4\x7d\xef\x9b\xba\x15\xbc\x25\xe3\x2c\x74\xfd\x21\xc7\xd2\xfa\x53\x45\xb4\xa2\x8b\xb4\xb2\x21\x5c\x24\x20\x82\x33\x95\x80\x55\x9d\x39\xfc\xac\x91\x37\x59\x7e\xcb\x8b\xbc\xc9\x0c\xa6\x9e\x8a\x89\x27\x8f\x12\xf9\xae\x60\x32\x58\x6b\x63\x29\x87\x68\x41\x10\x93\xfe\x15\x8a\xb3\x91\x1f\x84\xfe\x51\x1c\x7b\xca\x16\x71\x0b\xad\xfd\x8c\xe0\x95\xe7\x5e\xd8\xf5\x06\x37\x6f\xf2\xc8\x6d\xdb\x52\xa4\xa2\x25\x6d\xde\x94\x33\x3e\xc2\x0c\xd0\x53\x15\x09\x43\x4d\xbf\x4d\x74\x84\x62\xf7\xd2\xb4\xd8\xb7\xf4\xe6\xe3\x65\x72\xd1\x97\x71\xbd\xa4\xbb\x86\x9f\xd3\xc4\xe7\x2a\x14\xcf\xd5\x18\xe0\x29\x4c\xe5\x11\xab\xc5\x2f\x22\xbf\x32\x23\xd3\xa9\xb0\x64\x9a\x93\x18\x24\xb9\x2f\x22\x9b\xae\x1f\xfa\xff\x25\xf3\xb9\xd1\xdd\x97\x0a\x8f\x41\x74\x11\xa7\x44\x10\xf5\x0c\x30\x14\x59\x40\x7a\x21\xea\x14\xe1\x5d\x61\x84\x9b\x3b\x56\xa4\xb9\x40\x6d\xef\x46\x86\x64\xbd\x63\x60\x8c\x70\x0c\x3f\xf9\xa1\xdf\xd7\x82\xb8\x94\x88\x59\xc6\x08\x24\x64\x5a\xbd\xa1\x9b\x69\x0d\xd1\x51\x3f\x6b\xc7\x6a\x5b\x87\x7a\x6d\x6e\xbd\xb9\x03\x65\xa6\xd0\xae\xad\xe6\xe6\xf8\x31\x07\xd3\xd2\xa2\x34\xed\xcf\x6e\x9d\x8c\x49\x7c\xdd\x7a\xc0\x59\x73\x0b\x7b\x6f\xa6\x50\xf8\xfe\xd1\xa5\xfa\xa1\x9d\x00\x55\xae\x5f\x1d\x62\x46\x1e\x87\xcf\x3b\x8d\x7c\x1b\x53\x9c\x10\xc2\x60\xcd\x85\xd0\x6e\x3b\xb7\xd9\xb1\x64\xc9\x12\x84\x61\x9f\xc2\x88\xe0\x18\xa4\xd7\xf6\x76\x8b\x11\x9d\xa3\x3c\xde\x6b\xcb\x0d\x80\x23\x49\x53\xb7\x9a\xee\x06\x03\x54\xa4\x9a\xaf\x2c\x77\x08\x8e\x44\xc4\x9f\xba\x98\x3e\xdf\x2f\x93\x0b\x73\x1a\x48\x8b\x1d\xcb\x6e\xa7\xf2\xa8\xd8\x70\x55\x5b\x94\x6a\x2a\x52\x24\x23\x1b\x8c\xe4\x1b\x1b\xee\x48\x2f\xb3\xf2\xce\x52\xd7\x0e\x04\x22\xf9\x9b\x4d\x15\xd8\xb7\xce\x99\xf0\x40\x10\xc4\x85\xe4\x83\x1b\x6e\xa0\x16\x24\x8f\x55\x2a\xd6\x6b\xaf\x50\xe3\xec\xe9\xd7\x7c\x28\x5f\x85\xfe\x12\x27\x50\xbc\xe1\xcb\x7f\x18\x9e\xf9\x40\xdd\xb9\xe7\x9c\x36\x92\x0f\xda\x55\x55\x02\xce\xf7\x72\x6a\x49\x5d\x4d\x5e\xfa\xe7\xf6\x2d\x60\x73\x41\x8d\x3e\x1d\xce\xad\x1c\xf7\x11\x16\x7b\x4b\x50\xbb\x1e\x48\xd0\x14\xf7\x19\x59\xd4\x5c\xec\x6a\x3c\x73\xd8\xf1\x32\xcf\x8d\x04\x15\x8f\x14\xc0\x60\x8a\x40\xd2\x47\x11\xc1\x94\xb3\xc5\x24\xed\x4f\x53\x60\x2f\xb5\x30\x88\xfb\x65\x4c\x3e\xfd\xa2\x0e\x84\x5f\xc6\x09\xc0\x17\x2d\x10\xb2\x38\xbe\xe2\x5c\x4c\xb4\xae\x5b\x9c\x91\x65\x1c\x58\xc1\xc9\x49\xfa\x43\xd2\x4b\x7e\xa8\xc6\x96\x5b\x5b\x03\x81\x35\xe6\xfc\xc0\x66\x50\xb7\x86\x15\x83\x2c\x4f\xd2\xf5\xaa\x74\xee\xb4\x3f\xd6\x5a\xec\x90\x4d\xc8\x25\x21\xba\x72\x37\x77\xa8\x81\xe5\x4f\x96\x49\x22\x65\x8c\x4d\xdc\x4c\x73\x87\x42\xeb\x59\xee\x42\xbd\x6e\xd7\x7e\x2d\xdc\x1a\x3f\x9a\xa3\xd1\xc1\x3b\x48\xc1\x4b\x04\x71\x89\x8a\x70\x1d\x37\x2a\x69\x47\xe7\x0d\xba\x65\xdc\x96\x19\x53\x0c\x6e\xcb\xab\xe4\x96\x77\xe8\x7d\x4d\xa1\xeb\x31\xeb\xdc\x7a\x77\x88\x22\x97\x08\x5e\xad\xc3\x65\x6e\x1f\xc4\x1f\x94\x80\xe2\xf1\x22\x49\xdb\x19\x3c\x36\x1c\x59\x87\x6a\xd9\x06\xc9\xb2\x05\x22\x45\x13\x80\xf7\x8b\xda\x47\x4a\x2c\xfb\x78\x51\xbb\xed\x0c\xba\x51\x28\x9b\x90\x27\x7f\xe2\x7f\x2b\xfc\xd7\x7c\xd3\x3d\x6f\x00\x39\x8c\x47\xbd\x03\xda\x4e\xe1\xcf\x2d\xe0\x24\xb1\x8b\x7c\xbe\x20\x4e\xfb\x52\x42\xd4\x2f\x80\x35\xf4\x55\x64\x0c\xb1\x48\x6a\x7f\x9c\x2b\xd1\x92\xf2\x9c\xe5\x14\x59\xcd\xa2\x11\x7c\x3a\x23\x57\xa2\x50\xe5\x92\x35\x4b\x57\xeb\x91\xc7\x02\x1b\x54\xa3\xe9\x24\x27\xda\x06\x7a\xff\x09\xdd\x96\xfb\xc1\x05\x35\x5b\x2a\x69\x43\x04\x18\x51\x4e\xa7\xe6\x4a\x8b\xa0\xf4\x0d\xad\x96\x41\x6a\x58\x4a\x0b\x91\x49\x34\x6b\x97\x42\x15\xbb\x8b\xc5\x88\xdb\xca\x58\xb7\x4e\xd8\x36\x35\x78\xe8\x10\xa3\x96\x5a\x2b\x36\xd2\x64\x9d\x2c\x74\x48\x62\x37\x09\x15\xd2\xf6\x75\x47\x95\x28\xb9\x9e\xa6\xa8\xa1\xb9\x7a\xbd\x50\x43\xe5\x92\x16\x88\x73\x3c\xc2\xe5\xef\x50\x29\x96\x39\xa0\x3e\xc8\xe0\x7a\x13\x94\x52\x56\x94\xca\x1c\x84\x7e\x55\xf9\x04\x94\x8b\x77\x31\xe2\x69\xa3\x43\xf2\xf3\x36\xe4\x4d\x12\xea\x3a\xeb\xa6\xda\xfa\x75\x26\x4e\x02\x97\x2c\xe0\x64\xb6\xf7\xf6\xbb\x26\xf1\x52\x8d\x2d\x92\xb1\x71\xb0\x6d\x92\xce\xf5\x9d\x90\xf5\x5c\xb2\x14\xb0\x2d\xe1\x2a\x16\xb2\x55\x18\xb6\x26\x9a\xe4\xf6\xc0\x9a\xe1\x50\xe6\x5c\x05\xb6\x02\xd4\x82\x09\x46\x01\xa8\xa6\xdf\xd0\x6d\x84\x51\x87\xec\x0f\x1c\xa4\x39\x79\xe8\x41\xe8\xbf\xd4\xcf\xb7\x06\x4c\xd9\x63\x5b\x48\x6a\xc1\x6c\x47\x30\xfa\x8e\xb4\x14\x47\x4b\x36\xd3\x29\x29\xb2\x10\x7f\xeb\x18\x5f\xb4\x73\x2d\xea\x50\x3d\x22\x49\x7f\x1e\xf7\xbf\x6e\xd1\xc6\x76\x90\xa2\x25\x76\xd8\xa6\x9a\xed\x8c\x30\x3b\x8c\x96\x21\x7b\x98\xc6\x0f\x15\xc3\x2b\x6f\xb1\x4e\x27\x6b\x63\xa4\xd3\x7e\xd3\x89\x98\xae\x92\xed\x02\xb3\xb5\xd8\xeb\x9d\x8a\x3c\x2a\x34\x8a\x08\x9e\xa0\x74\x7e\x52\xc6\xa6\x63\xf9\xa5\x45\x04\xd5\xf5\xb0\x4a\xb7\x7f\xf7\x48\x55\x9c\x73\x17\xdc\x52\x75\x55\x64\x83\xbb\xc5\xaf\x16\x3c\xec\xc6\xb6\x0c\x9b\x1b\xd2\xf8\x0f\xcb\x6c\x66\xdd\xe1\xac\x61\x24\xf3\x41\xe4\x2e\xad\x30\x90\x71\x1a\x39\x57\xaf\xc3\x3a\xdc\x93\xc9\xee\xa5\x38\x97\xcc\x8a\x55\xb1\xb4\x0a\x79\x8f\xc1\x42\x0e\x5f\x41\xe0\xbd\x04\x07\x9d\x91\x2b\x91\x00\xec\x28\x32\xd9\x11\x2d\x63\xb3\x8c\x25\x16\x40\xd2\x6c\xb3\xda\x22\xd4\xb0\xc2\x2f\x14\xdb\x54\x9f\xfc\x2c\x67\x4b\x54\x69\xde\xe2\x77\xb7\x33\xb3\x79\x1c\xf9\x4a\x13\xd3\x0e\x55\xf5\x41\xe8\x3f\xef\xb8\xab\xb6\xee\x02\x9e\x99\x8f\x6f\x6a\x83\x7e\x7f\x1e\xe0\xf4\x1f\x27\xf1\x8f\xf3\xe4\x4d\x3b\x0f\xf0\x6d\x50\x7f\x95\x87\x54\xd1\x90\x9d\xf5\xbf\x72\x5b\xb3\x57\x18\xb4\x1f\xc5\xb1\x44\xf7\x6a\xa3\x2e\x87\x23\xb4\xb8\x35\xa4\xa9\x44\x3d\x83\xef\x0a\xe8\x45\xd3\x3e\xc1\xc9\x75\xee\x72\xc6\x52\x39\xfc\xc3\x1a\xdc\xaa\xbf\x86\x53\x72\xde\xb0\x3d\x73\xa2\x29\x0d\x23\xcf\xab\xaa\xcf\x45\x99\x83\x35\x44\x57\x98\x26\xf3\xb5\xce\x97\x66\x3e\xee\x3f\xf5\xe6\x69\x9f\xce\xfb\xcf\xf8\x03\x9d\xf7\x0f\xaa\x1d\x6c\x9c\xc5\xeb\xbc\x6e\x36\x5d\x98\xd7\x9d\xf9\xdd\x76\x24\x4b\xcb\x05\x79\x5d\x64\x7b\x8b\xeb\x61\xcb\x74\xb2\x91\xb9\x56\x43\x7f\x7c\xa4\x8b\xf1\xb2\x03\x97\xbc\xb5\x25\x78\xa9\x18\x65\xc5\x30\x17\x81\x6f\x4c\x96\xd4\x68\x5c\x60\x17\x5f\x1e\x12\xcc\x5d\x14\x12\x5d\x8e\xe7\x52\x01\x50\x4f\x21\x55\x48\xc8\x41\x1c\xdb\x7e\x5e\x47\xb1\x93\xc0\x6f\x24\x75\xaa\x6e\xe4\x5b\xb8\x87\xd7\x76\x07\xd3\x82\xe1\x7d\x71\x01\xf6\xa1\xb6\x5a\xba\xe3\x8b\xf8\xe7\xbf\xfd\xe3\x9f\x2f\x7e\x7a\x75\xb4\x41\x28\x16\x8e\x50\x00\x61\x07\x89\xdf\x55\xc4\x52\xcb\x0c\x1f\x3e\xad\xbf\x28\x1d\x8a\x22\x1b\xb2\x6d\xdc\x45\xcd\xf2\x98\x7d\x27\x2b\x0b\x7a\x57\x19\x59\x1b\x81\x3e\xdf\x4e\x6a\xab\x2f\x64\xac\x56\x8e\x4a\xba\xdb\x37\x24\x86\x32\x39\xae\x64\x37\xf2\x64\xb2\xa2\x36\x8d\x6e\xe0\x5c\x3b\x7b\xc9\x16\xcd\xf3\xc2\xc4\x77\x15\x0e\xa8\xbc\xfd\xf3\xf3\x90\xa5\x4b\x58\x47\x2b\x1b\x0e\x47\x91\xa1\xd5\x25\xcd\x88\x9a\x9c\x4d\xb7\xc3\x71\x6c\x63\xff\x39\xf7\x4d\xb6\xfb\x76\x3a\xee\x3e\xa5\x64\xe9\x27\x08\x5f\xc0\x7b\xd8\x7f\xec\x3f\xde\xc6\xbf\x7d\x73\x78\xea\xf6\xc7\x44\x0c\xce\xfd\xd0\xf5\xa7\x66\x6b\x72\xee\x13\xc5\xbe\x46\x69\x1c\x01\x8e\xcf\x7e\x7e\xa6\x52\x3b\xd6\xf7\x6d\x44\x0b\x95\x2e\x32\xcf\x8e\xfe\xa9\x3d\x93\x61\xca\x61\xca\xbc\xd7\xa8\xd2\x4c\xa4\xa1\x45\x97\xb2\xcb\x25\x76\xe8\x70\xbc\xb6\xd6\x2f\xb4\x10\x68\xd7\x9d\xbc\x9c\x25\xfa\xb2\x92\x25\x72\x37\xb4\x2c\x12\x63\x0c\x8c\x31\xb8\x34\xc4\x47\xa5\x45\x4b\x93\x50\x12\xf9\x2e\xed\x3d\x03\x63\xaf\x4c\x34\x31\x30\x3e\x3c\xcd\x5c\x1f\x42\xcb\x0f\xc2\xf2\x2b\xa9\x54\xd6\xbf\x07\x63\x6d\xea\x7f\x68\x3b\x9f\xc3\xa8\x26\xd3\xff\x76\x86\xfd\x74\x3b\xc3\x7e\x6a\xd3\x52\x8c\x81\x68\xa6\x37\xd3\xad\x8d\xfc\xcb\xed\x8c\xfc\xcb\x1c\xc0\x41\x1a\xd5\x64\x84\x5e\x53\x1c\xda\xf0\xd1\xa1\x76\xa2\x33\x72\xa5\x56\x7f\x4d\x4f\xdf\xdb\x50\x36\x79\xce\x83\xbd\x9a\x28\xab\xeb\xc0\x96\x9b\xf1\xb3\x4e\xe5\xda\x12\x51\xb4\xaf\x10\x9b\x21\x2c\x43\xb3\xdb\xe7\x72\x3b\x54\x52\x14\x96\x14\x37\x26\x88\xb2\xfe\x02\x45\xe2\xc6\x35\x1c\x15\x83\x73\xed\x46\xf2\x03\x82\x89\x0c\xee\x8f\x2d\x87\x1b\x9f\x60\xf5\xd3\x90\x50\x11\xc0\x31\x8a\xf9\xed\xae\xc8\x30\x11\x21\x5c\xcb\x2f\xeb\x09\x25\x0a\x99\x6c\xae\x1d\x09\xb4\x3e\xa6\xb5\x11\x11\xba\x70\x2d\xdb\xb2\x7f\x20\x74\x03\xd8\x03\x66\xde\x1b\x22\x9d\x73\x0e\x57\x28\x9e\x42\x96\xc3\xc1\x8e\x9a\xb1\xd2\xe5\x56\x8e\x6a\x5d\xe1\xb6\x99\x43\x57\xb0\xf6\xf2\x76\x3a\xaa\xe5\xe0\x4a\x3e\x97\xcf\xf2\x7e\x81\xdd\xce\xea\xdc\xd6\x09\x55\x73\x6d\xad\xd8\x5a\xad\x52\x16\xba\x86\xa5\x4b\x4e\xc2\x56\x89\x49\x5b\xb5\x8f\xe6\xd3\x42\xfb\x28\x92\x57\x38\x07\x17\x4d\x23\x0d\xac\x7d\x40\x29\x64\x74\x1f\xcd\xa7\xfb\xd6\xfa\xec\x2b\xe8\x19\xb6\x61\x82\x12\x28\xcc\xed\x2c\x68\x8a\x8d\xf1\x89\x65\x14\xb4\x81\x47\x5b\xff\xec\xe2\x89\xa9\x1a\x36\xb9\x65\xda\x29\x0e\xeb\x0e\xa2\xbc\xb9\xf0\xb3\x4d\x7d\x43\x2b\xa0\x5d\xa4\x80\xab\xec\x13\x85\x21\x76\xc7\xb3\xb2\xe3\x84\x8b\xad\x3d\x6b\xdb\x5c\xfb\x53\xe6\x6e\x95\xb4\x95\x74\x89\x24\x92\xfe\x15\xaf\x89\x5b\xb1\x6a\xe8\x4a\x5c\xe6\x36\x66\x2b\x55\x49\xde\x98\xa0\x28\x1e\x06\x4b\x46\x22\x32\x5f\x68\x0b\xdd\x22\x7f\x4e\xe5\xc0\x8c\xe0\xd9\x69\x67\x70\x01\xaf\xaf\x48\x1a\x4b\xa2\x47\x3d\x78\xa6\x26\x99\x4c\x9a\x73\x77\x3b\x60\xb4\x46\x3c\xb1\x17\xea\x60\xf4\x38\xf5\x16\xea\xc5\x0f\xed\xab\xbc\x8d\x65\x5f\xcd\xa1\x95\xc5\x19\x30\x19\x8e\x00\x8b\x66\x70\xbd\xbb\xf3\x2d\xe1\x74\xc5\xd4\x9b\x90\x25\x8e\x07\xeb\x9f\x3b\x0f\x92\xca\x98\x2b\xc0\x64\xf7\xd5\x7d\x10\x18\x5f\x6e\x97\xc0\xf8\xf2\xe1\x12\x18\x87\x7a\x80\xe5\x9b\xfa\xeb\xd0\x1f\x9b\x95\xff\x36\x57\x36\x23\x17\xb6\x7e\xaf\x7f\xf9\xc7\xbb\xd7\xbf\xcc\x9a\xab\xde\x0e\x9a\x41\xbc\xeb\xad\xf0\x74\xbb\x5b\xe1\xe9\x43\xdf\x0a\x4f\x3b\x6c\x85\xa7\xb7\xbb\x15\x9e\xfe\xf1\xb6\xc2\xd3\x36\x5b\xe1\x7e\x99\xcf\xc3\xed\x6e\x88\x62\x14\x96\x07\xb4\x21\xee\x82\xf9\x3c\xbc\x2d\xe6\xf3\xf0\x36\x99\xcf\x8d\x03\x13\x3d\xbe\x9d\xe9\xf2\x7a\x6b\xd1\xd0\x06\xa5\xb6\xcd\x7c\xd6\xb5\xfd\xa8\xec\x84\x2b\x95\x10\x5a\x79\x7e\xa7\x06\xc3\x95\xa3\x91\x7a\x47\xa9\x76\x2c\x6a\x23\x6b\xa0\xbc\x91\xaa\x7e\xcb\x7a\xfa\x3c\x5f\xbb\xbe\x9d\x8c\xfe\x71\x6f\xa6\x32\xc7\x57\x63\x3a\xfe\x9d\x5e\xb6\x33\x95\xd9\xaa\x49\xc9\xad\x98\x91\xdc\x89\x05\xc9\x96\x91\xa9\x80\x04\x5b\xc0\x26\x9d\x58\xe9\xce\xd1\xe9\xc5\xab\xf9\x62\xfe\xdb\xfb\xbf\xb6\x36\x81\x2e\x48\x40\x38\x04\x84\x95\xd1\x46\x86\xcf\xed\x2d\x2c\xca\x2e\xf3\x05\x10\x3a\x14\xc2\x11\xc0\x32\x3c\xc1\x79\xe8\x47\xcb\x94\x92\xb4\x2f\xd2\x96\x16\x42\x3b\x96\xfd\x25\xdc\x6d\x54\xe2\x61\x16\xf9\xcb\xb4\xeb\xf4\xa9\x70\xdc\x46\xa5\xfc\x5d\x31\x89\xfa\x4c\xe7\xb2\xaf\x0b\xfe\x6c\x6d\x5b\xbd\xb2\x5d\xe8\x18\x2d\x6c\x5b\x80\xd2\x05\x31\xed\x5f\x81\x54\x24\xc2\x5e\xf4\x0f\xbd\x45\xda\x7f\xea\x2d\x92\xbe\x6d\xff\xf6\xde\x74\x68\x4e\xee\xff\xfd\xbf\xfe\xf7\xff\xea\xee\xe5\x63\x3c\x1f\xb2\xc9\x38\x7c\x1e\x36\xb9\xdc\x39\x3c\xe1\xa7\x08\xa6\x0b\x83\x64\x8e\x4e\x4d\x89\x6a\x8f\xf2\xc6\x4b\xac\x75\x88\x0e\xbf\xd2\x2c\xbf\xb4\x27\xaa\x43\x39\x28\xf7\x9c\x33\x5f\x79\xbe\x68\xd3\x57\x17\x1f\x52\x07\x9c\xdc\x1e\xea\xeb\xf8\x19\x5d\x6c\x96\xda\x48\xc3\xbb\x08\xae\xf3\xa9\x31\x1a\x05\xd7\x66\x0e\x0e\xfb\xf2\x98\x44\x6f\x15\x3a\x39\x4c\x9a\xf9\xa7\x2a\x63\x66\xb2\xa4\xf0\xff\x67\xef\xed\x96\xdb\x36\xb2\x06\xc0\x7b\x3f\x05\x82\xa9\xf2\x88\x23\x90\x12\xe5\x9f\xd8\x4a\x98\x7c\x8a\x24\x27\x9a\xd8\xb2\xc6\x92\x93\x71\x1c\xaf\xab\x09\x34\x49\xc4\x20\x1a\x01\x1a\xa2\x69\x5b\x55\x7b\xb5\x0f\xb0\xbb\x97\x7b\xf1\x3d\xcb\xf7\x28\xdf\x93\x6c\xf5\x1f\xd0\x00\x1a\x40\x03\x04\x29\x3a\xe3\xd4\xd4\x58\xc4\x4f\xa3\xfb\x9c\xd3\xa7\xcf\xff\xc1\x21\x08\xaa\x22\x98\xc5\x33\x69\x69\xd9\x2b\x9e\xb8\x54\x63\xfa\x6e\x4a\xc3\x0d\x21\xdc\xa4\xe5\xbf\x3e\x78\xc5\x16\xb1\xcc\x03\x09\xbc\xa7\xe9\xc6\x51\x05\x8d\xb3\xbb\xdd\x02\xf9\x34\x99\xc8\x4a\x60\xde\x2e\x41\xbe\x62\x52\x2b\x06\xb5\x0b\x5e\x51\x9f\xda\xd7\x82\xc3\xad\x49\xbc\xe2\xec\xa8\x03\xf9\x8a\x49\xb0\x9b\x16\xae\x7e\xdc\x0d\xc7\x4f\x7f\xd8\xff\x4d\x1d\x56\x4b\x8f\x6c\xea\x5a\x63\x01\xac\x36\x6d\x3b\xab\xdd\xf5\xa4\x54\x66\xaa\x67\xf3\x2c\x7b\x60\xe2\x42\xcf\x89\xf2\xaf\xd7\x9d\x15\xb5\x3d\x9a\xca\xe2\xe6\x0d\xde\x34\xe9\x9e\x51\xec\x22\x7a\x0c\x30\x9c\xa2\xd0\x85\x65\xad\x01\x34\xc7\x7e\x6c\x24\x39\xd3\xd5\xce\x29\x61\xf2\x91\x3f\x5c\x26\x34\xdd\xb7\x4c\xa2\x35\xf6\x31\x32\x53\xad\x26\xab\xe3\xf0\x98\xe5\xfc\xc5\xc8\x8b\xd3\x8c\xd2\x3f\x63\x18\x2e\xfb\x74\xe3\x44\x29\x4b\xb6\xd9\x04\x28\x13\x11\xc1\x10\xbc\x16\x53\x63\x27\x7a\x1a\xab\x91\x8e\xaa\xd4\x84\xb4\x8d\x4b\x25\xb2\xdc\xfd\xaa\x42\x82\x42\x5c\x3e\x72\x04\x74\x97\x95\xb0\xcd\xbe\xc5\x6c\xaa\xf5\x2f\x96\x59\xae\x38\xa1\x00\x4e\x26\xb3\x10\x4e\x4c\xcb\xfc\x5b\x35\x63\x9c\xa1\x85\xf8\xe2\x33\x16\x5c\x9e\x12\xd0\xb7\x8c\x54\xbe\x6b\x2d\xe6\xa9\xe7\xa8\x22\xaa\x41\x82\xb6\x26\xd4\x45\xa5\x3f\x29\xcd\x0b\xf9\xfd\x20\x74\x7d\xde\x88\x48\x99\xa2\xfc\xed\x1c\xf8\x60\x0a\xbf\xd3\xcc\x1a\xae\xaf\x36\x98\x24\x36\x15\xeb\x75\x75\x88\xe1\x52\x26\xc0\xd0\xca\xcb\xa6\x15\x6a\xd5\x65\x2e\xd0\xa8\x02\x5e\x81\x7f\xee\x3a\x8e\x57\x5f\x2a\xad\x94\x34\xaa\x62\xd8\x6b\xaa\x48\xe6\x27\xa0\x5b\xb7\xae\x9d\xa5\x58\xe7\x94\xbf\x15\xbe\x7f\x05\xa6\x9b\xe2\xf8\x18\x4c\x3f\xe8\xf2\x78\x11\xbb\x52\xc1\xb7\x79\x43\x2c\x8b\x39\xb3\xae\xc0\x54\x30\x70\xea\x16\xa5\x31\xbf\xed\x38\x78\x36\x5d\xe6\x6f\xb2\xaf\x95\xa3\xb6\xa6\x68\x51\x25\x49\x94\xaa\xe7\x07\x56\xd6\x77\x2d\xed\xd9\x00\x86\x73\x37\x8a\x68\xd4\x47\x2a\x44\x70\x6b\xc8\x16\x6c\xde\x26\x9d\xa5\x12\x11\x08\x83\x69\xd4\xac\xab\xd4\x97\xdd\xbe\xb2\x94\x37\x03\xfe\x14\x1a\xc7\x49\x73\xc9\xd5\xf7\x7d\xbf\x0e\x4d\x39\xfb\x16\xb7\xfb\x0c\x1f\x59\xa6\x4d\x67\xc3\x27\xf3\x2c\x22\x13\xad\xa9\x22\x58\x0b\xd4\xac\x75\xee\x81\x65\xc2\x3f\x55\x76\xba\x20\x44\x58\x04\xfc\x8b\x53\x9d\xd0\x09\x06\x64\xf7\x58\xe6\x45\x72\x9f\x97\x38\x79\x01\x89\xc4\x2f\x79\x55\xeb\x37\x5d\x0b\xcc\xae\x86\xdc\xa3\x20\x08\xd1\x35\xf0\x8c\x8b\x10\x09\x55\xb4\xd2\x53\xd5\x15\x86\x2b\x91\x0c\xf8\xac\x6a\xf1\x5b\x6d\x27\xa8\x49\xc9\x89\x23\x18\x32\xe2\xd6\x0f\x63\x68\x87\xa0\xd5\x70\xf4\x0a\xc5\x21\xdb\x7e\xee\x38\x4e\xc2\xf8\x9a\x97\x0a\x6c\x8d\xa8\xea\x0d\x29\x26\x86\x42\x1d\x74\x55\xfa\x95\x1b\x72\x4e\x75\x75\x3f\x4a\x3b\x50\xbf\x1d\xca\x6d\xa0\x54\x4c\xd2\xb8\xc4\x00\xc7\x5b\x85\x4f\xc0\xa7\xb6\x31\x64\xd6\x1d\x8f\xf9\x71\x6a\xf7\x75\x1b\xc9\x67\x1d\xd5\xac\x44\x58\xb3\x64\xad\xb0\xcc\x24\x1f\x4d\xb6\xff\x49\x65\xad\x8a\x6a\x4b\xb9\xff\xf4\x12\x5c\xc3\x54\x23\xab\xa9\x6e\xa5\xce\x9c\x62\xd3\x31\x16\x33\x64\xd8\xc0\x37\xc8\x81\x95\xe4\x4a\x45\x22\x83\x4a\xb6\x76\xa8\x4e\xd3\x0e\xf2\xf3\xa4\xa4\x3c\xc9\xb4\x63\xa5\x26\x11\x4e\x89\xcd\x2d\x23\x4a\xdb\x1a\x35\x55\x97\x4b\x95\xdd\xe4\xac\xd7\x47\xad\xb4\x68\x0f\x5a\x33\x62\x6d\x3f\xd0\x9a\xf7\x8b\x0d\x40\x05\x15\x57\x28\x7d\xf5\xc3\xd6\xb6\xfc\x34\xb3\x5e\x35\xe6\xd4\xe5\xb6\xf3\xca\x10\x02\xc7\x61\x5a\x5c\x9d\xc7\xb6\x7e\xa6\x8d\xf2\x42\xcc\xb2\x3a\x97\xc0\x71\x08\x3d\xf5\xa9\x99\x56\xde\x68\x01\xb4\xdd\xc9\xd2\x88\x03\x03\x23\x03\xcf\x42\x08\x0d\x42\x77\x46\x00\xc3\x92\xec\xc4\x32\x7d\xb8\xa9\x0e\xa7\x81\xa4\xfe\x3d\x16\xb2\x98\xf1\x8e\x34\x49\x38\xa8\xae\xb4\x2f\xda\x0a\xb7\xb7\xe8\xbc\x80\x73\x74\x0d\x09\xaa\xdb\x05\x6d\x6a\x69\x7c\xd2\xa2\x6d\x0f\x82\xb2\x2e\xf6\xea\xd1\x9b\xa6\x00\x15\xac\x05\x43\x6d\x6b\x81\xf6\x11\xab\x11\x33\x68\xd6\xf8\x76\xb9\x1b\x2b\x53\x71\xbc\xa6\x31\x79\x76\x0b\x94\xba\x04\xa9\x1d\xc9\x10\x95\xc2\x78\x4d\x2b\xba\x99\x9b\x64\x52\xeb\xa5\x1c\x49\x8e\x36\x51\xbe\x38\x84\x51\x64\x9c\x9e\x5f\x9d\xbe\xa0\x99\xc3\x8e\x43\xb6\xa3\x06\x22\xf5\x3f\x9a\xcf\x73\x7a\x8a\x16\x30\xb4\x41\x04\x2d\xc3\x9e\x81\x10\xd8\x04\x4b\x96\xe1\xc7\xf3\x31\xfd\x63\xb6\x0c\x66\xd0\x8f\x0c\x51\x78\xac\xb3\x72\x04\xba\x77\x56\x6b\x68\x6c\x6e\x57\x29\xd6\x6e\x82\x2b\x75\xab\xb1\x12\x51\x8c\x9f\x90\x0d\xeb\xb1\xea\xab\xb0\xca\x6b\x0d\xa4\xec\x35\xb8\x7a\xc9\x08\x1d\xf8\x79\x59\xc0\xe2\xa6\xfd\xbc\xe1\x8f\x2f\x9d\xcb\xdd\xaf\x7f\x69\x5a\xbe\x2c\xad\x91\xf4\x90\xc7\x47\xaa\x4b\x21\x89\xe8\x34\x4a\xc8\xc9\x0b\x75\x0f\x32\x02\x2d\x3e\xca\x25\x3b\x11\xfb\xf9\xa6\x26\xc0\x4c\x37\xc2\xaf\x6a\xeb\x2f\x96\x91\xbb\x58\x96\xb5\xc1\x97\x4e\x8e\xf2\x38\x5b\x71\x8c\xac\x3d\x4c\x95\x7c\xf0\x22\x13\xaa\x4a\x21\xa0\x1b\xae\x2a\x87\xff\xd5\xed\x73\xf6\x99\xea\x9a\x1f\x1a\xdb\xb2\x12\x1f\x79\xc0\x52\x2a\x4b\xc2\x4d\xf5\xa1\x1a\x40\x9f\xbd\x92\xd3\x8a\x31\x18\xf3\x2a\x73\x44\xed\x48\x0a\xde\xd1\x54\x51\x16\x32\x29\xaf\xf6\x28\xfa\x81\x76\xe4\xa5\xf0\x42\xc1\xf2\x82\x7d\x03\xf9\xcf\x10\x07\x47\x5a\x66\x99\xff\x0c\xe1\x24\x84\xd1\xac\x09\x0a\xcb\x22\x8d\x99\x4e\xcf\xd6\x21\x5d\x48\x97\x93\x5c\x14\xab\x4a\x2e\xb0\xc5\x25\x3f\xf9\x1a\xab\x09\xa2\x29\x29\x08\xe0\x68\xbc\x92\xc0\x4e\xe3\xd9\x04\xb4\x1a\xcf\x4a\x90\xaf\x7b\x9a\xc3\x45\x60\xe7\x8d\x06\x1d\xaf\xc6\x1b\x22\x66\x13\xdf\x1b\x83\x08\xf6\x43\xe8\x3b\x30\x94\x2d\x03\x0c\xe9\x19\x5e\x57\x2e\xff\xd5\xef\xaa\x75\x26\x23\x64\x8e\xab\x0e\x4e\x3d\x8c\xec\xcd\x1f\x7a\xbf\x5e\x3e\xfc\xf9\xe7\xbd\x97\x7f\x56\xd7\x0c\xa4\x86\x0e\x9d\x38\xf2\x79\x80\x97\x97\xb8\x2e\x7a\xd9\x30\x0c\xa3\xd4\x06\x43\xe1\x50\x19\x23\x8e\x91\xad\x88\x0f\x77\xa3\x13\x18\xbd\xa3\xfd\xf8\xdf\x58\x99\x87\xfb\x8e\xb8\x91\x4b\x67\x63\x64\x61\xf0\xff\x4a\x69\xbb\x60\x04\x91\x5e\xaa\x7c\x31\x1f\xfa\x7d\x05\xc6\x1e\x34\xd0\x44\xd4\x34\x88\x94\x0a\xbe\x32\x5e\xbd\x1a\x98\x95\xb3\x61\xe1\xb8\xc8\xbe\x42\xc8\x1b\x33\x2d\xb6\x58\x83\x0d\xd9\x42\x25\x8b\x14\xb0\xa5\x1f\x4d\xbc\xbc\x64\x15\xe2\x6c\x35\xed\x38\x0c\x13\x99\xad\x1a\xc0\x5a\xb3\xec\xc7\x41\x3f\x95\xc6\x0b\x13\xcd\x7a\x96\x21\xf4\x15\x56\x84\xf2\xf9\xc7\xc1\x89\x1b\x91\xe9\xb3\x4c\x51\x27\xf9\x51\x9f\x29\x4a\xd6\xf7\x32\x30\xeb\x57\x26\xad\x4e\xdb\xbc\x00\xc2\x10\x2d\xde\xc6\xc1\x02\xe4\xdb\x90\x94\x8d\x5e\xff\x44\xbb\x7e\x87\xcd\x70\xe5\xa0\x85\xbf\x3e\x6c\x91\xd1\x57\xc2\xd7\x09\x5a\xf8\x6b\xc5\x18\x99\xe1\xe7\x86\x33\x14\x63\x87\x6c\xd8\xb5\xa1\x8d\x7f\x60\x25\xcc\x3d\x67\x63\xac\x15\x79\x63\x90\xcf\xd9\xdd\x6e\xc4\x91\x53\x78\x9d\x78\x63\xe3\xaf\x84\xb6\x33\x7f\xed\x58\x9b\xa0\xb0\x8b\x1d\xa7\x6b\x27\xb1\xe4\x23\x36\x6f\x6d\xc9\x8b\x0e\x85\x32\x3b\x54\x70\xa2\x2e\x30\xb3\x36\xb4\x2d\x2d\x28\xf2\x9a\x16\x63\xa2\x26\x54\x16\x32\xaa\x7f\xea\x7b\x79\x68\xf2\x02\xcf\x7a\xa7\x31\x28\x9a\x33\xd8\x0a\xd2\x0e\xb3\x4a\x43\x45\x86\x08\x3d\x56\x7c\x91\xd1\xeb\xfb\x3e\x99\x80\x51\x78\x1f\x23\x9b\xd1\xca\x71\xc4\x1c\x7b\x39\xba\x4c\xa2\x6e\x14\x9f\xb5\xb2\x64\x4b\xe9\x4e\xae\x35\xdd\xb0\x52\xec\x8f\x08\x23\xa6\xa4\xaa\xd7\xd8\x80\x94\x15\xf9\x77\xcc\x9a\x2b\x79\xfb\x87\xf9\xcf\x48\x4f\xa8\xfc\xeb\x66\x3e\x1a\x89\xa6\x2b\x8b\x31\xe2\x08\x86\x3f\x81\x88\x85\xad\x5c\xe4\x95\x62\x7e\xf7\x1c\x2e\xc8\x02\xd3\xdb\xb5\x01\x48\x65\xeb\xac\x5e\x2b\x6b\x6b\x1f\x42\xd1\x7b\x5c\xf8\xca\xf9\x87\x0d\x11\xc6\x63\xaa\xc2\xfd\x30\x42\x1e\xef\xd1\x26\xee\x51\xbf\x82\xc8\x8a\x44\xb2\x1b\xee\xf5\x3f\xde\xfc\xcf\x7f\xeb\x6f\x61\x05\xfc\x2a\x22\x03\x78\x30\x46\xde\x6a\xa0\x7a\xa0\x1a\x90\xf9\x0a\x15\x2c\x56\xed\x68\x01\x5c\xec\xfa\xd3\x5c\x38\x58\x53\x34\xe8\xa0\x82\x9e\x01\x39\x64\x88\xcf\xdf\x16\x36\xb4\x18\xad\x6a\xa1\x85\x8d\x53\x52\x4d\xa4\xec\xfd\xf6\x67\xc1\xd0\x3a\xd0\x38\x0e\x74\x46\x5a\xaf\xf5\x1d\x23\xbb\xbd\x19\x22\x6b\x51\xdc\xb4\x19\xe2\xeb\x97\x07\xff\x7a\xf7\xdb\xd3\x92\xd6\x05\x21\x8c\x62\x4f\x4e\xb2\xca\x5d\xd0\xcb\xb7\x0a\xd1\xc2\xf0\x51\x7f\x1a\x63\x82\x0d\xee\x6b\xa6\x91\x28\x65\xd5\xe3\x4b\x25\x3b\x1a\x6a\xb5\xaf\x32\x76\x95\xbe\x92\x60\x29\xc2\x61\x6c\xe3\x38\xac\xe9\xd5\x55\x1c\x21\xc1\x90\x46\x61\x13\x05\x4b\xa0\xaf\xb3\xc3\xc6\xcc\xe5\x4e\xeb\x9d\x44\x0d\x3e\x93\x31\x7c\xe4\xbe\x52\xd8\xb6\xdd\xb8\xba\xea\xd0\x75\xa0\x94\xc0\x24\xfb\x55\x77\x81\xbe\x4f\xa9\xf9\xb7\x8b\x30\x5f\x6d\xa2\xa9\xa5\x1b\x9c\x35\xfe\xe4\xfc\x55\xfc\x6e\xb9\xdf\xaa\x79\xd0\xe3\xc4\x43\x00\xf7\x43\x77\x3a\x53\xcb\xbe\x0d\xad\x5c\x1a\xc1\x26\x8a\x75\xd1\x8e\xab\x5c\x07\x2a\x5d\x5b\x99\xc6\x16\x82\x65\x26\x20\xc5\x70\xfa\x3e\xf2\xc9\x3f\x73\x87\xb7\xdb\xeb\x8f\xb9\xa9\xbf\x5c\xbc\x4c\xea\x4d\x68\x97\xa8\xd5\x56\x88\xe6\xc8\x81\x6f\x6b\xd3\x0f\xb4\x1d\x50\xca\xb4\x91\x19\x88\x9e\x41\x3f\xbe\xc8\xb8\x57\x56\x42\x53\x13\x05\xb9\x1d\xd6\xe7\xd0\x8f\x3b\xc3\xba\x52\x3c\x72\x42\x14\x38\xd4\xb8\x44\x6f\x82\xd0\x05\xfd\x19\x88\x02\x14\xc4\x01\x61\x71\x61\x0c\xe5\x5b\xf0\x7d\x00\x7c\x07\xd2\xe0\x17\xc2\xf4\xca\x37\xf1\x6a\xe4\x10\xc2\xb7\xd7\xe5\xc5\x9c\xb4\xe3\x45\xea\x98\x12\x5f\x3c\x85\xb3\x91\xf9\x95\xee\xf7\xe1\x3e\x5f\x3b\x0d\x89\xf3\xa0\x33\x5e\x36\xc7\xd1\x5a\x98\x46\x66\x75\xa0\x6c\x6d\x42\x6f\xce\x65\x9f\x96\xf4\x43\xe2\xed\xc2\xa7\xb0\x72\x49\xd9\x50\x10\x6d\x8e\x71\x5a\xd8\xe1\xfa\xdb\x57\xad\xe1\x1c\xa3\xa0\x45\x52\xee\x3a\x00\x67\xa3\x60\xd9\x14\x70\xe5\x99\x62\x69\xd0\x04\x4f\x15\xcb\x47\xd6\xa5\x9f\x6b\xd2\xb2\xaa\x36\xa9\x8c\xc1\xb3\x1d\x86\x6c\x40\x5d\xbb\xdb\x81\x8e\x39\xba\x86\x1b\x44\x47\xfa\xb9\x4e\xd1\xc1\xe0\xd9\xe5\x86\xb9\x6a\x51\x93\x69\x7d\x58\x0a\xe2\xb1\xe7\x46\xb3\x0d\x22\x2a\xf3\xc5\x4e\x71\x75\xc1\x46\x5e\x61\xf7\x88\x6e\xde\xeb\xc3\x0c\x0b\xdf\xe4\x2d\xc7\xb5\xb1\xc4\xfa\x7f\x6f\x10\x49\xf2\x07\x3b\xc5\x51\xd2\x2f\x7d\xc5\xf2\xa6\xab\x8c\x50\x2e\xb0\x94\xdc\x69\xfa\xb1\xfc\xf3\x2d\xd3\x8a\x74\x8e\xd6\x32\x01\xb6\xe4\x64\xdc\x7c\x77\xc5\xbf\x44\xa6\x0a\xc1\x84\x51\xdb\x60\xaf\x66\x54\xdd\x44\x95\x55\xd2\x47\x4c\x75\x37\x91\x13\x18\x61\xd7\x07\xb4\xe6\xf5\x89\x66\xbb\x2a\x53\x2f\x7a\xbf\xaa\x6a\x58\x1a\xb8\x9f\x18\x42\x58\x5f\x93\x27\xac\x56\x82\xaa\x55\xf4\x7d\xd3\x32\x81\xf1\xfc\x85\x31\xb6\x8c\xf7\xc6\xd1\xf9\x89\xb1\xb4\x8c\xdf\x7f\x37\x83\x59\x08\x22\x68\xcc\x01\xfe\xc7\xef\xbf\x9b\xc5\xea\x5e\xf2\xdc\xf5\x83\xd6\x2b\xb1\xb6\xec\x3f\x30\xd2\x0a\x49\x64\x0f\xcd\xb9\x34\x50\x19\x1d\x4b\xe3\x96\xda\xb4\xbd\x51\xa7\xd1\x9d\x23\x83\x56\x94\x70\xfd\xa9\x94\x3e\xc7\x1a\x84\xac\xc8\x47\xcd\x12\x57\x63\xf2\x19\x4d\x77\x63\x82\xd7\x17\xd4\x96\xaa\xef\x79\xac\x39\x49\x4b\x8a\xb7\x8b\xe9\x75\xdb\xda\x43\x34\xf1\x93\x57\x92\xb4\xf8\x48\xbe\x79\x56\x74\xe4\xd5\x4b\x04\x35\xd1\x5c\xc3\xc2\x57\xea\x8d\xa6\xba\x1f\x8a\x02\x60\x2b\x3e\xc4\x2f\x77\xf6\x15\xdf\x0d\x02\x88\x8b\xdf\xa9\x2c\x9f\x69\xae\xa7\x3d\x48\x53\x5b\x47\x77\x05\xd7\xeb\x06\xb9\x67\xd5\xb5\xf9\xaa\xe5\x54\x5f\x72\x6f\x36\x9a\x7b\x53\x88\xaa\xce\xe6\xde\x14\x95\xf5\xc6\xd2\x64\xc9\xb5\x86\xf4\xa8\x2d\x53\xea\xd8\x07\xb4\x64\xca\x76\xfa\xf6\x17\x99\x32\x63\x59\xf8\x22\x53\x7e\x91\x29\xbf\xc8\x94\x5b\x2d\x53\xae\xd4\x12\xa8\x5c\xa6\x1c\x6e\x44\xa6\x1c\x6e\x4a\xa6\x1c\x6e\x48\xa6\x1c\x36\x95\x29\x3b\xea\xe6\xb3\xbd\x32\x65\x3e\xa0\xe8\x8b\x4c\xb9\xed\x32\x65\x21\xfb\x2e\x2b\x53\x16\x3d\x0e\xdb\x2e\x53\xea\x59\xcd\xb5\xa4\xca\xb6\x76\xe7\x2f\x72\x65\xce\xc2\xbe\x31\xc9\x52\x16\x2b\x8e\x42\x68\x2c\x51\x6c\x44\x31\xff\x63\x01\x7c\x6c\x60\x64\x30\xb4\xb2\x76\xf9\x3c\x69\xf3\x7b\x9d\xed\x28\xd7\xc0\xc9\x08\xae\x94\xbf\xf6\xf3\x22\x69\x9d\xcc\xa9\x96\x36\x93\xc8\x2e\x32\x26\x0b\x38\x66\x7f\x8f\xd1\xfb\xec\xf7\xf8\xfb\x5c\x40\xa1\x6b\x3a\x9e\xb9\x9e\x13\x42\x5f\xb3\xb2\xc8\x91\x17\x25\xd0\xb0\xc9\xab\x02\x1c\xd1\x17\xd6\xdc\xf5\x8c\x52\x27\x9b\x2e\x67\x56\xe4\x3a\x67\x79\xb3\xca\x7b\xb5\xed\xdc\x59\xd7\xdf\xac\xc5\x9f\x5b\x3b\x6f\xbf\x30\xe8\xbc\x9b\xda\x78\x01\x63\x9a\x11\x45\xeb\x6f\x12\xd5\x43\xe4\xfa\x7f\x3e\xa6\x00\x42\x25\xb4\x36\x19\xcf\x19\x23\x0b\x60\x01\xbb\xb5\x81\x58\xe7\x1a\x6d\xd7\xcb\x59\xb7\xaa\x9f\x7d\x49\xe9\xa8\x1c\x05\xd7\xce\x51\x64\xfe\xf0\x8a\x53\xa5\x15\xa6\x4e\x7d\x0c\xc3\x4c\x8d\x29\x3a\xf4\x15\x0f\x49\xd6\x39\x0d\xcc\xd6\xf5\x9e\x2e\x42\x74\xed\x3a\xd0\x00\x46\x34\x43\x21\x36\xe8\x7a\x8c\x09\x0a\x0d\x3c\x83\x46\x28\x28\x8b\xd3\xae\x31\xae\xa6\xac\xd6\xe6\x8c\x8e\x29\xc7\x81\x91\x5d\x4b\x38\x27\x30\xb2\x43\x37\xa8\x16\x6e\x0a\xf4\x53\xdd\xfa\xa8\x0d\x09\x95\x4f\x56\x50\xd0\xbd\x7a\xf2\x71\xa4\xc5\xc8\x54\x94\x76\x4f\x5a\x2f\x1d\x5d\x52\xea\x91\x66\x41\xa4\xb5\x19\xf4\x02\x03\xe1\x19\x0c\x23\x23\xf6\x1d\x18\x46\x18\xf8\x4e\xf7\x94\xf5\x45\x8c\x59\x63\xc5\x30\x55\xf9\x98\xac\x30\xa3\x0c\x97\xda\xb4\x34\xd3\x69\xf6\x92\x9c\x77\xd4\x3e\x7b\x89\xf6\x52\x4a\xfb\x5c\x6f\x3e\x81\xe9\xd1\x4f\x7b\xd7\xd1\x2b\x17\xa8\x13\x98\x40\xc3\x54\xa5\xdc\x72\x8c\x39\xee\x3f\x30\x6b\xec\xcd\x33\x10\x1d\x35\x6a\xc4\x6e\x96\x58\x7d\xf5\x6c\xbd\x13\xd7\x6b\x90\xae\xac\x3a\x56\xea\x53\x95\xd5\xbb\x71\x23\x3d\xd0\xe1\x7b\x0c\xfd\x88\xe5\xfc\x68\x77\x41\x37\x73\x69\xd4\x2c\x4a\x50\xaa\xdd\x06\x82\xe0\x19\x2b\xc4\x05\x7d\x87\x76\x2f\xa5\xbb\x6c\x8f\x8a\xe8\x76\x61\x92\xd9\x57\x50\x38\x3d\x63\xe6\xec\xbd\xd4\x1e\xad\x91\xa2\x53\x99\xae\x45\xd6\x6e\x16\xcc\xb5\xe4\x6a\xbe\x75\xa7\xe6\x61\x51\x24\xcc\x76\x91\xfa\xa5\xc7\x89\xa2\x90\x6c\x26\x4b\x07\x24\x36\x94\xca\x7e\x40\x27\xbc\xb0\x77\x06\x90\x2a\x00\x68\x18\xf9\xcd\x86\x96\x66\xa7\x46\x25\x55\xc3\xb5\x51\x2f\xd6\xe6\xe6\x67\x8d\xcf\x35\xa9\x24\x7e\x8e\x0c\x89\x9c\x99\x9f\xaa\xfe\x13\x2b\x10\x4f\x29\xc1\xc4\x81\x87\x80\x93\x74\xda\xeb\x73\xce\xa5\xa7\x57\x52\x89\xb3\x74\x04\xd5\xd1\xaf\x28\x99\xfc\x92\xbe\x5f\x7f\x06\x57\xe1\x58\x15\x8d\xda\x79\x89\x7a\x66\xe4\x3a\x92\xce\x51\x61\x3e\x61\x05\xea\xb9\x79\x46\xaa\x4f\xcf\xb7\x51\x75\x09\xbd\xc4\x04\xe3\x57\x96\xa4\x57\x50\x51\x9d\x75\xd2\x94\x3b\x00\xd3\x4b\x99\xc9\x2b\xda\x0f\x7f\x7f\x2b\x52\x4e\xee\x40\x5f\x51\xd0\x11\xe6\x8d\x8d\x4b\x39\xee\x2f\xf3\xaf\x97\x7f\x2e\x3d\xb5\x94\x33\xe6\x45\x21\xb9\x79\x54\x1c\xe9\x55\xf5\xe3\xb2\xf2\xcb\x05\xa8\xec\xbd\xb2\x42\xc5\x94\x15\x4e\xa4\x52\xbe\x12\x61\x10\xd2\x12\xe9\x62\xff\xa4\xc5\x5d\x99\x85\x8c\xf7\x71\x4c\x94\xcb\xf4\x81\x31\x9c\xa0\x10\xb2\x22\xb0\x3c\x88\x2e\x53\xe1\x44\x7a\x3e\xcd\x6d\x04\x8e\x23\xbe\x26\x25\x14\x28\x5e\xaf\xf1\x6e\xcf\xd0\x82\x3b\x1a\x7e\x75\x3f\x80\x30\x3f\x87\xaa\x13\xaf\x06\x16\xa9\x4e\xd4\xdc\xa0\x65\x63\x20\xbd\xb8\x6b\x5c\x9e\x1e\x5f\x9d\x3d\x3f\x5f\x51\xd3\x69\xdc\xe1\xb1\x7c\x85\x1c\xf2\x8e\x7b\xed\x4a\xb6\xc1\xda\xe3\x2c\xcf\xed\x4b\x4b\xe4\x32\x0c\x76\x50\xca\x15\xf1\x7a\xad\x8a\x4a\xae\x49\xb9\xda\x8d\x56\x73\xcd\x52\x57\xf2\x3b\xa9\xe8\x2a\xee\xeb\xd5\x74\x45\x69\x07\xff\xb6\x25\x5d\xf3\x55\x7b\xff\x83\xcb\xba\xea\x04\xbc\xae\x24\xd3\xeb\xb3\xcf\xc7\x59\xee\x69\xee\xcb\x17\x25\x8e\x99\xdc\xa0\x3f\x14\x5c\x71\xbf\x56\xf8\xcf\xf2\xbf\x12\x7e\xb7\x22\xb3\xeb\x88\xd3\xad\x22\x35\x6a\xba\xa3\x72\x45\x5c\xb5\x0e\xe2\x0d\xd3\x42\xe2\x6b\xfa\x42\x0c\x6b\x26\x86\xe6\x88\x55\xeb\x4c\x0b\x0a\xce\x7e\x2e\x0c\x54\xae\xaa\xeb\x3a\xd0\x98\x83\x70\xea\xfa\x7d\x8c\x82\xfe\x83\xfd\xe2\x99\x5a\x3a\xba\x0f\x17\x09\xa2\x17\x1c\x71\x99\xd1\xd5\x0f\x68\x3b\x26\x89\x84\x0d\x5c\x1f\x86\xc6\x18\xbd\xd7\xd5\x15\xe5\x42\x43\xb4\x61\xcc\xc4\x2d\x7b\xb7\xfa\xdb\xac\x8f\x5b\xed\x08\x95\x5e\x9e\xb4\xfc\x8a\x31\x1f\xe7\xad\x87\xa5\x26\x8c\xe6\x96\x6e\x59\xdd\x2d\xdd\x66\x3f\xb9\x0e\x2c\xdd\x66\xc7\x1e\x8a\xaa\x8d\x21\x2b\x0a\x81\x5a\x18\x6b\x8d\xa8\x96\xf8\x69\xe4\x85\xab\x8c\x85\xa1\x1b\xa2\x2a\xfc\xda\x32\x41\x8c\x11\xd1\x26\x85\xd9\x49\x38\x4a\xe5\x5d\x92\xeb\xbc\xc3\xd1\x75\xce\x35\xe8\x7c\xd1\xd0\xec\x13\xcf\x88\x98\xc6\x44\x37\x33\x71\x98\x19\x19\x3f\x9a\xfc\xa3\xef\x4d\x0d\x37\xea\xbb\xfe\x35\xf0\xe8\xec\xf5\xde\x49\xa4\x1e\xee\x88\xe3\x33\xe7\xfe\x5c\x13\x4d\x26\xc5\x70\xf0\xce\x49\xe9\x2f\x40\x4d\xca\x21\x64\x52\xb0\x41\xe2\xaa\xe5\x63\x9d\xf9\x11\x0c\x71\x02\x71\x4a\x79\x1a\xe6\x4b\x95\x7b\x21\x08\x61\x04\xb1\x66\x44\xb9\x88\xb4\x5a\xa5\xbf\x59\xa9\xa3\xa1\x94\x5d\xb1\xd5\x8a\x68\x3c\xa9\x77\xf7\xca\xf1\xde\xc2\x53\xa1\x35\x4a\xa5\xcb\x83\x5d\xc9\x7b\x3c\x04\xbc\xf6\x92\x59\xe7\x1a\xc5\x58\xe6\x20\xe0\x35\x40\xc5\xcb\x11\x2b\x26\xa0\xfb\xfe\x7f\x1d\xbc\x4f\x87\xd0\x28\xd7\x54\xb7\xef\x74\x41\xa7\x08\x95\x27\xd3\xd3\x29\x27\x57\x39\x17\x45\x17\xf5\x8d\x06\x67\xdf\x2a\x83\x29\x0a\x7d\x33\xc0\x14\xdd\xa6\x5b\x6e\x35\xc6\x12\xc2\x7e\x36\x48\xa1\x2d\x77\x61\x71\x1e\x7a\xcc\x65\xdc\x66\x9d\x7a\xac\x85\x6c\x2d\x6e\x87\x67\xee\xbf\xc4\xaf\x14\x46\x58\x58\xa5\x4d\xa9\x2e\xb2\x07\xa4\xeb\x96\xc8\x68\xc1\xee\x1c\xf6\xc1\x14\xc9\x45\x64\x43\x08\xe4\xbc\x08\xfa\x78\x1c\x41\xe7\x50\x1a\x8d\xfc\x96\x0a\x9d\xad\x50\xdb\xb5\xe5\x66\x05\x76\xd2\x98\xba\x8a\xd8\xda\x46\x3f\xde\xb7\x68\x99\xe9\x3e\x46\xa6\x64\x7c\x1a\x70\x03\x74\xc6\x00\x95\x2d\x1a\x9d\x5c\x8c\xbc\x58\xb2\x34\x49\xd6\x36\xf9\x69\xe9\x72\xf2\x7c\xc6\xef\x4a\xa4\x30\xb6\xe4\x37\x9a\xe5\xd7\xb3\xa5\xe5\x1a\x25\x43\xa9\xce\x05\x53\xd3\xe3\x58\xac\x12\xd8\x32\xb5\xa5\x1e\xf5\xed\x8a\xfa\x95\x0f\x5d\x9d\x75\xc0\xf6\x7b\xc6\x1c\x2e\xa1\xa7\x2c\xa2\x55\x9e\x63\x08\x9d\x55\x3a\x91\x52\x5f\x32\x9d\x0b\x65\x9b\xac\x4f\x73\xde\x3d\xaf\x7f\xe0\xb7\x43\xaf\x9e\x43\xb9\xe1\x31\xa8\x4b\x0f\xab\x1f\xed\x0e\xc4\xc0\xf5\x22\x0d\x99\x8c\x5b\xaa\x57\xe9\xf9\x5a\x22\x59\xb0\x58\x3b\x1c\xc6\x84\xc0\x14\x21\x11\x2d\xe4\x8c\xda\x55\x47\x76\xdd\x57\x2b\xf3\xe6\x56\xc6\x49\x1d\x05\xd4\xf5\x8b\xd5\xa0\xa0\xd5\x64\x07\xe1\x7d\x54\x08\x0e\xaf\x50\x6c\xcc\xc0\x35\x34\x7c\x54\x8c\x70\xfc\xdf\xff\xf3\xff\x35\x78\xd8\xbb\x01\xfc\x65\xa2\xb7\x80\xc8\x00\x06\x4e\x8e\x17\x5d\xf7\x4d\x2d\x5c\x55\x97\x0b\xd7\x1a\xee\xb7\x6e\x8f\xcb\x35\x85\x0a\x64\xc3\xe0\xeb\xa3\x05\x52\x46\xd9\x20\x70\x20\xe3\x78\x69\xd8\xd0\x5e\x2b\xbd\xa9\x20\x7d\xb2\x10\xd9\x26\xa1\x02\x1b\x0a\x21\xe0\xf3\x5b\x31\x7e\x20\x84\xd7\x6e\xc4\xc0\xbd\xe1\x00\x82\x9f\xcf\x4e\x4f\x8e\x7e\x7d\x75\xde\xb4\xc7\xaa\x7c\x08\xea\xc5\x42\xbe\xe0\x6b\x6c\x10\x09\xd9\x44\xd1\x6a\x6d\xc6\x59\xd5\x86\x23\x99\x03\x63\xb7\xcf\xd2\xa4\xa5\x0d\x0d\xa6\xe7\xcc\x1a\x26\x5b\xb2\x99\x08\x2b\xb6\x98\x89\xe8\x2e\xff\x85\x20\xef\x02\xe0\x59\x72\xe5\x29\x18\x43\x8f\x5e\x79\xc3\x52\xc3\x7d\xea\xea\x65\x70\xec\x07\xae\xfd\x2e\xdd\xcd\xa1\x04\xde\x4a\xf7\x29\x9d\xa0\x40\x46\x6a\xc1\xa3\x66\x3f\x9e\x59\x50\x69\xb3\x5b\x85\xe3\xae\x05\xb5\x46\x76\x0b\x35\x47\xb4\xe3\x4e\x26\xfd\x0f\xc8\xaf\xad\x20\x31\x03\xd1\x89\xcb\x8d\x9a\x1d\x28\xe2\xd5\x2d\x3a\x15\x34\x36\x7c\xc4\x26\x6b\xbe\xb1\x70\x18\xd7\x25\x33\x74\x10\xaa\xd8\x00\xbb\xba\x87\x63\x07\x71\x3e\x9f\x95\x39\x97\x65\xc8\xc0\x08\xa3\x10\xf6\x67\x2e\xf9\x77\xd9\xd7\x4c\xb9\x2c\xaf\x3d\xfa\x38\x57\x7a\xd4\xfc\x5b\x12\xb6\x12\x22\xcf\x1b\x03\xfb\x5d\xbf\xf0\x70\x55\x49\xd1\x17\x6c\x86\xe4\x20\xa6\x27\xf0\x35\x0c\xa3\xba\xe4\xa0\x75\x5a\xd6\x44\xf3\xd1\x8a\x35\x75\x96\x0d\x59\x83\xfc\xd6\x39\x91\x5a\xe3\xd6\x66\x46\x6a\x8d\x52\xc8\x8f\x14\xf8\x14\x45\x85\xea\x53\xd9\xb5\xbe\x53\x9b\x1f\xd9\x5c\xee\x23\xb8\x35\x08\x72\x13\xda\x13\xac\xbc\x3a\xbb\x5d\x43\xa9\xaa\x59\x8c\x46\x06\x54\x66\x9c\x2d\xca\x83\x5a\x6d\x5e\x2d\xb2\xa1\x5e\xf0\x1d\x58\x92\x06\xc5\xc9\x6d\x25\x84\xad\xc8\x4e\x1a\x69\x03\x0d\x03\xe7\x13\xe1\xca\x98\x03\x47\x4f\x4f\x7d\xb4\x06\x65\x43\x4c\xa3\x9d\xb6\xe1\x7e\x20\x94\x88\xe3\x60\xf3\x5a\xc6\xe9\x71\xf8\x72\x76\xf1\x93\xbb\x82\x96\x41\x8e\xef\xc7\x85\xbd\xca\xd1\x35\x1b\x4a\x77\x9e\x42\xfc\xfb\xdf\x23\x83\x2e\x95\xf1\x3f\xf7\x43\x91\x32\xc5\x9b\xf7\xa4\x37\x4f\x00\x06\x63\x10\xc1\xc3\x4c\x18\xfb\x1c\x39\xd0\x23\xdc\x7e\x5c\x99\x81\xc3\x07\x24\xa2\x42\x9e\xdb\x2c\x99\x82\x54\x62\x4a\x8b\x00\xab\x55\xf3\xda\xe4\xaa\x7c\x14\x8f\xe7\x5c\x48\xd2\x0f\x90\xa9\x15\x51\x4c\x75\x05\xba\x2b\x08\xe6\x15\xfb\xab\xaa\xd0\x9c\x9c\x3f\x9e\x0d\x77\xa0\xab\x70\x31\xbc\xe2\xe6\x0c\xb9\xd6\x9c\x00\x67\x62\xbf\xcb\x47\x32\x90\x4d\x33\x0f\xf0\x92\xbe\x7c\x1a\x86\x48\x51\x8f\x2e\x13\xac\x20\xdf\x31\x6b\xfa\xe5\xa7\x80\x68\x91\xe8\xfb\xeb\x0c\x50\xd2\x5a\xa2\x38\x34\x70\xe8\x8e\xa1\x61\x03\xcf\x83\x8e\xf2\xa4\x6a\xa4\xfd\x34\x46\xdf\x63\x9e\xfa\x6d\x02\x67\xee\xfa\x4f\x52\x37\x56\xf2\x76\xe6\x5a\x35\x7a\x1b\x21\x36\xf7\x41\x35\x76\x33\x7e\xb5\x32\x0c\x27\x83\x6c\x1d\x96\x0d\x07\x19\x01\x44\x81\xc7\x30\x4c\x30\x7e\xeb\x38\x7e\x0a\x0a\x28\x96\x2f\x75\x8d\xe1\x64\x6c\x35\x82\x65\xff\x68\x19\x7e\xc5\x10\x5b\x85\xde\x9f\xd0\x82\x66\xe1\x4f\xd1\x35\x0c\x7d\x2a\x1b\x87\x70\x02\xc3\x88\xc8\x9f\x4b\x14\xdf\x36\x9a\x4f\xe7\xc0\x95\x19\x74\xf2\xbb\x6b\x04\xb3\x81\x2d\x13\xb2\x7f\xb3\xe8\x65\x17\x2b\x70\x4b\xdf\xde\x2a\xc4\x9e\x23\x23\x0a\xc0\x7c\x60\x9c\x5e\xc3\x70\x70\xdb\x68\xbc\x00\x51\xb4\x40\x99\x28\x57\xf9\x52\xd7\xc8\x4c\xc6\x26\xb2\xa8\xf8\x33\x8b\xd2\xe4\x7a\x05\x56\xc5\x30\x5b\x85\xd8\x4b\x34\x87\x98\x96\x59\x25\x7a\xa3\x0d\x7c\x23\x84\x73\x48\xe4\x4d\x63\xe1\xe2\x19\x8a\xb1\xb1\x08\x59\x0f\x5d\x97\x70\xee\x85\x52\xcb\xad\x40\xbe\x4a\x81\x12\x42\x58\x95\x02\x95\x94\x01\xa8\x94\xec\xa4\x85\x50\xe9\xbb\xce\x0d\x55\x50\x2e\xba\xd1\x22\x12\xf1\xbf\xb1\xf6\x40\x0b\xe7\xf6\x79\x7b\xef\x4d\xab\x0e\xef\x9f\x9e\xbd\xfc\xe5\xd1\xc3\xdf\x56\x50\x1d\xe4\xf9\x97\x28\x10\x7a\x8e\x7d\x6e\x82\x9d\x7a\xcb\x80\xda\xe4\xab\xf4\x80\x20\xf7\xd2\x1c\x46\x11\x4b\x14\x52\xd7\x5b\xed\x1a\xe7\xd2\xa2\x1b\x23\x9c\x05\xe5\xec\xd9\x00\xc3\x29\x0a\x97\x7d\xca\x61\x36\x8f\xfa\x87\xbf\x3d\x7d\xfe\x9b\xf7\x83\xad\x4e\x6e\xb5\x01\xd6\x2c\xde\x91\xe4\x0e\x94\x61\x5f\xdb\xc4\x5c\xfa\xbc\x8d\xca\x4a\x28\x96\xbe\x42\x2b\xfd\x32\xd0\x12\x3e\x72\xbf\x26\x2b\x20\xa3\xe9\x96\x45\x61\x52\xe3\x11\x45\x9a\xcb\xf2\xe1\x2b\x2b\x03\x05\xf9\x19\xc5\xe3\x7e\x7e\xb8\xcb\x78\xcc\x33\x2c\x0d\x3a\xe1\xc8\x70\x7d\x8c\x0c\x3b\xf9\x8a\xb1\x98\xb9\xf6\x8c\x72\x65\x0e\x67\xa9\x18\x36\x61\xcf\x46\x08\x23\x1c\xba\x36\x86\x8e\x01\x28\xdb\x54\x9e\xcd\x99\x99\x29\x94\x68\x7a\x46\xb0\x26\xaf\xa9\xdd\x8a\x33\xe9\x2a\xc3\xd5\x91\xe3\x94\xd8\xac\x5a\xd9\xff\x8d\x79\xd8\xbf\x57\x8e\xa5\x26\x27\x79\x4d\xbd\x2c\x1a\xa7\x99\x6c\xc1\x8c\x24\x5e\x5e\x10\x8b\x63\x7f\x69\xe4\x92\x07\xc4\x75\x9d\x5a\x58\xe5\xd8\xd9\xac\xc9\xb1\x1c\x73\xec\xce\xda\x0b\x2e\x7d\xae\x3c\x42\xf1\xe9\x0c\x53\xa8\x0e\xc2\xb5\x25\x52\xe9\xc2\xcb\x49\x1b\xf6\x15\x60\x65\x2a\x4a\x8c\x43\xc7\xc5\xcf\x90\xd3\xae\x75\x60\x8e\x73\x68\xf3\x87\x4b\x22\xa3\x29\xa2\x48\xc7\xf1\x78\xcc\x8b\x8a\xb0\xdd\xf2\x46\x15\xb7\x68\x23\xaf\xff\xa8\x8e\x1d\x74\x63\x50\x53\x75\xb8\x4d\xd8\x43\x49\xa0\xa5\xd0\xdc\x45\xa8\x72\x8a\xda\xbc\xf8\xae\x51\x20\x4f\xdb\xe8\xde\x1c\x6b\xa5\x14\xbb\x34\x9a\x43\x58\x1d\xf4\x2e\x19\x4e\x86\x4a\x80\x74\x53\x70\xdf\xf5\x27\xa8\xf8\x9d\xe4\x44\xcc\xd5\x3e\x31\xe4\x93\x62\x92\xed\x7a\xaf\x7a\x75\x98\x20\x56\x8a\x84\x96\x9e\xe0\x77\xa5\x2f\x58\xe2\x13\x69\x20\x7a\xd8\x62\x16\xc9\x6b\xe9\x0c\x02\x18\x46\x34\x7a\x85\xd9\xc9\x0a\x1f\x5f\x3d\xda\x51\x15\xef\xa7\x41\x39\xc8\xeb\xdf\xe7\x01\xc4\x11\x53\x28\xeb\x9a\xde\x77\xc1\x7f\xba\x76\x13\x56\x76\xa3\xe6\x1e\xc2\xd2\xa8\x66\x6d\x0f\x62\x67\x87\x7a\x79\x38\xb6\x82\xbf\x4a\xe2\x25\xd0\xea\x0c\xdc\x0a\x0f\xca\x7e\xf4\xa9\x4e\x43\xa7\x5e\x16\xa8\xbe\x72\x43\x7a\xbd\x9c\x8e\xc7\x49\x52\x4a\x2a\xb9\x01\x0d\x98\xce\xd0\xe2\x88\x3e\x76\x21\x62\xc0\xda\x86\xb7\x37\xd2\x7f\xf7\x69\xd5\x95\x38\x74\x71\x45\xc3\xae\x26\xd2\xa4\xd6\x86\x5e\x25\x7f\x41\x6f\xd0\xf5\x60\xf4\x05\x14\x87\x4e\x75\x67\xf9\xcd\x21\xaf\x98\x74\xf2\x99\x20\x2e\xb3\x87\xd5\x79\x27\x35\xa2\x50\xd5\x8e\x56\x14\x2d\xec\x86\x02\xd2\x4a\xf7\x1a\xd9\x2a\x1b\xa4\x83\x86\xd9\x29\x2b\x9f\xd3\xab\x14\x55\x1c\xae\x9c\xb3\x20\x95\xb4\xb8\x97\x94\xb4\x10\xe0\x4a\x7d\x07\x76\xc1\x70\x72\x7b\xb9\x08\x25\x9a\x27\xd5\x0f\x12\x42\xe7\x84\xbf\x96\x90\xb8\x72\x60\x7e\x2e\x0d\x02\x92\xf3\x94\xee\xae\xad\x6c\xe2\x22\x30\x59\x11\xe7\xd6\x7a\xd2\xff\x51\xd5\xbd\xdb\x36\x29\xb9\xf5\x06\x25\xeb\xab\x1c\x7a\x09\xb1\x41\xb6\x00\xa2\x7b\x80\x09\x8b\x26\x97\xb7\x59\x32\x90\x10\xde\xa5\x6c\x20\xb1\x67\xf8\xe3\xd5\x89\x04\x3f\x86\xc0\xc7\xe2\xc9\x56\xa9\x40\x2c\x15\xc1\x58\xcc\x10\x35\x1f\x5f\xbb\x70\x91\xb3\x1d\xbb\xbe\x91\xaa\xe8\x6a\xe8\x26\xa9\x17\x04\x7e\x9e\x1b\xe1\x24\x2f\x22\xb1\xaa\x60\x38\x17\x26\x80\x27\x2e\xf4\x08\x13\x8d\x5c\x7f\xea\x41\x36\x01\xf3\x4d\xde\xf4\xf5\x52\x68\xbb\xe6\x24\xf6\x3c\x66\x4a\x4d\x8c\x40\x75\xe5\xda\x54\x15\x62\xbb\x71\xe9\x28\xdd\x32\x6d\x9d\x3b\x49\x6c\x35\x06\xd3\x68\xf3\xbe\x9d\xf1\xa3\x7f\x1d\xff\xf2\x2b\xb8\x56\xfb\x76\xf0\x54\xd3\xb5\x33\x03\xd1\x8c\x2e\xa0\xd6\xac\x89\xc1\xf4\x83\x66\xe6\x51\x36\x99\x3d\x62\x1d\x43\x19\x99\xfd\x19\xc3\x70\xd9\xa7\xf8\x8e\x52\x0a\x9b\xf0\xae\xa9\x89\x29\xe1\x0d\x57\x21\xe5\x64\x74\x3e\x55\x55\x8e\xf9\x30\xcd\x9f\x15\x74\x56\x9b\x8a\x58\x91\x1a\xda\x4d\xe8\xa9\x8a\x4e\x56\x25\x36\xde\xb7\x74\xe3\xd4\x76\x1f\xff\xeb\xc5\xbf\x2e\x7f\xfd\x49\x4d\x6d\x92\xe4\xa2\xdd\x0b\x20\xd3\xbe\x33\xef\x4f\x2c\xef\xdb\x5a\x4f\xa7\xb2\xbd\xaf\x61\x29\x7f\x53\xae\x81\xd1\x75\x73\xd6\xac\x19\x25\xa1\x8a\xba\xc2\xf7\x7e\x71\x43\x25\xd5\x21\x44\x55\x5e\x76\xfe\x50\x80\x66\xcb\x3d\x88\x6b\xca\x5a\x0f\x69\xcb\x54\x76\x57\xdb\x64\x57\x2a\x39\x95\xf4\x7e\x6d\x54\x77\xbf\xc3\x2e\xac\x8a\xd1\x13\xe7\x81\x8a\x85\xe7\x2b\xd5\x5e\x71\xbe\x98\x24\xcc\xd3\xdf\x5a\x25\x47\xeb\x33\x9f\x67\x20\x12\xa9\x25\x47\xcd\x2b\x42\x95\x42\x2a\x69\x19\x58\x11\x54\x43\xa9\x33\x69\x96\x5d\xa5\x35\x9b\x9d\xf6\xb1\x6d\xaa\x65\xd3\xb5\xbc\xe5\x8b\xe9\xc8\xc0\xd9\x7a\x0e\x6f\xb9\xd4\xfe\x76\xec\x01\x5f\xa3\xa9\xae\x52\xa3\xcf\xbf\xd6\x19\x74\x4b\xe9\x61\xa5\xb2\x35\x3a\x6d\xfa\x35\x8c\x4f\x19\xdd\xea\x1a\xf6\xd3\xc3\x8c\x49\xe1\x46\xf3\x32\x33\x35\x06\x21\x32\xf1\x13\xd9\xef\xd3\xc8\xf9\xa5\x4f\x1c\x68\x1e\x80\x10\xbe\x05\x21\xed\xe0\xd5\xc2\x67\xd3\x18\x80\xb5\x26\xc1\x2a\x5e\xd4\x5d\x1b\xdd\x66\x93\xe6\x86\x96\x4a\xbc\x77\x56\xb4\x66\x03\x78\x6f\x62\xfe\xd3\xe0\x5d\x2b\x16\x24\xd1\xaa\x85\xab\x3d\x60\xa1\x42\x4a\x91\x67\x6d\x42\xfd\xe6\xd5\x38\x52\x64\x6a\x56\xe2\x68\x50\x84\xe3\x24\xef\xf6\x5d\x57\x1b\x0f\xc1\xd3\xe5\xc5\x78\xd0\x9f\xe2\x59\x89\x1f\x79\xf8\x28\x95\x21\x8f\x93\x3a\x31\x6d\x5a\x7e\xe4\x38\x7e\xd7\x58\x22\x7c\x36\x83\x23\x7a\x62\x94\x9a\x47\x28\x5b\xd6\x41\x50\x8e\x7f\x37\x47\x0f\xb7\x8c\x50\xf9\x97\x36\xa4\x5c\x23\x3e\x0a\xe6\xa9\x2e\x2d\x2a\xe4\xc0\x7c\x1e\x08\xf9\x90\x87\x61\xb0\xe2\x05\x9d\x88\xa1\x04\x2d\x34\x1a\xac\xbe\x22\x36\x5f\x56\x26\x98\x39\x59\x10\xed\x35\x26\xc5\xe8\xbe\x36\x1d\x37\xa4\x85\x3c\xcc\x23\xc7\x91\xac\x52\xd7\x2e\x30\x76\x8d\x93\xe7\xc7\x2f\x9f\x9d\x9e\x5f\x29\xe2\x66\xda\xae\xe2\x29\xb2\xdf\xa1\x58\xab\xb6\x77\xc3\x95\x5c\xbb\x91\x3b\x76\x3d\x17\x2f\x4d\xcb\xbc\xa4\x24\x25\x9d\x9d\x06\x08\xa1\x11\x84\xf0\x1a\xfa\x58\x84\xd8\x4f\x42\x34\xa7\xe6\x38\x72\x01\xf8\x8e\x41\x6b\x1c\x92\x1f\x59\xed\x54\x77\xe5\x6b\x30\x47\x30\x4b\x42\x5b\x7b\x44\xba\xfe\xdb\x8a\x6d\xfe\xd5\x39\x3b\x5e\xe2\xf3\xa7\x6a\x8b\x44\x3a\xbf\x1a\x9b\x04\xf5\x08\xb1\x28\x41\x69\x4d\xdd\xbb\x84\x6a\xbc\x0d\xec\x2d\x83\xfd\x78\xb4\xaf\x72\x3b\xd4\x8c\x50\xed\xff\xa9\x79\xb9\xe0\xfc\x61\x54\x7e\x21\xb7\x2b\x29\x35\xd9\x6b\x78\x7e\x1e\x13\x1c\x2c\x29\x7c\xd0\x35\x0c\x27\x1e\x5a\xf4\xdf\x1f\x1a\x20\xc6\xe8\x9b\xfc\x8c\xf5\x9c\x34\x72\x60\x27\x06\x63\x0f\xf6\x43\x18\x05\xc8\x8f\xdc\xeb\xa2\x55\x49\x31\x22\x7d\x27\x6f\xbe\xa0\x05\xb3\xd8\x68\x33\x32\x4f\x69\x9b\xf7\x93\x17\x34\x8a\x4c\x60\x02\xcf\xba\x67\xa5\xc7\x75\x4a\x28\xc8\xa3\x17\xa5\x7e\xad\x57\x1e\xd3\xd8\x2e\x5e\x05\xe9\x5e\x1e\xdb\x0d\xf4\x17\xf5\x88\x5f\xe7\xc1\x09\xdf\xe3\xbe\x1c\xce\xb7\x6f\x99\xf2\xa1\xae\x53\x9c\x41\xaf\x7e\xc3\xa6\x00\xc8\xbf\xf0\x8b\x0b\x17\x2d\x80\xc5\xdf\x7e\x06\x7c\x7e\xb0\xb4\x7b\xff\xf9\x82\x27\x62\xb4\xc0\x55\x05\x66\x8e\x69\x15\xde\xee\xc7\x3d\xd5\x0e\x99\x69\x32\x6a\x9d\x87\xb1\xed\xb8\xcc\xe2\xd1\x39\x6c\x51\xa0\x19\xef\xd5\x64\x54\x51\x25\xb1\xed\xc6\xad\x18\xfa\x28\x08\x42\x74\x0d\x74\x4b\xa8\x74\x50\x62\x06\x17\x83\x04\x4c\x85\x71\x3f\xdb\x40\xab\xb5\x89\x42\x97\x61\x48\x6f\x24\xfc\x5c\xea\x29\x2b\x7c\x9b\xad\xa2\x81\xcf\x64\x3b\x3d\x64\xb2\x8a\x45\xef\x14\x5a\xb8\xef\x2c\x51\xdc\x6b\x11\x1f\xac\x9a\xbe\x6e\x38\x54\x7d\x83\x0e\x6a\x1a\x65\x79\xa6\xa9\xd9\x39\x5f\xd4\x98\x9d\xd3\x44\x36\xea\x53\xb7\x4f\xa6\xa2\x37\x83\x41\xda\x1c\x90\x9b\x40\xc9\x2b\x8c\xc7\x6a\xf5\x9d\xd7\x26\xb5\x6d\x04\xca\x9c\x9e\x06\xda\x60\x11\x87\xc7\x5f\x1f\x30\x88\x1c\x73\xda\x70\xe1\x87\xe2\x5f\x14\x2c\x0e\xb2\x19\x50\x80\xe3\xe8\x80\x44\xe8\x78\x5c\xb1\xff\x6b\xc3\x84\xe6\xf1\x34\x00\x8a\xa8\x9f\xf8\xd7\x86\x0a\x37\xb9\x37\x80\x4b\x6a\xf8\xff\x6b\x43\x86\xba\xa0\x1a\xc0\x45\x38\xc1\xfe\xda\x50\xb1\x51\xb0\x6c\x02\x15\x26\xd2\xfe\xd5\xa1\x92\x54\x6b\x6f\x00\x19\xb9\x78\xf9\x5f\x1b\x3a\x80\x6a\x09\x8d\x80\xc3\x14\x8b\x35\xc1\xc6\x6c\xea\xda\x6a\xf2\x95\xf2\x9b\xf9\x3b\xd5\x01\xad\xab\x47\x1e\x9b\xdb\x15\x76\xdc\x76\x3a\x8d\x13\xda\x23\x88\xb3\x06\x49\x55\xe8\x71\x31\x1f\xae\x12\x1b\x85\x6b\x79\x1a\x5a\x5b\x10\x6a\xde\x82\xde\xd6\x12\xcf\x44\xe6\x19\x04\xac\x75\xf6\xa6\xcd\xf0\xc7\xf8\xb7\x3f\x17\x3f\x3e\x53\x87\xa1\x7e\xce\xd5\x45\x4a\xaa\x05\x98\xca\x06\xc3\x6d\x12\x5f\x4b\xbf\x5c\x11\x1e\xa9\x3b\x84\x20\x07\x6d\x13\x34\xab\x8a\x52\x08\x79\xa4\x53\xe1\x83\x65\xc3\x1e\x15\x11\x24\x19\x45\xcc\x32\xed\x38\x8c\x50\xd8\x0f\x90\xeb\x33\x76\x96\x0d\x85\xcc\xee\x77\xcd\x41\x4b\x79\x03\x4b\x31\xe3\xb6\x46\xee\x32\xd3\x2b\x59\x52\x38\x21\xe5\xb8\x49\x85\x75\x67\x2d\x76\xb0\xba\x93\x4b\x2b\xc0\xcd\xcc\x16\x70\xa8\x4e\x28\xd6\x2d\x97\xda\x31\xc5\x76\x43\xb4\x55\xa3\xe8\x57\x9a\x57\xc9\x46\x0d\xab\x4a\xd4\x76\xa5\x65\xdc\x59\x51\x05\x92\xde\x28\x6b\x45\x3b\x03\xd1\xf9\x0a\x55\x1f\x85\xfb\xae\x49\x17\x59\x05\x6c\x5b\x14\x9a\xbb\x08\x61\x14\x19\xac\x97\x2d\x46\x46\x04\xae\xa1\x81\x42\xe3\x34\xb2\x41\x40\x4b\xe3\xdb\x0d\xf2\xea\xd7\x6d\x7c\xae\xdf\x74\x39\x41\x71\xbb\x04\x88\xcc\xc1\xbf\x9a\xf4\x40\xf6\xef\xe6\x45\x87\x5d\xf8\xe3\x3d\xfc\xe8\xe7\xd3\xf2\xea\x64\x44\x57\x71\xe0\xfb\xa2\x0b\x3f\x1b\xc6\x9d\x13\x81\xc4\xb6\x15\x4c\x3c\xc8\x7a\xb1\x65\x0e\x9f\x18\xe0\x73\x7e\x05\xc5\x6e\xf1\x2b\x84\x8b\x4d\xc8\x2f\x1a\x0d\xd4\xcb\x79\x22\x6d\x9d\xee\xc1\x09\x36\xe6\x61\xab\xfa\x47\x9a\x1c\xbe\x7c\x06\x34\xc1\x47\x34\x3d\xa3\xa5\x98\xcc\xd4\x9f\x92\xcb\xdb\x28\x8b\xc6\x72\xb4\x9c\xc7\x66\x49\x0a\x09\x06\x63\x1f\x5c\x4b\xbc\x52\xe7\xac\x2b\x49\x05\xc1\x60\xac\x10\x87\x28\x7c\x2e\x6b\x13\x41\x4a\x0f\x66\xe1\x1c\x7f\xc2\xb2\xa1\x2c\x41\xc1\x8a\xfc\x0e\xe9\xa8\x3e\xf2\x3c\x63\xc7\x6c\x02\xc8\x5e\x91\x47\x15\x72\x13\xe4\x2a\x78\x15\x4d\xd8\x52\xff\xd6\x14\x27\xaf\x87\x08\xe1\x13\x64\x1f\xa3\xd8\xa7\x99\x19\xfb\x19\x91\xac\x75\x53\x5a\x4d\x2c\xb0\xc6\x83\x64\xee\x1f\xa0\xd3\x25\x36\x32\x03\xd7\x61\xe5\xa5\xfc\x70\x82\x9f\xe1\x23\x2b\x07\x9d\x4a\xbc\xb4\x0c\xf6\xd5\x3c\x02\x1b\xa8\xc9\x7a\xcc\x65\xbb\xf8\x4a\xd5\xce\x16\x5b\x45\x2a\x59\x50\xc6\x74\xd2\x47\xba\xd9\x2a\x12\xa3\xc0\xd8\xf5\xa7\xed\xfc\xd8\xff\xf3\xdf\xff\xf3\xdf\x66\x21\x31\x8c\x9d\x87\x83\x24\xe3\x57\x3f\x33\x2c\x97\x6a\x49\x2d\x12\x7d\x32\xb2\x21\x15\x7f\x78\x50\x96\x7a\xf9\x28\x2d\xaa\xf0\xd4\xf5\xdf\x31\xb1\x56\x86\xe2\xff\xfc\xf7\xff\xfe\x5f\xff\xb7\x4e\x60\xe7\x7a\x29\xbe\xe5\xe9\x60\x96\x17\xf9\xab\x44\x7a\x19\xfe\x1a\x72\x35\xed\x0c\x43\x7d\x56\x26\x51\x88\x2a\xf9\xab\xba\xbe\x1b\xd9\x15\x09\x43\x4b\xcc\xbb\x09\xb7\x6f\xc2\xd0\x86\x56\x65\x67\xfa\x82\x65\x55\x6d\x7d\xb9\x8d\x3d\xf8\x65\xf3\x75\xd8\xfb\x8e\x3d\xa7\xaa\xee\xd0\xb5\x08\x5d\x21\x39\xab\x53\x43\x45\xc2\x75\x3e\x37\x34\xb1\x4d\x45\xa9\x9c\x96\x34\xf7\x8d\x72\x5a\x47\x31\xe7\xc4\xcc\x67\x39\xa4\x9a\x09\x3b\xd2\x68\x76\x42\x94\x23\x99\xfc\xef\xf4\x67\xfa\xe5\x12\x95\x46\x3f\x1d\x26\xb1\x22\x68\xe6\x67\xd4\x55\xae\x6f\xa4\x21\xaf\x47\x49\x26\x52\x46\x0b\x0d\x39\x9c\x22\xdc\x97\x9a\x01\x6c\x58\x3f\x7e\x72\x16\x9e\x5e\xec\xde\x7f\xa4\x6d\x5a\xaf\xb1\xfc\xb1\x05\x69\x58\xfe\x8a\x52\x4e\x04\x96\x57\x33\xe0\xbf\xab\x66\x94\x06\xff\xaf\x7c\xcf\xc2\x08\xe2\x3e\xa6\x23\x09\xde\x36\x46\x18\xa3\xb9\x54\x58\x6a\xdf\x32\xd9\xb7\x06\xc6\xf1\x0c\xda\xef\x58\xb3\x20\xda\x4e\x83\x66\xf2\xb8\x7e\x84\xc3\x98\xa5\xb5\x0e\xda\x19\x4e\x6b\x27\x5a\x66\x44\x34\xa4\xff\xcc\xb2\xee\x15\xb0\xbe\xff\x48\x7e\x9c\x2a\xeb\x63\xce\xf0\xc8\xfc\xb4\xc9\x61\x91\xe9\x3d\x92\xf4\x1c\x11\x97\xb3\x86\xc3\x8f\x1f\xdd\x89\x51\x6c\x3f\x62\xfc\xfe\xf7\xd4\xa4\xf8\xfb\xdf\x7b\x37\x37\x0a\x73\xa1\x3c\xdb\xe2\x3a\x4a\x01\x59\x14\xc8\x15\x20\x6c\xdc\x3d\x22\x08\xdd\x39\xf7\x5f\xf2\x81\x5f\x10\xca\x2a\x9f\x9b\xa6\x99\xaf\x6a\x19\x45\xab\x89\x18\x3c\x2b\x06\x80\x18\xcf\x06\x1e\x9a\xba\xa2\x35\xb0\x8a\x00\x8f\x3d\xd7\x7e\x67\xcc\x20\xeb\x17\x1a\xb9\x53\xdf\x70\x35\x12\x9f\x36\x64\x5e\xcc\xf0\xbd\xc6\x7c\x13\xf9\x63\x04\x42\x67\x2f\x9a\x81\x10\xf6\x27\xdc\x34\xbe\x69\xe6\xe9\x4e\x4f\x96\x0f\x66\xbf\xad\xd2\xf5\x82\x2f\xc4\xf5\xa7\xfd\x12\x13\x5f\x25\xe9\x57\xbc\x53\xcd\x24\x8b\x82\x8d\x86\x16\x6e\x23\x8f\x56\x7a\x8e\xe6\xfd\x87\x2d\xf4\xf0\xc8\x75\xe0\x18\x14\x2c\x98\x25\xda\x93\x3b\x9f\xe6\xde\xf7\xd0\x14\x19\xee\x7c\x9a\xcb\xc2\x79\x6c\x99\x51\x68\x9b\x96\xb9\x07\xa2\x08\xe2\x68\xcf\x9d\x4f\xf7\xc8\xb3\x7d\x1b\x79\x28\x1c\x04\xa9\xbb\x47\x1d\x41\x51\x37\x6d\x0c\xa6\xb0\x3f\xd4\x34\xe6\xc9\xcc\x3c\xed\x71\x68\xc4\x01\x3b\x62\x80\x6d\x73\x9b\x8c\x4e\xc0\xfa\x8a\x9e\xa7\xd2\xd3\x83\x2f\xa9\x3f\x69\xd1\x90\x4e\x85\x2a\x7a\x98\xc8\xb9\x6e\xaa\xf1\x53\xbe\x4b\x7d\x54\xec\x8a\x38\x71\x54\xcb\xcc\xe9\xc9\x7a\x73\x69\xd3\x92\xca\xb5\xdf\x91\x49\x1a\x28\x34\x10\x9e\xc1\x70\xe1\x46\xab\x35\x49\xdd\x1c\x06\xbd\xc6\xed\xe6\x9a\xe0\x4f\x1e\x7d\x6b\xd1\xf7\x32\x8a\x81\xe7\x2d\x0d\x1f\x61\xda\x32\x2e\x22\xa8\x04\xbc\xff\xe3\x44\x97\x9a\x3b\xc0\xa7\xa1\x3c\xc1\x35\x86\xca\xc0\xdc\x4f\xa1\x5b\x11\xcd\x24\x48\x97\x40\x85\x6a\xde\x9d\xf9\x28\x1b\x73\xc6\xea\x6e\xed\x52\xf8\x87\xfc\x60\x4d\x97\xb5\xcd\x6e\xa3\x83\x54\x01\x93\x42\xd2\x66\x08\x45\xd0\xd0\x9d\x68\xed\x6e\xca\x7e\x24\xdd\x4d\xb9\xab\xdb\xb0\xa3\x7e\x80\x78\x01\xa1\x6f\x3c\xa4\x69\xe5\x0f\xf6\x0d\x7b\x06\x42\x60\x53\x81\xb1\x86\x56\xb6\x85\x33\xa6\xd0\xee\xf3\x8a\x13\x32\x6a\xd9\x95\x75\xe0\x56\xfe\xda\x56\xe3\xf8\x05\xec\x93\xc9\x31\x2e\x69\xcf\x50\x04\x7d\x23\x68\xb0\x29\xb7\x80\x57\x1e\x34\xe3\x95\x97\x44\x03\x3a\xf3\x6f\x9b\x5d\x6a\xf5\xa5\xca\x77\xcb\xbe\xf0\x20\x88\xa0\xf1\x2b\xa8\xcf\x73\x55\xc8\xa1\x64\xe5\xa2\x6a\x84\xeb\x0f\x06\x15\xad\xbd\xea\xd6\x57\xf2\x66\xe1\x9d\x72\x55\xde\xdc\x84\x65\x4e\xa5\x1f\x36\x56\x32\x93\x3d\x4d\x4d\x4a\x9b\x57\x2f\x1f\xbf\x7f\x1f\xfe\xb6\x88\x76\x57\x50\x2f\xa9\x8d\xa0\x2f\x6c\x76\x4a\xa5\xb2\xc6\xa0\x17\x0a\xa3\x47\x8d\x3d\x6f\x2d\xe6\xae\x44\xca\x59\x94\xf0\xea\xee\x6c\x5c\xf9\x7e\xac\x72\x1f\x56\xd3\x87\x8b\x0b\xe9\x7e\x21\x90\xae\xfb\x86\xac\x0a\xa8\xb4\x60\xf2\x5c\x86\x01\x46\x84\x43\xe4\x4f\x4b\x18\x7c\x4b\xb3\xdb\x0a\x08\xad\x3e\x80\x4b\x90\xda\x09\x3a\x8f\xc5\xf1\xfc\xc6\x2a\x5c\x53\x61\x96\xdf\xdb\x36\xc4\xf2\xf3\x20\x3d\xc1\x7d\xb8\x48\xb0\x6b\x80\x29\x70\xfd\x4e\x70\x2c\xf9\x06\x87\xfb\x39\x6b\xfa\xc1\x7e\x2d\xde\xdb\xb6\xec\x35\xb5\x8c\xae\x32\x08\x03\x40\x3f\x93\x77\x74\xb3\x1a\x59\x59\x4f\xee\x3c\x8e\xf0\x33\x80\x6d\x1a\x85\x61\x3a\x7d\x1f\xf9\x69\x8d\x79\xd3\xa0\x46\x23\x5a\x29\x90\x2f\xd7\x83\x13\x4c\x17\xfb\xa6\xa8\xbe\x44\x06\x19\xcd\x98\xb3\xe1\xf4\x00\x5e\x75\x00\x76\x73\xfa\x65\x0f\xae\xc6\xe7\x1e\xab\xa5\xcd\xff\x21\x63\xc4\x1e\xbe\x85\xe2\xe3\xf1\x1f\x1f\xc2\x7d\x67\x12\xa9\x43\x37\xd9\xb4\xca\xa3\x37\x2b\x22\x81\xe8\xba\x8c\xf9\x32\x2f\x80\x56\xee\x84\x5c\xe0\xb8\x88\xb3\xa2\xb3\xb8\x98\x85\x20\x52\x37\x0d\x96\xc6\xdc\x86\x7a\xd3\x8a\xaf\x97\x6f\x62\x69\xee\x20\x2f\x57\xb8\xac\x3c\x2d\xd9\x6f\xb3\x10\x4e\x44\x5c\x49\xb4\x67\x66\x73\xe6\x59\x01\x0a\x33\x7f\xf9\x92\xd7\x8a\x36\xf7\x1c\xe9\x96\x98\x52\xf1\x25\x71\x27\x79\xef\xfb\x00\x4c\xe1\x48\x0a\x2d\xc1\x70\x7e\xa6\xac\x6d\xad\x27\x9b\x97\x54\x95\x4e\x81\xb4\x15\x95\xa5\x75\x46\xdf\xb7\xcc\x5c\xe0\x4c\xe2\xc6\x2f\x8f\x9a\x51\x7c\x6b\x3d\x55\xac\x55\xf4\x55\xce\xd9\x9b\x84\xf5\x6c\x86\xb5\x2a\x79\x63\x0b\x0e\x4b\xb9\xe7\x1e\x70\x43\x5a\xf2\x6b\x8f\x9c\x8d\xb4\xc8\x00\xba\x05\x37\xd6\x1f\xaf\x1e\x3c\x9b\x7b\x91\xba\xca\x5d\x81\xb1\xde\xa7\xed\xe5\xe8\xf4\xc7\x20\x4a\x67\x9d\x27\x09\x53\xd0\x0e\xb5\x7f\x4c\xa9\x8c\x16\x9d\xb8\x21\x2d\x70\x88\x7c\xd1\x1c\x31\x53\xeb\x33\xcb\xec\xd2\x30\x13\x3e\x50\x1a\x76\xc2\xea\x93\x94\x47\x8f\x88\x2f\x69\x84\x99\x24\xa9\xa7\xb5\x4f\x26\xf3\xd4\xaa\x14\xda\xd4\xbe\x55\x6a\xd0\x12\x44\xd2\x87\xf3\x31\x74\xfa\x36\x4d\x01\x4c\x23\xb3\xf9\x5d\x83\xde\x35\xc4\x5d\x55\x28\x14\xdf\xd1\x44\xa0\x04\x21\x04\x29\xca\x84\x0c\x4d\x0b\x4c\x67\x44\xe9\xca\xdc\x23\xf1\x33\xe4\x35\x38\xe9\x2f\x10\xb8\x18\x78\xee\x07\x2a\xea\x05\xd0\xf3\x68\x8a\xb7\x84\x5c\x80\x01\xdd\x8a\xf7\x4a\x96\x56\xd1\x37\x9b\xe5\xfc\xf0\xa7\xd0\x64\x92\xfb\x7f\xba\xa7\x4b\xb3\x90\x56\x10\xb6\x41\x44\x9b\x41\x41\x43\x01\x6c\x43\x62\xbf\x95\x11\x48\xeb\x2c\xbb\x59\xc5\x4f\x3a\x62\x4e\x21\xf4\x1d\x18\xde\x86\x97\xfd\xd7\xeb\xc7\xd7\x7b\xd3\xa9\xb3\x82\x19\xc4\x47\x34\x9e\xc3\x57\xd7\x57\x34\xa5\x60\x6d\xce\xa9\x58\xa1\xb0\x37\xac\x06\xee\x7a\xcf\x93\x2a\x60\xb7\xc6\x9d\xc4\x99\x45\x3b\xfe\x8d\xe3\xed\x7a\xef\xfa\xe4\xe8\x34\xfa\x51\x2d\xbf\xdf\xe5\x63\x54\x49\xee\xd9\x6e\x26\x7c\x6d\x62\x59\x26\x93\xc0\x09\xc2\xce\x8a\x4d\x25\x2a\x65\xf9\x36\x61\x9d\x8f\x8c\xec\xf7\x95\x32\xbb\x64\x3b\xa0\x6b\xae\x4d\xd7\x2e\x11\xb7\xdb\x19\x5b\x14\x36\x93\xf2\x54\xd3\xaa\x1c\xd3\x37\x7c\x23\xf4\x5d\xa7\xff\xf1\x23\x83\xf0\xcd\x8d\x99\xdd\x22\x5c\x62\x6e\x9a\x58\x9a\xf0\x73\x43\xbe\xdc\xf7\xa6\x06\xad\xb1\x44\x47\x2d\xb7\xab\x54\xbd\x94\x9e\x14\x89\x32\xcf\x0e\x0c\x9e\x60\xdd\x5e\x14\x5d\x07\x66\x8a\xa7\x70\x06\x2d\xfc\x28\xae\xc4\x0e\xd7\x1e\xca\x51\x24\xa9\x17\xe6\x81\xd2\xbc\x75\x02\x23\x7b\x7b\x10\xe5\xc0\xc8\x0e\x5d\x5e\xfa\xbc\x21\xbe\x9a\x86\x65\x6e\x74\xc7\xc9\xe5\x6f\xea\x36\x9e\x9c\xc0\x9d\x30\xb7\xff\xa8\xad\x57\x1e\x3e\xa9\x7e\x5e\x83\x7b\x97\x25\x6c\x95\x63\x9f\x26\x9c\xd5\xb5\xa4\x67\x9c\x3e\x8e\x96\x2d\x6a\x72\xa4\xf1\x6d\xc5\xe8\x35\x32\x24\x6d\x78\x3d\x98\xba\x93\xbc\xa9\x94\xdc\x73\x7d\xc7\xb5\x81\x74\x0c\xe9\x48\x9a\xe5\x4b\xe0\x75\xbd\x9f\xba\xfe\x3b\x18\xfe\xc0\x8d\xb6\x1d\x54\x19\x51\xc4\xd2\x56\x9e\xe9\x34\xc4\x55\x6a\xf6\x9e\x3f\xdf\x57\x6f\xf6\x7c\xe6\x47\x30\xc4\x86\xb0\x5f\x55\xb6\x7a\x21\xe0\x78\xc6\x0a\x15\x49\xd1\x55\xae\x4e\x63\xa6\x3a\x80\x07\x21\xbc\x76\xe1\x42\x03\xd4\x65\xec\xa6\x13\x78\xf3\x69\x54\x81\xbc\x14\x42\x17\xec\x5d\xf3\x4d\xd6\x22\xca\x87\xbc\x62\x9e\xf9\xa2\x55\x4b\x2b\x00\x59\x9f\xb2\x24\x87\x41\xe9\x4c\x85\xde\xae\x55\xc0\x49\xe7\xa3\xca\x22\x57\x95\x80\x66\x25\x29\x5a\xc1\x59\xd8\x27\x34\x8b\x65\xb5\xf3\x42\x34\x4a\x82\xaa\x25\x43\x1b\x79\x95\xd2\xb2\x16\x2d\xdb\xc0\xbf\x06\x91\x11\xa2\xd8\x77\xa0\xa3\x88\x17\x51\x1e\xc2\x43\x6b\xa8\x61\x4d\x2c\x3d\x47\xaa\x0c\x88\x85\xf2\x0c\x29\xc6\xb3\xa5\xeb\xdc\xc8\x06\xa1\xc3\xfa\x3b\xf4\x73\x22\x59\xa6\xe6\x32\x27\xfb\xcd\xf6\x7f\xc8\x8d\x54\xd1\x0f\xbc\x66\xb8\x6e\x9b\x41\x9c\x30\xa8\x19\xc7\x33\xe0\x4f\x4b\xcb\x8d\xd7\x8c\x5a\xdd\x04\xdc\x2c\x46\xc6\xbc\x42\xb1\x31\x03\xd7\xd0\x98\x03\x07\x1a\x36\xfb\xb6\x81\x11\x0b\x24\x65\x24\x6c\xf4\x0d\xb2\x54\xd7\x8f\x21\x95\x79\x5c\x7f\x6a\xa0\xd0\xe0\x68\x16\x2f\x95\xb5\x07\x6f\xb7\x90\x6d\x2b\xcf\x97\x5b\x7f\x2d\xef\xdc\x44\x73\x70\x06\xff\xb2\xee\xe0\x59\xec\x34\x40\x4e\x1b\x9e\xc0\x65\x7f\xb1\x99\xf6\xf8\xd6\xa0\xf2\x0c\xd4\xb3\x8d\xb3\xd6\x55\x04\xec\x64\x71\x4c\x4c\x11\xb2\x46\x73\xb3\x78\xd2\xaf\x28\x23\xc2\x94\x03\x33\xf3\xbd\x92\xc8\x85\x6e\x0d\x5e\x45\x0b\x55\x17\xc6\xae\xcd\x5b\xb9\xb0\xff\xf0\x9f\xf1\x53\xef\x8f\xff\x04\x2b\x57\x93\x00\xcf\x6a\xde\xd5\xad\xb2\xcc\xcc\x21\x5c\xc4\xff\x6b\x69\xca\x25\xac\xaa\xa8\x51\x90\x8d\x99\x98\x7b\x6e\xcf\xe0\xd8\x9d\x59\xeb\x8b\x2d\xab\x4c\x47\xfa\x62\x05\xe9\xc2\x0a\xb2\x6e\x35\x93\xeb\xc3\xec\xd9\xa7\xdc\xab\x5b\x1d\xe5\xb1\xd5\x8a\x67\x52\x06\x84\x5c\xd5\x58\xcf\x5f\x54\x11\xfd\x0c\x75\xd0\xbc\x88\xfc\x45\xdf\xdc\x32\x7d\xf3\x8b\x82\xf9\x45\xc1\xcc\x6d\xf8\x35\xa9\x5a\xab\xe9\x58\xb7\x17\x03\xf2\xdb\xde\xc1\xf2\x41\x80\x1b\xc7\x80\x64\xcf\x46\x2a\x5e\x52\x4a\x54\x5a\xe5\xde\x64\x29\x67\xb1\x8c\xdc\xc5\x52\xcd\xf5\x86\x82\xe1\x72\x40\x89\x02\x95\x52\x97\x29\x0e\xb8\xdc\x97\x38\x13\xa3\xed\xae\x69\x8c\x6b\x36\xb8\x26\x29\x62\xf9\x5a\x68\xf3\x89\xc7\xa0\xac\x25\x97\x42\x74\xec\x96\x72\x56\x0e\x46\xb1\x91\x73\xcb\x11\x8e\x8f\xff\x78\x34\xfd\xed\xeb\x87\xef\x56\x89\x70\x4c\xe2\x68\x34\x8c\x39\xd8\x0d\xd6\x11\xee\x48\xd8\xa4\xed\x46\xac\xe8\xb6\x81\x67\x00\x73\x35\x63\x0c\xa3\x6c\x30\xda\x67\x16\x19\x29\x64\x34\xb2\x86\x0a\xcb\x43\xf9\xfb\x4b\x1f\x83\xf7\x7d\x56\xb0\xb0\xd2\x6a\x91\xb4\x4d\xe7\x0f\xe7\xf4\x54\x21\x63\xa4\x0b\x35\x11\xd5\xe1\x7e\x21\x34\x77\x01\xf0\x2c\xb9\x42\x45\x60\x7e\x85\x8d\x95\xc1\x2a\x9b\x52\xa6\xff\x22\xbd\x22\xf5\x59\xaf\x00\xe8\x25\x7d\x96\xc9\x26\xa9\x66\x39\x67\x91\x8f\xac\xe4\xba\xf0\xdc\x3a\x90\x3d\x5c\xd1\xee\xa6\x42\x51\x64\x1d\x93\xd5\xf0\x1a\x1c\x23\x07\x3e\x73\x69\xf9\xa6\x8f\xb9\x63\x78\x06\x89\x52\xc8\xba\x2b\x1b\x5f\xb9\x73\xb2\x9b\x81\x8f\xbf\xc9\x3d\x36\x41\x3e\xee\x47\xee\x07\x78\x68\x0c\xbf\x0e\xde\x67\x6e\xdf\xd4\xce\x2f\x63\x25\x2a\x0f\x5b\xcd\xa6\x7e\xa5\x5b\xe6\x07\x1e\xc4\x97\xb6\xcf\x40\xbc\x21\xa6\x29\xa9\xed\x2a\x98\xe9\xaa\xe3\x5d\xf2\xda\x3c\x97\xec\x80\xdd\xde\xde\x79\x7d\x7e\xf9\xf3\xbb\xab\x9f\xfc\x23\xed\xf3\x5a\x41\x87\x19\xf2\x33\xca\x08\xee\x46\x71\x04\x52\xca\x4e\xe8\x45\x2d\x06\xa8\x24\x00\xcb\xe4\xd1\xd5\xa2\x7f\x08\xa7\x30\xa6\xf8\x22\x87\x53\x94\x2c\x09\xae\xeb\xe4\x2d\x22\xb1\x35\x3d\x4c\xe1\xdc\xf5\xdd\xdb\x3d\x80\xe7\x7b\x47\xcb\xaf\x4f\xbc\x92\x46\xfa\x5c\xcc\xee\x2e\xd1\x80\x1a\xa3\xd6\x76\x0c\xb3\x5f\x0b\xc0\x35\x95\x37\x96\xf9\x23\x05\xb1\x01\x7d\x0c\xc3\x20\x24\x27\xb4\x1b\x45\x31\xa4\xe5\x33\xb0\x6b\xbf\x83\x54\xa7\x8b\xd0\x04\x2f\x40\x08\x8d\x9d\x19\xc6\x41\x74\xb8\xb7\xb7\x58\x2c\x06\xb4\x1e\x14\x0c\xc9\xcd\x81\x8d\xe6\xbd\xed\x3c\xbb\xcb\x3b\x13\xa8\xdc\x0c\x95\x56\x48\x65\xe9\xb0\xf6\x1e\x05\xb3\x2c\x6f\x82\xd1\x7d\x3f\x0e\x65\x45\x93\x63\xea\xe5\x8b\xa7\x15\x1a\x5b\xbb\x3e\x2d\x6f\xac\xd7\xf2\x37\xb3\xad\x58\x68\x59\x90\xa9\x69\x99\x74\x3a\x6f\xf2\xd9\xc2\xd5\x76\xff\x76\x69\x0b\x70\x30\x1d\x18\x84\xd2\x0e\xf7\xf6\x66\xd0\x0b\x1c\x18\xbd\xcb\x53\x9b\x96\x7e\xda\x29\x7a\x92\xa2\x4d\x30\xac\x28\xcb\x54\xfa\x3d\x1e\xec\x95\xc3\x66\xfd\x60\xea\x1c\x72\x3d\x64\x8a\xd1\xcb\x30\x9a\x7c\x5d\x17\xad\xeb\x85\x70\x7e\x03\x80\xc0\xe5\xd9\xa2\x22\x65\xe8\xe2\xcc\xf8\x19\x96\x35\x8b\x5f\x11\x5a\xfc\x6b\x56\x21\x03\x3f\x81\xd7\xd1\xc5\x19\xfd\xfa\x46\x36\x01\xa7\x10\x82\x23\x83\xac\xfb\x1d\x5c\x1a\x3b\x93\x10\xcd\xd9\xa5\x20\x44\x13\xd7\x83\xca\x6c\xc8\x46\x58\x52\x44\xde\x95\x18\xd6\x41\xcc\xea\xff\x27\xd8\x88\xf1\x0c\xfa\xd8\xb5\x01\x2e\x12\x70\xc1\xfa\xdb\x90\xb9\x9a\x05\x3f\x0d\x90\x3e\xe7\xe8\x39\x6c\xda\x93\x66\xf9\xfe\x67\x3d\x33\x0c\x8e\x9e\x05\x0a\xdf\x25\x0d\x1a\x2a\xed\x7e\x85\x24\x6a\xa1\x3a\x72\xf2\x4b\x46\xd2\x48\xaa\x96\x9f\x6d\x54\x9a\xdd\x2c\x49\xa9\x2e\x9b\x8b\x10\x41\x13\x0f\xf5\xc3\x34\x53\xf6\x8a\x7b\xa8\x57\x89\x6f\xcd\x8a\xb7\xf9\xaf\x4b\xad\x53\x35\x32\xa4\xeb\x34\xed\xec\x12\xb9\xe4\x46\x67\xc0\x44\x78\x3e\x89\x31\xb0\xdf\x4d\xa9\xcb\x84\x55\xe1\x3c\x4c\x27\x71\x4c\x7e\xd3\xed\xff\x8d\x59\xed\x81\xfa\x55\x2c\x81\x2b\xc2\xf9\x75\xe4\xd3\xa9\x39\x5b\x51\x05\x9d\x4a\xdb\xa0\xd8\xea\xa0\x75\xcf\x98\x5a\xf8\x88\x8f\x24\x80\xe2\x70\xff\xdf\xff\xef\xff\xd1\xd5\x31\xad\x72\x1a\xac\x4c\x8f\x5e\xad\x80\x7e\xfd\x7c\x54\x56\xeb\x8c\x9b\x6a\x13\x4a\x73\x51\xb7\x49\xd5\xa4\x3b\xed\xd5\xa4\xdb\x53\x9c\xa1\xf7\x7c\xb9\xfb\x0a\x23\x3d\xc5\xb9\x2a\x6b\x71\x5d\x60\x5e\x5d\x1f\x75\xf1\x2c\x1e\xdf\xae\x3e\x1a\xff\x04\x8f\x9e\x5c\x3e\xf7\xd6\x9e\xf2\xbe\x09\x4d\x94\x87\x5e\x58\xe6\x8f\x2e\xfe\x29\x1e\x1b\x6e\x64\xcc\xd0\xc2\x08\x20\x0a\x3c\x68\x8c\x63\xd7\x73\x12\xdd\x73\x90\x2a\x9f\x0c\x0f\xdb\xac\x73\xd6\x04\x03\x24\xae\x7d\xb6\x12\xcd\xc4\xcc\x2e\x05\xa0\x52\x75\xb6\x03\xc1\xa9\x56\x76\x7a\x1e\x4e\x81\xef\x7e\x00\x82\x78\x74\xaa\x79\xac\xd3\xee\x6d\xa2\x85\x0f\xc3\xa8\xef\x84\x28\x70\xd0\xc2\x17\x82\x3f\xbb\x5c\x63\xf0\xa6\xdd\x77\xf3\xf6\x6e\x3a\xb5\xac\xb5\x9b\xeb\x10\x88\x37\xeb\xad\x6d\x39\xda\x5e\x73\xe0\x50\x46\x12\x94\x0d\x14\x32\xb5\x61\x31\x43\x11\x34\x42\x18\xa0\x88\x90\xdc\x92\x56\x56\x5c\x00\x1f\xd3\x4a\xfb\x33\x66\x11\x29\x97\x63\x1b\x46\xff\xac\x48\x2d\x84\x17\xb8\x18\xce\x23\x23\x72\xfd\x2a\x11\xbb\x5e\xf9\x13\x5a\x1f\x57\x02\x53\xe5\x6f\x1c\x02\xdf\x9e\xf5\xd9\x07\xf2\xc8\x62\x37\x2f\xd9\xc7\xdf\x08\x2d\x5a\x5b\xf9\x5b\x15\x91\xfc\x40\x20\x6c\xf1\x6b\xc3\x01\xcb\xc8\x00\x53\xb4\x45\x08\xe2\x5c\xfb\x17\x17\x2e\xb4\x9a\x4e\x16\xbf\xcf\xf9\x1f\x4b\xc7\xaa\x2f\x2e\x5a\x81\x60\x5a\xac\x03\x26\x7a\xfe\x1b\x1e\x46\xde\x9f\xbb\x1e\x8c\x30\xf2\x8b\xc8\xa5\x71\xeb\xe2\x6e\xc4\x9a\x72\x93\x41\xc6\xe8\xbd\x56\x43\xe0\x2a\xaa\x95\xc7\xd5\x2a\x7a\x3a\x56\x44\x02\x76\x06\x03\x6a\xd2\x8d\x94\x00\x38\x63\xb7\x3a\x5d\xbc\x18\xf3\xf6\x17\x6e\xa3\xf9\xdc\xc5\xea\x95\x1f\xf3\x7b\x9d\x2e\x3d\x19\xb4\x41\x95\xda\x6e\xb9\x3e\x9e\x41\x83\x6c\xa7\x68\x75\xce\xae\x32\xe1\xac\x49\xac\xa0\x48\x55\x54\x7b\xd5\xe5\x23\xfa\x05\xb8\xab\x25\x93\x17\xc9\xc1\xa8\x43\xbe\x89\x68\xb2\x17\xbb\xb4\x11\x5a\x3f\x70\xed\x4c\xda\x0c\x3d\xbd\xb8\x28\xf0\xc4\x85\x1e\x2d\x01\xed\xfa\x53\x8f\x37\xc2\x4d\x45\xe7\x84\x36\xc9\x38\x8c\x2a\xc9\x29\x6d\x72\x95\xa8\xa4\xe3\xb2\x3a\x3a\x79\x05\x2c\x37\x6e\xae\xdf\x39\x29\xac\xc9\x1e\xa9\xbb\xd8\x12\x2b\xc1\xe6\xec\x02\x05\x1d\xb3\x13\x75\xf5\xf6\xec\x02\x3f\x4f\xcf\xce\x7f\xf8\xf1\xfd\xc1\xea\x76\x81\xf5\xf8\xab\x55\x50\x6a\x0d\xf2\x39\x08\xdf\x11\x0d\xe2\x76\x6d\x04\xf7\xdc\x87\x8b\xf0\x9f\x4f\x35\x5b\xe3\xad\x1e\x34\x96\x56\x0c\xb2\x94\x05\x19\x72\x79\x7a\x56\xae\x88\x80\x9c\x93\xbf\x3e\x53\x83\x54\xd5\x88\x92\x53\xb3\xa4\xc2\xda\x57\x92\xa2\x02\x75\x36\x84\xed\x30\x4b\x94\x46\x4f\x95\x86\x4e\xe9\xc4\x4d\xd1\xa0\xa9\x09\x98\xbb\xde\xf2\xd0\xf8\x09\x7a\xd7\x90\x70\xe3\xe2\x23\xaa\xb8\xaa\x1b\x59\xc6\x90\x67\x11\x84\x30\x3b\x93\x00\x38\x8e\xeb\x4f\x0f\x8d\xfd\xfc\xdb\xcd\xbc\x4e\xc2\x08\x23\x36\xad\xa6\x19\x86\x3c\x55\x5b\x1e\x2b\x7f\xce\x29\x63\x7a\x86\x8f\x2c\x29\xb8\x4b\x99\xe4\x90\xe6\x68\x65\x4a\x55\x24\x31\x62\x82\x33\xae\xe3\x04\x4f\x73\xcf\x78\x40\xb1\x51\x80\x58\x90\x50\x7d\x75\xca\xa4\x98\x74\xba\x4b\x32\x1c\xfd\x33\x3a\x9f\x55\x1c\xbe\xa3\xe3\xe2\xf6\xce\xe8\x5f\x5e\xfd\xfc\xc7\xe3\x1f\xff\x88\xb7\xf5\x8c\x56\xc3\xa9\x35\xd8\x03\x40\x00\x17\x02\xd7\xbb\xdd\x73\xfa\x97\xfb\xf6\x23\x14\xce\x57\x0a\xee\xde\x1a\x5b\xbe\x1c\x55\x76\x91\x00\xd8\xb0\x3d\x14\x3b\x86\x87\xa6\x53\x1a\x48\x06\xc3\x6b\xd7\x96\xe2\xc8\x52\x54\x80\x20\xd8\x66\x8b\x7e\x95\x39\xbf\xc0\xfe\x9a\x2b\x45\xa6\x56\x4b\x13\xa6\xf1\xd4\x76\x34\xe9\x46\x5f\x2e\xd1\x94\x25\xdc\x56\x87\xe3\xac\x1c\x92\x96\xd2\x46\x1f\x04\x2e\x46\xef\xa0\x5f\x13\x9d\x73\x45\x9f\x69\x12\x9f\xb3\x92\xc9\x85\xac\x9f\x7e\x92\x07\xe6\xd0\x7e\x16\x55\x81\x39\x2d\x92\xde\xda\xab\xc3\x5d\xf9\x90\xd8\xff\x5e\xc0\xbe\xac\x5f\xb7\x11\x34\xd8\xff\x34\x46\xc9\x19\x36\x54\x20\x2b\x5c\x53\x88\x03\xab\xae\xbd\x95\x69\x43\x6f\x23\x67\xd8\xad\xe6\x66\x5e\x83\x1d\x3f\x09\xb8\x93\xb6\xda\x9f\x31\xcc\xf4\x8e\xbe\x64\x4d\x27\x92\xcb\x6d\x3d\x30\x19\xcf\x8b\xd8\xee\xb9\x6d\xce\x3e\xa2\xf4\xb3\xc8\xe5\xb4\x73\x1b\x9f\x4f\x6d\x9d\x2e\xb5\x13\x42\x9c\x73\xd7\x87\xc6\x62\xe6\xda\x33\x72\x9e\x19\xd0\xc7\xa1\x0b\xb3\x76\x56\xc7\x8d\x02\x0f\x2c\x0d\x1a\xc1\x3a\x46\x63\xe3\xf9\x0b\x63\xe7\xf7\xdf\xcd\x08\xcd\xa1\x11\xd0\x66\x1b\xbf\xff\x6e\x1a\x47\xe7\x27\x46\x04\x3c\x6f\x59\xd1\xcc\xa0\xfa\xce\xba\xa9\x60\x0e\xde\x4b\x63\x3c\x03\xef\xdd\x79\x3c\x37\x44\x47\x95\x35\x93\x01\xf9\xb8\x65\xfa\x31\x91\x9d\xf4\xc9\x60\x5e\x99\x49\xd4\x01\x11\xfc\x84\x16\xc6\x1c\xf8\xcb\x0c\xf6\x1d\x94\x10\x40\x59\x9e\xf3\xed\x20\x93\xbe\x9a\xba\xb4\x25\xaf\x9d\x18\x73\x15\xb7\x7b\x10\xa2\x79\x80\xbb\xf2\xbf\xe7\xe6\x6a\x99\xdf\xd2\x2b\xdf\x25\x8e\x78\x9e\x7a\xc6\x57\x55\xe7\x92\xa7\x2b\x8c\xf4\x7d\xf2\x1c\xca\xeb\xa4\x1d\x96\x3c\x07\x3c\x43\x12\x9f\xa6\xd5\x88\x68\x20\x40\x68\xd8\xf0\xb9\x1c\x7c\x0b\x1a\xb3\x5a\xdb\xea\x4c\x79\xbb\x3d\xad\xf9\xf4\x87\x3f\x5e\xbd\x5c\xde\xc7\xdb\x15\xf1\x56\x06\x9f\xf6\x00\xf7\x80\x8f\xe3\xf9\x2d\xeb\xca\xbf\x1d\xa3\xe9\x39\x7e\xf4\xfe\x2f\xa7\x2b\x57\x65\x46\xe3\x19\x34\x1c\x17\x4c\x43\x30\xdf\x4e\xb5\xb8\xde\xb8\x2a\xa8\xa7\x2f\xd6\xd1\xac\xb0\x9b\x8f\x81\xeb\x97\x96\xfb\x68\xa4\x94\xeb\xb9\x2c\x87\xd5\x4d\xc1\x57\x3d\xae\x4b\xf4\x6a\xa9\x51\x19\x6b\x4a\x66\xf2\xf4\x27\x01\xbe\x81\x8d\xe6\x7b\xa6\x28\x77\x13\x4e\x21\x21\xdd\xb7\x63\x0f\xb0\x3a\x8b\x42\x37\x27\x4f\xbf\x7c\xf6\xd4\x38\x49\x81\xfd\x48\x2f\x0e\x43\x61\xfe\x5d\xd6\x77\xfc\x4d\xdf\x97\x97\xcd\x4b\x55\x47\x60\x1e\x78\x09\x01\x47\x87\x95\x32\x47\xe9\x60\x65\x8f\xae\x50\x51\xc5\x13\x65\xc1\x4a\xb5\x33\xb6\x82\x4b\xf8\x67\x0c\x79\xec\x57\xaa\x0e\x89\x6b\xb5\x8b\xd9\xc0\x0c\x5f\x46\xf0\x98\x36\xf0\xcb\xe4\xa7\x19\xec\xda\x36\x4c\xf0\x98\x59\x73\xa4\x7a\x39\xc2\xbc\x73\xfb\x73\x23\x2c\xee\xda\xc5\xcb\x4c\x0c\x41\x72\x6d\x9b\x66\x78\x2e\x55\x2b\x97\x26\x69\xec\xf8\x70\x61\xb0\xea\x0c\xd5\x6d\xf1\x36\x87\xef\xa4\xae\x8c\x8c\xf3\xf4\xe2\x36\xcc\xf1\x12\xd3\x00\x11\x69\x4f\xe3\xf2\x88\x11\x3d\x2d\x4e\xff\xbe\x66\x65\x88\x62\x43\xb3\x54\xd8\x60\xfc\x94\xd5\xa9\x7f\x63\xdd\xdb\x57\x95\x89\xe0\x0f\x71\xc1\xc7\x28\x51\xa1\xb5\x14\x9e\x95\xb5\x93\xcf\xfc\xa0\x6e\x4c\x87\x99\x0a\x62\x2d\xbb\x10\xb0\xd0\x88\x63\xc0\xcb\x70\xd6\x37\xd9\x2c\x2c\x39\xe3\x65\xe6\xa3\x96\xb8\x99\xa9\xc6\x6a\xd3\x1a\x00\x8a\xe6\xb2\x55\x7b\x94\x17\xc1\xa4\x49\x74\xa1\x9d\x24\x08\x3e\x4a\x08\x30\x5d\xe5\x1b\xcd\x30\xcf\x16\x71\x93\xad\x35\xe5\x06\xaa\x73\xa7\x2a\x9a\x42\xa3\xea\x48\x3d\xbb\x3d\x6d\xf8\xe5\xbf\xaf\xf6\x86\xc1\xaf\xc7\x2b\x34\xbb\x93\xe8\xd0\x2c\xab\x16\xad\xa6\x38\x85\x66\xad\x20\x38\x05\xae\xd7\x84\xd3\x95\x95\xee\x2d\x68\xae\xfa\x38\xf8\xed\xc7\x8b\x5f\x77\xd5\x5d\xac\xd7\x10\x45\xf6\x1f\xde\x63\x95\xb7\x13\x65\x60\x5b\x84\x20\x08\x60\x68\x94\x55\xf2\xcb\x0a\x13\x7f\xf5\x02\x53\xdd\x75\x06\xdd\x8a\xb6\xa0\xe7\x57\xc1\x8b\xf3\xe7\xf7\xc3\x6d\x8d\xb6\xe9\xb2\x9d\x27\x0e\xa1\xe7\xa1\xdb\x65\x64\xb3\xf9\xc3\xf1\x8f\xe3\x7f\xfd\xa2\x2e\xe1\xe4\xb9\x11\xfe\xec\x4a\x38\x25\x89\xb3\x57\x14\xbe\x86\x1b\xf1\xc4\x8f\x28\x06\x9e\xb1\x00\x4b\x03\x23\x63\x0e\x7c\x30\x85\x49\x54\x02\x01\x6e\x44\x0b\x3b\xf1\xcc\x40\x68\x00\x7f\x89\x67\xae\x3f\x4d\xe3\x71\x18\xbe\xb6\x3d\x10\xa7\x95\x5f\x3f\xfb\x92\x8f\x7e\x40\x20\x74\x34\x0b\x68\x28\xec\x52\x49\x41\x64\x1f\x19\x18\x82\xb9\x31\xa6\xe3\xb1\x6c\x1b\x10\x42\xa3\x6f\x04\x30\x8c\xa8\xd3\x87\xdf\x22\x57\x7d\x78\x0d\x43\x9a\x8f\xa3\x12\x47\x3a\x89\xdb\x5c\xbd\xb8\x09\x05\x4d\xb5\xbc\xbd\x89\xb4\x5c\x06\xb6\x42\x5a\xee\x58\x20\xae\x8a\x9a\xe8\x12\xf4\x5d\x80\x63\xb6\xe2\x2a\x17\x60\x53\xd5\xb6\x0d\x1a\x2a\x5a\xa7\x17\xb1\xf4\x94\x65\x0a\x35\xf6\x2c\x0b\xd3\x3c\xdb\xeb\xfd\x31\x52\x94\x42\x21\x2a\x1c\xbd\x71\xc9\x03\xc5\xb3\x35\xa4\x1b\xe8\xdb\xaa\xaf\xf1\x8e\x27\xa9\xe6\xab\x42\x06\xc7\x54\x55\x59\x94\x4c\x51\x9c\x42\x06\x55\x8b\xc2\x38\xb5\xd3\xe7\xa7\x45\xb9\x5a\x4f\x90\x72\x2c\xd2\x09\x93\xfa\x2e\x6e\xb1\x03\x8e\xa9\xa8\xec\xe2\xfa\xb6\x17\x3b\xab\x55\x76\xc9\x97\xf6\x99\x03\x0c\x43\x17\x78\x7d\xd7\x46\x7e\x64\x2c\x5c\x67\x0a\x71\x5f\x64\x3c\x1a\xe2\x0f\xda\xae\xc2\x50\xac\xb6\x9f\x26\x47\x26\xd3\xa7\x97\xde\xf2\x6b\x2b\xb0\xb0\x2d\x58\xc1\x5b\x5e\xf7\x3d\xf5\xa5\x68\xc6\x9f\x97\x4e\x3f\x0a\x40\xde\x32\x24\x4f\x26\x4f\xfa\x1c\xf5\xe5\xb4\x5e\x67\x26\x69\x52\x41\xa7\xd2\xa8\xe6\x41\x10\x4e\xdc\x04\x4a\x1d\x67\x11\x36\xa2\x8d\xd2\x49\xae\x23\x3b\xb0\x0a\xcd\x9b\xd2\x70\x0a\x62\x72\x27\x12\xf7\xed\xe9\x38\xe1\xd3\x0f\x5f\xff\xf2\xf2\xc3\x7c\x05\x6b\x90\x8f\x28\x9a\x7d\x7a\x0e\x16\x8e\x50\x53\x3a\x38\xaa\x55\xa3\xf5\xd9\x7c\x54\xa0\x6e\x8d\x37\xae\xea\xdf\xae\xaa\xf4\xcf\x47\xf6\x6f\x53\xf8\x60\x7b\x33\x07\xb7\x34\x3b\x70\x1b\x35\xa5\x2a\x7f\x00\x46\xc8\x1b\x83\x4c\xda\x59\x81\xe5\x57\xbc\xae\x97\xb4\x96\xa4\x8d\xf1\x7f\x6b\xea\xe3\x97\xe6\xb6\xdd\xaa\xed\x49\xb1\x2d\xbb\xd9\xe2\xb7\xc7\x9b\xef\x9f\xcd\x1f\xec\x9f\x01\xcd\x96\x24\x9b\xb7\x3f\x29\xc1\xd4\x1c\xe8\xb4\x3e\x26\xfb\x87\x89\xed\x1b\x07\xb4\xef\x7f\xf8\xf0\x7e\x32\xbc\x54\x1b\x9e\x12\x5e\x98\xff\x43\xef\x78\x2c\x8f\x8d\x6a\xea\x6c\xad\x72\xb3\x96\xa8\xae\xa5\xaf\xcc\x71\xff\xbe\x31\x1f\x17\x7d\x88\x7a\xaa\x29\xed\xe9\xae\xaa\x82\xaa\x2b\xc4\xce\x20\x70\x78\x17\x26\xfe\xf2\xe9\x2f\xa7\x2f\x5e\x3d\x3f\x3f\xad\xea\xb5\x16\xe7\x5c\x4e\x3b\x19\xe9\x22\x1e\x7b\xae\xfd\x84\xe2\x86\x3c\xee\x41\x7f\xca\x44\x4b\xc9\x50\x90\x84\x5f\x14\x74\xd4\xd8\xf7\x20\xf9\x4c\xda\xee\xf1\x22\x33\x60\x2b\x3d\x35\xc8\x2d\x01\xce\x03\x2c\x27\x6d\x9c\x23\x63\xea\xa1\x31\xf0\x8c\x14\x98\x6d\x4b\x76\x9a\x25\xf5\x6b\xc9\x9e\x32\xf2\x4a\x43\xb9\x7a\x1e\xe8\xad\xfa\x3e\x19\xd8\x7f\xd7\xc7\xc8\x4c\x4e\xed\x01\xef\xee\x46\x0e\xc1\x7b\x42\x9b\x4e\x7e\x45\x5e\x3c\x5d\x45\x61\x2e\x14\xc3\x75\x31\x9c\x67\x15\xb4\x7b\x95\x0a\x5a\xe5\x41\x94\xb9\x7e\xaf\x0e\xce\x35\x19\x4c\x11\x8c\x22\x66\x4c\x6b\x9d\xc7\xd5\x6c\xf3\x5c\x9d\x1e\x3d\x6b\xbf\x71\x42\x84\x69\x0d\xd9\x2e\xf7\x4e\x7e\xcc\xc6\x88\xd7\xdf\x41\xd4\xaa\xbb\xfa\xfe\xe9\x70\x0b\x69\x2f\xbe\x6e\x17\x1d\x64\x76\xd1\xc1\x2a\xbb\xa8\xd1\x46\x3a\xe8\x68\x23\x1d\x34\xaa\x31\xdc\x2c\xee\xb5\xb8\x0b\x2e\x4e\x5f\x5c\x3e\x3f\x3f\x7a\xba\xc2\x4e\x70\xaf\x01\x86\x9d\xee\x83\xcc\x88\x6b\xdc\x05\x89\x13\x63\xbb\x76\x82\xde\xf2\xeb\xf6\xc1\x30\xb3\x0f\x86\x1b\xdb\x07\xd5\x16\x3f\xfd\x7d\x50\x69\xe9\x6b\x94\x18\x94\x7b\xbd\x7c\x03\xa9\x0c\x80\x85\x6b\xf9\xef\xae\xc1\x06\x93\x17\xef\x1b\x2b\x08\x5c\x07\xde\x9b\xa0\xb0\x9f\x9a\x28\x36\xae\x8c\x1d\xfc\x70\xf0\xe7\xab\x7f\x2f\xb5\x2d\x2e\x62\xda\xb8\xcf\xff\xe2\x86\x96\x72\x7a\x15\x3b\x28\x7d\x93\xec\x89\xa8\xf6\x3d\x81\x59\xd5\x26\x62\xf1\x24\x52\xf0\xca\xf4\x9c\xb7\x31\xa1\xcf\x9a\x6c\x17\x28\x2d\x13\x97\xa2\x71\x81\x56\x9b\xeb\xb2\x09\x08\x0f\x1e\x6b\x53\x20\xda\x60\x65\xaf\x25\x7b\xb9\xcd\x4c\x87\xb9\xc1\xb2\xdb\xb5\x6e\xf2\x0a\xd9\x6d\x86\x16\x27\x9c\xcc\x98\xed\x48\xd7\xf1\x9c\x5d\xbe\x20\xd5\x84\x8d\xe9\x82\xc1\xca\x99\xc6\xb2\x0f\x4b\x97\x8b\x60\x4b\x80\x55\x01\x27\x69\x80\xa6\xa0\xd2\xe5\x76\x7a\x40\xbe\x42\x64\xf3\x54\x1d\x09\xe9\x46\x60\xf6\xb5\xca\xad\xb0\xa2\x04\x9e\x7d\x3d\x80\xe1\xdc\xa5\x23\x44\x52\x4b\xe9\x23\xa7\x91\x08\x5f\x90\x42\xa8\x5b\x5b\x0c\xd6\x17\xfc\xa5\xaf\x0e\x52\x66\xfd\xd4\x5d\x1b\xf9\xcc\x61\x06\x3c\x77\xea\xf7\xe7\xae\xe3\x30\x2b\x7b\xcb\x4e\x1e\x8f\x93\x26\x21\xe6\x25\xb8\x86\x06\x88\x0c\x31\x91\x4a\x4d\x5e\xd7\xed\xa7\x9c\x9a\xdc\x04\x9c\xdd\x11\xa9\x51\x7f\x2b\x82\xa3\xf0\xf0\x18\xd8\xef\x9c\x10\x05\x26\xe3\xb2\xae\x2d\x4d\x94\x1b\xa3\xdf\xda\x28\xa8\xaf\x7a\xd0\xbc\xee\x71\x06\x0b\x69\x79\x2f\xfd\x81\x4a\x50\x2e\xaf\xb1\x9b\x4e\xe9\xba\x2b\x6a\xd7\x38\xbd\xd9\xe8\xd5\x7d\xd4\x9b\x8d\x55\x68\xab\x2e\xa8\xf6\x4a\xa2\x5a\xed\x5c\x95\x76\x6d\xd6\xd5\x63\x89\xd2\x21\xac\xdb\x37\x2f\x0a\x52\xd9\x72\x15\x5c\x43\x69\xd6\xbe\xa2\xe7\x77\xf5\x87\xbb\x49\x97\x28\x11\x86\x0b\xa1\x2d\x3e\x5c\xa4\x04\x2b\x9a\x9f\x09\x7d\xa3\xbc\x17\x5a\xd5\x77\x9a\x16\x7e\xb7\x4c\xca\xc1\x66\xc2\xde\xfa\x5a\x31\x29\x71\x88\xca\xc0\x4d\x8f\x36\x13\xce\x81\xeb\x55\x14\xa7\x30\xc5\x4b\x06\x7f\xa5\xbe\xb0\xb4\x1a\x80\x6d\x5a\x87\x21\xe4\x24\xdc\x97\x25\x16\xdb\xc8\xbf\x86\xcb\xc8\x10\x9b\xd1\x10\x85\xb2\x75\x21\xdd\xf4\xd9\xdb\x20\x26\x07\x46\x32\x0f\x3f\xa1\x79\xd4\x41\x6d\x97\x89\x4a\x9a\x2a\xc6\x56\x67\xc8\x4a\x32\xad\x47\x45\x42\xa2\x13\x52\x13\x92\x23\x4f\x2e\x5f\xb0\xca\x32\x1f\x6c\x96\x62\x4e\xdf\x07\x1e\x70\x7d\x23\x8e\xa0\x61\x83\x08\x1a\x13\x14\x1a\x78\xe6\x66\x0f\xf1\xce\x69\x45\x9f\xc7\xae\xcc\x89\x27\x08\x15\xd2\x4a\xea\x41\xd9\x38\xf7\x8b\x47\x13\x65\x73\xc0\x84\xc0\xe1\xb8\x11\x91\xfe\xe4\x33\x59\x64\x48\x0a\xdf\xaf\x3e\xdc\x5a\x65\xa6\xc5\xb6\x0d\x99\x3c\xcf\x4e\x17\xdb\x73\xed\x77\xab\x1e\x2e\xe4\x91\xce\x30\x59\xf7\x48\x03\x61\xac\xbd\x62\x51\x4e\x54\x59\xb9\x8b\x86\xa7\xdc\x9a\x9c\x7d\x41\xbe\x6e\x56\xe7\x18\xba\x3e\x3e\x91\x63\x21\x2a\xc3\x50\xeb\x25\x70\xfe\x7a\x20\xbe\xdc\x45\x81\xbb\x7a\x51\x58\xa1\xe8\x05\xae\xcf\xb2\x76\x2d\xd3\x8d\x2e\x5c\xdf\x6f\xe0\x05\xa9\x43\xaa\xeb\x6b\xa0\x14\x79\xce\x1a\x50\xfa\x02\xce\xd1\x35\x34\x26\xe0\x1a\x85\x2e\x63\xba\xa5\xc8\x7d\xe9\x07\xae\x5f\x81\xd4\x16\x78\x8d\x30\x08\xcb\x37\x58\xf5\x9d\x76\xc8\xd5\x0a\x19\xed\xd6\x09\xd6\x09\xfa\xd7\xa8\x39\x6b\x21\xff\xe2\xf3\x47\xbd\x34\x84\x3e\x9f\xae\xb0\xfd\xa8\x6d\x2b\x27\xd0\x83\x58\xb3\x56\x77\x3d\x71\x38\x74\xb4\x7a\xfa\x70\x80\x3f\x85\xe1\x1a\x28\x84\x2d\xc7\xd0\xd2\xa9\xb5\x49\xa0\x95\x5d\x85\x83\xa2\x91\x55\xc5\xe1\xc8\xb8\x15\x32\xd3\xc6\xee\x7a\x8d\x28\x35\x72\xea\x2a\x16\x94\x9a\xa1\xf5\xcd\x27\x35\x03\x15\x6c\x27\x9c\x2a\x4f\xa4\x79\xea\x15\xfa\x59\xdd\x6e\x62\x16\x33\xb3\x8e\x42\x9a\xf4\x66\x44\x31\xff\x23\xa9\xce\xc9\xa6\x49\xf5\x1a\x01\xd3\x8a\xa2\x8d\x4d\xc5\xd6\x8e\xb4\x8f\x2d\x56\x3d\xda\x4e\x8d\xb1\xc3\x26\x6a\xc7\x49\x8e\x7d\x2b\x15\x8f\x93\x1a\x76\xb2\x0e\xa5\xa2\x4b\x75\x63\x25\xcf\xc8\xca\x1e\x54\x95\xff\x73\x25\x27\x2a\xf7\x37\x6d\xda\x83\xfa\xc3\x24\x0a\xa6\x8b\xfd\xaf\xd5\x51\x96\xe4\x0c\x8a\x13\x27\x7c\xe2\x8b\xef\xc2\xaf\x8a\x3f\x5b\xd7\xaa\xce\x13\xd6\xaa\x9e\x32\x32\x97\x4b\x88\xb1\xeb\x4f\x9b\x65\xd9\xe6\x8e\x67\xe6\xe2\x77\xfd\x6b\xf7\x16\x7d\x5a\x67\xf4\xf3\x34\xb9\x57\xf4\xc5\x5f\x51\x95\x6e\x22\x74\x65\x40\xd0\x48\xe2\x62\xd1\x3b\x6f\x81\x53\x96\xce\xbb\x06\x75\x5d\x1f\x9b\x6b\x94\xb4\xd6\x25\x66\x75\x23\x63\x35\x15\xb0\xe8\xc6\x36\x28\x11\xd6\x77\x4d\xee\x4c\xbc\x32\xdb\x3a\xa4\xc8\x6c\xd9\x8e\x69\xee\x8f\x2a\x9d\x7a\x0b\xe7\x81\x59\xe6\x36\xc8\x50\x21\x73\xe5\x48\xc6\x70\xf2\x9b\x5a\xc0\xe9\x63\x86\xab\x0d\xf6\xcc\x87\xf5\x8b\xa0\xcb\xce\x28\xb9\x24\xba\x62\x96\x1a\x8e\xa7\x53\x5a\xc7\x8b\x3f\xc6\x78\x31\x1b\xe2\x94\xad\xb3\xbe\xcc\xb5\x02\x84\x2d\x7c\x0a\xc7\x68\x3e\x07\x46\x04\xc9\x39\x83\xa1\x31\x8f\x09\xc7\xf5\x20\x9b\x99\x01\x1c\x27\x84\x51\x54\xdf\x27\x56\x5b\x04\xbf\x15\xda\x99\x47\x32\x0f\x7a\x06\xa3\x08\x4c\xa1\x01\x99\x3b\x85\x76\xbc\xe9\x80\x84\x9a\xfa\xa0\x0a\x33\xcc\x90\x01\x9f\xe4\xaa\x5e\xa7\x75\x8b\xdd\x1d\x2a\x55\xdb\xaa\x51\xb5\x9d\x57\x1b\x37\x4e\x2d\x4b\x4e\x6e\xde\x62\x85\x3e\x3d\xe1\x21\xe2\x42\xe5\xed\x99\x69\x21\x36\x64\x6b\xe3\x6d\x08\x83\xe9\xf7\x9b\x09\x84\x11\xb4\xe3\xb0\xbc\xc0\x6d\xe7\xe2\xa0\xb6\xaa\x51\x6b\xc9\x4d\xbd\x90\xab\xea\x12\xb7\x1e\x21\xf7\x8c\x55\x66\x4a\x34\xea\x5b\xa1\xa0\xb5\x05\xc6\xdd\x8e\x4a\xb1\x89\x18\xb8\xbf\x96\x52\xc1\xa9\xf0\x4a\xa6\xc2\x8d\x29\x15\xc5\x51\x78\x5d\x17\xb9\x8f\x7a\x13\x85\xa1\x90\x52\x22\x9a\xc6\xd4\x26\x93\x48\xdb\xb0\x5d\xde\x47\x3e\xf5\x83\x1c\xca\x7c\x16\xb4\x3c\x29\x9f\x8a\xc1\x4f\xe8\xa4\xe4\x0f\xcd\x5e\xa4\xb5\x9c\x20\xab\xbd\x98\xfe\x10\xa9\xfd\x55\x3e\x40\x56\x06\x2a\x8d\x29\xe2\x43\xe6\x0b\x0d\x55\x4f\xbc\x0a\x23\xa9\x6c\x8f\xc3\xd8\xb7\x35\x42\x79\xd5\x83\xa7\x49\x94\xbc\xf8\x4d\x2a\x63\x12\xf1\x27\x94\x77\x7c\xfa\x6c\x2e\x42\xaa\x45\x2c\x54\x21\x8f\xaa\x0c\xf2\x6d\xb1\xde\x90\x47\xcb\xb5\x87\xf2\xf3\x6b\x98\x47\x55\xb5\x54\x55\xd6\x69\xe3\xa5\x9d\x23\x29\x56\x50\x6c\x90\xe6\x35\x91\xbe\x28\x0a\x55\x8a\x82\x87\xf2\x7d\x1a\x8a\xc2\xd0\x6a\xdc\x69\x83\x2a\xc6\xf3\x00\xfa\x35\x91\x62\xe4\x91\x15\x09\x7f\x9d\x0a\xc8\xea\xb2\x2a\x15\x45\x9e\x2f\x68\x55\x86\x55\xa5\xd4\x6d\x89\x35\xb8\x3d\x83\x77\xe7\x21\x06\xb7\x23\x99\xae\x3f\xac\xe0\xaf\x25\x97\x32\x63\x37\xa5\xbe\xcf\xc3\xd4\x5d\xe9\xa4\x5e\x43\xec\x02\xb3\x29\x02\xdf\x31\x80\xe7\x25\xc7\x74\xa4\x13\xca\xb0\x29\x23\x29\xa7\x79\xb6\x01\x72\x49\x1e\x17\x1e\x04\x11\xa4\x19\x08\x7c\x29\xac\xf7\x19\x32\x68\x09\xcf\x70\xae\xb7\x8e\x4a\x33\x3b\x3f\xe3\xa4\xfa\xe7\xe5\x66\x76\xde\x6d\xb6\x38\xe5\x0a\x23\xfb\x65\x32\x6f\x61\x5c\x65\xaf\xd3\xeb\xe7\x3c\xe3\x63\x33\x76\xf6\x2b\x42\x12\x0b\x97\x50\x02\xa3\x91\x0c\x51\x50\x32\x49\x64\x08\x63\xe1\xe2\x99\xeb\x4b\x64\xf4\x95\x3e\xd1\x7c\x11\xe2\x6e\xc5\xda\xdb\x3c\x78\xa6\x9e\x29\xe9\x45\xce\x6c\x9d\xac\xd5\x36\xe8\xbb\xea\x74\xfe\xab\x84\x7b\x37\xd5\x42\x2b\x02\x7e\x3b\x17\x93\x36\x1d\xe5\xbd\x3a\xbe\xb7\x3b\xbe\x7b\x9b\x71\x2d\xde\x5f\x63\x4c\xb7\x76\xbe\x7c\xf9\x2a\xb0\x9f\x4a\x3a\xa9\x50\xac\x57\xad\x3d\x43\x3d\x94\xb2\xc6\x98\xf5\x9c\x96\x03\x60\x9b\x29\xda\xc6\x04\xf9\xb8\xbf\x80\xee\x74\x86\xfb\x63\xc2\x6d\x44\xd5\x7b\x41\x6e\x2a\x02\x94\xbb\x7b\x3f\xb6\x4c\x10\xba\xa0\x3f\x03\x51\x80\x82\x38\xa0\x65\xa7\x63\x28\xdf\x82\xef\x03\xe0\x3b\x90\xcc\x98\xca\x25\xd2\x4a\x77\x8d\x93\xe7\xc7\x2f\x9f\x9d\x9e\x5f\x55\xf3\x75\x25\x34\x93\xa9\xce\xa1\x1f\x1b\x99\x5f\xfd\x50\x34\xe5\x13\x93\xa0\xb2\xa2\x07\x9d\xf1\xb2\x04\x70\x75\xda\x08\x28\xfb\xba\x28\xb3\x93\x36\x51\xfd\x5b\xe5\x1e\xbb\x9c\xa1\xc5\xe9\x3c\xc0\xcb\x13\x64\x3f\x63\xa7\xba\x1c\x04\x12\xe0\x65\x26\xce\xbe\xca\x48\x33\x03\xd1\x55\x4b\x3b\xcd\x3a\x56\x25\xe6\xa2\x5a\xd8\x93\x10\xcd\x4b\xb2\x3a\x5b\xd5\x05\xec\x74\xe2\x67\xf3\x00\x85\x58\x35\x6d\x76\xc7\x98\xb8\x5e\x95\xa3\x62\x45\x26\x47\x37\x33\xad\x81\xd5\x77\x90\xfd\x45\x63\xd7\xd5\xd8\xd9\x66\xd1\x0d\xff\xbf\x5d\x8d\xfd\xc8\x71\xc4\xa6\xdf\xd2\xe0\xb4\x94\x00\x73\x8a\xb3\x00\xb0\xd1\xa8\x4c\x42\xb9\x92\x2c\xc7\xa2\x89\x60\xa2\xac\x92\x2c\x96\x07\x62\x8c\x6c\x34\x0f\x84\xd6\x90\x9f\xa3\xc5\x95\x68\xde\x4f\x8c\xc3\xf7\x5c\x14\x4b\x60\x21\x69\x42\x5b\x7e\x90\x61\x9d\xf2\xc3\xa7\x61\x88\xc2\x42\x60\x52\xaa\x78\x1b\x6e\xd4\x77\xfd\x6b\xe0\xd1\x99\x97\x35\x35\x15\xdd\x5e\xd0\x64\xf2\x25\x9e\xe9\x73\xd0\x70\x5b\x38\x1b\xea\x77\xf1\x51\x69\xc8\xb3\x1e\xbe\xd6\x7b\xc8\xa4\x25\x22\xbe\x9c\x33\x0d\xf2\xcc\x04\x03\xa4\x42\x8c\x6e\xa5\x9e\x5b\x3f\x6f\x24\x71\x6c\x4b\x8f\x9c\x0c\x39\x6e\xef\xa9\x53\x9c\x66\xf6\xe0\xc1\x29\xa0\xb5\xce\x9e\xdc\xf3\x5b\x7e\xfc\xac\x23\x78\x66\x5b\xe2\x67\xda\x86\xd0\x1c\x74\x1f\x42\x73\xd0\x22\x84\x66\xdd\x51\x34\x99\x40\x9a\x83\x06\x81\x34\x07\x2b\x07\xd2\xd4\xc6\xd2\x1c\x74\x19\x4b\xb3\x05\xe1\x34\x1a\xa6\xea\xba\xf2\xd3\x2d\x76\xf5\x17\xd1\xf3\x33\x12\x3d\xeb\x0f\xf4\xed\x96\x3e\x5d\x6a\x4c\xf9\x22\x7b\x36\x91\x3d\xb9\x01\x4a\x48\x43\xb7\x1d\x2d\xcb\x51\xf8\x01\xf9\x9a\xc7\x89\x6a\x87\xe4\x88\x81\x55\xc1\x58\x7d\x6f\xd3\xab\xde\x94\xfe\x43\x73\xb2\x9b\xca\x22\xd9\x93\xac\xf6\xad\x63\xb2\x67\x69\x6e\x2e\x6b\x8c\x4a\x8d\x84\x06\x0a\x0d\x27\x04\x53\xda\x3e\x96\x5f\x6a\xf1\xf1\xe6\xb3\x19\x38\xc8\xb6\x0c\xf2\xff\xef\x2d\x63\x30\x77\xc8\xff\x81\xf0\x9d\x83\x16\xea\x46\x04\x9d\x7e\x7f\x45\x31\x92\xd3\x02\x4f\x9a\xaf\x95\xfc\xd8\xe3\x97\xfc\xe9\x55\x83\xa7\x13\x3d\x26\xa9\x91\xaf\x59\x1d\xbf\xae\x0a\xbe\x36\x68\x3e\xf7\x53\x76\xf5\xf8\xd3\x86\x6b\x5e\xed\x98\x4a\x9e\x5e\xa9\x06\xb8\x4e\x1c\x01\xd7\x44\x59\x81\x85\x3d\x29\x77\x0a\x38\x73\xd7\x4f\x75\xd3\x49\xd2\xa1\x23\xe9\xc5\x25\x97\x33\x88\xf2\xc5\xd5\x55\x41\x3e\xdd\xf4\x37\x28\x14\xd6\x58\xbd\x34\x47\xb4\xf9\xda\x1c\xff\xc6\x68\x7f\x71\xf4\x7e\xb8\x9e\xee\x06\x9b\x2d\xbc\x61\x24\x4a\xce\x9a\x2b\x70\x74\x55\xa1\xde\x8d\x4e\x79\xc3\xc5\x06\xbe\xf2\xb6\x12\x74\xc1\x81\x6d\x36\x0c\xf9\x05\x8e\xc3\x63\xef\x1a\xc5\xfb\xee\x1a\x97\x17\x47\xc7\xa7\xba\xe2\x6f\x6b\x11\x57\x48\x4b\x8a\x69\xfe\x27\x48\xbf\x47\x8e\x63\x5c\x8a\x40\xf0\xad\x36\xb6\x8a\x59\x6e\xa3\x99\xd5\x17\xdd\x0d\xf3\x36\x56\x16\x4e\xda\x91\x81\xb5\x45\xec\x6b\x6e\x62\x8d\x02\x5f\xa3\x0e\x43\x5e\xb9\x03\x1e\xb8\xde\x4f\xd0\xcb\x37\xa7\xaa\xab\x37\x31\x03\x21\xb0\x09\x37\xa5\x31\xaf\x7e\x4c\x0e\xa6\xc8\x40\xbe\x57\xdd\xc1\xa1\x2b\xd9\xb9\x4b\x42\xb1\x3d\xe4\x8b\x50\x64\x39\xc8\x27\x15\xdc\x7c\xa8\xb7\x1f\x55\xf4\x12\xbb\x7d\x76\x96\xe5\x8c\xf2\x82\x77\x58\x66\x10\xa2\x79\x40\xfe\x10\xdb\x8c\xdb\x5f\x7f\x21\x84\x73\x01\xf0\x2c\xb9\xf2\x94\xcc\x9d\x5f\x61\x83\xf2\x98\x7d\xf5\x1a\xac\xbc\x34\xc5\x5f\x32\x44\xf1\xb0\x8a\xfe\xc8\x64\xbc\x4b\x56\x55\x8a\x4e\x3e\xb1\xb4\xd3\xc9\xcb\x24\x49\x3f\x2d\x38\xc1\xed\x12\x25\x0a\x96\x69\xf8\xb5\x25\x97\x0d\xb0\xa4\x20\xed\x49\x88\xe6\x06\x7c\xef\x46\x38\xa9\x19\xd2\x08\xb1\x6a\x8e\x0b\xc2\xa9\xeb\xf7\x31\x0a\xfa\xc3\xfd\xa2\x0a\x69\xaa\xa2\x98\x28\x90\x57\x54\xe5\xee\x13\x0a\xdb\x8b\xdd\x3e\xb5\xcc\x8e\xd1\xfb\x94\xcc\x24\xeb\x3c\xff\xa6\x8d\x82\xa5\x9c\xd9\xaf\x94\xaa\xb2\x50\xd4\x6d\x1d\xd5\xe9\x1c\x2f\x12\xc4\x55\xcf\x32\x53\x17\xe2\x16\xe6\x29\x55\xfb\xae\x98\xa5\x93\x5a\xb1\x56\x56\xb0\x5a\x33\xd3\xcf\x5d\xdb\xfe\x6b\xd9\xb4\xab\xe4\xa6\x5b\xb6\x66\x77\x57\x59\x73\x2d\x9a\x79\xd4\x5a\x35\xf7\xc1\x75\x9f\xea\xb8\x9b\xd6\xcb\x2f\xee\x9f\x7c\xf8\xe1\xde\x4f\x9e\xba\x66\x66\xe0\x92\x13\x9f\xa6\x1b\x54\xb6\x22\xe7\xe7\x2e\x5b\x43\x96\x16\xf9\xd5\xa4\xa5\xa7\x91\xb4\x2b\xef\x4f\xbc\xd8\x75\x0a\xdb\xb2\x74\x33\x87\x68\x61\xf8\xa8\x3f\x8d\x31\xe6\x2a\x7a\x7e\x3b\x97\xbe\x6a\x23\xcf\xb0\x91\xd7\x8f\xe6\xfd\xc7\x4a\x63\x66\xb5\x09\x80\xb6\x73\x01\xd7\xfd\xb2\xce\x77\x39\xee\x57\x3a\x0d\x32\x06\xf7\xd7\x26\xf6\x4d\xca\xaf\x41\x10\x3c\x83\x18\x98\x56\xd1\x9d\xdb\x30\x02\x9b\x7c\x62\x1e\x4d\xd5\x6e\xe6\xe2\xe7\xe6\x69\x09\xb0\x26\xdd\x47\xad\xac\x0d\xa5\x18\xf3\x5f\x8f\x87\x7b\x25\xfc\xb8\x72\x65\x49\x0c\x79\x43\x4d\x3b\x13\xe5\x5f\x85\xfc\x08\x82\xd0\x9e\xe5\x71\x2f\xa7\x3a\x2c\x66\x34\x63\xa3\x96\x08\x32\x33\xd2\xcf\xcf\x48\xbe\xdf\xca\x87\x9d\x47\x46\x17\x9d\xc3\x0b\x92\xe1\x85\xeb\xb7\x0c\x6d\x5f\xbd\xfd\x5d\x0b\x24\x37\x13\x95\x15\xa8\x4e\x39\x5c\x1c\xc1\xb0\x1f\xb8\x7e\xae\xe0\xd8\xba\x52\x31\xea\x75\xcf\x8e\x9a\x3a\x34\x95\xd5\x3a\xce\xfd\x50\x81\xb5\xb0\x49\xb3\x34\x48\x65\x94\x16\x84\x98\x5f\xc6\xec\x61\xd9\x2a\xd4\xc9\xe8\x85\xae\xd7\x45\x57\x58\xb4\xea\xd4\xda\x67\x54\x10\x21\x8f\x12\x23\xa1\xd6\x6c\x77\x77\xce\x2f\xc8\x13\xf4\x26\x0d\xa5\x0a\x5c\xbf\x9f\x7b\xb0\x2a\x4a\xea\x8f\x78\x1e\x5c\xa1\x0b\x22\x13\x14\xc2\xa3\xd2\x20\x23\x9e\x9c\xa8\x73\x9c\x1c\xd4\xfb\x76\x0a\x98\x17\x6a\xcd\x66\x91\x5f\xe2\xec\x57\xe1\xdf\xe9\x60\x82\x1d\x92\xc0\x50\x97\x04\x86\x2d\x48\x60\x58\x24\x81\x61\x33\x12\x18\x6a\xba\xf7\x5a\x30\xab\x86\xa7\xa8\xb6\x79\x7d\xe5\x96\xad\x8d\x0f\xac\xba\xa9\x4c\x43\x70\x0d\x30\x08\xd9\x89\xc5\xd3\x55\xa9\x04\x38\x46\x18\xa3\xb9\x7c\x86\x05\x21\x9a\xb8\x1e\xbc\xdd\x13\xcc\x94\x84\xd1\x54\x20\x21\xe7\x80\x69\x99\xae\xef\x62\x17\xd0\xce\xcd\xb5\xd6\xba\xd6\x96\x81\xf6\xa7\x55\x11\x80\x1a\x8b\xcd\x4a\x99\x7c\x88\xbc\x98\x99\xdb\xdb\x4a\x11\xf3\x42\xbc\xda\xa2\x25\xb6\xe4\x0f\x3c\xa2\xde\xee\xb6\x75\xa4\xb2\xab\xb1\xe3\x08\x23\xa2\xe2\x0e\xa6\xd0\x87\x21\x33\x71\x34\x5d\x97\xd4\x1f\x60\x35\x87\xa9\x9c\x50\xe4\x83\xb1\x07\x9f\xa2\x29\x8a\xf1\x2a\x35\xb3\x2a\xa8\xc7\x71\xaf\x5d\xe9\xa4\xd0\x73\x1a\x64\xc1\x47\xc4\xf0\x81\xc7\x27\xd9\x1c\x70\xc9\xf2\xba\xb6\xde\x35\xb0\xe3\x68\x65\xf5\x17\x3f\x72\x6b\x1c\xb6\x1c\x09\xd4\xd2\x51\xad\xfb\x19\xda\xca\x5f\x0b\x39\xdd\x43\xf6\xbb\xb7\x68\xc5\xe2\x68\xf5\xef\xe6\x5e\x2b\xd3\xe1\x1f\xe5\xed\x32\x59\xc9\xe7\xd1\x9a\x22\x5d\xb8\xc9\xa8\xb5\x31\x4d\x8a\x95\xd8\xb4\x39\xed\xc9\x93\xd9\x78\xb9\x1f\x3f\x53\x9b\xd3\xee\xf2\x31\x6a\xac\x69\x49\xdc\x09\x0f\x7c\xd1\xb6\x90\x31\x5a\x2d\x35\x8d\x0d\x87\xd6\xf0\x76\x30\x9a\x60\x64\x05\x9c\xf2\xb0\x9e\x4d\x63\xf4\x5f\x7f\x1c\xbf\x70\x7e\x3c\x7f\xb5\x09\x8c\x16\x32\x6f\xd8\x9a\xb7\x10\x9d\x74\x62\x2b\x20\x33\x89\xe9\xda\x34\x3a\x9d\x7b\x2f\xa7\x67\xef\x5e\x76\x83\xce\xc4\x94\x9d\xb8\xd1\xfa\x8d\xf7\xac\x9e\x55\xfb\x36\x71\xcd\xff\x6a\x8c\x6d\x29\xb8\x60\xd3\x58\x7e\x77\xfa\xf2\xd9\xf1\x93\xa5\xab\xc6\xb2\xba\xf3\xd7\x43\x11\x81\x60\xaa\xb2\xce\x32\x61\x30\x44\xf9\x7d\x64\x99\x76\x14\x1d\x33\x39\x81\xea\xc0\xe4\x9d\x10\x02\x87\xc6\x99\xb0\x27\x92\x9f\x89\xf6\x5d\xa2\x57\xdb\x33\xe0\x4f\xb9\x42\x20\xa2\x26\xf8\xa5\x37\x35\xd6\x30\x1e\xa1\x51\x25\xdf\x1a\xfc\x3f\x4e\x84\x28\xe9\x84\x4f\x54\x3f\x37\x22\x52\x32\xd1\xde\xc4\xc2\xd3\xf0\x46\x16\x54\x14\xf5\x7d\x84\x25\x35\x22\x89\xed\x78\x53\x1a\x5c\x65\x48\xff\x71\x65\x8f\xc0\x43\xcc\x35\xa7\xd7\xc9\x4f\xea\x09\x3d\x79\xa3\x4b\x12\xec\xf6\x86\x82\xf0\x1d\xa4\x2e\x58\xf3\xbf\x5c\x07\xfa\x98\x36\x39\x50\xca\x6c\xa5\x80\x21\x60\xe0\x29\xa9\x14\xff\x14\x10\x04\x9b\xfd\x80\x46\xb8\xbc\x4e\xe3\xd2\xd9\x04\xf2\x51\x31\x09\x6c\x12\xd2\x28\x42\x15\xfe\x19\x03\x4f\x31\x56\x5b\x08\xeb\xcd\x31\x8d\xd3\x49\x47\x57\xa3\xa3\x16\x1f\x52\xb8\x7d\xd7\xec\x27\x61\x1e\x2d\xd8\x0e\x79\x99\x19\x44\x36\xcf\x79\x5e\xbd\x02\x57\xf7\xaf\xf6\x1f\xeb\xc5\x39\x2b\x4f\x04\x3e\xf5\x82\xa9\x8e\xdb\x78\x12\xd6\x32\x39\x73\x24\xce\xc3\x2b\x8b\x31\x6a\x25\x0f\x4c\xdc\x30\xc2\x3c\xba\xd0\x14\x2c\xcb\x03\xe2\x1a\x7d\xb1\x65\x21\xb3\xc2\xc9\x26\xc2\xc9\x22\x18\xf6\x13\xf3\x8d\xd8\x9b\xd2\x44\x04\x25\xca\xd3\x50\x92\xe0\x3a\x4e\x34\x99\x30\x5a\x52\x55\x1a\x7b\xb3\x69\xba\x3a\xd8\xfd\xe3\xf2\x74\x76\xf1\xb4\xbd\xdc\x52\x38\xd2\xa4\xf5\x18\xc5\x8c\xf8\x4c\x2e\xb5\xf4\x68\xbf\x59\x5e\xf5\x31\xcb\xc9\xad\x39\xc3\x1a\x64\x0d\x6b\x69\xd4\x86\x1c\x12\x25\x67\x07\xbf\x25\xc8\x5b\xc1\x76\xd1\x54\x9f\x4f\x3e\xfa\x96\xc7\x08\xbd\x1d\x7b\xc0\xd7\x48\x52\x4e\x34\xf4\x52\xc1\x91\x06\xec\x0a\xd3\x3b\x13\x0f\xd7\x2b\x11\x66\xb7\x40\xcb\x1d\xc4\xa3\xdd\x37\xbe\x7f\x26\x4f\xff\x79\xf0\xfe\xe2\xe5\xf9\x6a\xfb\x27\x61\xc6\x4c\xfe\x63\x42\x47\xc2\x86\x3b\x4b\x9c\xcd\xe2\xbc\xb0\x71\xe5\xbc\x01\xc1\xd8\x23\xf7\x83\xc4\xd4\x35\xd2\x08\x4a\xe9\x4a\x27\x7b\xa0\xe6\xe5\xac\xfb\x8c\xcb\x7e\x22\xf0\xa5\x22\xb0\xa5\x66\xd8\xea\x94\x01\xb3\x6d\xa6\x80\x08\x54\xd6\xcb\x13\x30\x54\xea\x58\x9d\xd1\xb4\xe2\xf2\x0a\x71\x8b\xe6\x86\xc2\x15\xcb\x99\x3b\x0f\x60\xcc\x22\xda\xa6\x57\x8f\x81\x10\xa6\xb5\x22\x99\xaa\x17\x51\xd8\x02\x64\x29\x9c\xf2\xd9\x53\x57\xe4\x95\x54\x1a\xd2\x0a\x75\x2c\x45\xbc\x58\x08\x2b\x42\xae\xb5\x92\x2d\x31\xa1\xca\x4c\xb6\x25\x87\x96\x2b\xc7\x6c\x9c\x4d\xbb\xd7\x57\x0f\x66\x3f\x00\xd0\x50\x71\x6f\x55\x06\xa7\xcc\xe8\x26\x95\xbb\x19\x3e\x20\x1f\x5b\x52\xc1\x9a\x72\x59\xf2\xf7\x71\x14\xa9\x05\x9a\x6c\x46\x34\x86\xf3\x66\xdd\xae\x9b\xd5\xbb\x19\xae\x56\xef\xe6\x8a\x4b\xfc\x05\x2f\x7e\x83\xa8\xba\xf2\x7a\x36\x5c\x1f\xa0\x09\x7d\x05\x35\x94\x08\xfe\x4f\x5c\xe8\x39\x0a\xe9\xbf\xbc\xb8\xcc\xb0\x65\x71\x99\x56\x12\x5b\x3b\xef\x4b\x03\x75\x39\x95\xed\x36\xc1\x0f\xa4\x5d\xd0\x92\x29\x84\xc0\x71\xd1\xe6\xd9\xc1\xbd\x19\x9e\xfd\xfa\xf0\xa2\xc4\x8e\xd7\x56\xeb\xa1\x8b\xd1\x50\x79\xe8\x73\x9f\xad\xbe\x43\x67\xff\x96\x9d\x8e\x6f\x29\x55\x43\x67\x93\xaa\x4f\xe6\xfb\xb1\xaf\x3d\x83\xcc\xee\xc8\x08\x5a\xeb\xdb\x20\x74\xae\xcd\xb7\x46\x04\xc3\xbe\x8f\xb0\x3b\x71\x6d\xc0\x89\x61\xd3\x1b\xe4\xc7\xd9\xd9\x03\xbc\xfb\xab\x7a\x83\xb0\x9e\xd4\x3a\xc7\x65\x71\x29\xb5\x07\x9c\xfc\x74\xf5\x41\x97\xb3\xb2\xe6\x13\xe7\x92\x18\xf4\x95\x6b\x7e\x74\x4e\x1c\x79\xa8\xa4\x24\x72\xa7\x01\x89\x88\x70\x9f\x8d\x53\xc7\xc9\x93\x7f\xef\x1d\x2f\x5c\xb5\x34\xa5\x47\x18\xd7\x2e\x5c\x88\x05\x18\xf3\x65\xff\x81\xbe\x67\x8b\xdb\x2b\x3d\x10\x4e\x0b\x19\x08\x5a\x41\x5f\x99\x48\x76\x89\x80\xf4\x33\x6e\x73\x94\x57\x4c\xaf\x95\x8d\xa4\x49\x5d\x74\xf9\xda\x23\xe5\x58\x49\x15\x11\x3b\x8e\xfa\x1a\x55\x2d\xd3\x70\x92\xf4\x83\xd9\x82\x95\x73\xe4\x40\x2f\x3b\xa1\x37\x85\x03\x6a\x06\xa2\x64\x72\x25\x25\x2a\x4b\x0b\x53\xca\xc7\x57\xd1\xdc\x5f\x5c\x6a\xf7\xb0\x4e\x8d\xbe\xc9\x6b\x4f\x81\x26\xa4\x1b\xc1\x38\xf9\x90\x1a\xc4\x92\xf1\x59\x05\x61\x31\xa7\xcf\x0f\xc0\x34\x33\xd9\x94\x8b\xb1\xf3\xdf\xdd\x81\x96\x7d\x42\x7c\x2a\x07\x58\xfe\x7d\x25\x54\xe9\x5c\xd6\x09\xd2\xa2\x90\xe5\x46\x47\x31\x9e\x5d\x84\x88\x86\xe8\x9d\x70\x3e\xdd\xe4\xa4\x6a\x8e\x9b\x4a\xfc\x04\x20\x8a\x16\x28\x94\x85\xb4\x0b\xe9\x52\x11\x4b\xab\x60\x2a\xf9\x98\xf4\x5d\x8e\x2f\xd5\x2d\x35\xd6\xc4\xf4\xba\x45\x9c\x7a\x3f\xac\x0f\xee\xdc\x8e\x73\x51\x04\xff\x31\xbb\x63\xac\x0f\x0d\xf9\x6f\x57\x62\x83\x3f\x0c\x44\x81\x56\x05\x46\x8e\xb3\xe3\xad\x1b\x31\x35\xaa\x6f\x25\xce\x14\x59\xc8\x25\x6a\x53\x04\xae\xa1\xac\x33\x5d\xd2\xdf\x6b\xd7\x8d\x25\xd9\xac\x4a\xf6\x8f\xb1\xeb\x91\x17\xfd\x08\x03\xc2\x2a\xd6\x21\xc6\x7d\x7c\x42\xb3\x4e\xaf\x96\x01\x3c\xfc\x78\x11\x8f\x3d\xd7\x3e\x1c\x5a\x17\xa1\x7b\x0d\x30\x3c\x3c\xb0\x2e\x42\x84\xa9\x82\x77\x78\xef\xc6\x92\xd9\xda\xe1\x47\xc1\xd8\xd2\xe5\x9a\xd6\xcf\x70\x69\x7b\x08\xbc\x3b\x34\xdf\xf1\xbf\xcc\x1b\x4b\xe4\xb0\x30\xbb\x27\xfb\xd4\x0b\x08\x9c\xc3\xa1\xf5\x04\x42\x67\x0c\xec\x77\x87\x07\xd6\x31\x21\x14\x77\x1c\x63\x78\x78\xcf\x3a\x0a\x82\x10\x5d\xc3\xc3\xfb\xe2\x2f\xe7\xf0\x81\xf5\x02\xfe\xc1\xa6\xf2\xf0\xc6\x7a\x19\xc1\x90\x8c\x77\xed\xe2\x25\x1b\xf1\x38\x84\x80\xdc\x1c\x5a\x74\xec\x03\xeb\xd4\x71\xe9\xbc\x2d\xd6\x6a\xce\x21\x83\x85\xf6\xcc\x65\x83\x25\xe3\x3e\xb4\x5e\xc0\x6b\x18\x92\x07\xbe\xb6\x28\x04\xa2\x19\x4c\xea\xab\x1e\x3e\x4a\xaf\xfd\x40\x65\xd9\xc7\xe9\xa4\x87\xfb\xe9\x9c\x86\xc3\x9b\x9b\x72\x24\x3a\xac\xb6\x73\x09\xfe\xc4\xdf\x06\xdc\xc1\x16\xec\x7d\x0c\x21\x8e\x43\xdf\x98\x23\x02\xb5\x1d\xdc\x1b\x90\x9d\x04\xf0\x0e\xec\xdd\xac\x82\x6a\x8c\x2e\x67\x28\xc4\x27\x64\x59\xf2\xe7\xb3\x9f\xf3\xe1\xc2\x20\x8f\xec\xe0\x5e\xf2\x61\xf3\xd5\xab\x57\xaf\xf6\x9e\x3d\xdb\x3b\x39\x31\x7b\x37\x16\x46\x67\x11\xa2\xc3\x40\x8b\x3d\x91\x1b\xd3\xf2\xf3\xa3\x42\x7a\x91\xbc\xeb\xce\xe1\xd1\x14\x69\x4f\x20\x44\xf3\x73\xb4\xd8\x49\xdf\x7c\x79\x75\x5c\xfe\xf2\x20\xc6\x76\x76\x00\x0f\xd9\xc0\xdb\x91\x07\xaa\x40\x13\xf4\x6d\xe4\xb8\x7e\x87\x6e\xc2\x3b\xd7\x20\x34\xe0\xe8\xe3\xdb\x77\x70\x79\x89\xc3\x43\xf3\xe8\x87\xe3\x93\xd3\x27\x3f\xfe\x74\xf6\xcf\x9f\x9f\x3e\x3b\x7f\x7e\xf1\xaf\x17\x97\x57\x2f\x7f\xf9\xf5\xdf\xaf\x7e\x03\x63\xdb\x81\x93\xe9\xcc\xfd\xe3\x9d\x37\xf7\x51\xf0\x67\x18\xe1\xf8\x7a\xf1\x7e\xf9\x61\x7f\x78\x70\xef\xfe\x83\x87\x5f\x3f\x7a\xbc\xbb\x37\x32\x2d\x3a\xcb\x2c\x0a\xc9\x57\x7c\x2b\xb2\x90\xe5\x5a\xc0\x0a\x2d\xcf\xb2\x47\xa6\x69\x39\xa3\xfd\x3b\x13\x14\xee\xe0\x11\x1c\xbc\x8d\xf1\xe4\xd1\x5b\xf6\xee\x0e\xee\x7d\xe3\x7c\x8b\x07\x1e\xf4\xa7\x78\xf6\x4d\xcf\x1d\xed\xf8\x23\x3c\xb0\x67\x20\x3c\x46\x0e\x3c\xc2\x3b\xce\xee\x6e\xaf\xf7\xdd\x77\x07\x16\x18\xed\xdc\xbb\xeb\xf7\xbe\xfd\xf6\xfe\xa7\x9d\x48\xf9\xcc\x7d\x2b\x1c\xed\x0c\x1f\xdc\x8d\x7a\xdf\x7e\x7b\xf0\x69\x07\x29\x1f\x7a\x68\x79\xa3\x87\xf7\xee\x22\xcb\x8d\xce\xc1\xf9\x4e\xd4\xfb\x3e\x1c\x79\xa3\x87\xf7\x0f\xd9\x6f\xd4\xbb\x7b\x77\x87\xfc\xee\x59\xf6\xc8\xde\xc5\x33\x37\x1a\x70\x90\xd1\xc1\x8e\xf0\x8e\xdb\x53\x5e\x06\xea\xcb\xa1\xfa\xb2\xd7\xbb\xc3\xe9\xc5\xbe\xb1\x1c\x58\x0f\x47\x02\x45\x3b\x81\x22\x1e\x84\x90\x86\xa5\xec\xec\xbd\xfe\x3f\x8e\xfa\xbf\x81\xfe\x87\xfd\x3e\x41\xca\x9b\xbd\xa9\x65\x9a\xbd\x6f\x6c\x09\xa8\xfe\x28\x33\x03\xea\x8a\x7d\x3e\xd9\xc1\x62\x2e\x36\x81\x0c\x05\x99\xab\xf3\x24\x85\x74\x44\x21\xed\x32\x74\x00\xcd\xd7\x0e\x2c\x44\x90\x08\x7a\xdf\x7e\xfb\xf0\xd3\x4e\xa8\xf5\x96\xe5\xed\x8e\x2e\x71\xe8\xfa\x53\xba\x73\x8e\x39\x42\x77\xfc\x9e\xf5\xf0\xfe\x57\xa3\x11\x20\xf8\x52\x3f\x12\xf5\xf8\x33\x61\xf9\x33\xa8\x97\x20\xc2\x4b\x68\x93\xe1\x63\xc7\xeb\xdd\x58\x32\xb1\x66\x10\x94\xc1\xc1\xef\xe1\xef\x3e\x01\xfc\xef\xbe\xd9\xa3\x18\x62\x9b\xcd\x34\x2d\x7f\xb4\xff\x8d\x9f\xe2\xc2\xdf\xdd\x65\xb8\xcd\x51\xb0\xdf\xbb\x13\x7d\x3b\x3c\x78\xf4\x3d\x2c\x5b\xca\x61\xf4\xdd\xf0\xe0\xeb\xbb\x77\xa3\x6f\x0f\xf6\xef\x3f\xfa\x7e\xa7\xec\xc1\xef\xbe\x7b\xf8\x69\xf8\xf8\xa0\x67\x95\x3c\xf0\xf0\xde\xdd\xe8\xd3\xf0\xe0\x51\xaf\x77\x58\x31\xc6\xf0\xe0\xd3\xc1\xc1\xfd\xd2\x41\xc8\x57\xee\x3e\xbc\x47\xc7\xa9\xff\xd0\x0d\x07\x30\x14\xe0\x54\xd0\x7b\x1e\x68\x56\x34\xda\xb7\x50\x16\x78\x3d\x77\xb2\x93\xdf\xfa\x7e\xaf\x47\xe0\xd6\x2b\x85\x9b\xe5\xef\xee\xde\x81\x5e\x04\x0d\x77\xb2\x13\x7d\x37\x7c\x3c\xa4\x30\x3c\xb8\xdf\xcb\xf1\x07\x7f\x77\x58\xba\x96\x9d\x7b\x43\xca\x55\x1e\x7e\x22\xac\x83\x8c\x39\x3a\xa0\x83\x7e\x54\x0c\x42\x39\xad\x9b\xbf\x7e\xd0\xbb\x53\x36\x38\x67\x59\xc3\x83\x4f\x3b\x74\x78\xfe\x1d\x97\x7e\xe7\x5e\x0a\xbd\x9b\x3b\xd2\x19\xfa\x03\x88\xe0\xc3\xfb\x87\xb0\xe2\x10\xa1\xda\x42\x7f\xbc\x5c\x8b\xbc\x96\x67\x56\x70\x24\xa2\x41\x06\xff\x05\x81\x3d\x1b\x98\xbb\x58\xec\x2c\x66\xa2\x23\x82\x67\x8c\xa1\xb3\x03\xd3\x39\x88\x77\x5f\xbf\x11\xcf\x52\x9e\x30\x85\x78\x27\x89\x68\xa5\x87\xff\x29\xb0\x67\x3b\xc9\x6b\x7e\xef\xe3\x57\x5f\xc1\xc1\xc4\xf5\x9d\x1f\x96\x3b\xbc\x57\xa5\xc5\x3e\x43\xde\xf5\x2d\xdc\xeb\x7d\xfa\x04\x07\x41\x1c\xcd\xd8\x22\x77\xd8\x5d\xbe\x62\x9b\xca\x68\x3b\x1f\xe9\x9b\x87\xd9\x17\x2d\xfe\x61\x22\xe9\xf7\x7a\x56\xdd\x67\xf2\x93\x95\x3e\xe9\x13\x69\x1a\xde\xf4\x2a\x70\x34\x77\x23\x7b\x3d\xf2\xb4\xeb\x63\x18\x5e\x03\x4f\x96\x86\x20\x91\x87\x18\xfb\x49\xae\x42\x49\x46\x92\xf0\xe2\x4e\x76\xae\x91\xeb\x18\xfb\xa3\xd1\xc8\xff\xf4\xc9\xef\xf7\x8d\xef\xf6\x7b\x1f\x23\x88\xaf\xdc\x39\x44\x31\xde\x89\x2c\xd8\xbb\x83\xc3\xe5\x47\x3c\xb0\x81\xe7\xed\x10\xa5\xa8\x77\x63\x03\x6c\xcf\x28\x83\x9c\xd1\xc0\xfe\xd1\xbe\x85\x07\x18\x31\xc2\xa7\x42\xcf\x0d\xfd\xe4\x9d\xdc\x48\x37\xd6\x22\x04\xc1\x13\x3e\x81\xc2\xa4\x8b\x13\xc4\x03\x10\x04\xde\x92\x0e\x76\x73\x63\xb9\x7e\x04\x43\x7c\x84\x8f\xe3\x30\x42\x61\xe6\x7d\xba\x18\x11\x09\x34\x48\x62\x8b\x7b\x78\x40\xcd\x97\x3b\x3d\xab\x78\x93\x53\xc8\x0b\xe0\x4f\xe1\x4e\x6f\x80\xe1\x7b\x3c\x82\x09\x1f\x91\x1e\xbc\xc4\x20\xc4\x9f\x3e\x99\xfb\xe6\x68\x34\xca\x5f\xe7\xe7\x78\xe1\xba\x15\xc9\x97\x4e\x7d\xe7\x0e\x1e\x50\x2c\x8e\xf8\xbf\x83\x28\x1e\x47\x0c\x64\xfb\x96\xdf\xdb\x85\xbb\xc5\x1b\x91\x25\xae\x31\xfe\x48\xb0\x9f\xfd\xcc\xc8\xdf\x15\x37\xad\xec\xf7\xa4\x3b\x37\x74\x51\x7c\xa8\xdd\x11\xac\x12\x4b\xb9\x9d\x2b\x25\x57\x2b\xff\x04\x9b\x5b\xf1\x7a\xaa\x3c\xca\x14\xce\x70\xdb\x4a\x94\x8d\x46\x99\x0d\x0d\xdf\x63\xe8\x3b\xcc\xe8\x6f\x5a\x36\x57\xc1\xa8\x85\x22\x84\xd7\x6e\x24\x7e\x44\x10\x5f\x82\x09\xcc\xd1\x07\x65\x3a\x11\xc4\x3b\x98\xef\x6e\xce\xa7\x67\x78\xee\x91\xc7\x39\xf3\xf8\x09\xf8\x8e\x07\xc7\x20\x8c\x06\x2f\xc9\xaa\x06\x30\xb2\x41\x00\x4f\xdf\x07\x21\xb3\xe6\xef\xc0\x5e\x8f\xee\x76\xa4\x9e\x1d\x51\xb8\xcf\xe8\x0c\xa9\xa5\x90\xfc\x91\x98\xbb\xc9\x0f\x61\x98\x25\x7f\x8b\x7f\x59\x35\x26\xf6\xd6\x24\xd5\x91\xf7\xad\x49\xec\x79\xf4\xa1\x1c\x7b\xcd\x58\xd8\x53\x4b\xb0\xb4\x75\x0a\xac\x36\x7d\xa3\xb7\x6b\x1a\xe6\x6e\x7a\x27\x79\xbf\x47\x4d\x03\xee\x28\x4a\x16\x53\x3a\xf3\x64\x6d\xc2\xa5\x41\xfe\x06\x44\x47\x86\x87\x5f\x0d\x2d\x48\x2b\x31\x93\xbf\x68\xc5\x71\xf2\xc7\xc6\x97\x42\xa7\x76\x28\x73\x13\x2a\x8a\x46\x71\x00\x43\xce\x57\xc8\x15\x0b\x84\x53\x56\xf5\xa2\x67\xd1\x27\x80\x6d\xa3\xd8\xc7\xd1\xe8\xf5\x9b\x1b\x8b\x25\x7b\x63\x78\x26\x96\x99\x3b\xd6\xf0\x48\x39\xad\x01\x0e\xdd\xf9\x4e\xcf\x82\x23\xd5\xdc\xf8\xdd\x3b\x09\x49\xa6\x8e\x21\xb2\x87\xe9\xee\xdf\xd9\xb7\x86\xbd\x5d\x28\xff\xea\xdd\x58\x36\x0a\x96\xc5\x29\xb8\xe2\xac\x4b\xe4\x5c\x3c\x70\x1d\xf6\x69\xd7\xb1\xc4\x51\xc8\xaf\xf0\x1f\x16\x91\x6d\xe9\xae\x61\x97\xf9\x0f\x0b\x0f\x92\x75\xb0\x1b\xc9\x4f\x0b\x0f\xc4\x1a\xd8\x1d\xf1\xcb\xc2\x03\x4a\x0f\xec\x2a\xfd\xd3\xc2\x03\xb1\x26\x3e\x0f\xfe\xcb\xc2\x03\x46\x26\x23\x0e\x6c\xf2\x37\x19\x80\x52\x0c\x1f\x81\xfe\x4d\x9e\x24\xc4\xc3\x1f\x24\x7f\xd2\x97\x39\x76\x32\xb8\xb2\x30\xd9\x91\x40\xa2\x5c\x1a\x88\x49\x88\x92\x3b\x5e\x33\x44\x0b\x3c\x0f\x2d\x8e\x7c\xe4\x2f\xe7\x28\x8e\x8e\xa8\xe5\xee\xf0\xab\xe1\x4d\xcf\x0a\xa5\x21\x12\x5a\x7f\x6f\xc3\x30\xc0\xe4\xcf\x3f\xd0\x98\xee\x04\xc4\x3c\xa5\xe4\x6f\x14\x4e\xe5\x8d\xcb\xfe\x4e\x99\x00\x06\x53\xba\x37\x84\x71\x8e\xfc\x1d\x30\x3b\x17\x19\x60\xdf\x02\xd4\x36\x04\xbc\xc3\x7d\x2b\xf2\xe2\x69\x61\x7b\x94\x6d\x07\x28\xc4\x80\xc1\x1c\xbc\x83\x97\x5e\x3c\xdd\x49\x69\x8d\xd1\x19\xd9\x04\x22\x66\x82\x2d\xcf\x93\x96\x07\x62\x3c\x43\x21\x99\x8f\x93\x32\x52\xa9\x79\x16\x9d\xb5\x80\x22\x66\xfc\x48\x39\x43\x9e\x94\xd1\x70\x8a\xec\xad\x1e\xe3\x39\xb6\x02\xec\x09\x60\x53\x60\x4a\xbc\xd1\x4f\xc6\x4e\x8d\x8a\x03\x6e\x4a\x5c\x0b\x20\xe7\x20\x7c\x77\x14\xbd\x80\xe4\xf4\xa3\x00\xcd\x73\x16\xba\x91\xd3\x19\x9a\x56\xc9\x14\xb9\x8d\xb3\x77\xc3\x87\x14\xf6\xcf\xb6\xe3\xd1\xb7\xd3\xd1\x98\x59\xb5\xe5\x60\xf4\xe5\xde\x4d\x5b\xd6\x19\xcd\x40\x08\x9d\x5f\x5d\x3c\x23\xcc\x93\xc8\x18\x12\x5e\x85\x00\xc6\x0f\x47\x72\x35\xe2\x64\x36\x71\x3d\xc8\x31\xec\x7a\x50\x10\x00\xdf\x6c\x82\x0e\x6e\x7a\x56\x5c\x3a\x5c\x42\x2c\x5c\x48\xa7\x34\x42\x76\x2a\xbc\x86\xde\xe1\xd0\x8a\xe0\x9f\x31\xf4\x6d\x78\x38\xdc\xdf\xbf\xcf\xc4\x05\x17\xf9\xd1\xe1\x7e\x4a\xe2\x63\xe4\x2c\xc9\xbf\x21\x58\xfc\xc0\xff\x64\x8d\x61\x0e\xf7\xad\x10\x7a\x80\x30\xaa\x64\x4f\x9f\xab\x4e\x32\xfa\x31\x05\x89\x99\xb3\xcc\x19\x45\x9f\x22\x24\x85\x91\x7d\xe6\x3b\x44\x0d\xd1\x1d\xc9\x38\xd8\xff\xc7\x4e\x61\xa8\xfe\x30\x33\xda\x71\x14\x15\xf7\xa8\xb8\xa9\x9a\x1e\xaf\x9c\xec\xc1\x09\xee\xcb\x33\x4d\x5f\x5a\xe1\x38\x9d\x43\x0c\x46\x1f\xa9\xc4\x39\x97\xd0\x17\x80\x29\x87\x66\x09\x22\x25\x34\x90\x77\x42\x1f\x78\x97\x28\x0e\x6d\x2a\x5f\xb4\x9c\x0b\x75\x3d\x4d\xf9\x6c\x02\x69\x36\x39\xaa\x49\x68\x22\xc7\x0e\x5d\x1b\xf9\x4f\x90\x8f\x93\xbf\x5d\xf6\xd8\x0c\x44\x67\x73\x72\xc8\xe4\xc1\x2e\x5e\x30\x2d\x53\x3c\x5f\x2d\xda\x24\x4f\xf5\xb8\xe8\xfe\xdd\x3e\x0d\xc4\x91\x94\xbe\x23\x8c\x81\x3d\x23\xcb\x7a\x46\x44\xf5\x43\x27\xf1\x79\xb0\xdf\xa1\xc5\x76\x34\xfb\x65\x5b\xcf\xc3\x29\xf0\xdd\x0f\xf4\xc0\x62\xd7\x80\x75\x01\xa6\x90\xfd\x1d\xb3\xbf\x21\x06\xec\xf7\x3c\xf5\xc2\xb0\x61\x2e\x40\x88\x5d\xdb\x0d\x80\x8f\x0f\x91\x75\xc9\xce\x2d\xf6\x6c\x60\x09\xcf\x05\xfb\xed\x51\x4f\x09\xfb\xdb\xad\x50\x31\x7c\xb8\x9e\x6c\xe9\x8f\x53\x88\x2f\xe3\xb1\x83\xe6\xc0\xf5\x0f\xb3\x8a\x2e\x11\x41\x82\xeb\xfb\x3b\x0b\xd7\x77\xd0\x62\x20\x4e\xf0\xc1\x0c\x45\xb8\xd7\xe3\x1b\xc1\xbc\xc3\x04\x2a\x42\x73\x23\xd5\x93\x83\x28\xf0\x5c\xbc\x63\x0e\xcc\x44\xd4\x12\x3a\xd6\x77\xc3\xbb\x77\x77\xf0\x08\xbe\xde\x7f\x33\xc0\xe8\x29\x5a\xc0\xf0\x18\x44\x70\xa7\xd7\xb3\x30\x91\x23\xf1\x51\x10\xbc\x0c\xbd\x82\x05\xb8\xfe\x43\x70\x10\xc2\x39\xba\x86\x47\x78\x67\x9f\x29\x46\xfe\x08\x0e\xfe\x40\xae\x9f\x99\x08\x15\xbd\x02\x02\xab\xde\xf7\x64\x09\x87\x78\x77\x64\x0e\x4c\x2b\x3f\x3c\x91\x3e\x90\x8d\xbc\x5d\x73\x6f\xcf\xdc\xc5\xbb\xfe\x8d\xe5\x46\x47\x7f\x80\xf7\x4c\x0e\xa2\xce\x56\x95\xd3\x83\x99\x0a\xbe\x1a\x8d\xf0\xdd\xbb\x3b\x26\x79\xc1\x60\x22\x04\xa7\x2d\x63\x02\x5c\x0f\x3a\x4c\x47\xe6\x52\xd7\xa7\x4f\xe9\x5b\x03\x48\x46\x8e\xee\xde\x15\x7f\x25\x14\x4e\xc6\xbb\xbf\x3f\x64\x6f\xb2\x7b\x04\x8a\x8c\xfb\x7e\xfa\x64\xde\xdf\xbf\xa7\xbe\x47\x44\x62\x36\xf7\x73\x84\x9f\xa0\xd8\x77\xb4\x66\xaf\x37\x27\xf3\xfe\xfe\x7d\xf5\x67\xc9\x47\xcf\x98\xe7\xf9\xa9\x6b\x43\x3f\x82\xdd\x7e\xf6\xa0\xe4\xb3\x15\x5b\x4a\xe8\xe4\xeb\xd8\x55\x42\x2c\x52\xad\x2f\xa2\xe2\x92\xf5\x71\x8e\x1c\x78\x68\x86\x13\xfb\xde\xe3\x47\x0f\x89\x80\xbc\x80\x21\x1d\x88\xc8\x25\xef\x08\xa7\xaf\xb0\x04\xaf\xe8\xa7\x32\xad\x68\xb4\xff\x4d\xf4\x2d\xfe\x26\xda\xdd\xed\xc1\xdd\x91\x2f\xdc\x0b\xcf\x00\x9e\x0d\x26\x1e\x42\x21\xfb\x33\x04\xbe\x83\xe6\x3b\xbd\x7f\xf8\xc2\x9e\x92\x6e\xe3\x1b\x0b\xfa\x4e\x44\x64\x97\x9c\xe1\x80\x3d\xd0\x1f\x52\xc4\x09\x0f\x06\x55\x86\xe8\x10\xfd\xc4\x36\x53\x85\x1f\x8c\xd6\x64\x02\x24\x2c\x0f\xe7\x1c\xa2\x50\xd8\xa4\x3e\x62\x64\x5f\x21\xe4\x45\x87\x1f\xe3\xe0\x8a\xf6\x1e\x62\x27\xee\xc2\x4f\x7f\xb9\xf4\x88\x3f\xf3\xed\x90\x46\x09\x11\x95\x84\xa8\x47\x5c\x32\x21\x2a\x3c\xf9\xf9\x3c\xc6\xfc\xf7\x8d\xc5\xa2\x1b\xc0\xd8\x83\xe4\xec\x20\x8f\xc4\xc1\x09\xaf\xb0\x70\xf8\xd5\x3e\x1d\x5f\xfe\xcd\xbe\x20\x5f\x41\x6c\x34\xf9\x52\x22\x10\xdc\xdc\x61\xec\x3a\xf6\x19\x40\x9c\x1d\x28\x18\xb4\xe1\xdf\xf1\x07\xec\xc1\x11\xe4\x07\xa6\x63\x0a\x63\xd1\x5b\x6a\xc5\x25\xf3\x7e\xbf\x83\x2d\x05\xb1\x62\xf6\x0a\x19\x60\x40\xde\x1b\x8d\xe4\x51\x6e\x7a\xe4\xc3\xfd\xe1\x68\x34\x8a\xd2\xef\x91\xa1\xd1\xe8\xed\xc0\x8d\x5e\x26\xf3\xc1\xaf\xa3\xfe\xf0\x4d\xef\x7b\xf6\xef\x21\xfb\x27\x1d\xdb\xec\x59\x6e\xf1\x8d\x5d\xfe\xc6\x2e\x7b\x63\x37\xfb\x06\xf9\x74\xf6\x15\xea\xa5\xf4\x07\x02\x83\x03\x81\xc0\x91\x69\xf6\xac\xec\xa3\x6e\xee\xd1\x14\xbf\xf4\xe1\xaf\xf2\x03\x33\xf2\x00\xad\x00\x86\x8a\x00\xfb\x6a\x34\x02\xe9\x9e\x0e\x47\xe0\x9b\xf0\xbb\xd1\xfe\xdd\xbb\x5f\xed\xc0\x8c\x98\xfa\x1d\x7e\x1d\x4a\x8b\x1e\xf0\xcb\xbd\x6f\xc2\x7e\xbf\xe7\x4e\x72\x4f\x13\x16\xa8\x7e\xfe\xa3\x0a\x2a\xb9\x67\x29\x59\x8c\x43\x08\xde\xdd\x48\x4f\x4b\x84\x2d\x16\x22\xe6\x36\xca\x7e\xdd\x92\xde\xca\x6d\x90\xdc\x9b\xfd\xdc\x8b\xd4\x98\x5e\xfa\x72\x16\x51\xf9\x91\x87\xbd\x9b\x1b\x77\xb2\xf3\x55\x1e\xbd\x0c\x61\x5e\x2b\x84\xb9\x4a\x84\x79\x3d\x81\x2f\x7b\xe4\x49\x9e\x64\x82\x35\xfc\xda\x56\x80\xfd\xdb\xec\x3a\x7b\xdf\xd8\xbb\xbb\x25\x58\x53\xbd\x9e\xc1\x9a\x44\xa0\xb9\xa7\x25\xbc\xe5\x88\xc7\xcd\xfc\xac\x22\x78\xe1\x4d\xcb\x23\x9e\xb3\xb0\x1c\xa6\xbf\x1b\x5a\xfe\x20\xe5\x5f\x23\xd3\xcc\x22\x50\x50\x18\xd1\x98\x25\xbe\x56\x78\x2e\x9d\x83\xe5\x0f\xb2\x1c\x6f\xf4\x95\x9a\x06\x2d\x7f\x90\x63\x84\xc5\x27\xf9\xa4\x2d\x7f\x90\xe5\xba\x23\x37\x1a\xf8\x08\x73\x91\x4f\x31\xdf\xde\xa7\x4f\x65\x8f\xa4\x53\xed\x7d\xfa\xa4\x9e\x5a\xf1\x7a\x32\x91\x1b\x8b\x08\xa3\x2f\x83\x12\xa7\x13\xa3\x51\xd9\x01\x08\x25\x53\x4b\x81\x3c\x71\x71\xe6\xd4\xb6\x4e\xad\x51\xee\xe8\xf5\x1b\x7e\x1a\x90\x85\xa4\x27\x42\x44\x08\x20\x1a\x45\x32\x0b\xed\x59\x99\x43\xc3\x67\x00\x90\xdf\x11\x5c\xdd\xbd\x53\xe4\x7f\x50\x73\x3b\x45\xf2\x76\xfa\x86\x31\xbf\xbb\x77\x0b\x13\x84\xaf\x01\x39\x22\xee\xde\xdd\x41\x23\xf6\x77\x66\xaa\x77\x18\xa7\xe4\x83\x09\xe3\x84\xd9\xb3\x3c\x81\x57\xb2\x7e\x7a\x06\x14\x86\x46\xbd\xef\x51\xfe\xbd\xc3\x7d\xcb\x6e\xb5\x1c\x5f\xc9\x1d\x6c\x86\x4c\x67\xb4\x13\xee\x7a\xbd\xbd\x83\x3b\x2e\x75\x79\x26\x5a\xbb\xf4\x56\x6a\x59\x71\x6e\xd2\xb8\x88\x78\x64\xef\x0e\xbf\x89\xbf\x85\x12\x5b\x81\xaf\x63\x15\x5b\x11\x53\x48\xf8\x4a\xbc\xbb\xdb\x73\x46\x3b\xce\x6e\x01\x3a\xbd\xbd\x03\x2b\x37\x93\xdc\xa0\x85\x19\x09\x5e\xe0\x32\xaa\x3d\x41\x8b\xa2\xdf\xb1\x28\x3d\xb4\x82\x9e\x85\x56\xa0\xfd\x74\x4b\x12\x34\x14\x51\x4e\x09\x09\x15\x69\xc8\x6d\x35\xef\xcc\x21\x6e\x01\xbe\xcb\x98\xe8\xf3\xe9\x13\xfd\xd7\x15\x9b\x05\x70\x5a\xdd\xb7\xbc\x11\xa3\xb2\x10\x46\x78\x07\x5a\x6e\xcf\x72\xe8\x2f\xea\x07\xb7\xeb\x3e\xcd\xf1\xfb\xd5\x28\x87\xf0\x4f\x9f\xaa\x01\xab\xbc\x5f\x90\x42\x9c\x44\x83\x62\xf8\x8c\x47\x0e\x51\x9c\x64\x99\x6c\x3e\x82\xaf\xdb\x00\x2b\x96\xbf\xd5\x1f\xca\x0c\x89\x6e\xd2\x39\x41\xce\x7c\x34\x2f\xf0\xa2\xcc\x13\xf3\xec\xa1\x93\x23\xfa\x70\xb4\x13\xe7\xa9\x7d\x77\xae\xa2\x7f\x6f\x54\x78\x90\x45\xa9\x90\x55\x07\x23\xf8\xda\xcd\x4b\x96\xe1\x68\x27\x28\x8c\x5d\xe0\x20\x6c\xec\xc2\x83\x37\xcc\x75\xec\x8d\x0e\xfe\xb1\x13\x8e\x0e\xfe\x61\xbf\xb6\x85\xde\x23\x7f\x66\x20\x0d\x74\x07\x68\x30\x8b\x50\x62\x16\x13\xc1\x66\xac\xe9\x28\xda\x1d\x7e\x33\xcd\xb1\x8d\xa9\x16\xdb\x98\x8a\xb0\xab\xd9\x68\x67\xc2\xb8\x16\xc8\xf3\x8a\x69\x39\xaf\x98\xa5\xbc\x02\xdc\x70\x8d\x65\x8d\x9c\xe2\xf5\x9b\x3b\xa8\x1c\x4c\xcc\x6a\x9d\x5d\xe1\x2e\x2e\x95\x1b\x25\x58\xba\x14\x82\x6e\x0e\x82\xae\x16\x04\xdd\xdd\xdd\x1e\xca\x83\xcc\x2d\x80\x8c\x4d\x4e\x3d\x68\xf5\x24\x39\x78\xd0\x8d\xd0\xff\xb6\x0a\xc0\xfd\xe1\xf6\xc0\x91\xce\x25\x01\x97\xd2\xae\xc0\x6c\xd9\x7b\xd0\xbf\x76\x43\xe4\xb3\xd2\x65\xaf\xdf\xc8\xc6\x65\x1c\x2e\xb9\x83\xb8\xfa\x2d\x38\x4a\x62\x63\xfe\x8c\x61\xb8\x64\xfd\x26\x51\xb8\xf3\xf7\x39\xc4\xe0\x35\xf5\xf7\x9a\x7f\xdf\xc5\xbb\x7f\x37\xdf\xfc\x9d\xc6\x42\x1d\x61\x1e\x3d\x2f\x05\x45\x59\xfe\xe8\x23\xb7\x4a\x1c\xfe\xf3\xf2\xf9\xf9\x20\x00\x61\x04\x77\x62\x9f\x05\x50\x10\x25\xfe\x46\x2c\x49\x6d\xf0\xf0\xcb\x0d\x1e\x3e\x8f\x39\x82\x49\xcc\x11\x5c\x18\xd4\xe8\xb6\xf3\xf7\x63\x14\x7b\x8e\xe1\x23\x6c\x84\x10\x38\x06\x5b\x21\x6b\x31\x49\xe6\x6f\x60\x30\x35\x16\x2e\x9e\xd1\x2e\xae\x06\x5f\xc8\xe0\xef\x34\x86\x23\x8c\x7d\xdf\xf5\xa7\x57\x30\xc2\xd1\xa7\x4f\x21\xfc\x33\x76\x43\x19\xc8\x20\x08\xcc\x5e\xe2\x29\x13\x11\x65\x4f\x9f\xff\xf8\xf6\xc5\xe9\xe5\xf3\xa7\xbf\x9c\xbe\x38\xfc\x6a\x68\x91\xdf\x47\xc7\x57\x67\xbf\x9c\xbe\xfd\xf1\xf4\xfc\xf4\xc5\xd1\xd5\xd9\xf3\x73\x71\xe3\x97\xb3\xd3\x5f\xdf\x3e\x7d\xfe\xfc\xe7\x97\x17\x97\xe2\xda\xd5\x8b\xa3\xf3\xcb\x33\xf2\x94\xea\xd2\xdb\xb3\xf3\xab\xd3\x17\xe7\x47\x4f\xc9\x3d\x3f\x93\xe3\x61\x5a\xd7\x30\x64\x5e\xb3\xe1\xe0\xc1\xd7\x83\xfd\xdd\xfd\x83\x87\x07\x5f\x3f\xbc\x67\x9b\x37\xbd\x3b\xff\x7f\x00\x00\x00\xff\xff\xb0\x80\x61\x03\xab\x36\x07\x00") -func bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJsBytes() ([]byte, error) { +func bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJsBytes() ([]byte, error) { return bindataRead( - _bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJs, - "bindata/public/assets/documize-9462f18402b546fde2d0d807281ae7ab.js", + _bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJs, + "bindata/public/assets/documize-918475c4ba74e809565c23e7f86ae36c.js", ) } -func bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJs() (*asset, error) { - bytes, err := bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJsBytes() +func bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJs() (*asset, error) { + bytes, err := bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJsBytes() if err != nil { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/documize-9462f18402b546fde2d0d807281ae7ab.js", size: 472747, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/documize-918475c4ba74e809565c23e7f86ae36c.js", size: 472747, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1066,7 +1066,7 @@ func bindataPublicAssetsDocumize99dcfec5ca4e18d5f3bb1e1e911b86bbCss() (*asset, e return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/documize-99dcfec5ca4e18d5f3bb1e1e911b86bb.css", size: 253357, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/documize-99dcfec5ca4e18d5f3bb1e1e911b86bb.css", size: 253357, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1086,7 +1086,7 @@ func bindataPublicAssetsFontDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/font/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/font/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1106,7 +1106,7 @@ func bindataPublicAssetsFontIconsMaterialiconsRegularEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.eot", size: 143258, mode: os.FileMode(493), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.eot", size: 143258, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1126,7 +1126,7 @@ func bindataPublicAssetsFontIconsMaterialiconsRegularTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.ttf", size: 128180, mode: os.FileMode(493), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.ttf", size: 128180, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1146,7 +1146,7 @@ func bindataPublicAssetsFontIconsMaterialiconsRegularWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.woff", size: 57620, mode: os.FileMode(493), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.woff", size: 57620, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1166,7 +1166,7 @@ func bindataPublicAssetsFontIconsMaterialiconsRegularWoff2() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.woff2", size: 44300, mode: os.FileMode(493), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/font/icons/MaterialIcons-Regular.woff2", size: 44300, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1186,7 +1186,7 @@ func bindataPublicAssetsImgDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1206,7 +1206,7 @@ func bindataPublicAssetsImgAttachmentsAviPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/avi.png", size: 1495, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/avi.png", size: 1495, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1226,7 +1226,7 @@ func bindataPublicAssetsImgAttachmentsBinPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/bin.png", size: 1470, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/bin.png", size: 1470, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1246,7 +1246,7 @@ func bindataPublicAssetsImgAttachmentsCodePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/code.png", size: 1520, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/code.png", size: 1520, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1266,7 +1266,7 @@ func bindataPublicAssetsImgAttachmentsCssPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/css.png", size: 1542, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/css.png", size: 1542, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1286,7 +1286,7 @@ func bindataPublicAssetsImgAttachmentsDocPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/doc.png", size: 1497, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/doc.png", size: 1497, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1306,7 +1306,7 @@ func bindataPublicAssetsImgAttachmentsGifPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/gif.png", size: 1463, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/gif.png", size: 1463, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1326,7 +1326,7 @@ func bindataPublicAssetsImgAttachmentsHtmlPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/html.png", size: 1459, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/html.png", size: 1459, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1346,7 +1346,7 @@ func bindataPublicAssetsImgAttachmentsImagePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/image.png", size: 1511, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/image.png", size: 1511, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1366,7 +1366,7 @@ func bindataPublicAssetsImgAttachmentsJpgPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/jpg.png", size: 1502, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/jpg.png", size: 1502, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1386,7 +1386,7 @@ func bindataPublicAssetsImgAttachmentsMp3Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/mp3.png", size: 1509, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/mp3.png", size: 1509, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1406,7 +1406,7 @@ func bindataPublicAssetsImgAttachmentsPdfPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/pdf.png", size: 1443, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/pdf.png", size: 1443, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1426,7 +1426,7 @@ func bindataPublicAssetsImgAttachmentsPngPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/png.png", size: 1514, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/png.png", size: 1514, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1446,7 +1446,7 @@ func bindataPublicAssetsImgAttachmentsPptPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/ppt.png", size: 1445, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/ppt.png", size: 1445, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1466,7 +1466,7 @@ func bindataPublicAssetsImgAttachmentsPsdPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/psd.png", size: 1508, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/psd.png", size: 1508, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1486,7 +1486,7 @@ func bindataPublicAssetsImgAttachmentsSettingsPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/settings.png", size: 1589, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/settings.png", size: 1589, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1506,7 +1506,7 @@ func bindataPublicAssetsImgAttachmentsTxtPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/txt.png", size: 1444, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/txt.png", size: 1444, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1526,7 +1526,7 @@ func bindataPublicAssetsImgAttachmentsUnknownPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/unknown.png", size: 1391, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/unknown.png", size: 1391, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1546,7 +1546,7 @@ func bindataPublicAssetsImgAttachmentsVectorPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/vector.png", size: 1395, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/vector.png", size: 1395, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1566,7 +1566,7 @@ func bindataPublicAssetsImgAttachmentsVideoPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/video.png", size: 1336, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/video.png", size: 1336, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1586,7 +1586,7 @@ func bindataPublicAssetsImgAttachmentsVsdPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/vsd.png", size: 1545, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/vsd.png", size: 1545, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1606,7 +1606,7 @@ func bindataPublicAssetsImgAttachmentsXlsPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/xls.png", size: 1520, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/xls.png", size: 1520, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1626,7 +1626,7 @@ func bindataPublicAssetsImgAttachmentsZipPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/attachments/zip.png", size: 1459, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/attachments/zip.png", size: 1459, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1646,7 +1646,7 @@ func bindataPublicAssetsImgBusyBlackGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/busy-black.gif", size: 97340, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/busy-black.gif", size: 97340, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1666,7 +1666,7 @@ func bindataPublicAssetsImgBusyGrayGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/busy-gray.gif", size: 83378, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/busy-gray.gif", size: 83378, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1686,7 +1686,7 @@ func bindataPublicAssetsImgBusyWhiteGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/busy-white.gif", size: 42705, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/busy-white.gif", size: 42705, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1706,7 +1706,7 @@ func bindataPublicAssetsImgGithubIconLastUpdatedPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/github/icon-last-updated.png", size: 1293, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/github/icon-last-updated.png", size: 1293, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1726,7 +1726,7 @@ func bindataPublicAssetsImgIconBlack1024x1024Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-1024x1024.png", size: 17397, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-1024x1024.png", size: 17397, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1746,7 +1746,7 @@ func bindataPublicAssetsImgIconBlack128x128Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-128x128.png", size: 2418, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-128x128.png", size: 2418, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1766,7 +1766,7 @@ func bindataPublicAssetsImgIconBlack256x256Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-256x256.png", size: 4174, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-256x256.png", size: 4174, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1786,7 +1786,7 @@ func bindataPublicAssetsImgIconBlack64x64Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-64x64.png", size: 1724, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-black-64x64.png", size: 1724, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1806,7 +1806,7 @@ func bindataPublicAssetsImgIconBlue1024x1024Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-1024x1024.png", size: 16700, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-1024x1024.png", size: 16700, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1826,7 +1826,7 @@ func bindataPublicAssetsImgIconBlue128x128Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-128x128.png", size: 2526, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-128x128.png", size: 2526, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1846,7 +1846,7 @@ func bindataPublicAssetsImgIconBlue256x256Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-256x256.png", size: 4247, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-256x256.png", size: 4247, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1866,7 +1866,7 @@ func bindataPublicAssetsImgIconBlue64x64Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-64x64.png", size: 1751, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-blue-64x64.png", size: 1751, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1886,7 +1886,7 @@ func bindataPublicAssetsImgIconWhite1024x1024Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-1024x1024.png", size: 17035, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-1024x1024.png", size: 17035, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1906,7 +1906,7 @@ func bindataPublicAssetsImgIconWhite128x128Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-128x128.png", size: 2542, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-128x128.png", size: 2542, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1926,7 +1926,7 @@ func bindataPublicAssetsImgIconWhite256x256Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-256x256.png", size: 4213, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-256x256.png", size: 4213, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1946,7 +1946,7 @@ func bindataPublicAssetsImgIconWhite64x64Png() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-64x64.png", size: 1747, mode: os.FileMode(384), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/icon-white-64x64.png", size: 1747, mode: os.FileMode(384), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1966,7 +1966,7 @@ func bindataPublicAssetsImgLogoBlackPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/logo-black.png", size: 10031, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/logo-black.png", size: 10031, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -1986,7 +1986,7 @@ func bindataPublicAssetsImgLogoColorPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/logo-color.png", size: 5618, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/logo-color.png", size: 5618, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2006,7 +2006,7 @@ func bindataPublicAssetsImgOnboardLockGreenPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/lock-green.png", size: 3229, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/lock-green.png", size: 3229, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2026,7 +2026,7 @@ func bindataPublicAssetsImgOnboardLockRedPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/lock-red.png", size: 3158, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/lock-red.png", size: 3158, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2046,7 +2046,7 @@ func bindataPublicAssetsImgOnboardLockPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/lock.png", size: 3004, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/lock.png", size: 3004, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2066,7 +2066,7 @@ func bindataPublicAssetsImgOnboardNavIconsPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/nav-icons.png", size: 2527, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/nav-icons.png", size: 2527, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2086,7 +2086,7 @@ func bindataPublicAssetsImgOnboardPatternPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/pattern.png", size: 6084, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/pattern.png", size: 6084, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2106,7 +2106,7 @@ func bindataPublicAssetsImgOnboardPersonGreenPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/person-green.png", size: 6260, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/person-green.png", size: 6260, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2126,7 +2126,7 @@ func bindataPublicAssetsImgOnboardPersonRedPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/person-red.png", size: 6057, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/person-red.png", size: 6057, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2146,7 +2146,7 @@ func bindataPublicAssetsImgOnboardPersonPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/onboard/person.png", size: 5580, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/onboard/person.png", size: 5580, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2166,7 +2166,7 @@ func bindataPublicAssetsImgSetupDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/setup/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/setup/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2186,7 +2186,7 @@ func bindataPublicAssetsImgSetupCogsPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/setup/cogs.png", size: 14989, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/setup/cogs.png", size: 14989, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2206,7 +2206,7 @@ func bindataPublicAssetsImgSetupErrorPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/setup/error.png", size: 2660, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/setup/error.png", size: 2660, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2226,7 +2226,7 @@ func bindataPublicAssetsImgSetupLogoPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/img/setup/logo.png", size: 5618, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/img/setup/logo.png", size: 5618, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2246,7 +2246,7 @@ func bindataPublicAssetsVendorA09c1b102f55559735bac0f2dff9f487Js() (*asset, erro return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/vendor-a09c1b102f55559735bac0f2dff9f487.js", size: 1615829, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/vendor-a09c1b102f55559735bac0f2dff9f487.js", size: 1615829, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2266,7 +2266,7 @@ func bindataPublicAssetsVendorD41d8cd98f00b204e9800998ecf8427eCss() (*asset, err return nil, err } - info := bindataFileInfo{name: "bindata/public/assets/vendor-d41d8cd98f00b204e9800998ecf8427e.css", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/assets/vendor-d41d8cd98f00b204e9800998ecf8427e.css", size: 0, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2286,7 +2286,7 @@ func bindataPublicCodemirrorDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/.DS_Store", size: 12292, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/.DS_Store", size: 12292, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2306,7 +2306,7 @@ func bindataPublicCodemirrorAddonDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2326,7 +2326,7 @@ func bindataPublicCodemirrorAddonCommentCommentJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/comment/comment.js", size: 3999, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/comment/comment.js", size: 3999, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2346,7 +2346,7 @@ func bindataPublicCodemirrorAddonCommentContinuecommentJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/comment/continuecomment.js", size: 1558, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/comment/continuecomment.js", size: 1558, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2366,7 +2366,7 @@ func bindataPublicCodemirrorAddonDialogDialogCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/dialog/dialog.css", size: 507, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/dialog/dialog.css", size: 507, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2386,7 +2386,7 @@ func bindataPublicCodemirrorAddonDialogDialogJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/dialog/dialog.js", size: 2149, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/dialog/dialog.js", size: 2149, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2406,7 +2406,7 @@ func bindataPublicCodemirrorAddonDisplayAutorefreshJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/autorefresh.js", size: 852, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/autorefresh.js", size: 852, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2426,7 +2426,7 @@ func bindataPublicCodemirrorAddonDisplayFullscreenCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/fullscreen.css", size: 116, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/fullscreen.css", size: 116, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2446,7 +2446,7 @@ func bindataPublicCodemirrorAddonDisplayFullscreenJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/fullscreen.js", size: 888, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/fullscreen.js", size: 888, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2466,7 +2466,7 @@ func bindataPublicCodemirrorAddonDisplayPanelJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/panel.js", size: 2409, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/panel.js", size: 2409, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2486,7 +2486,7 @@ func bindataPublicCodemirrorAddonDisplayPlaceholderJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/placeholder.js", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/placeholder.js", size: 1194, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2506,7 +2506,7 @@ func bindataPublicCodemirrorAddonDisplayRulersJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/rulers.js", size: 1177, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/display/rulers.js", size: 1177, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2526,7 +2526,7 @@ func bindataPublicCodemirrorAddonEditClosebracketsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/closebrackets.js", size: 3466, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/closebrackets.js", size: 3466, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2546,7 +2546,7 @@ func bindataPublicCodemirrorAddonEditClosetagJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/closetag.js", size: 3274, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/closetag.js", size: 3274, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2566,7 +2566,7 @@ func bindataPublicCodemirrorAddonEditContinuelistJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/continuelist.js", size: 1348, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/continuelist.js", size: 1348, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2586,7 +2586,7 @@ func bindataPublicCodemirrorAddonEditMatchbracketsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/matchbrackets.js", size: 2580, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/matchbrackets.js", size: 2580, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2606,7 +2606,7 @@ func bindataPublicCodemirrorAddonEditMatchtagsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/matchtags.js", size: 1342, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/matchtags.js", size: 1342, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2626,7 +2626,7 @@ func bindataPublicCodemirrorAddonEditTrailingspaceJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/trailingspace.js", size: 503, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/edit/trailingspace.js", size: 503, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2646,7 +2646,7 @@ func bindataPublicCodemirrorAddonFoldBraceFoldJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/brace-fold.js", size: 1909, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/brace-fold.js", size: 1909, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2666,7 +2666,7 @@ func bindataPublicCodemirrorAddonFoldCommentFoldJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/comment-fold.js", size: 1018, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/comment-fold.js", size: 1018, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2686,7 +2686,7 @@ func bindataPublicCodemirrorAddonFoldFoldcodeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/foldcode.js", size: 2503, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/foldcode.js", size: 2503, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2706,7 +2706,7 @@ func bindataPublicCodemirrorAddonFoldFoldgutterCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/foldgutter.css", size: 435, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/foldgutter.css", size: 435, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2726,7 +2726,7 @@ func bindataPublicCodemirrorAddonFoldFoldgutterJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/foldgutter.js", size: 2425, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/foldgutter.js", size: 2425, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2746,7 +2746,7 @@ func bindataPublicCodemirrorAddonFoldIndentFoldJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/indent-fold.js", size: 651, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/indent-fold.js", size: 651, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2766,7 +2766,7 @@ func bindataPublicCodemirrorAddonFoldMarkdownFoldJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/markdown-fold.js", size: 712, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/markdown-fold.js", size: 712, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2786,7 +2786,7 @@ func bindataPublicCodemirrorAddonFoldXmlFoldJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/xml-fold.js", size: 3374, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/fold/xml-fold.js", size: 3374, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2806,7 +2806,7 @@ func bindataPublicCodemirrorAddonHintAnywordHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/anyword-hint.js", size: 788, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/anyword-hint.js", size: 788, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2826,7 +2826,7 @@ func bindataPublicCodemirrorAddonHintCssHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/css-hint.js", size: 1173, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/css-hint.js", size: 1173, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2846,7 +2846,7 @@ func bindataPublicCodemirrorAddonHintHtmlHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/html-hint.js", size: 7630, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/html-hint.js", size: 7630, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2866,7 +2866,7 @@ func bindataPublicCodemirrorAddonHintJavascriptHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/javascript-hint.js", size: 3047, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/javascript-hint.js", size: 3047, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2886,7 +2886,7 @@ func bindataPublicCodemirrorAddonHintShowHintCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/show-hint.css", size: 623, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/show-hint.css", size: 623, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2906,7 +2906,7 @@ func bindataPublicCodemirrorAddonHintShowHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/show-hint.js", size: 8692, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/show-hint.js", size: 8692, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2926,7 +2926,7 @@ func bindataPublicCodemirrorAddonHintSqlHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/sql-hint.js", size: 3503, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/sql-hint.js", size: 3503, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2946,7 +2946,7 @@ func bindataPublicCodemirrorAddonHintXmlHintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/xml-hint.js", size: 2152, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/hint/xml-hint.js", size: 2152, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2966,7 +2966,7 @@ func bindataPublicCodemirrorAddonLintCoffeescriptLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/coffeescript-lint.js", size: 757, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/coffeescript-lint.js", size: 757, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -2986,7 +2986,7 @@ func bindataPublicCodemirrorAddonLintCssLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/css-lint.js", size: 607, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/css-lint.js", size: 607, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3006,7 +3006,7 @@ func bindataPublicCodemirrorAddonLintHtmlLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/html-lint.js", size: 938, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/html-lint.js", size: 938, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3026,7 +3026,7 @@ func bindataPublicCodemirrorAddonLintJavascriptLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/javascript-lint.js", size: 1661, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/javascript-lint.js", size: 1661, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3046,7 +3046,7 @@ func bindataPublicCodemirrorAddonLintJsonLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/json-lint.js", size: 597, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/json-lint.js", size: 597, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3066,7 +3066,7 @@ func bindataPublicCodemirrorAddonLintLintCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/lint.css", size: 2999, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/lint.css", size: 2999, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3086,7 +3086,7 @@ func bindataPublicCodemirrorAddonLintLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/lint.js", size: 4180, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/lint.js", size: 4180, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3106,7 +3106,7 @@ func bindataPublicCodemirrorAddonLintYamlLintJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/yaml-lint.js", size: 537, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/lint/yaml-lint.js", size: 537, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3126,7 +3126,7 @@ func bindataPublicCodemirrorAddonMergeMergeCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/merge/merge.css", size: 3249, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/merge/merge.css", size: 3249, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3146,7 +3146,7 @@ func bindataPublicCodemirrorAddonMergeMergeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/merge/merge.js", size: 18306, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/merge/merge.js", size: 18306, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3166,7 +3166,7 @@ func bindataPublicCodemirrorAddonModeLoadmodeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/loadmode.js", size: 1162, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/loadmode.js", size: 1162, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3186,7 +3186,7 @@ func bindataPublicCodemirrorAddonModeMultiplexJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/multiplex.js", size: 2172, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/multiplex.js", size: 2172, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3206,7 +3206,7 @@ func bindataPublicCodemirrorAddonModeMultiplex_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/multiplex_test.js", size: 492, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/multiplex_test.js", size: 492, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3226,7 +3226,7 @@ func bindataPublicCodemirrorAddonModeOverlayJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/overlay.js", size: 1321, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/overlay.js", size: 1321, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3246,7 +3246,7 @@ func bindataPublicCodemirrorAddonModeSimpleJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/simple.js", size: 4044, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/mode/simple.js", size: 4044, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3266,7 +3266,7 @@ func bindataPublicCodemirrorAddonRunmodeColorizeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/colorize.js", size: 673, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/colorize.js", size: 673, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3286,7 +3286,7 @@ func bindataPublicCodemirrorAddonRunmodeRunmodeStandaloneJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/runmode-standalone.js", size: 3144, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/runmode-standalone.js", size: 3144, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3306,7 +3306,7 @@ func bindataPublicCodemirrorAddonRunmodeRunmodeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/runmode.js", size: 1131, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/runmode.js", size: 1131, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3326,7 +3326,7 @@ func bindataPublicCodemirrorAddonRunmodeRunmodeNodeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/runmode.node.js", size: 4336, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/runmode/runmode.node.js", size: 4336, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3346,7 +3346,7 @@ func bindataPublicCodemirrorAddonScrollAnnotatescrollbarJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/annotatescrollbar.js", size: 2659, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/annotatescrollbar.js", size: 2659, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3366,7 +3366,7 @@ func bindataPublicCodemirrorAddonScrollScrollpastendJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/scrollpastend.js", size: 798, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/scrollpastend.js", size: 798, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3386,7 +3386,7 @@ func bindataPublicCodemirrorAddonScrollSimplescrollbarsCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/simplescrollbars.css", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/simplescrollbars.css", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3406,7 +3406,7 @@ func bindataPublicCodemirrorAddonScrollSimplescrollbarsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/simplescrollbars.js", size: 3101, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/scroll/simplescrollbars.js", size: 3101, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3426,7 +3426,7 @@ func bindataPublicCodemirrorAddonSearchJumpToLineJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/jump-to-line.js", size: 1101, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/jump-to-line.js", size: 1101, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3446,7 +3446,7 @@ func bindataPublicCodemirrorAddonSearchMatchHighlighterJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/match-highlighter.js", size: 2671, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/match-highlighter.js", size: 2671, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3466,7 +3466,7 @@ func bindataPublicCodemirrorAddonSearchMatchesonscrollbarCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/matchesonscrollbar.css", size: 188, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/matchesonscrollbar.css", size: 188, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3486,7 +3486,7 @@ func bindataPublicCodemirrorAddonSearchMatchesonscrollbarJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/matchesonscrollbar.js", size: 2144, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/matchesonscrollbar.js", size: 2144, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3506,7 +3506,7 @@ func bindataPublicCodemirrorAddonSearchSearchJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/search.js", size: 5127, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/search.js", size: 5127, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3526,7 +3526,7 @@ func bindataPublicCodemirrorAddonSearchSearchcursorJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/searchcursor.js", size: 5080, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/search/searchcursor.js", size: 5080, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3546,7 +3546,7 @@ func bindataPublicCodemirrorAddonSelectionActiveLineJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/selection/active-line.js", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/selection/active-line.js", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3566,7 +3566,7 @@ func bindataPublicCodemirrorAddonSelectionMarkSelectionJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/selection/mark-selection.js", size: 1778, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/selection/mark-selection.js", size: 1778, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3586,7 +3586,7 @@ func bindataPublicCodemirrorAddonSelectionSelectionPointerJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/selection/selection-pointer.js", size: 1915, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/selection/selection-pointer.js", size: 1915, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3606,7 +3606,7 @@ func bindataPublicCodemirrorAddonTernTernCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/tern/tern.css", size: 1872, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/tern/tern.css", size: 1872, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3626,7 +3626,7 @@ func bindataPublicCodemirrorAddonTernTernJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/tern/tern.js", size: 11746, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/tern/tern.js", size: 11746, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3646,7 +3646,7 @@ func bindataPublicCodemirrorAddonTernWorkerJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/tern/worker.js", size: 760, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/tern/worker.js", size: 760, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3666,7 +3666,7 @@ func bindataPublicCodemirrorAddonWrapHardwrapJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/addon/wrap/hardwrap.js", size: 2413, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/addon/wrap/hardwrap.js", size: 2413, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3686,7 +3686,7 @@ func bindataPublicCodemirrorLibCodemirrorJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/lib/codemirror.js", size: 166752, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/lib/codemirror.js", size: 166752, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3706,7 +3706,7 @@ func bindataPublicCodemirrorModeAplAplJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/apl/apl.js", size: 2676, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/apl/apl.js", size: 2676, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3726,7 +3726,7 @@ func bindataPublicCodemirrorModeAplIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/apl/index.html", size: 2662, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/apl/index.html", size: 2662, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3746,7 +3746,7 @@ func bindataPublicCodemirrorModeAsciiarmorAsciiarmorJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/asciiarmor/asciiarmor.js", size: 1178, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/asciiarmor/asciiarmor.js", size: 1178, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3766,7 +3766,7 @@ func bindataPublicCodemirrorModeAsciiarmorIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/asciiarmor/index.html", size: 1651, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/asciiarmor/index.html", size: 1651, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3786,7 +3786,7 @@ func bindataPublicCodemirrorModeAsn1Asn1Js() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/asn.1/asn.1.js", size: 4214, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/asn.1/asn.1.js", size: 4214, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3806,7 +3806,7 @@ func bindataPublicCodemirrorModeAsn1IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/asn.1/index.html", size: 2544, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/asn.1/index.html", size: 2544, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3826,7 +3826,7 @@ func bindataPublicCodemirrorModeAsteriskAsteriskJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/asterisk/asterisk.js", size: 4330, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/asterisk/asterisk.js", size: 4330, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3846,7 +3846,7 @@ func bindataPublicCodemirrorModeAsteriskIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/asterisk/index.html", size: 4913, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/asterisk/index.html", size: 4913, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3866,7 +3866,7 @@ func bindataPublicCodemirrorModeBrainfuckBrainfuckJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/brainfuck/brainfuck.js", size: 815, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/brainfuck/brainfuck.js", size: 815, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3886,7 +3886,7 @@ func bindataPublicCodemirrorModeBrainfuckIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/brainfuck/index.html", size: 3821, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/brainfuck/index.html", size: 3821, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3906,7 +3906,7 @@ func bindataPublicCodemirrorModeClikeClikeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/clike.js", size: 18243, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/clike.js", size: 18243, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3926,7 +3926,7 @@ func bindataPublicCodemirrorModeClikeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/index.html", size: 10910, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/index.html", size: 10910, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3946,7 +3946,7 @@ func bindataPublicCodemirrorModeClikeScalaHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/scala.html", size: 29001, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/scala.html", size: 29001, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3966,7 +3966,7 @@ func bindataPublicCodemirrorModeClikeTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/test.js", size: 1516, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/clike/test.js", size: 1516, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -3986,7 +3986,7 @@ func bindataPublicCodemirrorModeClojureClojureJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/clojure/clojure.js", size: 9254, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/clojure/clojure.js", size: 9254, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4006,7 +4006,7 @@ func bindataPublicCodemirrorModeClojureIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/clojure/index.html", size: 2872, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/clojure/index.html", size: 2872, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4026,7 +4026,7 @@ func bindataPublicCodemirrorModeCmakeCmakeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cmake/cmake.js", size: 1019, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cmake/cmake.js", size: 1019, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4046,7 +4046,7 @@ func bindataPublicCodemirrorModeCmakeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cmake/index.html", size: 4635, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cmake/index.html", size: 4635, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4066,7 +4066,7 @@ func bindataPublicCodemirrorModeCobolCobolJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cobol/cobol.js", size: 6418, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cobol/cobol.js", size: 6418, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4086,7 +4086,7 @@ func bindataPublicCodemirrorModeCobolIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cobol/index.html", size: 9372, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cobol/index.html", size: 9372, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4106,7 +4106,7 @@ func bindataPublicCodemirrorModeCoffeescriptCoffeescriptJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/coffeescript/coffeescript.js", size: 4205, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/coffeescript/coffeescript.js", size: 4205, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4126,7 +4126,7 @@ func bindataPublicCodemirrorModeCoffeescriptIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/coffeescript/index.html", size: 22799, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/coffeescript/index.html", size: 22799, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4146,7 +4146,7 @@ func bindataPublicCodemirrorModeCommonlispCommonlispJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/commonlisp/commonlisp.js", size: 2537, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/commonlisp/commonlisp.js", size: 2537, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4166,7 +4166,7 @@ func bindataPublicCodemirrorModeCommonlispIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/commonlisp/index.html", size: 7013, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/commonlisp/index.html", size: 7013, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4186,7 +4186,7 @@ func bindataPublicCodemirrorModeCrystalCrystalJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/crystal/crystal.js", size: 5305, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/crystal/crystal.js", size: 5305, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4206,7 +4206,7 @@ func bindataPublicCodemirrorModeCrystalIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/crystal/index.html", size: 3088, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/crystal/index.html", size: 3088, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4226,7 +4226,7 @@ func bindataPublicCodemirrorModeCssCssJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/css.js", size: 24781, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/css.js", size: 24781, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4246,7 +4246,7 @@ func bindataPublicCodemirrorModeCssGssHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/gss.html", size: 3585, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/gss.html", size: 3585, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4266,7 +4266,7 @@ func bindataPublicCodemirrorModeCssGss_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/gss_test.js", size: 256, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/gss_test.js", size: 256, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4286,7 +4286,7 @@ func bindataPublicCodemirrorModeCssIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/index.html", size: 2716, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/index.html", size: 2716, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4306,7 +4306,7 @@ func bindataPublicCodemirrorModeCssLessHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/less.html", size: 4549, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/less.html", size: 4549, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4326,7 +4326,7 @@ func bindataPublicCodemirrorModeCssLess_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/less_test.js", size: 1473, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/less_test.js", size: 1473, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4346,7 +4346,7 @@ func bindataPublicCodemirrorModeCssScssHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/scss.html", size: 3064, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/scss.html", size: 3064, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4366,7 +4366,7 @@ func bindataPublicCodemirrorModeCssScss_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/scss_test.js", size: 2562, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/scss_test.js", size: 2562, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4386,7 +4386,7 @@ func bindataPublicCodemirrorModeCssTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/test.js", size: 5629, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/css/test.js", size: 5629, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4406,7 +4406,7 @@ func bindataPublicCodemirrorModeCypherCypherJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cypher/cypher.js", size: 3462, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cypher/cypher.js", size: 3462, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4426,7 +4426,7 @@ func bindataPublicCodemirrorModeCypherIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cypher/index.html", size: 2230, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cypher/index.html", size: 2230, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4446,7 +4446,7 @@ func bindataPublicCodemirrorModeCypherTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/cypher/test.js", size: 1047, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/cypher/test.js", size: 1047, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4466,7 +4466,7 @@ func bindataPublicCodemirrorModeDDJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/d/d.js", size: 3910, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/d/d.js", size: 3910, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4486,7 +4486,7 @@ func bindataPublicCodemirrorModeDIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/d/index.html", size: 6815, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/d/index.html", size: 6815, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4506,7 +4506,7 @@ func bindataPublicCodemirrorModeDTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/d/test.js", size: 238, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/d/test.js", size: 238, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4526,7 +4526,7 @@ func bindataPublicCodemirrorModeDartDartJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dart/dart.js", size: 2310, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dart/dart.js", size: 2310, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4546,7 +4546,7 @@ func bindataPublicCodemirrorModeDartIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dart/index.html", size: 2110, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dart/index.html", size: 2110, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4566,7 +4566,7 @@ func bindataPublicCodemirrorModeDiffDiffJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/diff/diff.js", size: 558, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/diff/diff.js", size: 558, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4586,7 +4586,7 @@ func bindataPublicCodemirrorModeDiffIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/diff/index.html", size: 4731, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/diff/index.html", size: 4731, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4606,7 +4606,7 @@ func bindataPublicCodemirrorModeDjangoDjangoJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/django/django.js", size: 4826, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/django/django.js", size: 4826, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4626,7 +4626,7 @@ func bindataPublicCodemirrorModeDjangoIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/django/index.html", size: 2882, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/django/index.html", size: 2882, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4646,7 +4646,7 @@ func bindataPublicCodemirrorModeDockerfileDockerfileJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dockerfile/dockerfile.js", size: 902, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dockerfile/dockerfile.js", size: 902, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4666,7 +4666,7 @@ func bindataPublicCodemirrorModeDockerfileIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dockerfile/index.html", size: 2750, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dockerfile/index.html", size: 2750, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4686,7 +4686,7 @@ func bindataPublicCodemirrorModeDtdDtdJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dtd/dtd.js", size: 2283, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dtd/dtd.js", size: 2283, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4706,7 +4706,7 @@ func bindataPublicCodemirrorModeDtdIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dtd/index.html", size: 3659, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dtd/index.html", size: 3659, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4726,7 +4726,7 @@ func bindataPublicCodemirrorModeDylanDylanJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dylan/dylan.js", size: 4255, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dylan/dylan.js", size: 4255, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4746,7 +4746,7 @@ func bindataPublicCodemirrorModeDylanIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dylan/index.html", size: 13837, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dylan/index.html", size: 13837, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4766,7 +4766,7 @@ func bindataPublicCodemirrorModeDylanTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/dylan/test.js", size: 2144, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/dylan/test.js", size: 2144, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4786,7 +4786,7 @@ func bindataPublicCodemirrorModeEbnfEbnfJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ebnf/ebnf.js", size: 2438, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ebnf/ebnf.js", size: 2438, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4806,7 +4806,7 @@ func bindataPublicCodemirrorModeEbnfIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ebnf/index.html", size: 2933, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ebnf/index.html", size: 2933, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4826,7 +4826,7 @@ func bindataPublicCodemirrorModeEclEclJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ecl/ecl.js", size: 5364, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ecl/ecl.js", size: 5364, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4846,7 +4846,7 @@ func bindataPublicCodemirrorModeEclIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ecl/index.html", size: 1731, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ecl/index.html", size: 1731, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4866,7 +4866,7 @@ func bindataPublicCodemirrorModeEiffelEiffelJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/eiffel/eiffel.js", size: 2055, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/eiffel/eiffel.js", size: 2055, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4886,7 +4886,7 @@ func bindataPublicCodemirrorModeEiffelIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/eiffel/index.html", size: 13520, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/eiffel/index.html", size: 13520, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4906,7 +4906,7 @@ func bindataPublicCodemirrorModeElmElmJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/elm/elm.js", size: 2154, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/elm/elm.js", size: 2154, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4926,7 +4926,7 @@ func bindataPublicCodemirrorModeElmIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/elm/index.html", size: 1962, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/elm/index.html", size: 1962, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4946,7 +4946,7 @@ func bindataPublicCodemirrorModeErlangErlangJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/erlang/erlang.js", size: 8313, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/erlang/erlang.js", size: 8313, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4966,7 +4966,7 @@ func bindataPublicCodemirrorModeErlangIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/erlang/index.html", size: 2651, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/erlang/index.html", size: 2651, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -4986,7 +4986,7 @@ func bindataPublicCodemirrorModeFactorFactorJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/factor/factor.js", size: 1913, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/factor/factor.js", size: 1913, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5006,7 +5006,7 @@ func bindataPublicCodemirrorModeFactorIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/factor/index.html", size: 2507, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/factor/index.html", size: 2507, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5026,7 +5026,7 @@ func bindataPublicCodemirrorModeFclFclJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/fcl/fcl.js", size: 2331, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/fcl/fcl.js", size: 2331, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5046,7 +5046,7 @@ func bindataPublicCodemirrorModeFclIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/fcl/index.html", size: 3574, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/fcl/index.html", size: 3574, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5066,7 +5066,7 @@ func bindataPublicCodemirrorModeForthForthJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/forth/forth.js", size: 2920, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/forth/forth.js", size: 2920, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5086,7 +5086,7 @@ func bindataPublicCodemirrorModeForthIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/forth/index.html", size: 2105, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/forth/index.html", size: 2105, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5106,7 +5106,7 @@ func bindataPublicCodemirrorModeFortranFortranJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/fortran/fortran.js", size: 4904, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/fortran/fortran.js", size: 4904, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5126,7 +5126,7 @@ func bindataPublicCodemirrorModeFortranIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/fortran/index.html", size: 2814, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/fortran/index.html", size: 2814, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5146,7 +5146,7 @@ func bindataPublicCodemirrorModeGasGasJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gas/gas.js", size: 4409, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gas/gas.js", size: 4409, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5166,7 +5166,7 @@ func bindataPublicCodemirrorModeGasIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gas/index.html", size: 2162, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gas/index.html", size: 2162, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5186,7 +5186,7 @@ func bindataPublicCodemirrorModeGfmGfmJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gfm/gfm.js", size: 2750, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gfm/gfm.js", size: 2750, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5206,7 +5206,7 @@ func bindataPublicCodemirrorModeGfmIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gfm/index.html", size: 5270, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gfm/index.html", size: 5270, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5226,7 +5226,7 @@ func bindataPublicCodemirrorModeGfmTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gfm/test.js", size: 5267, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gfm/test.js", size: 5267, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5246,7 +5246,7 @@ func bindataPublicCodemirrorModeGherkinGherkinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gherkin/gherkin.js", size: 10411, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gherkin/gherkin.js", size: 10411, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5266,7 +5266,7 @@ func bindataPublicCodemirrorModeGherkinIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/gherkin/index.html", size: 1888, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/gherkin/index.html", size: 1888, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5286,7 +5286,7 @@ func bindataPublicCodemirrorModeGoGoJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/go/go.js", size: 3057, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/go/go.js", size: 3057, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5306,7 +5306,7 @@ func bindataPublicCodemirrorModeGoIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/go/index.html", size: 2657, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/go/index.html", size: 2657, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5326,7 +5326,7 @@ func bindataPublicCodemirrorModeGroovyGroovyJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/groovy/groovy.js", size: 4074, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/groovy/groovy.js", size: 4074, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5346,7 +5346,7 @@ func bindataPublicCodemirrorModeGroovyIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/groovy/index.html", size: 2660, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/groovy/index.html", size: 2660, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5366,7 +5366,7 @@ func bindataPublicCodemirrorModeHamlHamlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haml/haml.js", size: 2263, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haml/haml.js", size: 2263, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5386,7 +5386,7 @@ func bindataPublicCodemirrorModeHamlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haml/index.html", size: 3037, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haml/index.html", size: 3037, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5406,7 +5406,7 @@ func bindataPublicCodemirrorModeHamlTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haml/test.js", size: 2285, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haml/test.js", size: 2285, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5426,7 +5426,7 @@ func bindataPublicCodemirrorModeHandlebarsHandlebarsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/handlebars/handlebars.js", size: 1295, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/handlebars/handlebars.js", size: 1295, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5446,7 +5446,7 @@ func bindataPublicCodemirrorModeHandlebarsIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/handlebars/index.html", size: 3001, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/handlebars/index.html", size: 3001, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5466,7 +5466,7 @@ func bindataPublicCodemirrorModeHaskellHaskellJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell/haskell.js", size: 4506, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell/haskell.js", size: 4506, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5486,7 +5486,7 @@ func bindataPublicCodemirrorModeHaskellIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell/index.html", size: 2677, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell/index.html", size: 2677, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5506,7 +5506,7 @@ func bindataPublicCodemirrorModeHaskellLiterateHaskellLiterateJs() (*asset, erro return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell-literate/haskell-literate.js", size: 692, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell-literate/haskell-literate.js", size: 692, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5526,7 +5526,7 @@ func bindataPublicCodemirrorModeHaskellLiterateIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell-literate/index.html", size: 9864, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haskell-literate/index.html", size: 9864, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5546,7 +5546,7 @@ func bindataPublicCodemirrorModeHaxeHaxeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haxe/haxe.js", size: 8146, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haxe/haxe.js", size: 8146, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5566,7 +5566,7 @@ func bindataPublicCodemirrorModeHaxeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/haxe/index.html", size: 2899, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/haxe/index.html", size: 2899, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5586,7 +5586,7 @@ func bindataPublicCodemirrorModeHtmlembeddedHtmlembeddedJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlembedded/htmlembedded.js", size: 911, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlembedded/htmlembedded.js", size: 911, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5606,7 +5606,7 @@ func bindataPublicCodemirrorModeHtmlembeddedIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlembedded/index.html", size: 3213, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlembedded/index.html", size: 3213, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5626,7 +5626,7 @@ func bindataPublicCodemirrorModeHtmlmixedHtmlmixedJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlmixed/htmlmixed.js", size: 2884, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlmixed/htmlmixed.js", size: 2884, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5646,7 +5646,7 @@ func bindataPublicCodemirrorModeHtmlmixedIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlmixed/index.html", size: 4562, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/htmlmixed/index.html", size: 4562, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5666,7 +5666,7 @@ func bindataPublicCodemirrorModeHttpHttpJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/http/http.js", size: 1253, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/http/http.js", size: 1253, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5686,7 +5686,7 @@ func bindataPublicCodemirrorModeHttpIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/http/index.html", size: 1715, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/http/index.html", size: 1715, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5706,7 +5706,7 @@ func bindataPublicCodemirrorModeIdlIdlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/idl/idl.js", size: 11960, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/idl/idl.js", size: 11960, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5726,7 +5726,7 @@ func bindataPublicCodemirrorModeIdlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/idl/index.html", size: 1955, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/idl/index.html", size: 1955, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5746,7 +5746,7 @@ func bindataPublicCodemirrorModeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/index.html", size: 8295, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/index.html", size: 8295, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5766,7 +5766,7 @@ func bindataPublicCodemirrorModeJadeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jade/index.html", size: 3437, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jade/index.html", size: 3437, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5786,7 +5786,7 @@ func bindataPublicCodemirrorModeJadeJadeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jade/jade.js", size: 7956, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jade/jade.js", size: 7956, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5806,7 +5806,7 @@ func bindataPublicCodemirrorModeJavascriptIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/index.html", size: 4998, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/index.html", size: 4998, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5826,7 +5826,7 @@ func bindataPublicCodemirrorModeJavascriptJavascriptJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/javascript.js", size: 15332, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/javascript.js", size: 15332, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5846,7 +5846,7 @@ func bindataPublicCodemirrorModeJavascriptJsonLdHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/json-ld.html", size: 2955, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/json-ld.html", size: 2955, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5866,7 +5866,7 @@ func bindataPublicCodemirrorModeJavascriptTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/test.js", size: 14503, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/test.js", size: 14503, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5886,7 +5886,7 @@ func bindataPublicCodemirrorModeJavascriptTypescriptHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/typescript.html", size: 1879, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/javascript/typescript.html", size: 1879, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5906,7 +5906,7 @@ func bindataPublicCodemirrorModeJinja2IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jinja2/index.html", size: 2077, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jinja2/index.html", size: 2077, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5926,7 +5926,7 @@ func bindataPublicCodemirrorModeJinja2Jinja2Js() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jinja2/jinja2.js", size: 2091, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jinja2/jinja2.js", size: 2091, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5946,7 +5946,7 @@ func bindataPublicCodemirrorModeJsxIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jsx/index.html", size: 3054, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jsx/index.html", size: 3054, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5966,7 +5966,7 @@ func bindataPublicCodemirrorModeJsxJsxJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jsx/jsx.js", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jsx/jsx.js", size: 2321, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -5986,7 +5986,7 @@ func bindataPublicCodemirrorModeJsxTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/jsx/test.js", size: 3434, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/jsx/test.js", size: 3434, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6006,7 +6006,7 @@ func bindataPublicCodemirrorModeJuliaIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/julia/index.html", size: 2697, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/julia/index.html", size: 2697, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6026,7 +6026,7 @@ func bindataPublicCodemirrorModeJuliaJuliaJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/julia/julia.js", size: 5940, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/julia/julia.js", size: 5940, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6046,7 +6046,7 @@ func bindataPublicCodemirrorModeLivescriptIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/livescript/index.html", size: 10165, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/livescript/index.html", size: 10165, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6066,7 +6066,7 @@ func bindataPublicCodemirrorModeLivescriptLivescriptJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/livescript/livescript.js", size: 4418, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/livescript/livescript.js", size: 4418, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6086,7 +6086,7 @@ func bindataPublicCodemirrorModeLuaIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/lua/index.html", size: 2556, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/lua/index.html", size: 2556, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6106,7 +6106,7 @@ func bindataPublicCodemirrorModeLuaLuaJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/lua/lua.js", size: 3631, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/lua/lua.js", size: 3631, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6126,7 +6126,7 @@ func bindataPublicCodemirrorModeMarkdownIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/markdown/index.html", size: 13127, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/markdown/index.html", size: 13127, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6146,7 +6146,7 @@ func bindataPublicCodemirrorModeMarkdownMarkdownJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/markdown/markdown.js", size: 12776, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/markdown/markdown.js", size: 12776, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6166,7 +6166,7 @@ func bindataPublicCodemirrorModeMarkdownTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/markdown/test.js", size: 25252, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/markdown/test.js", size: 25252, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6186,7 +6186,7 @@ func bindataPublicCodemirrorModeMathematicaIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mathematica/index.html", size: 2254, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mathematica/index.html", size: 2254, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6206,7 +6206,7 @@ func bindataPublicCodemirrorModeMathematicaMathematicaJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mathematica/mathematica.js", size: 2140, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mathematica/mathematica.js", size: 2140, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6226,7 +6226,7 @@ func bindataPublicCodemirrorModeMboxIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mbox/index.html", size: 1615, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mbox/index.html", size: 1615, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6246,7 +6246,7 @@ func bindataPublicCodemirrorModeMboxMboxJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mbox/mbox.js", size: 1666, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mbox/mbox.js", size: 1666, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6266,7 +6266,7 @@ func bindataPublicCodemirrorModeMetaJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/meta.js", size: 12355, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/meta.js", size: 12355, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6286,7 +6286,7 @@ func bindataPublicCodemirrorModeMircIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mirc/index.html", size: 6120, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mirc/index.html", size: 6120, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6306,7 +6306,7 @@ func bindataPublicCodemirrorModeMircMircJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mirc/mirc.js", size: 6166, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mirc/mirc.js", size: 6166, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6326,7 +6326,7 @@ func bindataPublicCodemirrorModeMllikeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mllike/index.html", size: 4436, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mllike/index.html", size: 4436, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6346,7 +6346,7 @@ func bindataPublicCodemirrorModeMllikeMllikeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mllike/mllike.js", size: 2939, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mllike/mllike.js", size: 2939, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6366,7 +6366,7 @@ func bindataPublicCodemirrorModeModelicaIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/modelica/index.html", size: 2812, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/modelica/index.html", size: 2812, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6386,7 +6386,7 @@ func bindataPublicCodemirrorModeModelicaModelicaJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/modelica/modelica.js", size: 3299, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/modelica/modelica.js", size: 3299, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6406,7 +6406,7 @@ func bindataPublicCodemirrorModeMscgenIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/index.html", size: 4632, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/index.html", size: 4632, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6426,7 +6426,7 @@ func bindataPublicCodemirrorModeMscgenMscgenJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/mscgen.js", size: 3841, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/mscgen.js", size: 3841, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6446,7 +6446,7 @@ func bindataPublicCodemirrorModeMscgenMscgen_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/mscgen_test.js", size: 3282, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/mscgen_test.js", size: 3282, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6466,7 +6466,7 @@ func bindataPublicCodemirrorModeMscgenMsgenny_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/msgenny_test.js", size: 2771, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/msgenny_test.js", size: 2771, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6486,7 +6486,7 @@ func bindataPublicCodemirrorModeMscgenXu_testJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/xu_test.js", size: 3473, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mscgen/xu_test.js", size: 3473, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6506,7 +6506,7 @@ func bindataPublicCodemirrorModeMumpsIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mumps/index.html", size: 2930, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mumps/index.html", size: 2930, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6526,7 +6526,7 @@ func bindataPublicCodemirrorModeMumpsMumpsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/mumps/mumps.js", size: 2283, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/mumps/mumps.js", size: 2283, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6546,7 +6546,7 @@ func bindataPublicCodemirrorModeNginxIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/nginx/index.html", size: 5561, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/nginx/index.html", size: 5561, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6566,7 +6566,7 @@ func bindataPublicCodemirrorModeNginxNginxJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/nginx/nginx.js", size: 7541, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/nginx/nginx.js", size: 7541, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6586,7 +6586,7 @@ func bindataPublicCodemirrorModeNsisIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/nsis/index.html", size: 2086, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/nsis/index.html", size: 2086, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6606,7 +6606,7 @@ func bindataPublicCodemirrorModeNsisNsisJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/nsis/nsis.js", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/nsis/nsis.js", size: 6685, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6626,7 +6626,7 @@ func bindataPublicCodemirrorModeNtriplesIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ntriples/index.html", size: 2769, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ntriples/index.html", size: 2769, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6646,7 +6646,7 @@ func bindataPublicCodemirrorModeNtriplesNtriplesJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ntriples/ntriples.js", size: 2467, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ntriples/ntriples.js", size: 2467, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6666,7 +6666,7 @@ func bindataPublicCodemirrorModeOctaveIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/octave/index.html", size: 2127, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/octave/index.html", size: 2127, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6686,7 +6686,7 @@ func bindataPublicCodemirrorModeOctaveOctaveJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/octave/octave.js", size: 2566, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/octave/octave.js", size: 2566, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6706,7 +6706,7 @@ func bindataPublicCodemirrorModeOzIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/oz/index.html", size: 1872, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/oz/index.html", size: 1872, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6726,7 +6726,7 @@ func bindataPublicCodemirrorModeOzOzJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/oz/oz.js", size: 3155, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/oz/oz.js", size: 3155, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6746,7 +6746,7 @@ func bindataPublicCodemirrorModePascalIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pascal/index.html", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pascal/index.html", size: 1762, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6766,7 +6766,7 @@ func bindataPublicCodemirrorModePascalPascalJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pascal/pascal.js", size: 1549, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pascal/pascal.js", size: 1549, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6786,7 +6786,7 @@ func bindataPublicCodemirrorModePegjsIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pegjs/index.html", size: 2373, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pegjs/index.html", size: 2373, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6806,7 +6806,7 @@ func bindataPublicCodemirrorModePegjsPegjsJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pegjs/pegjs.js", size: 1644, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pegjs/pegjs.js", size: 1644, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6826,7 +6826,7 @@ func bindataPublicCodemirrorModePerlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/perl/index.html", size: 1864, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/perl/index.html", size: 1864, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6846,7 +6846,7 @@ func bindataPublicCodemirrorModePerlPerlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/perl/perl.js", size: 9829, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/perl/perl.js", size: 9829, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6866,7 +6866,7 @@ func bindataPublicCodemirrorModePhpIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/php/index.html", size: 3288, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/php/index.html", size: 3288, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6886,7 +6886,7 @@ func bindataPublicCodemirrorModePhpPhpJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/php/php.js", size: 13919, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/php/php.js", size: 13919, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6906,7 +6906,7 @@ func bindataPublicCodemirrorModePhpTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/php/test.js", size: 5327, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/php/test.js", size: 5327, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6926,7 +6926,7 @@ func bindataPublicCodemirrorModePigIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pig/index.html", size: 1797, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pig/index.html", size: 1797, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6946,7 +6946,7 @@ func bindataPublicCodemirrorModePigPigJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pig/pig.js", size: 2894, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pig/pig.js", size: 2894, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6966,7 +6966,7 @@ func bindataPublicCodemirrorModePowershellIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/powershell/index.html", size: 7694, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/powershell/index.html", size: 7694, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -6986,7 +6986,7 @@ func bindataPublicCodemirrorModePowershellPowershellJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/powershell/powershell.js", size: 8006, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/powershell/powershell.js", size: 8006, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7006,7 +7006,7 @@ func bindataPublicCodemirrorModePowershellTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/powershell/test.js", size: 2393, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/powershell/test.js", size: 2393, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7026,7 +7026,7 @@ func bindataPublicCodemirrorModePropertiesIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/properties/index.html", size: 1877, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/properties/index.html", size: 1877, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7046,7 +7046,7 @@ func bindataPublicCodemirrorModePropertiesPropertiesJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/properties/properties.js", size: 960, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/properties/properties.js", size: 960, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7066,7 +7066,7 @@ func bindataPublicCodemirrorModeProtobufIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/protobuf/index.html", size: 2948, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/protobuf/index.html", size: 2948, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7086,7 +7086,7 @@ func bindataPublicCodemirrorModeProtobufProtobufJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/protobuf/protobuf.js", size: 1201, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/protobuf/protobuf.js", size: 1201, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7106,7 +7106,7 @@ func bindataPublicCodemirrorModePugIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pug/index.html", size: 3455, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pug/index.html", size: 3455, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7126,7 +7126,7 @@ func bindataPublicCodemirrorModePugPugJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/pug/pug.js", size: 8024, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/pug/pug.js", size: 8024, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7146,7 +7146,7 @@ func bindataPublicCodemirrorModePuppetIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/puppet/index.html", size: 3743, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/puppet/index.html", size: 3743, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7166,7 +7166,7 @@ func bindataPublicCodemirrorModePuppetPuppetJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/puppet/puppet.js", size: 2777, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/puppet/puppet.js", size: 2777, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7186,7 +7186,7 @@ func bindataPublicCodemirrorModePythonIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/python/index.html", size: 6433, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/python/index.html", size: 6433, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7206,7 +7206,7 @@ func bindataPublicCodemirrorModePythonPythonJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/python/python.js", size: 5611, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/python/python.js", size: 5611, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7226,7 +7226,7 @@ func bindataPublicCodemirrorModePythonTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/python/test.js", size: 875, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/python/test.js", size: 875, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7246,7 +7246,7 @@ func bindataPublicCodemirrorModeQIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/q/index.html", size: 9444, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/q/index.html", size: 9444, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7266,7 +7266,7 @@ func bindataPublicCodemirrorModeQQJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/q/q.js", size: 4246, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/q/q.js", size: 4246, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7286,7 +7286,7 @@ func bindataPublicCodemirrorModeRIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/r/index.html", size: 2840, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/r/index.html", size: 2840, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7306,7 +7306,7 @@ func bindataPublicCodemirrorModeRRJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/r/r.js", size: 3088, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/r/r.js", size: 3088, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7326,7 +7326,7 @@ func bindataPublicCodemirrorModeRpmChangesIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rpm/changes/index.html", size: 2341, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rpm/changes/index.html", size: 2341, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7346,7 +7346,7 @@ func bindataPublicCodemirrorModeRpmIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rpm/index.html", size: 4945, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rpm/index.html", size: 4945, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7366,7 +7366,7 @@ func bindataPublicCodemirrorModeRpmRpmJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rpm/rpm.js", size: 1964, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rpm/rpm.js", size: 1964, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7386,7 +7386,7 @@ func bindataPublicCodemirrorModeRstIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rst/index.html", size: 18252, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rst/index.html", size: 18252, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7406,7 +7406,7 @@ func bindataPublicCodemirrorModeRstRstJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rst/rst.js", size: 6620, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rst/rst.js", size: 6620, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7426,7 +7426,7 @@ func bindataPublicCodemirrorModeRubyIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ruby/index.html", size: 6232, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ruby/index.html", size: 6232, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7446,7 +7446,7 @@ func bindataPublicCodemirrorModeRubyRubyJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ruby/ruby.js", size: 5295, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ruby/ruby.js", size: 5295, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7466,7 +7466,7 @@ func bindataPublicCodemirrorModeRubyTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ruby/test.js", size: 480, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ruby/test.js", size: 480, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7486,7 +7486,7 @@ func bindataPublicCodemirrorModeRustIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rust/index.html", size: 2015, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rust/index.html", size: 2015, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7506,7 +7506,7 @@ func bindataPublicCodemirrorModeRustRustJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rust/rust.js", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rust/rust.js", size: 2361, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7526,7 +7526,7 @@ func bindataPublicCodemirrorModeRustTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/rust/test.js", size: 676, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/rust/test.js", size: 676, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7546,7 +7546,7 @@ func bindataPublicCodemirrorModeSasIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sas/index.html", size: 2337, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sas/index.html", size: 2337, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7566,7 +7566,7 @@ func bindataPublicCodemirrorModeSasSasJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sas/sas.js", size: 9541, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sas/sas.js", size: 9541, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7586,7 +7586,7 @@ func bindataPublicCodemirrorModeSassIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sass/index.html", size: 2275, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sass/index.html", size: 2275, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7606,7 +7606,7 @@ func bindataPublicCodemirrorModeSassSassJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sass/sass.js", size: 4644, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sass/sass.js", size: 4644, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7626,7 +7626,7 @@ func bindataPublicCodemirrorModeSassTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sass/test.js", size: 3627, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sass/test.js", size: 3627, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7646,7 +7646,7 @@ func bindataPublicCodemirrorModeSchemeIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/scheme/index.html", size: 2876, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/scheme/index.html", size: 2876, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7666,7 +7666,7 @@ func bindataPublicCodemirrorModeSchemeSchemeJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/scheme/scheme.js", size: 5992, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/scheme/scheme.js", size: 5992, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7686,7 +7686,7 @@ func bindataPublicCodemirrorModeShellIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/shell/index.html", size: 1937, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/shell/index.html", size: 1937, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7706,7 +7706,7 @@ func bindataPublicCodemirrorModeShellShellJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/shell/shell.js", size: 2161, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/shell/shell.js", size: 2161, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7726,7 +7726,7 @@ func bindataPublicCodemirrorModeShellTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/shell/test.js", size: 1474, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/shell/test.js", size: 1474, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7746,7 +7746,7 @@ func bindataPublicCodemirrorModeSieveIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sieve/index.html", size: 2657, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sieve/index.html", size: 2657, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7766,7 +7766,7 @@ func bindataPublicCodemirrorModeSieveSieveJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sieve/sieve.js", size: 1883, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sieve/sieve.js", size: 1883, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7786,7 +7786,7 @@ func bindataPublicCodemirrorModeSlimIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/slim/index.html", size: 4369, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/slim/index.html", size: 4369, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7806,7 +7806,7 @@ func bindataPublicCodemirrorModeSlimSlimJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/slim/slim.js", size: 7494, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/slim/slim.js", size: 7494, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7826,7 +7826,7 @@ func bindataPublicCodemirrorModeSlimTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/slim/test.js", size: 2451, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/slim/test.js", size: 2451, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7846,7 +7846,7 @@ func bindataPublicCodemirrorModeSmalltalkIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/smalltalk/index.html", size: 2387, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/smalltalk/index.html", size: 2387, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7866,7 +7866,7 @@ func bindataPublicCodemirrorModeSmalltalkSmalltalkJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/smalltalk/smalltalk.js", size: 2216, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/smalltalk/smalltalk.js", size: 2216, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7886,7 +7886,7 @@ func bindataPublicCodemirrorModeSmartyIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/smarty/index.html", size: 4456, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/smarty/index.html", size: 4456, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7906,7 +7906,7 @@ func bindataPublicCodemirrorModeSmartySmartyJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/smarty/smarty.js", size: 2999, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/smarty/smarty.js", size: 2999, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7926,7 +7926,7 @@ func bindataPublicCodemirrorModeSolrIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/solr/index.html", size: 1687, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/solr/index.html", size: 1687, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7946,7 +7946,7 @@ func bindataPublicCodemirrorModeSolrSolrJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/solr/solr.js", size: 1169, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/solr/solr.js", size: 1169, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7966,7 +7966,7 @@ func bindataPublicCodemirrorModeSoyIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/soy/index.html", size: 3066, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/soy/index.html", size: 3066, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -7986,7 +7986,7 @@ func bindataPublicCodemirrorModeSoySoyJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/soy/soy.js", size: 5900, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/soy/soy.js", size: 5900, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8006,7 +8006,7 @@ func bindataPublicCodemirrorModeSoyTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/soy/test.js", size: 3324, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/soy/test.js", size: 3324, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8026,7 +8026,7 @@ func bindataPublicCodemirrorModeSparqlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sparql/index.html", size: 2256, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sparql/index.html", size: 2256, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8046,7 +8046,7 @@ func bindataPublicCodemirrorModeSparqlSparqlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sparql/sparql.js", size: 3319, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sparql/sparql.js", size: 3319, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8066,7 +8066,7 @@ func bindataPublicCodemirrorModeSpreadsheetIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/spreadsheet/index.html", size: 1875, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/spreadsheet/index.html", size: 1875, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8086,7 +8086,7 @@ func bindataPublicCodemirrorModeSpreadsheetSpreadsheetJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/spreadsheet/spreadsheet.js", size: 1390, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/spreadsheet/spreadsheet.js", size: 1390, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8106,7 +8106,7 @@ func bindataPublicCodemirrorModeSqlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sql/index.html", size: 3914, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sql/index.html", size: 3914, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8126,7 +8126,7 @@ func bindataPublicCodemirrorModeSqlSqlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/sql/sql.js", size: 35361, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/sql/sql.js", size: 35361, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8146,7 +8146,7 @@ func bindataPublicCodemirrorModeStexIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/stex/index.html", size: 4454, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/stex/index.html", size: 4454, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8166,7 +8166,7 @@ func bindataPublicCodemirrorModeStexStexJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/stex/stex.js", size: 2914, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/stex/stex.js", size: 2914, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8186,7 +8186,7 @@ func bindataPublicCodemirrorModeStexTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/stex/test.js", size: 2508, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/stex/test.js", size: 2508, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8206,7 +8206,7 @@ func bindataPublicCodemirrorModeStylusIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/stylus/index.html", size: 3277, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/stylus/index.html", size: 3277, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8226,7 +8226,7 @@ func bindataPublicCodemirrorModeStylusStylusJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/stylus/stylus.js", size: 26209, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/stylus/stylus.js", size: 26209, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8246,7 +8246,7 @@ func bindataPublicCodemirrorModeSwiftIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/swift/index.html", size: 2568, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/swift/index.html", size: 2568, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8266,7 +8266,7 @@ func bindataPublicCodemirrorModeSwiftSwiftJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/swift/swift.js", size: 4050, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/swift/swift.js", size: 4050, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8286,7 +8286,7 @@ func bindataPublicCodemirrorModeSwiftTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/swift/test.js", size: 7515, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/swift/test.js", size: 7515, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8306,7 +8306,7 @@ func bindataPublicCodemirrorModeTclIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tcl/index.html", size: 6780, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tcl/index.html", size: 6780, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8326,7 +8326,7 @@ func bindataPublicCodemirrorModeTclTclJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tcl/tcl.js", size: 2560, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tcl/tcl.js", size: 2560, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8346,7 +8346,7 @@ func bindataPublicCodemirrorModeTextileIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/textile/index.html", size: 4669, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/textile/index.html", size: 4669, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8366,7 +8366,7 @@ func bindataPublicCodemirrorModeTextileTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/textile/test.js", size: 7127, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/textile/test.js", size: 7127, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8386,7 +8386,7 @@ func bindataPublicCodemirrorModeTextileTextileJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/textile/textile.js", size: 7063, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/textile/textile.js", size: 7063, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8406,7 +8406,7 @@ func bindataPublicCodemirrorModeTiddlywikiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiddlywiki/index.html", size: 5223, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiddlywiki/index.html", size: 5223, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8426,7 +8426,7 @@ func bindataPublicCodemirrorModeTiddlywikiTiddlywikiCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiddlywiki/tiddlywiki.css", size: 220, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiddlywiki/tiddlywiki.css", size: 220, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8446,7 +8446,7 @@ func bindataPublicCodemirrorModeTiddlywikiTiddlywikiJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiddlywiki/tiddlywiki.js", size: 3081, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiddlywiki/tiddlywiki.js", size: 3081, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8466,7 +8466,7 @@ func bindataPublicCodemirrorModeTikiIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiki/index.html", size: 2228, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiki/index.html", size: 2228, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8486,7 +8486,7 @@ func bindataPublicCodemirrorModeTikiTikiCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiki/tiki.css", size: 439, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiki/tiki.css", size: 439, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8506,7 +8506,7 @@ func bindataPublicCodemirrorModeTikiTikiJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiki/tiki.js", size: 3549, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tiki/tiki.js", size: 3549, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8526,7 +8526,7 @@ func bindataPublicCodemirrorModeTomlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/toml/index.html", size: 2162, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/toml/index.html", size: 2162, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8546,7 +8546,7 @@ func bindataPublicCodemirrorModeTomlTomlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/toml/toml.js", size: 1246, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/toml/toml.js", size: 1246, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8566,7 +8566,7 @@ func bindataPublicCodemirrorModeTornadoIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tornado/index.html", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tornado/index.html", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8586,7 +8586,7 @@ func bindataPublicCodemirrorModeTornadoTornadoJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/tornado/tornado.js", size: 1421, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/tornado/tornado.js", size: 1421, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8606,7 +8606,7 @@ func bindataPublicCodemirrorModeTroffIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/troff/index.html", size: 4626, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/troff/index.html", size: 4626, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8626,7 +8626,7 @@ func bindataPublicCodemirrorModeTroffTroffJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/troff/troff.js", size: 1292, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/troff/troff.js", size: 1292, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8646,7 +8646,7 @@ func bindataPublicCodemirrorModeTtcnIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn/index.html", size: 3812, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn/index.html", size: 3812, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8666,7 +8666,7 @@ func bindataPublicCodemirrorModeTtcnTtcnJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn/ttcn.js", size: 5464, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn/ttcn.js", size: 5464, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8686,7 +8686,7 @@ func bindataPublicCodemirrorModeTtcnCfgIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn-cfg/index.html", size: 3927, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn-cfg/index.html", size: 3927, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8706,7 +8706,7 @@ func bindataPublicCodemirrorModeTtcnCfgTtcnCfgJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn-cfg/ttcn-cfg.js", size: 4422, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/ttcn-cfg/ttcn-cfg.js", size: 4422, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8726,7 +8726,7 @@ func bindataPublicCodemirrorModeTurtleIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/turtle/index.html", size: 1792, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/turtle/index.html", size: 1792, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8746,7 +8746,7 @@ func bindataPublicCodemirrorModeTurtleTurtleJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/turtle/turtle.js", size: 2176, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/turtle/turtle.js", size: 2176, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8766,7 +8766,7 @@ func bindataPublicCodemirrorModeTwigIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/twig/index.html", size: 1692, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/twig/index.html", size: 1692, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8786,7 +8786,7 @@ func bindataPublicCodemirrorModeTwigTwigJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/twig/twig.js", size: 2203, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/twig/twig.js", size: 2203, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8806,7 +8806,7 @@ func bindataPublicCodemirrorModeVbIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vb/index.html", size: 1983, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vb/index.html", size: 1983, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8826,7 +8826,7 @@ func bindataPublicCodemirrorModeVbVbJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vb/vb.js", size: 3187, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vb/vb.js", size: 3187, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8846,7 +8846,7 @@ func bindataPublicCodemirrorModeVbscriptIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vbscript/index.html", size: 1839, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vbscript/index.html", size: 1839, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8866,7 +8866,7 @@ func bindataPublicCodemirrorModeVbscriptVbscriptJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vbscript/vbscript.js", size: 6083, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vbscript/vbscript.js", size: 6083, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8886,7 +8886,7 @@ func bindataPublicCodemirrorModeVelocityIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/velocity/index.html", size: 3622, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/velocity/index.html", size: 3622, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8906,7 +8906,7 @@ func bindataPublicCodemirrorModeVelocityVelocityJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/velocity/velocity.js", size: 2907, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/velocity/velocity.js", size: 2907, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8926,7 +8926,7 @@ func bindataPublicCodemirrorModeVerilogIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/verilog/index.html", size: 3102, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/verilog/index.html", size: 3102, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8946,7 +8946,7 @@ func bindataPublicCodemirrorModeVerilogTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/verilog/test.js", size: 5150, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/verilog/test.js", size: 5150, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8966,7 +8966,7 @@ func bindataPublicCodemirrorModeVerilogVerilogJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/verilog/verilog.js", size: 9000, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/verilog/verilog.js", size: 9000, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -8986,7 +8986,7 @@ func bindataPublicCodemirrorModeVhdlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vhdl/index.html", size: 2969, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vhdl/index.html", size: 2969, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9006,7 +9006,7 @@ func bindataPublicCodemirrorModeVhdlVhdlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vhdl/vhdl.js", size: 3576, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vhdl/vhdl.js", size: 3576, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9026,7 +9026,7 @@ func bindataPublicCodemirrorModeVueIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vue/index.html", size: 4157, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vue/index.html", size: 4157, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9046,7 +9046,7 @@ func bindataPublicCodemirrorModeVueVueJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/vue/vue.js", size: 1898, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/vue/vue.js", size: 1898, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9066,7 +9066,7 @@ func bindataPublicCodemirrorModeWebidlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/webidl/index.html", size: 2654, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/webidl/index.html", size: 2654, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9086,7 +9086,7 @@ func bindataPublicCodemirrorModeWebidlWebidlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/webidl/webidl.js", size: 2777, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/webidl/webidl.js", size: 2777, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9106,7 +9106,7 @@ func bindataPublicCodemirrorModeXmlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/xml/index.html", size: 2493, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/xml/index.html", size: 2493, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9126,7 +9126,7 @@ func bindataPublicCodemirrorModeXmlTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/xml/test.js", size: 1370, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/xml/test.js", size: 1370, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9146,7 +9146,7 @@ func bindataPublicCodemirrorModeXmlXmlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/xml/xml.js", size: 5665, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/xml/xml.js", size: 5665, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9166,7 +9166,7 @@ func bindataPublicCodemirrorModeXqueryIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/xquery/index.html", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/xquery/index.html", size: 8931, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9186,7 +9186,7 @@ func bindataPublicCodemirrorModeXqueryTestJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/xquery/test.js", size: 4416, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/xquery/test.js", size: 4416, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9206,7 +9206,7 @@ func bindataPublicCodemirrorModeXqueryXqueryJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/xquery/xquery.js", size: 6893, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/xquery/xquery.js", size: 6893, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9226,7 +9226,7 @@ func bindataPublicCodemirrorModeYacasIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/yacas/index.html", size: 2176, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/yacas/index.html", size: 2176, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9246,7 +9246,7 @@ func bindataPublicCodemirrorModeYacasYacasJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/yacas/yacas.js", size: 2374, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/yacas/yacas.js", size: 2374, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9266,7 +9266,7 @@ func bindataPublicCodemirrorModeYamlIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml/index.html", size: 2420, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml/index.html", size: 2420, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9286,7 +9286,7 @@ func bindataPublicCodemirrorModeYamlYamlJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml/yaml.js", size: 1794, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml/yaml.js", size: 1794, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9306,7 +9306,7 @@ func bindataPublicCodemirrorModeYamlFrontmatterIndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml-frontmatter/index.html", size: 4038, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml-frontmatter/index.html", size: 4038, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9326,7 +9326,7 @@ func bindataPublicCodemirrorModeYamlFrontmatterYamlFrontmatterJs() (*asset, erro return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js", size: 957, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js", size: 957, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9346,7 +9346,7 @@ func bindataPublicCodemirrorModeZ80IndexHtml() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/z80/index.html", size: 1728, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/z80/index.html", size: 1728, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9366,7 +9366,7 @@ func bindataPublicCodemirrorModeZ80Z80Js() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/codemirror/mode/z80/z80.js", size: 1987, mode: os.FileMode(420), modTime: time.Unix(1518166686, 0)} + info := bindataFileInfo{name: "bindata/public/codemirror/mode/z80/z80.js", size: 1987, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9386,7 +9386,7 @@ func bindataPublicFaviconIco() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/favicon.ico", size: 5430, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/favicon.ico", size: 5430, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9406,7 +9406,7 @@ func bindataPublicManifestJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/manifest.json", size: 608, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/manifest.json", size: 608, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9426,7 +9426,7 @@ func bindataPublicSectionsDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/.DS_Store", size: 6148, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9446,7 +9446,7 @@ func bindataPublicSectionsAirtablePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/airtable.png", size: 1263, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/airtable.png", size: 1263, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9466,7 +9466,7 @@ func bindataPublicSectionsAirtable2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/airtable@2x.png", size: 4247, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/airtable@2x.png", size: 4247, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9486,7 +9486,7 @@ func bindataPublicSectionsAsanaPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/asana.png", size: 1405, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/asana.png", size: 1405, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9506,7 +9506,7 @@ func bindataPublicSectionsAsana2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/asana@2x.png", size: 3507, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/asana@2x.png", size: 3507, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9526,7 +9526,7 @@ func bindataPublicSectionsCodePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/code.png", size: 720, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/code.png", size: 720, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9546,7 +9546,7 @@ func bindataPublicSectionsCode2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/code@2x.png", size: 1468, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/code@2x.png", size: 1468, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9566,7 +9566,7 @@ func bindataPublicSectionsDocusignPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/docusign.png", size: 791, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/docusign.png", size: 791, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9586,7 +9586,7 @@ func bindataPublicSectionsDocusign2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/docusign@2x.png", size: 1358, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/docusign@2x.png", size: 1358, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9606,7 +9606,7 @@ func bindataPublicSectionsGeminiPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/gemini.png", size: 1580, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/gemini.png", size: 1580, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9626,7 +9626,7 @@ func bindataPublicSectionsGemini2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/gemini@2x.png", size: 3446, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/gemini@2x.png", size: 3446, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9646,7 +9646,7 @@ func bindataPublicSectionsGithubPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/github.png", size: 674, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/github.png", size: 674, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9666,7 +9666,7 @@ func bindataPublicSectionsGithub2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/github@2x.png", size: 1388, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/github@2x.png", size: 1388, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9686,7 +9686,7 @@ func bindataPublicSectionsIntercomPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/intercom.png", size: 1183, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/intercom.png", size: 1183, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9706,7 +9706,7 @@ func bindataPublicSectionsIntercom2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/intercom@2x.png", size: 2223, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/intercom@2x.png", size: 2223, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9726,7 +9726,7 @@ func bindataPublicSectionsMailchimpPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/mailchimp.png", size: 2115, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/mailchimp.png", size: 2115, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9746,7 +9746,7 @@ func bindataPublicSectionsMailchimp2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/mailchimp@2x.png", size: 5901, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/mailchimp@2x.png", size: 5901, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9766,7 +9766,7 @@ func bindataPublicSectionsMarkdownPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/markdown.png", size: 518, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/markdown.png", size: 518, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9786,7 +9786,7 @@ func bindataPublicSectionsMarkdown2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/markdown@2x.png", size: 864, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/markdown@2x.png", size: 864, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9806,7 +9806,7 @@ func bindataPublicSectionsPapertrailPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/papertrail.png", size: 1178, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/papertrail.png", size: 1178, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9826,7 +9826,7 @@ func bindataPublicSectionsPapertrail2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/papertrail@2x.png", size: 2376, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/papertrail@2x.png", size: 2376, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9846,7 +9846,7 @@ func bindataPublicSectionsPlantumlPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/plantuml.png", size: 359, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/plantuml.png", size: 359, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9866,7 +9866,7 @@ func bindataPublicSectionsPlantuml2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/plantuml@2x.png", size: 630, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/plantuml@2x.png", size: 630, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9886,7 +9886,7 @@ func bindataPublicSectionsSalesforcePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/salesforce.png", size: 1116, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/salesforce.png", size: 1116, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9906,7 +9906,7 @@ func bindataPublicSectionsSalesforce2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/salesforce@2x.png", size: 2630, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/salesforce@2x.png", size: 2630, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9926,7 +9926,7 @@ func bindataPublicSectionsStripePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/stripe.png", size: 1487, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/stripe.png", size: 1487, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9946,7 +9946,7 @@ func bindataPublicSectionsStripe2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/stripe@2x.png", size: 4523, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/stripe@2x.png", size: 4523, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9966,7 +9966,7 @@ func bindataPublicSectionsSuggestPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/suggest.png", size: 578, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/suggest.png", size: 578, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -9986,7 +9986,7 @@ func bindataPublicSectionsSuggest2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/suggest@2x.png", size: 1096, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/suggest@2x.png", size: 1096, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10006,7 +10006,7 @@ func bindataPublicSectionsTablePng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/table.png", size: 396, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/table.png", size: 396, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10026,7 +10026,7 @@ func bindataPublicSectionsTable2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/table@2x.png", size: 487, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/table@2x.png", size: 487, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10046,7 +10046,7 @@ func bindataPublicSectionsTrelloPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/trello.png", size: 718, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/trello.png", size: 718, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10066,7 +10066,7 @@ func bindataPublicSectionsTrello2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/trello@2x.png", size: 1161, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/trello@2x.png", size: 1161, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10086,7 +10086,7 @@ func bindataPublicSectionsWysiwygPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/wysiwyg.png", size: 562, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/wysiwyg.png", size: 562, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10106,7 +10106,7 @@ func bindataPublicSectionsWysiwyg2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/wysiwyg@2x.png", size: 941, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/wysiwyg@2x.png", size: 941, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10126,7 +10126,7 @@ func bindataPublicSectionsZendeskPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/zendesk.png", size: 1720, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/zendesk.png", size: 1720, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10146,7 +10146,7 @@ func bindataPublicSectionsZendesk2xPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/sections/zendesk@2x.png", size: 5196, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/sections/zendesk@2x.png", size: 5196, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10166,7 +10166,7 @@ func bindataPublicTinymceDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/.DS_Store", size: 14340, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/.DS_Store", size: 14340, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10186,7 +10186,7 @@ func bindataPublicTinymceLangsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/langs/readme.md", size: 151, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/langs/readme.md", size: 151, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10206,7 +10206,7 @@ func bindataPublicTinymceLicenseTxt() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/license.txt", size: 26427, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/license.txt", size: 26427, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10226,7 +10226,7 @@ func bindataPublicTinymcePluginsDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10246,7 +10246,7 @@ func bindataPublicTinymcePluginsAdvlistPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/advlist/plugin.min.js", size: 2192, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/advlist/plugin.min.js", size: 2192, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10266,7 +10266,7 @@ func bindataPublicTinymcePluginsAnchorPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/anchor/plugin.min.js", size: 1398, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/anchor/plugin.min.js", size: 1398, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10286,7 +10286,7 @@ func bindataPublicTinymcePluginsAutolinkPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/autolink/plugin.min.js", size: 2132, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/autolink/plugin.min.js", size: 2132, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10306,7 +10306,7 @@ func bindataPublicTinymcePluginsAutoresizePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/autoresize/plugin.min.js", size: 2056, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/autoresize/plugin.min.js", size: 2056, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10326,7 +10326,7 @@ func bindataPublicTinymcePluginsAutosavePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/autosave/plugin.min.js", size: 3008, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/autosave/plugin.min.js", size: 3008, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10346,7 +10346,7 @@ func bindataPublicTinymcePluginsBbcodePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/bbcode/plugin.min.js", size: 2846, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/bbcode/plugin.min.js", size: 2846, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10366,7 +10366,7 @@ func bindataPublicTinymcePluginsCharmapPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/charmap/plugin.min.js", size: 8573, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/charmap/plugin.min.js", size: 8573, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10386,7 +10386,7 @@ func bindataPublicTinymcePluginsCodePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/code/plugin.min.js", size: 1002, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/code/plugin.min.js", size: 1002, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10406,7 +10406,7 @@ func bindataPublicTinymcePluginsCodesampleDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/codesample/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/codesample/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10426,7 +10426,7 @@ func bindataPublicTinymcePluginsCodesampleCssPrismCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/codesample/css/prism.css", size: 4915, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/codesample/css/prism.css", size: 4915, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10446,7 +10446,7 @@ func bindataPublicTinymcePluginsCodesamplePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/codesample/plugin.min.js", size: 19264, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/codesample/plugin.min.js", size: 19264, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10466,7 +10466,7 @@ func bindataPublicTinymcePluginsColorpickerPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/colorpicker/plugin.min.js", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/colorpicker/plugin.min.js", size: 1347, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10486,7 +10486,7 @@ func bindataPublicTinymcePluginsContextmenuPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/contextmenu/plugin.min.js", size: 1792, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/contextmenu/plugin.min.js", size: 1792, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10506,7 +10506,7 @@ func bindataPublicTinymcePluginsDirectionalityPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/directionality/plugin.min.js", size: 851, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/directionality/plugin.min.js", size: 851, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10526,7 +10526,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyCoolGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-cool.gif", size: 354, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-cool.gif", size: 354, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10546,7 +10546,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyCryGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-cry.gif", size: 329, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-cry.gif", size: 329, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10566,7 +10566,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyEmbarassedGif() (*asset, error return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-embarassed.gif", size: 331, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-embarassed.gif", size: 331, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10586,7 +10586,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyFootInMouthGif() (*asset, erro return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif", size: 342, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif", size: 342, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10606,7 +10606,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyFrownGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-frown.gif", size: 340, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-frown.gif", size: 340, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10626,7 +10626,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyInnocentGif() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-innocent.gif", size: 336, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-innocent.gif", size: 336, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10646,7 +10646,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyKissGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-kiss.gif", size: 338, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-kiss.gif", size: 338, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10666,7 +10666,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyLaughingGif() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-laughing.gif", size: 343, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-laughing.gif", size: 343, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10686,7 +10686,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyMoneyMouthGif() (*asset, error return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-money-mouth.gif", size: 321, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-money-mouth.gif", size: 321, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10706,7 +10706,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileySealedGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-sealed.gif", size: 323, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-sealed.gif", size: 323, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10726,7 +10726,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileySmileGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-smile.gif", size: 344, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-smile.gif", size: 344, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10746,7 +10746,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileySurprisedGif() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-surprised.gif", size: 338, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-surprised.gif", size: 338, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10766,7 +10766,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyTongueOutGif() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-tongue-out.gif", size: 328, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-tongue-out.gif", size: 328, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10786,7 +10786,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyUndecidedGif() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-undecided.gif", size: 337, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-undecided.gif", size: 337, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10806,7 +10806,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyWinkGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-wink.gif", size: 350, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-wink.gif", size: 350, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10826,7 +10826,7 @@ func bindataPublicTinymcePluginsEmoticonsImgSmileyYellGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-yell.gif", size: 336, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/img/smiley-yell.gif", size: 336, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10846,7 +10846,7 @@ func bindataPublicTinymcePluginsEmoticonsPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/plugin.min.js", size: 1067, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/emoticons/plugin.min.js", size: 1067, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10866,7 +10866,7 @@ func bindataPublicTinymcePluginsFullpagePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/fullpage/plugin.min.js", size: 7116, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/fullpage/plugin.min.js", size: 7116, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10886,7 +10886,7 @@ func bindataPublicTinymcePluginsFullscreenPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/fullscreen/plugin.min.js", size: 2126, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/fullscreen/plugin.min.js", size: 2126, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10906,7 +10906,7 @@ func bindataPublicTinymcePluginsHelpImgLogoPng() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/help/img/logo.png", size: 13208, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/help/img/logo.png", size: 13208, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10926,7 +10926,7 @@ func bindataPublicTinymcePluginsHelpPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/help/plugin.min.js", size: 9158, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/help/plugin.min.js", size: 9158, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10946,7 +10946,7 @@ func bindataPublicTinymcePluginsHrPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/hr/plugin.min.js", size: 414, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/hr/plugin.min.js", size: 414, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10966,7 +10966,7 @@ func bindataPublicTinymcePluginsImagePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/image/plugin.min.js", size: 13366, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/image/plugin.min.js", size: 13366, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -10986,7 +10986,7 @@ func bindataPublicTinymcePluginsImagetoolsPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/imagetools/plugin.min.js", size: 34759, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/imagetools/plugin.min.js", size: 34759, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11006,7 +11006,7 @@ func bindataPublicTinymcePluginsImportcssPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/importcss/plugin.min.js", size: 3127, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/importcss/plugin.min.js", size: 3127, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11026,7 +11026,7 @@ func bindataPublicTinymcePluginsInsertdatetimePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/insertdatetime/plugin.min.js", size: 2619, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/insertdatetime/plugin.min.js", size: 2619, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11046,7 +11046,7 @@ func bindataPublicTinymcePluginsLinkPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/link/plugin.min.js", size: 8701, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/link/plugin.min.js", size: 8701, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11066,7 +11066,7 @@ func bindataPublicTinymcePluginsListsPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/lists/plugin.min.js", size: 13942, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/lists/plugin.min.js", size: 13942, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11086,7 +11086,7 @@ func bindataPublicTinymcePluginsMediaPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/media/plugin.min.js", size: 14718, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/media/plugin.min.js", size: 14718, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11106,7 +11106,7 @@ func bindataPublicTinymcePluginsNonbreakingPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/nonbreaking/plugin.min.js", size: 979, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/nonbreaking/plugin.min.js", size: 979, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11126,7 +11126,7 @@ func bindataPublicTinymcePluginsNoneditablePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/noneditable/plugin.min.js", size: 1532, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/noneditable/plugin.min.js", size: 1532, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11146,7 +11146,7 @@ func bindataPublicTinymcePluginsPagebreakPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/pagebreak/plugin.min.js", size: 1414, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/pagebreak/plugin.min.js", size: 1414, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11166,7 +11166,7 @@ func bindataPublicTinymcePluginsPastePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/paste/plugin.min.js", size: 21256, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/paste/plugin.min.js", size: 21256, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11186,7 +11186,7 @@ func bindataPublicTinymcePluginsPreviewPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/preview/plugin.min.js", size: 2037, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/preview/plugin.min.js", size: 2037, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11206,7 +11206,7 @@ func bindataPublicTinymcePluginsPrintPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/print/plugin.min.js", size: 352, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/print/plugin.min.js", size: 352, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11226,7 +11226,7 @@ func bindataPublicTinymcePluginsSavePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/save/plugin.min.js", size: 1413, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/save/plugin.min.js", size: 1413, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11246,7 +11246,7 @@ func bindataPublicTinymcePluginsSearchreplacePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/searchreplace/plugin.min.js", size: 7304, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/searchreplace/plugin.min.js", size: 7304, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11266,7 +11266,7 @@ func bindataPublicTinymcePluginsSpellcheckerPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/spellchecker/plugin.min.js", size: 9819, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/spellchecker/plugin.min.js", size: 9819, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11286,7 +11286,7 @@ func bindataPublicTinymcePluginsTabfocusPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/tabfocus/plugin.min.js", size: 1629, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/tabfocus/plugin.min.js", size: 1629, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11306,7 +11306,7 @@ func bindataPublicTinymcePluginsTablePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/table/plugin.min.js", size: 130111, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/table/plugin.min.js", size: 130111, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11326,7 +11326,7 @@ func bindataPublicTinymcePluginsTemplatePluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/template/plugin.min.js", size: 5251, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/template/plugin.min.js", size: 5251, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11346,7 +11346,7 @@ func bindataPublicTinymcePluginsTextcolorPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/textcolor/plugin.min.js", size: 4857, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/textcolor/plugin.min.js", size: 4857, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11366,7 +11366,7 @@ func bindataPublicTinymcePluginsTextpatternPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/textpattern/plugin.min.js", size: 4121, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/textpattern/plugin.min.js", size: 4121, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11386,7 +11386,7 @@ func bindataPublicTinymcePluginsTocPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/toc/plugin.min.js", size: 2858, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/toc/plugin.min.js", size: 2858, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11406,7 +11406,7 @@ func bindataPublicTinymcePluginsVisualblocksCssVisualblocksCss() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/visualblocks/css/visualblocks.css", size: 5473, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/visualblocks/css/visualblocks.css", size: 5473, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11426,7 +11426,7 @@ func bindataPublicTinymcePluginsVisualblocksPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/visualblocks/plugin.min.js", size: 1669, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/visualblocks/plugin.min.js", size: 1669, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11446,7 +11446,7 @@ func bindataPublicTinymcePluginsVisualcharsPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/visualchars/plugin.min.js", size: 4281, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/visualchars/plugin.min.js", size: 4281, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11466,7 +11466,7 @@ func bindataPublicTinymcePluginsWordcountPluginMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/plugins/wordcount/plugin.min.js", size: 7169, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/plugins/wordcount/plugin.min.js", size: 7169, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11486,7 +11486,7 @@ func bindataPublicTinymceSkinsDs_store() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/.DS_Store", size: 8196, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11506,7 +11506,7 @@ func bindataPublicTinymceSkinsCharcoalVariablesLess() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/Variables.less", size: 7272, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/Variables.less", size: 7272, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11526,7 +11526,7 @@ func bindataPublicTinymceSkinsCharcoalContentInlineMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/content.inline.min.css", size: 2676, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/content.inline.min.css", size: 2676, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11546,7 +11546,7 @@ func bindataPublicTinymceSkinsCharcoalContentMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/content.min.css", size: 3091, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/content.min.css", size: 3091, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11566,7 +11566,7 @@ func bindataPublicTinymceSkinsCharcoalFontsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/readme.md", size: 67, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/readme.md", size: 67, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11586,7 +11586,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceSmallEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11606,7 +11606,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceSmallJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.json", size: 40273, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.json", size: 40273, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11626,7 +11626,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceSmallSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11646,7 +11646,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceSmallTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11666,7 +11666,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceSmallWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11686,7 +11686,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.eot", size: 17572, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.eot", size: 17572, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11706,7 +11706,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.json", size: 89684, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.json", size: 89684, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11726,7 +11726,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.svg", size: 45991, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.svg", size: 45991, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11746,7 +11746,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.ttf", size: 17408, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.ttf", size: 17408, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11766,7 +11766,7 @@ func bindataPublicTinymceSkinsCharcoalFontsTinymceWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.woff", size: 17484, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/fonts/tinymce.woff", size: 17484, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11786,7 +11786,7 @@ func bindataPublicTinymceSkinsCharcoalImgAnchorGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/anchor.gif", size: 53, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/anchor.gif", size: 53, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11806,7 +11806,7 @@ func bindataPublicTinymceSkinsCharcoalImgLoaderGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/loader.gif", size: 2608, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/loader.gif", size: 2608, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11826,7 +11826,7 @@ func bindataPublicTinymceSkinsCharcoalImgObjectGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/object.gif", size: 152, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/object.gif", size: 152, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11846,7 +11846,7 @@ func bindataPublicTinymceSkinsCharcoalImgTransGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/trans.gif", size: 43, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/img/trans.gif", size: 43, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11866,7 +11866,7 @@ func bindataPublicTinymceSkinsCharcoalSkinIe7MinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/skin.ie7.min.css", size: 45978, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/skin.ie7.min.css", size: 45978, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11886,7 +11886,7 @@ func bindataPublicTinymceSkinsCharcoalSkinJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/skin.json", size: 2507, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/skin.json", size: 2507, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11906,7 +11906,7 @@ func bindataPublicTinymceSkinsCharcoalSkinMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/skin.min.css", size: 49774, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/charcoal/skin.min.css", size: 49774, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11926,7 +11926,7 @@ func bindataPublicTinymceSkinsDocumizeVariablesLess() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/Variables.less", size: 7283, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/Variables.less", size: 7283, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11946,7 +11946,7 @@ func bindataPublicTinymceSkinsDocumizeContentInlineMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/content.inline.min.css", size: 2676, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/content.inline.min.css", size: 2676, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11966,7 +11966,7 @@ func bindataPublicTinymceSkinsDocumizeContentMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/content.min.css", size: 3091, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/content.min.css", size: 3091, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -11986,7 +11986,7 @@ func bindataPublicTinymceSkinsDocumizeFontsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/readme.md", size: 67, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/readme.md", size: 67, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12006,7 +12006,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceSmallEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12026,7 +12026,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceSmallJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.json", size: 40273, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.json", size: 40273, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12046,7 +12046,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceSmallSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12066,7 +12066,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceSmallTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12086,7 +12086,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceSmallWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12106,7 +12106,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.eot", size: 17572, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.eot", size: 17572, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12126,7 +12126,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.json", size: 89684, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.json", size: 89684, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12146,7 +12146,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.svg", size: 45991, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.svg", size: 45991, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12166,7 +12166,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.ttf", size: 17408, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.ttf", size: 17408, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12186,7 +12186,7 @@ func bindataPublicTinymceSkinsDocumizeFontsTinymceWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.woff", size: 17484, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/fonts/tinymce.woff", size: 17484, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12206,7 +12206,7 @@ func bindataPublicTinymceSkinsDocumizeImgAnchorGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/anchor.gif", size: 53, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/anchor.gif", size: 53, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12226,7 +12226,7 @@ func bindataPublicTinymceSkinsDocumizeImgLoaderGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/loader.gif", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/loader.gif", size: 2608, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12246,7 +12246,7 @@ func bindataPublicTinymceSkinsDocumizeImgObjectGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/object.gif", size: 152, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/object.gif", size: 152, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12266,7 +12266,7 @@ func bindataPublicTinymceSkinsDocumizeImgTransGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/trans.gif", size: 43, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/img/trans.gif", size: 43, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12286,7 +12286,7 @@ func bindataPublicTinymceSkinsDocumizeSkinIe7MinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/skin.ie7.min.css", size: 36982, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/skin.ie7.min.css", size: 36982, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12306,7 +12306,7 @@ func bindataPublicTinymceSkinsDocumizeSkinJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/skin.json", size: 2518, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/skin.json", size: 2518, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12326,7 +12326,7 @@ func bindataPublicTinymceSkinsDocumizeSkinMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/skin.min.css", size: 40297, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/documize/skin.min.css", size: 40297, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12346,7 +12346,7 @@ func bindataPublicTinymceSkinsLightgrayContentInlineMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/content.inline.min.css", size: 3326, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/content.inline.min.css", size: 3326, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12366,7 +12366,7 @@ func bindataPublicTinymceSkinsLightgrayContentMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/content.min.css", size: 3732, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/content.min.css", size: 3732, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12386,7 +12386,7 @@ func bindataPublicTinymceSkinsLightgrayContentMobileMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/content.mobile.min.css", size: 234, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/content.mobile.min.css", size: 234, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12406,7 +12406,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceMobileWoff() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-mobile.woff", size: 4624, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-mobile.woff", size: 4624, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12426,7 +12426,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceSmallEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12446,7 +12446,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceSmallSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12466,7 +12466,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceSmallTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12486,7 +12486,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceSmallWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12506,7 +12506,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceEot() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.eot", size: 18808, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.eot", size: 18808, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12526,7 +12526,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceSvg() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.svg", size: 45989, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.svg", size: 45989, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12546,7 +12546,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceTtf() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.ttf", size: 18644, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.ttf", size: 18644, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12566,7 +12566,7 @@ func bindataPublicTinymceSkinsLightgrayFontsTinymceWoff() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.woff", size: 18720, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/fonts/tinymce.woff", size: 18720, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12586,7 +12586,7 @@ func bindataPublicTinymceSkinsLightgrayImgAnchorGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/anchor.gif", size: 53, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/anchor.gif", size: 53, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12606,7 +12606,7 @@ func bindataPublicTinymceSkinsLightgrayImgLoaderGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/loader.gif", size: 2608, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/loader.gif", size: 2608, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12626,7 +12626,7 @@ func bindataPublicTinymceSkinsLightgrayImgObjectGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/object.gif", size: 152, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/object.gif", size: 152, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12646,7 +12646,7 @@ func bindataPublicTinymceSkinsLightgrayImgTransGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/trans.gif", size: 43, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/img/trans.gif", size: 43, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12666,7 +12666,7 @@ func bindataPublicTinymceSkinsLightgraySkinMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/skin.min.css", size: 43338, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/skin.min.css", size: 43338, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12686,7 +12686,7 @@ func bindataPublicTinymceSkinsLightgraySkinMobileMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/skin.mobile.min.css", size: 28005, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray/skin.mobile.min.css", size: 28005, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12706,7 +12706,7 @@ func bindataPublicTinymceSkinsLightgrayGradientVariablesLess() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/Variables.less", size: 8554, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/Variables.less", size: 8554, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12726,7 +12726,7 @@ func bindataPublicTinymceSkinsLightgrayGradientContentInlineMinCss() (*asset, er return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/content.inline.min.css", size: 3073, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/content.inline.min.css", size: 3073, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12746,7 +12746,7 @@ func bindataPublicTinymceSkinsLightgrayGradientContentMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/content.min.css", size: 3618, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/content.min.css", size: 3618, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12766,7 +12766,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsReadmeMd() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/readme.md", size: 67, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/readme.md", size: 67, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12786,7 +12786,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceSmallEot() (*asset, e return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.eot", size: 9492, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12806,7 +12806,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceSmallJson() (*asset, return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.json", size: 40273, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.json", size: 40273, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12826,7 +12826,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceSmallSvg() (*asset, e return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.svg", size: 24727, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12846,7 +12846,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceSmallTtf() (*asset, e return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.ttf", size: 9304, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12866,7 +12866,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceSmallWoff() (*asset, return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce-small.woff", size: 9380, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12886,7 +12886,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceEot() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.eot", size: 17572, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.eot", size: 17572, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12906,7 +12906,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceJson() (*asset, error return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.json", size: 87654, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.json", size: 87654, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12926,7 +12926,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceSvg() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.svg", size: 45991, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.svg", size: 45991, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12946,7 +12946,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceTtf() (*asset, error) return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.ttf", size: 17408, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.ttf", size: 17408, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12966,7 +12966,7 @@ func bindataPublicTinymceSkinsLightgrayGradientFontsTinymceWoff() (*asset, error return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.woff", size: 17484, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/fonts/tinymce.woff", size: 17484, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -12986,7 +12986,7 @@ func bindataPublicTinymceSkinsLightgrayGradientImgAnchorGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/anchor.gif", size: 53, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/anchor.gif", size: 53, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13006,7 +13006,7 @@ func bindataPublicTinymceSkinsLightgrayGradientImgLoaderGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/loader.gif", size: 2608, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/loader.gif", size: 2608, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13026,7 +13026,7 @@ func bindataPublicTinymceSkinsLightgrayGradientImgObjectGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/object.gif", size: 152, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/object.gif", size: 152, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13046,7 +13046,7 @@ func bindataPublicTinymceSkinsLightgrayGradientImgTransGif() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/trans.gif", size: 43, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/img/trans.gif", size: 43, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13066,7 +13066,7 @@ func bindataPublicTinymceSkinsLightgrayGradientSkinIe7MinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/skin.ie7.min.css", size: 43291, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/skin.ie7.min.css", size: 43291, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13086,7 +13086,7 @@ func bindataPublicTinymceSkinsLightgrayGradientSkinJson() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/skin.json", size: 2601, mode: os.FileMode(493), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/skin.json", size: 2601, mode: os.FileMode(493), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13106,7 +13106,7 @@ func bindataPublicTinymceSkinsLightgrayGradientSkinMinCss() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/skin.min.css", size: 50359, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/skins/lightgray-gradient/skin.min.css", size: 50359, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13126,7 +13126,7 @@ func bindataPublicTinymceThemesInliteThemeMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/themes/inlite/theme.min.js", size: 133388, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/themes/inlite/theme.min.js", size: 133388, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13146,7 +13146,7 @@ func bindataPublicTinymceThemesMobileThemeMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/themes/mobile/theme.min.js", size: 173407, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/themes/mobile/theme.min.js", size: 173407, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13166,7 +13166,7 @@ func bindataPublicTinymceThemesModernThemeMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/themes/modern/theme.min.js", size: 131682, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/themes/modern/theme.min.js", size: 131682, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13186,7 +13186,7 @@ func bindataPublicTinymceTinymceMinJs() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/public/tinymce/tinymce.min.js", size: 333639, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/public/tinymce/tinymce.min.js", size: 333639, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13206,7 +13206,7 @@ func bindataRobotsTxt() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/robots.txt", size: 51, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/robots.txt", size: 51, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13226,7 +13226,7 @@ func bindataScriptsDb_00000Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00000.sql", size: 10715, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00000.sql", size: 10715, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13246,7 +13246,7 @@ func bindataScriptsDb_00001Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00001.sql", size: 692, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00001.sql", size: 692, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13266,7 +13266,7 @@ func bindataScriptsDb_00002Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00002.sql", size: 548, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00002.sql", size: 548, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13286,7 +13286,7 @@ func bindataScriptsDb_00003Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00003.sql", size: 103, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00003.sql", size: 103, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13306,7 +13306,7 @@ func bindataScriptsDb_00004Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00004.sql", size: 824, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00004.sql", size: 824, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13326,7 +13326,7 @@ func bindataScriptsDb_00005Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00005.sql", size: 441, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00005.sql", size: 441, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13346,7 +13346,7 @@ func bindataScriptsDb_00006Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00006.sql", size: 634, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00006.sql", size: 634, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13366,7 +13366,7 @@ func bindataScriptsDb_00007Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00007.sql", size: 115, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00007.sql", size: 115, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13386,7 +13386,7 @@ func bindataScriptsDb_00008Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00008.sql", size: 711, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00008.sql", size: 711, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13406,7 +13406,7 @@ func bindataScriptsDb_00009Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00009.sql", size: 1262, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00009.sql", size: 1262, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13426,7 +13426,7 @@ func bindataScriptsDb_00010Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00010.sql", size: 4289, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00010.sql", size: 4289, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13446,7 +13446,7 @@ func bindataScriptsDb_00011Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00011.sql", size: 218, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00011.sql", size: 218, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13466,7 +13466,7 @@ func bindataScriptsDb_00012Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00012.sql", size: 128, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00012.sql", size: 128, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13486,7 +13486,7 @@ func bindataScriptsDb_00013Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00013.sql", size: 632, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00013.sql", size: 632, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13506,7 +13506,7 @@ func bindataScriptsDb_00014Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00014.sql", size: 144, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00014.sql", size: 144, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13526,7 +13526,7 @@ func bindataScriptsDb_00015Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00015.sql", size: 3972, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00015.sql", size: 3972, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13546,7 +13546,7 @@ func bindataScriptsDb_00016Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00016.sql", size: 6548, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00016.sql", size: 6548, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13566,7 +13566,7 @@ func bindataScriptsDb_00017Sql() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "bindata/scripts/db_00017.sql", size: 1543, mode: os.FileMode(420), modTime: time.Unix(1518166687, 0)} + info := bindataFileInfo{name: "bindata/scripts/db_00017.sql", size: 1543, mode: os.FileMode(420), modTime: time.Unix(1518621131, 0)} a := &asset{bytes: bytes, info: info} return a, nil } @@ -13639,7 +13639,7 @@ var _bindata = map[string]func() (*asset, error){ "bindata/manifest.json": bindataManifestJson, "bindata/offline.html": bindataOfflineHtml, "bindata/public/assets/.DS_Store": bindataPublicAssetsDs_store, - "bindata/public/assets/documize-9462f18402b546fde2d0d807281ae7ab.js": bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJs, + "bindata/public/assets/documize-918475c4ba74e809565c23e7f86ae36c.js": bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJs, "bindata/public/assets/documize-99dcfec5ca4e18d5f3bb1e1e911b86bb.css": bindataPublicAssetsDocumize99dcfec5ca4e18d5f3bb1e1e911b86bbCss, "bindata/public/assets/font/.DS_Store": bindataPublicAssetsFontDs_store, "bindata/public/assets/font/icons/MaterialIcons-Regular.eot": bindataPublicAssetsFontIconsMaterialiconsRegularEot, @@ -14329,7 +14329,7 @@ var _bintree = &bintree{nil, map[string]*bintree{ "public": &bintree{nil, map[string]*bintree{ "assets": &bintree{nil, map[string]*bintree{ ".DS_Store": &bintree{bindataPublicAssetsDs_store, map[string]*bintree{}}, - "documize-9462f18402b546fde2d0d807281ae7ab.js": &bintree{bindataPublicAssetsDocumize9462f18402b546fde2d0d807281ae7abJs, map[string]*bintree{}}, + "documize-918475c4ba74e809565c23e7f86ae36c.js": &bintree{bindataPublicAssetsDocumize918475c4ba74e809565c23e7f86ae36cJs, map[string]*bintree{}}, "documize-99dcfec5ca4e18d5f3bb1e1e911b86bb.css": &bintree{bindataPublicAssetsDocumize99dcfec5ca4e18d5f3bb1e1e911b86bbCss, map[string]*bintree{}}, "font": &bintree{nil, map[string]*bintree{ ".DS_Store": &bintree{bindataPublicAssetsFontDs_store, map[string]*bintree{}}, diff --git a/vendor/github.com/Sirupsen/logrus/.gitignore b/vendor/github.com/Sirupsen/logrus/.gitignore deleted file mode 100644 index 66be63a0..00000000 --- a/vendor/github.com/Sirupsen/logrus/.gitignore +++ /dev/null @@ -1 +0,0 @@ -logrus diff --git a/vendor/github.com/Sirupsen/logrus/.travis.yml b/vendor/github.com/Sirupsen/logrus/.travis.yml deleted file mode 100644 index 2efbc54a..00000000 --- a/vendor/github.com/Sirupsen/logrus/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -go: - - 1.1 - - 1.2 - - tip -before_script: - - go get github.com/stretchr/testify diff --git a/vendor/github.com/Sirupsen/logrus/LICENSE b/vendor/github.com/Sirupsen/logrus/LICENSE deleted file mode 100644 index f090cb42..00000000 --- a/vendor/github.com/Sirupsen/logrus/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Simon Eskildsen - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/Sirupsen/logrus/README.md b/vendor/github.com/Sirupsen/logrus/README.md deleted file mode 100644 index 3a6aced2..00000000 --- a/vendor/github.com/Sirupsen/logrus/README.md +++ /dev/null @@ -1,335 +0,0 @@ -# Logrus :walrus: [![Build Status](https://travis-ci.org/Sirupsen/logrus.svg?branch=master)](https://travis-ci.org/Sirupsen/logrus) - -Logrus is a structured logger for Go (golang), completely API compatible with -the standard library logger. [Godoc][godoc]. **Please note the Logrus API is not -yet stable (pre 1.0), the core API is unlikely change much but please version -control your Logrus to make sure you aren't fetching latest `master` on every -build.** - -Nicely color-coded in development (when a TTY is attached, otherwise just -plain text): - -![Colored](http://i.imgur.com/PY7qMwd.png) - -With `log.Formatter = new(logrus.JSONFormatter)`, for easy parsing by logstash -or Splunk: - -```json -{"animal":"walrus","level":"info","msg":"A group of walrus emerges from the -ocean","size":10,"time":"2014-03-10 19:57:38.562264131 -0400 EDT"} - -{"level":"warning","msg":"The group's number increased tremendously!", -"number":122,"omg":true,"time":"2014-03-10 19:57:38.562471297 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"A giant walrus appears!", -"size":10,"time":"2014-03-10 19:57:38.562500591 -0400 EDT"} - -{"animal":"walrus","level":"info","msg":"Tremendously sized cow enters the ocean.", -"size":9,"time":"2014-03-10 19:57:38.562527896 -0400 EDT"} - -{"level":"fatal","msg":"The ice breaks!","number":100,"omg":true, -"time":"2014-03-10 19:57:38.562543128 -0400 EDT"} -``` - -With the default `log.Formatter = new(logrus.TextFormatter)` when a TTY is not -attached, the output is compatible with the -[l2met](http://r.32k.io/l2met-introduction) format: - -```text -time="2014-04-20 15:36:23.830442383 -0400 EDT" level="info" msg="A group of walrus emerges from the ocean" animal="walrus" size=10 -time="2014-04-20 15:36:23.830584199 -0400 EDT" level="warning" msg="The group's number increased tremendously!" omg=true number=122 -time="2014-04-20 15:36:23.830596521 -0400 EDT" level="info" msg="A giant walrus appears!" animal="walrus" size=10 -time="2014-04-20 15:36:23.830611837 -0400 EDT" level="info" msg="Tremendously sized cow enters the ocean." animal="walrus" size=9 -time="2014-04-20 15:36:23.830626464 -0400 EDT" level="fatal" msg="The ice breaks!" omg=true number=100 -``` - -#### Example - -The simplest way to use Logrus is simply the package-level exported logger: - -```go -package main - -import ( - log "github.com/Sirupsen/logrus" -) - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - }).Info("A walrus appears") -} -``` - -Note that it's completely api-compatible with the stdlib logger, so you can -replace your `log` imports everywhere with `log "github.com/Sirupsen/logrus"` -and you'll now have the flexibility of Logrus. You can customize it all you -want: - -```go -package main - -import ( - "os" - log "github.com/Sirupsen/logrus" - "github.com/Sirupsen/logrus/hooks/airbrake" -) - -func init() { - // Log as JSON instead of the default ASCII formatter. - log.SetFormatter(logrus.JSONFormatter) - - // Use the Airbrake hook to report errors that have Error severity or above to - // an exception tracker. You can create custom hooks, see the Hooks section. - log.AddHook(logrus_airbrake.AirbrakeHook) - - // Output to stderr instead of stdout, could also be a file. - log.SetOuput(os.Stderr) - - // Only log the warning severity or above. - log.SetLevel(logrus.WarnLevel) -} - -func main() { - log.WithFields(log.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") - - log.WithFields(log.Fields{ - "omg": true, - "number": 122, - }).Warn("The group's number increased tremendously!") - - log.WithFields(log.Fields{ - "omg": true, - "number": 100, - }).Fatal("The ice breaks!") -} -``` - -For more advanced usage such as logging to multiple locations from the same -application, you can also create an instance of the `logrus` Logger: - -```go -package main - -import ( - "github.com/Sirupsen/logrus" -) - -// Create a new instance of the logger. You can have any number of instances. -var log = logrus.New() - -func main() { - // The API for setting attributes is a little different than the package level - // exported logger. See Godoc. - log.Out = os.Stderr - - log.WithFields(log.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") -} -``` - -#### Fields - -Logrus encourages careful, structured logging though logging fields instead of -long, unparseable error messages. For example, instead of: `log.Fatalf("Failed -to send event %s to topic %s with key %d")`, you should log the much more -discoverable: - -```go -log.WithFields(log.Fields{ - "event": event, - "topic": topic, - "key": key, -}).Fatal("Failed to send event") -``` - -We've found this API forces you to think about logging in a way that produces -much more useful logging messages. We've been in countless situations where just -a single added field to a log statement that was already there would've saved us -hours. The `WithFields` call is optional. - -In general, with Logrus using any of the `printf`-family functions should be -seen as a hint you should add a field, however, you can still use the -`printf`-family functions with Logrus. - -#### Hooks - -You can add hooks for logging levels. For example to send errors to an exception -tracking service on `Error`, `Fatal` and `Panic`, info to StatsD or log to -multiple places simultaneously, e.g. syslog. - -```go -// Not the real implementation of the Airbrake hook. Just a simple sample. -import ( - log "github.com/Sirupsen/logrus" -) - -func init() { - log.AddHook(new(AirbrakeHook)) -} - -type AirbrakeHook struct{} - -// `Fire()` takes the entry that the hook is fired for. `entry.Data[]` contains -// the fields for the entry. See the Fields section of the README. -func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error { - err := airbrake.Notify(entry.Data["error"].(error)) - if err != nil { - log.WithFields(log.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - }).Info("Failed to send error to Airbrake") - } - - return nil -} - -// `Levels()` returns a slice of `Levels` the hook is fired for. -func (hook *AirbrakeHook) Levels() []log.Level { - return []log.Level{ - log.ErrorLevel, - log.FatalLevel, - log.PanicLevel, - } -} -``` - -Logrus comes with built-in hooks. Add those, or your custom hook, in `init`: - -```go -import ( - log "github.com/Sirupsen/logrus" - "github.com/Sirupsen/logrus/hooks/airbrake" - "github.com/Sirupsen/logrus/hooks/syslog" -) - -func init() { - log.AddHook(new(logrus_airbrake.AirbrakeHook)) - log.AddHook(logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")) -} -``` - -* [`github.com/Sirupsen/logrus/hooks/airbrake`](https://github.com/Sirupsen/logrus/blob/master/hooks/airbrake/airbrake.go). - Send errors to an exception tracking service compatible with the Airbrake API. - Uses [`airbrake-go`](https://github.com/tobi/airbrake-go) behind the scenes. - -* [`github.com/Sirupsen/logrus/hooks/syslog`](https://github.com/Sirupsen/logrus/blob/master/hooks/syslog/syslog.go). - Send errors to remote syslog server. - Uses standard library `log/syslog` behind the scenes. - -#### Level logging - -Logrus has six logging levels: Debug, Info, Warning, Error, Fatal and Panic. - -```go -log.Debug("Useful debugging information.") -log.Info("Something noteworthy happened!") -log.Warn("You should probably take a look at this.") -log.Error("Something failed but I'm not quitting.") -// Calls os.Exit(1) after logging -log.Fatal("Bye.") -// Calls panic() after logging -log.Panic("I'm bailing.") -``` - -You can set the logging level on a `Logger`, then it will only log entries with -that severity or anything above it: - -```go -// Will log anything that is info or above (warn, error, fatal, panic). Default. -log.SetLevel(log.InfoLevel) -``` - -It may be useful to set `log.Level = logrus.DebugLevel` in a debug or verbose -environment if your application has that. - -#### Entries - -Besides the fields added with `WithField` or `WithFields` some fields are -automatically added to all logging events: - -1. `time`. The timestamp when the entry was created. -2. `msg`. The logging message passed to `{Info,Warn,Error,Fatal,Panic}` after - the `AddFields` call. E.g. `Failed to send event.` -3. `level`. The logging level. E.g. `info`. - -#### Environments - -Logrus has no notion of environment. - -If you wish for hooks and formatters to only be used in specific environments, -you should handle that yourself. For example, if your application has a global -variable `Environment`, which is a string representation of the environment you -could do: - -```go -import ( - log "github.com/Sirupsen/logrus" -) - -init() { - // do something here to set environment depending on an environment variable - // or command-line flag - if Environment == "production" { - log.SetFormatter(logrus.JSONFormatter) - } else { - // The TextFormatter is default, you don't actually have to do this. - log.SetFormatter(logrus.TextFormatter) - } -} -``` - -This configuration is how `logrus` was intended to be used, but JSON in -production is mostly only useful if you do log aggregation with tools like -Splunk or Logstash. - -#### Formatters - -The built-in logging formatters are: - -* `logrus.TextFormatter`. Logs the event in colors if stdout is a tty, otherwise - without colors. - * *Note:* to force colored output when there is no TTY, set the `ForceColors` - field to `true`. -* `logrus.JSONFormatter`. Logs fields as JSON. - -Third party logging formatters: - -* [`zalgo`](https://github.com/aybabtme/logzalgo): invoking the P͉̫o̳̼̊w̖͈̰͎e̬͔̭͂r͚̼̹̲ ̫͓͉̳͈ō̠͕͖̚fÌÍÌ  ͕̲̞͖͑Z̖̫̤̫ͪa͉̬͈̗lÍ–ÍŽg̳̥o̰̥̅!̣͔̲̻͊̄ ̙̘̦̹̦. - -You can define your formatter by implementing the `Formatter` interface, -requiring a `Format` method. `Format` takes an `*Entry`. `entry.Data` is a -`Fields` type (`map[string]interface{}`) with all your fields as well as the -default ones (see Entries section above): - -```go -type MyJSONFormatter struct { -} - -log.SetFormatter(new(MyJSONFormatter)) - -func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { - // Note this doesn't include Time, Level and Message which are available on - // the Entry. Consult `godoc` on information about those fields or read the - // source of the official loggers. - serialized, err := json.Marshal(entry.Data) - if err != nil { - return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) - } - return append(serialized, '\n'), nil -} -``` - -#### Rotation - -Log rotation is not provided with Logrus. Log rotation should be done by an -external program (like `logrotated(8)`) that can compress and delete old log -entries. It should not be a feature of the application-level logger. - - -[godoc]: https://godoc.org/github.com/Sirupsen/logrus diff --git a/vendor/github.com/Sirupsen/logrus/entry.go b/vendor/github.com/Sirupsen/logrus/entry.go deleted file mode 100644 index 44ff0566..00000000 --- a/vendor/github.com/Sirupsen/logrus/entry.go +++ /dev/null @@ -1,242 +0,0 @@ -package logrus - -import ( - "bytes" - "fmt" - "io" - "os" - "time" -) - -// An entry is the final or intermediate Logrus logging entry. It containts all -// the fields passed with WithField{,s}. It's finally logged when Debug, Info, -// Warn, Error, Fatal or Panic is called on it. These objects can be reused and -// passed around as much as you wish to avoid field duplication. -type Entry struct { - Logger *Logger - - // Contains all the fields set by the user. - Data Fields - - // Time at which the log entry was created - Time time.Time - - // Level the log entry was logged at: Debug, Info, Warn, Error, Fatal or Panic - Level Level - - // Message passed to Debug, Info, Warn, Error, Fatal or Panic - Message string -} - -var baseTimestamp time.Time - -func NewEntry(logger *Logger) *Entry { - return &Entry{ - Logger: logger, - // Default is three fields, give a little extra room - Data: make(Fields, 5), - } -} - -// Returns a reader for the entry, which is a proxy to the formatter. -func (entry *Entry) Reader() (*bytes.Buffer, error) { - serialized, err := entry.Logger.Formatter.Format(entry) - return bytes.NewBuffer(serialized), err -} - -// Returns the string representation from the reader and ultimately the -// formatter. -func (entry *Entry) String() (string, error) { - reader, err := entry.Reader() - if err != nil { - return "", err - } - - return reader.String(), err -} - -// Add a single field to the Entry. -func (entry *Entry) WithField(key string, value interface{}) *Entry { - return entry.WithFields(Fields{key: value}) -} - -// Add a map of fields to the Entry. -func (entry *Entry) WithFields(fields Fields) *Entry { - data := Fields{} - for k, v := range entry.Data { - data[k] = v - } - for k, v := range fields { - data[k] = v - } - return &Entry{Logger: entry.Logger, Data: data} -} - -func (entry *Entry) log(level Level, msg string) string { - entry.Time = time.Now() - entry.Level = level - entry.Message = msg - - if err := entry.Logger.Hooks.Fire(level, entry); err != nil { - fmt.Fprintf(os.Stderr, "Failed to fire hook", err) - } - - reader, err := entry.Reader() - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to obtain reader, %v", err) - } - - entry.Logger.mu.Lock() - defer entry.Logger.mu.Unlock() - - _, err = io.Copy(entry.Logger.Out, reader) - if err != nil { - fmt.Fprintf(os.Stderr, "Failed to write to log, %v", err) - } - - return reader.String() -} - -func (entry *Entry) Debug(args ...interface{}) { - if entry.Logger.Level >= DebugLevel { - entry.log(DebugLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Print(args ...interface{}) { - entry.Info(args...) -} - -func (entry *Entry) Info(args ...interface{}) { - if entry.Logger.Level >= InfoLevel { - entry.log(InfoLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Warn(args ...interface{}) { - if entry.Logger.Level >= WarnLevel { - entry.log(WarnLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Error(args ...interface{}) { - if entry.Logger.Level >= ErrorLevel { - entry.log(ErrorLevel, fmt.Sprint(args...)) - } -} - -func (entry *Entry) Fatal(args ...interface{}) { - if entry.Logger.Level >= FatalLevel { - entry.log(FatalLevel, fmt.Sprint(args...)) - } - os.Exit(1) -} - -func (entry *Entry) Panic(args ...interface{}) { - if entry.Logger.Level >= PanicLevel { - msg := entry.log(PanicLevel, fmt.Sprint(args...)) - panic(msg) - } - panic(fmt.Sprint(args...)) -} - -// Entry Printf family functions - -func (entry *Entry) Debugf(format string, args ...interface{}) { - if entry.Logger.Level >= DebugLevel { - entry.Debug(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Infof(format string, args ...interface{}) { - if entry.Logger.Level >= InfoLevel { - entry.Info(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Printf(format string, args ...interface{}) { - entry.Infof(format, args...) -} - -func (entry *Entry) Warnf(format string, args ...interface{}) { - if entry.Logger.Level >= WarnLevel { - entry.Warn(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Warningf(format string, args ...interface{}) { - entry.Warnf(format, args...) -} - -func (entry *Entry) Errorf(format string, args ...interface{}) { - if entry.Logger.Level >= ErrorLevel { - entry.Error(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Fatalf(format string, args ...interface{}) { - if entry.Logger.Level >= FatalLevel { - entry.Fatal(fmt.Sprintf(format, args...)) - } -} - -func (entry *Entry) Panicf(format string, args ...interface{}) { - if entry.Logger.Level >= PanicLevel { - entry.Panic(fmt.Sprintf(format, args...)) - } -} - -// Entry Println family functions - -func (entry *Entry) Debugln(args ...interface{}) { - if entry.Logger.Level >= DebugLevel { - entry.Debug(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Infoln(args ...interface{}) { - if entry.Logger.Level >= InfoLevel { - entry.Info(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Println(args ...interface{}) { - entry.Infoln(args...) -} - -func (entry *Entry) Warnln(args ...interface{}) { - if entry.Logger.Level >= WarnLevel { - entry.Warn(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Warningln(args ...interface{}) { - entry.Warnln(args...) -} - -func (entry *Entry) Errorln(args ...interface{}) { - if entry.Logger.Level >= ErrorLevel { - entry.Error(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Fatalln(args ...interface{}) { - if entry.Logger.Level >= FatalLevel { - entry.Fatal(entry.sprintlnn(args...)) - } -} - -func (entry *Entry) Panicln(args ...interface{}) { - if entry.Logger.Level >= PanicLevel { - entry.Panic(entry.sprintlnn(args...)) - } -} - -// Sprintlnn => Sprint no newline. This is to get the behavior of how -// fmt.Sprintln where spaces are always added between operands, regardless of -// their type. Instead of vendoring the Sprintln implementation to spare a -// string allocation, we do the simplest thing. -func (entry *Entry) sprintlnn(args ...interface{}) string { - msg := fmt.Sprintln(args...) - return msg[:len(msg)-1] -} diff --git a/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go b/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go deleted file mode 100644 index cbe78641..00000000 --- a/vendor/github.com/Sirupsen/logrus/examples/basic/basic.go +++ /dev/null @@ -1,29 +0,0 @@ -package main - -import ( - "github.com/documize/community/Godeps/_workspace/src/github.com/Sirupsen/logrus" -) - -var log = logrus.New() - -func init() { - log.Formatter = new(logrus.JSONFormatter) - log.Formatter = new(logrus.TextFormatter) // default -} - -func main() { - log.WithFields(logrus.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") - - log.WithFields(logrus.Fields{ - "omg": true, - "number": 122, - }).Warn("The group's number increased tremendously!") - - log.WithFields(logrus.Fields{ - "omg": true, - "number": 100, - }).Fatal("The ice breaks!") -} diff --git a/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go b/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go deleted file mode 100644 index b3fc730c..00000000 --- a/vendor/github.com/Sirupsen/logrus/examples/hook/hook.go +++ /dev/null @@ -1,35 +0,0 @@ -package main - -import ( - "github.com/documize/community/Godeps/_workspace/src/github.com/Sirupsen/logrus" - "github.com/documize/community/Godeps/_workspace/src/github.com/Sirupsen/logrus/hooks/airbrake" - "github.com/tobi/airbrake-go" -) - -var log = logrus.New() - -func init() { - log.Formatter = new(logrus.TextFormatter) // default - log.Hooks.Add(new(logrus_airbrake.AirbrakeHook)) -} - -func main() { - airbrake.Endpoint = "https://exceptions.whatever.com/notifier_api/v2/notices.xml" - airbrake.ApiKey = "whatever" - airbrake.Environment = "production" - - log.WithFields(logrus.Fields{ - "animal": "walrus", - "size": 10, - }).Info("A group of walrus emerges from the ocean") - - log.WithFields(logrus.Fields{ - "omg": true, - "number": 122, - }).Warn("The group's number increased tremendously!") - - log.WithFields(logrus.Fields{ - "omg": true, - "number": 100, - }).Fatal("The ice breaks!") -} diff --git a/vendor/github.com/Sirupsen/logrus/exported.go b/vendor/github.com/Sirupsen/logrus/exported.go deleted file mode 100644 index 383ce93d..00000000 --- a/vendor/github.com/Sirupsen/logrus/exported.go +++ /dev/null @@ -1,177 +0,0 @@ -package logrus - -import ( - "io" -) - -var ( - // std is the name of the standard logger in stdlib `log` - std = New() -) - -// SetOutput sets the standard logger output. -func SetOutput(out io.Writer) { - std.mu.Lock() - defer std.mu.Unlock() - std.Out = out -} - -// SetFormatter sets the standard logger formatter. -func SetFormatter(formatter Formatter) { - std.mu.Lock() - defer std.mu.Unlock() - std.Formatter = formatter -} - -// SetLevel sets the standard logger level. -func SetLevel(level Level) { - std.mu.Lock() - defer std.mu.Unlock() - std.Level = level -} - -// AddHook adds a hook to the standard logger hooks. -func AddHook(hook Hook) { - std.mu.Lock() - defer std.mu.Unlock() - std.Hooks.Add(hook) -} - -// WithField creates an entry from the standard logger and adds a field to -// it. If you want multiple fields, use `WithFields`. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithField(key string, value interface{}) *Entry { - return std.WithField(key, value) -} - -// WithFields creates an entry from the standard logger and adds multiple -// fields to it. This is simply a helper for `WithField`, invoking it -// once for each field. -// -// Note that it doesn't log until you call Debug, Print, Info, Warn, Fatal -// or Panic on the Entry it returns. -func WithFields(fields Fields) *Entry { - return std.WithFields(fields) -} - -// Debug logs a message at level Debug on the standard logger. -func Debug(args ...interface{}) { - std.Debug(args...) -} - -// Print logs a message at level Info on the standard logger. -func Print(args ...interface{}) { - std.Print(args...) -} - -// Info logs a message at level Info on the standard logger. -func Info(args ...interface{}) { - std.Info(args...) -} - -// Warn logs a message at level Warn on the standard logger. -func Warn(args ...interface{}) { - std.Warn(args...) -} - -// Warning logs a message at level Warn on the standard logger. -func Warning(args ...interface{}) { - std.Warning(args...) -} - -// Error logs a message at level Error on the standard logger. -func Error(args ...interface{}) { - std.Error(args...) -} - -// Panic logs a message at level Panic on the standard logger. -func Panic(args ...interface{}) { - std.Panic(args...) -} - -// Fatal logs a message at level Fatal on the standard logger. -func Fatal(args ...interface{}) { - std.Fatal(args...) -} - -// Debugf logs a message at level Debugf on the standard logger. -func Debugf(format string, args ...interface{}) { - std.Debugf(format, args...) -} - -// Printf logs a message at level Info on the standard logger. -func Printf(format string, args ...interface{}) { - std.Printf(format, args...) -} - -// Infof logs a message at level Info on the standard logger. -func Infof(format string, args ...interface{}) { - std.Infof(format, args...) -} - -// Warnf logs a message at level Warn on the standard logger. -func Warnf(format string, args ...interface{}) { - std.Warnf(format, args...) -} - -// Warningf logs a message at level Warn on the standard logger. -func Warningf(format string, args ...interface{}) { - std.Warningf(format, args...) -} - -// Errorf logs a message at level Error on the standard logger. -func Errorf(format string, args ...interface{}) { - std.Errorf(format, args...) -} - -// Panicf logs a message at level Pancf on the standard logger. -func Panicf(format string, args ...interface{}) { - std.Panicf(format, args...) -} - -// Fatalf logs a message at level Fatal on the standard logger. -func Fatalf(format string, args ...interface{}) { - std.Fatalf(format, args...) -} - -// Debugln logs a message at level Debug on the standard logger. -func Debugln(args ...interface{}) { - std.Debugln(args...) -} - -// Println logs a message at level Info on the standard logger. -func Println(args ...interface{}) { - std.Println(args...) -} - -// Infoln logs a message at level Info on the standard logger. -func Infoln(args ...interface{}) { - std.Infoln(args...) -} - -// Warnln logs a message at level Warn on the standard logger. -func Warnln(args ...interface{}) { - std.Warnln(args...) -} - -// Warningln logs a message at level Warn on the standard logger. -func Warningln(args ...interface{}) { - std.Warningln(args...) -} - -// Errorln logs a message at level Error on the standard logger. -func Errorln(args ...interface{}) { - std.Errorln(args...) -} - -// Panicln logs a message at level Panic on the standard logger. -func Panicln(args ...interface{}) { - std.Panicln(args...) -} - -// Fatalln logs a message at level Fatal on the standard logger. -func Fatalln(args ...interface{}) { - std.Fatalln(args...) -} diff --git a/vendor/github.com/Sirupsen/logrus/formatter.go b/vendor/github.com/Sirupsen/logrus/formatter.go deleted file mode 100644 index fc0ebd7a..00000000 --- a/vendor/github.com/Sirupsen/logrus/formatter.go +++ /dev/null @@ -1,54 +0,0 @@ -package logrus - -import ( - "time" -) - -// The Formatter interface is used to implement a custom Formatter. It takes an -// `Entry`. It exposes all the fields, including the default ones: -// -// * `entry.Data["msg"]`. The message passed from Info, Warn, Error .. -// * `entry.Data["time"]`. The timestamp. -// * `entry.Data["level"]. The level the entry was logged at. -// -// Any additional fields added with `WithField` or `WithFields` are also in -// `entry.Data`. Format is expected to return an array of bytes which are then -// logged to `logger.Out`. -type Formatter interface { - Format(*Entry) ([]byte, error) -} - -// This is to not silently overwrite `time`, `msg` and `level` fields when -// dumping it. If this code wasn't there doing: -// -// logrus.WithField("level", 1).Info("hello") -// -// Would just silently drop the user provided level. Instead with this code -// it'll logged as: -// -// {"level": "info", "fields.level": 1, "msg": "hello", "time": "..."} -// -// It's not exported because it's still using Data in an opionated way. It's to -// avoid code duplication between the two default formatters. -func prefixFieldClashes(entry *Entry) { - _, ok := entry.Data["time"] - if ok { - entry.Data["fields.time"] = entry.Data["time"] - } - - entry.Data["time"] = entry.Time.Format(time.RFC3339) - - _, ok = entry.Data["msg"] - if ok { - entry.Data["fields.msg"] = entry.Data["msg"] - } - - entry.Data["msg"] = entry.Message - - _, ok = entry.Data["level"] - if ok { - entry.Data["fields.level"] = entry.Data["level"] - } - - entry.Data["level"] = entry.Level.String() -} diff --git a/vendor/github.com/Sirupsen/logrus/hook_test.go b/vendor/github.com/Sirupsen/logrus/hook_test.go deleted file mode 100644 index 13f34cb6..00000000 --- a/vendor/github.com/Sirupsen/logrus/hook_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package logrus - -import ( - "testing" - - "github.com/stretchr/testify/assert" -) - -type TestHook struct { - Fired bool -} - -func (hook *TestHook) Fire(entry *Entry) error { - hook.Fired = true - return nil -} - -func (hook *TestHook) Levels() []Level { - return []Level{ - DebugLevel, - InfoLevel, - WarnLevel, - ErrorLevel, - FatalLevel, - PanicLevel, - } -} - -func TestHookFires(t *testing.T) { - hook := new(TestHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - assert.Equal(t, hook.Fired, false) - - log.Print("test") - }, func(fields Fields) { - assert.Equal(t, hook.Fired, true) - }) -} - -type ModifyHook struct { -} - -func (hook *ModifyHook) Fire(entry *Entry) error { - entry.Data["wow"] = "whale" - return nil -} - -func (hook *ModifyHook) Levels() []Level { - return []Level{ - DebugLevel, - InfoLevel, - WarnLevel, - ErrorLevel, - FatalLevel, - PanicLevel, - } -} - -func TestHookCanModifyEntry(t *testing.T) { - hook := new(ModifyHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - log.WithField("wow", "elephant").Print("test") - }, func(fields Fields) { - assert.Equal(t, fields["wow"], "whale") - }) -} - -func TestCanFireMultipleHooks(t *testing.T) { - hook1 := new(ModifyHook) - hook2 := new(TestHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook1) - log.Hooks.Add(hook2) - - log.WithField("wow", "elephant").Print("test") - }, func(fields Fields) { - assert.Equal(t, fields["wow"], "whale") - assert.Equal(t, hook2.Fired, true) - }) -} - -type ErrorHook struct { - Fired bool -} - -func (hook *ErrorHook) Fire(entry *Entry) error { - hook.Fired = true - return nil -} - -func (hook *ErrorHook) Levels() []Level { - return []Level{ - ErrorLevel, - } -} - -func TestErrorHookShouldntFireOnInfo(t *testing.T) { - hook := new(ErrorHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - log.Info("test") - }, func(fields Fields) { - assert.Equal(t, hook.Fired, false) - }) -} - -func TestErrorHookShouldFireOnError(t *testing.T) { - hook := new(ErrorHook) - - LogAndAssertJSON(t, func(log *Logger) { - log.Hooks.Add(hook) - log.Error("test") - }, func(fields Fields) { - assert.Equal(t, hook.Fired, true) - }) -} diff --git a/vendor/github.com/Sirupsen/logrus/hooks.go b/vendor/github.com/Sirupsen/logrus/hooks.go deleted file mode 100644 index 0da2b365..00000000 --- a/vendor/github.com/Sirupsen/logrus/hooks.go +++ /dev/null @@ -1,34 +0,0 @@ -package logrus - -// A hook to be fired when logging on the logging levels returned from -// `Levels()` on your implementation of the interface. Note that this is not -// fired in a goroutine or a channel with workers, you should handle such -// functionality yourself if your call is non-blocking and you don't wish for -// the logging calls for levels returned from `Levels()` to block. -type Hook interface { - Levels() []Level - Fire(*Entry) error -} - -// Internal type for storing the hooks on a logger instance. -type levelHooks map[Level][]Hook - -// Add a hook to an instance of logger. This is called with -// `log.Hooks.Add(new(MyHook))` where `MyHook` implements the `Hook` interface. -func (hooks levelHooks) Add(hook Hook) { - for _, level := range hook.Levels() { - hooks[level] = append(hooks[level], hook) - } -} - -// Fire all the hooks for the passed level. Used by `entry.log` to fire -// appropriate hooks for a log entry. -func (hooks levelHooks) Fire(level Level, entry *Entry) error { - for _, hook := range hooks[level] { - if err := hook.Fire(entry); err != nil { - return err - } - } - - return nil -} diff --git a/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go b/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go deleted file mode 100644 index ca4083d5..00000000 --- a/vendor/github.com/Sirupsen/logrus/hooks/airbrake/airbrake.go +++ /dev/null @@ -1,54 +0,0 @@ -package logrus_airbrake - -import ( - "github.com/documize/community/Godeps/_workspace/src/github.com/Sirupsen/logrus" - "github.com/tobi/airbrake-go" -) - -// AirbrakeHook to send exceptions to an exception-tracking service compatible -// with the Airbrake API. You must set: -// * airbrake.Endpoint -// * airbrake.ApiKey -// * airbrake.Environment (only sends exceptions when set to "production") -// -// Before using this hook, to send an error. Entries that trigger an Error, -// Fatal or Panic should now include an "error" field to send to Airbrake. -type AirbrakeHook struct{} - -func (hook *AirbrakeHook) Fire(entry *logrus.Entry) error { - if entry.Data["error"] == nil { - entry.Logger.WithFields(logrus.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - }).Warn("Exceptions sent to Airbrake must have an 'error' key with the error") - return nil - } - - err, ok := entry.Data["error"].(error) - if !ok { - entry.Logger.WithFields(logrus.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - }).Warn("Exceptions sent to Airbrake must have an `error` key of type `error`") - return nil - } - - airErr := airbrake.Notify(err) - if airErr != nil { - entry.Logger.WithFields(logrus.Fields{ - "source": "airbrake", - "endpoint": airbrake.Endpoint, - "error": airErr, - }).Warn("Failed to send error to Airbrake") - } - - return nil -} - -func (hook *AirbrakeHook) Levels() []logrus.Level { - return []logrus.Level{ - logrus.ErrorLevel, - logrus.FatalLevel, - logrus.PanicLevel, - } -} diff --git a/vendor/github.com/Sirupsen/logrus/hooks/syslog/README.md b/vendor/github.com/Sirupsen/logrus/hooks/syslog/README.md deleted file mode 100644 index cd706bc1..00000000 --- a/vendor/github.com/Sirupsen/logrus/hooks/syslog/README.md +++ /dev/null @@ -1,20 +0,0 @@ -# Syslog Hooks for Logrus :walrus: - -## Usage - -```go -import ( - "log/syslog" - "github.com/Sirupsen/logrus" - "github.com/Sirupsen/logrus/hooks/syslog" -) - -func main() { - log := logrus.New() - hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") - - if err == nil { - log.Hooks.Add(hook) - } -} -``` \ No newline at end of file diff --git a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go b/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go deleted file mode 100644 index 2f483e34..00000000 --- a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog.go +++ /dev/null @@ -1,59 +0,0 @@ -package logrus_syslog - -import ( - "github.com/documize/community/Godeps/_workspace/src/github.com/Sirupsen/logrus" - "fmt" - "log/syslog" - "os" -) - -// SyslogHook to send logs via syslog. -type SyslogHook struct { - Writer *syslog.Writer - SyslogNetwork string - SyslogRaddr string -} - -// Creates a hook to be added to an instance of logger. This is called with -// `hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_DEBUG, "")` -// `if err == nil { log.Hooks.Add(hook) }` -func NewSyslogHook(network, raddr string, priority syslog.Priority, tag string) (*SyslogHook, error) { - w, err := syslog.Dial(network, raddr, priority, tag) - return &SyslogHook{w, network, raddr}, err -} - -func (hook *SyslogHook) Fire(entry *logrus.Entry) error { - line, err := entry.String() - if err != nil { - fmt.Fprintf(os.Stderr, "Unable to read entry, %v", err) - return err - } - - switch entry.Data["level"] { - case "panic": - return hook.Writer.Crit(line) - case "fatal": - return hook.Writer.Crit(line) - case "error": - return hook.Writer.Err(line) - case "warn": - return hook.Writer.Warning(line) - case "info": - return hook.Writer.Info(line) - case "debug": - return hook.Writer.Debug(line) - default: - return nil - } -} - -func (hook *SyslogHook) Levels() []logrus.Level { - return []logrus.Level{ - logrus.PanicLevel, - logrus.FatalLevel, - logrus.ErrorLevel, - logrus.WarnLevel, - logrus.InfoLevel, - logrus.DebugLevel, - } -} diff --git a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go b/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go deleted file mode 100644 index fc250924..00000000 --- a/vendor/github.com/Sirupsen/logrus/hooks/syslog/syslog_test.go +++ /dev/null @@ -1,26 +0,0 @@ -package logrus_syslog - -import ( - "github.com/documize/community/Godeps/_workspace/src/github.com/Sirupsen/logrus" - "log/syslog" - "testing" -) - -func TestLocalhostAddAndPrint(t *testing.T) { - log := logrus.New() - hook, err := NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "") - - if err != nil { - t.Errorf("Unable to connect to local syslog.") - } - - log.Hooks.Add(hook) - - for _, level := range hook.Levels() { - if len(log.Hooks[level]) != 1 { - t.Errorf("SyslogHook was not added. The length of log.Hooks[%v]: %v", level, len(log.Hooks[level])) - } - } - - log.Info("Congratulations!") -} diff --git a/vendor/github.com/Sirupsen/logrus/json_formatter.go b/vendor/github.com/Sirupsen/logrus/json_formatter.go deleted file mode 100644 index c0e2d184..00000000 --- a/vendor/github.com/Sirupsen/logrus/json_formatter.go +++ /dev/null @@ -1,19 +0,0 @@ -package logrus - -import ( - "encoding/json" - "fmt" -) - -type JSONFormatter struct { -} - -func (f *JSONFormatter) Format(entry *Entry) ([]byte, error) { - prefixFieldClashes(entry) - - serialized, err := json.Marshal(entry.Data) - if err != nil { - return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err) - } - return append(serialized, '\n'), nil -} diff --git a/vendor/github.com/Sirupsen/logrus/logger.go b/vendor/github.com/Sirupsen/logrus/logger.go deleted file mode 100644 index 7374fe36..00000000 --- a/vendor/github.com/Sirupsen/logrus/logger.go +++ /dev/null @@ -1,161 +0,0 @@ -package logrus - -import ( - "io" - "os" - "sync" -) - -type Logger struct { - // The logs are `io.Copy`'d to this in a mutex. It's common to set this to a - // file, or leave it default which is `os.Stdout`. You can also set this to - // something more adventorous, such as logging to Kafka. - Out io.Writer - // Hooks for the logger instance. These allow firing events based on logging - // levels and log entries. For example, to send errors to an error tracking - // service, log to StatsD or dump the core on fatal errors. - Hooks levelHooks - // All log entries pass through the formatter before logged to Out. The - // included formatters are `TextFormatter` and `JSONFormatter` for which - // TextFormatter is the default. In development (when a TTY is attached) it - // logs with colors, but to a file it wouldn't. You can easily implement your - // own that implements the `Formatter` interface, see the `README` or included - // formatters for examples. - Formatter Formatter - // The logging level the logger should log at. This is typically (and defaults - // to) `logrus.Info`, which allows Info(), Warn(), Error() and Fatal() to be - // logged. `logrus.Debug` is useful in - Level Level - // Used to sync writing to the log. - mu sync.Mutex -} - -// Creates a new logger. Configuration should be set by changing `Formatter`, -// `Out` and `Hooks` directly on the default logger instance. You can also just -// instantiate your own: -// -// var log = &Logger{ -// Out: os.Stderr, -// Formatter: new(JSONFormatter), -// Hooks: make(levelHooks), -// Level: logrus.Debug, -// } -// -// It's recommended to make this a global instance called `log`. -func New() *Logger { - return &Logger{ - Out: os.Stdout, - Formatter: new(TextFormatter), - Hooks: make(levelHooks), - Level: InfoLevel, - } -} - -// Adds a field to the log entry, note that you it doesn't log until you call -// Debug, Print, Info, Warn, Fatal or Panic. It only creates a log entry. -// Ff you want multiple fields, use `WithFields`. -func (logger *Logger) WithField(key string, value interface{}) *Entry { - return NewEntry(logger).WithField(key, value) -} - -// Adds a struct of fields to the log entry. All it does is call `WithField` for -// each `Field`. -func (logger *Logger) WithFields(fields Fields) *Entry { - return NewEntry(logger).WithFields(fields) -} - -func (logger *Logger) Debugf(format string, args ...interface{}) { - NewEntry(logger).Debugf(format, args...) -} - -func (logger *Logger) Infof(format string, args ...interface{}) { - NewEntry(logger).Infof(format, args...) -} - -func (logger *Logger) Printf(format string, args ...interface{}) { - NewEntry(logger).Printf(format, args...) -} - -func (logger *Logger) Warnf(format string, args ...interface{}) { - NewEntry(logger).Warnf(format, args...) -} - -func (logger *Logger) Warningf(format string, args ...interface{}) { - NewEntry(logger).Warnf(format, args...) -} - -func (logger *Logger) Errorf(format string, args ...interface{}) { - NewEntry(logger).Errorf(format, args...) -} - -func (logger *Logger) Fatalf(format string, args ...interface{}) { - NewEntry(logger).Fatalf(format, args...) -} - -func (logger *Logger) Panicf(format string, args ...interface{}) { - NewEntry(logger).Panicf(format, args...) -} - -func (logger *Logger) Debug(args ...interface{}) { - NewEntry(logger).Debug(args...) -} - -func (logger *Logger) Info(args ...interface{}) { - NewEntry(logger).Info(args...) -} - -func (logger *Logger) Print(args ...interface{}) { - NewEntry(logger).Info(args...) -} - -func (logger *Logger) Warn(args ...interface{}) { - NewEntry(logger).Warn(args...) -} - -func (logger *Logger) Warning(args ...interface{}) { - NewEntry(logger).Warn(args...) -} - -func (logger *Logger) Error(args ...interface{}) { - NewEntry(logger).Error(args...) -} - -func (logger *Logger) Fatal(args ...interface{}) { - NewEntry(logger).Fatal(args...) -} - -func (logger *Logger) Panic(args ...interface{}) { - NewEntry(logger).Panic(args...) -} - -func (logger *Logger) Debugln(args ...interface{}) { - NewEntry(logger).Debugln(args...) -} - -func (logger *Logger) Infoln(args ...interface{}) { - NewEntry(logger).Infoln(args...) -} - -func (logger *Logger) Println(args ...interface{}) { - NewEntry(logger).Println(args...) -} - -func (logger *Logger) Warnln(args ...interface{}) { - NewEntry(logger).Warnln(args...) -} - -func (logger *Logger) Warningln(args ...interface{}) { - NewEntry(logger).Warnln(args...) -} - -func (logger *Logger) Errorln(args ...interface{}) { - NewEntry(logger).Errorln(args...) -} - -func (logger *Logger) Fatalln(args ...interface{}) { - NewEntry(logger).Fatalln(args...) -} - -func (logger *Logger) Panicln(args ...interface{}) { - NewEntry(logger).Panicln(args...) -} diff --git a/vendor/github.com/Sirupsen/logrus/logrus.go b/vendor/github.com/Sirupsen/logrus/logrus.go deleted file mode 100644 index 79df39cb..00000000 --- a/vendor/github.com/Sirupsen/logrus/logrus.go +++ /dev/null @@ -1,72 +0,0 @@ -package logrus - -import ( - "log" -) - -// Fields type, used to pass to `WithFields`. -type Fields map[string]interface{} - -// Level type -type Level uint8 - -// Convert the Level to a string. E.g. PanicLevel becomes "panic". -func (level Level) String() string { - switch level { - case DebugLevel: - return "debug" - case InfoLevel: - return "info" - case WarnLevel: - return "warning" - case ErrorLevel: - return "error" - case FatalLevel: - return "fatal" - case PanicLevel: - return "panic" - } - - return "unknown" -} - -// These are the different logging levels. You can set the logging level to log -// on your instance of logger, obtained with `logrus.New()`. -const ( - // PanicLevel level, highest level of severity. Logs and then calls panic with the - // message passed to Debug, Info, ... - PanicLevel Level = iota - // FatalLevel level. Logs and then calls `os.Exit(1)`. It will exit even if the - // logging level is set to Panic. - FatalLevel - // ErrorLevel level. Logs. Used for errors that should definitely be noted. - // Commonly used for hooks to send errors to an error tracking service. - ErrorLevel - // WarnLevel level. Non-critical entries that deserve eyes. - WarnLevel - // InfoLevel level. General operational entries about what's going on inside the - // application. - InfoLevel - // DebugLevel level. Usually only enabled when debugging. Very verbose logging. - DebugLevel -) - -// Won't compile if StdLogger can't be realized by a log.Logger -var _ StdLogger = &log.Logger{} - -// StdLogger is what your logrus-enabled library should take, that way -// it'll accept a stdlib logger and a logrus logger. There's no standard -// interface, this is the closest we get, unfortunately. -type StdLogger interface { - Print(...interface{}) - Printf(string, ...interface{}) - Println(...interface{}) - - Fatal(...interface{}) - Fatalf(string, ...interface{}) - Fatalln(...interface{}) - - Panic(...interface{}) - Panicf(string, ...interface{}) - Panicln(...interface{}) -} diff --git a/vendor/github.com/Sirupsen/logrus/logrus_test.go b/vendor/github.com/Sirupsen/logrus/logrus_test.go deleted file mode 100644 index 62023003..00000000 --- a/vendor/github.com/Sirupsen/logrus/logrus_test.go +++ /dev/null @@ -1,173 +0,0 @@ -package logrus - -import ( - "bytes" - "encoding/json" - "testing" - - "github.com/stretchr/testify/assert" -) - -func LogAndAssertJSON(t *testing.T, log func(*Logger), assertions func(fields Fields)) { - var buffer bytes.Buffer - var fields Fields - - logger := New() - logger.Out = &buffer - logger.Formatter = new(JSONFormatter) - - log(logger) - - err := json.Unmarshal(buffer.Bytes(), &fields) - assert.Nil(t, err) - - assertions(fields) -} - -func TestPrint(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Print("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["level"], "info") - }) -} - -func TestInfo(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["level"], "info") - }) -} - -func TestWarn(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Warn("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["level"], "warning") - }) -} - -func TestInfolnShouldAddSpacesBetweenStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln("test", "test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test test") - }) -} - -func TestInfolnShouldAddSpacesBetweenStringAndNonstring(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln("test", 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test 10") - }) -} - -func TestInfolnShouldAddSpacesBetweenTwoNonStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln(10, 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "10 10") - }) -} - -func TestInfoShouldAddSpacesBetweenTwoNonStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Infoln(10, 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "10 10") - }) -} - -func TestInfoShouldNotAddSpacesBetweenStringAndNonstring(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Info("test", 10) - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test10") - }) -} - -func TestInfoShouldNotAddSpacesBetweenStrings(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.Info("test", "test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "testtest") - }) -} - -func TestWithFieldsShouldAllowAssignments(t *testing.T) { - var buffer bytes.Buffer - var fields Fields - - logger := New() - logger.Out = &buffer - logger.Formatter = new(JSONFormatter) - - localLog := logger.WithFields(Fields{ - "key1": "value1", - }) - - localLog.WithField("key2", "value2").Info("test") - err := json.Unmarshal(buffer.Bytes(), &fields) - assert.Nil(t, err) - - assert.Equal(t, "value2", fields["key2"]) - assert.Equal(t, "value1", fields["key1"]) - - buffer = bytes.Buffer{} - fields = Fields{} - localLog.Info("test") - err = json.Unmarshal(buffer.Bytes(), &fields) - assert.Nil(t, err) - - _, ok := fields["key2"] - assert.Equal(t, false, ok) - assert.Equal(t, "value1", fields["key1"]) -} - -func TestUserSuppliedFieldDoesNotOverwriteDefaults(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("msg", "hello").Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - }) -} - -func TestUserSuppliedMsgFieldHasPrefix(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("msg", "hello").Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["msg"], "test") - assert.Equal(t, fields["fields.msg"], "hello") - }) -} - -func TestUserSuppliedTimeFieldHasPrefix(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("time", "hello").Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["fields.time"], "hello") - }) -} - -func TestUserSuppliedLevelFieldHasPrefix(t *testing.T) { - LogAndAssertJSON(t, func(log *Logger) { - log.WithField("level", 1).Info("test") - }, func(fields Fields) { - assert.Equal(t, fields["level"], "info") - assert.Equal(t, fields["fields.level"], 1) - }) -} - -func TestConvertLevelToString(t *testing.T) { - assert.Equal(t, "debug", DebugLevel.String()) - assert.Equal(t, "info", InfoLevel.String()) - assert.Equal(t, "warning", WarnLevel.String()) - assert.Equal(t, "error", ErrorLevel.String()) - assert.Equal(t, "fatal", FatalLevel.String()) - assert.Equal(t, "panic", PanicLevel.String()) -} diff --git a/vendor/github.com/Sirupsen/logrus/terminal_darwin.go b/vendor/github.com/Sirupsen/logrus/terminal_darwin.go deleted file mode 100644 index 8fe02a4a..00000000 --- a/vendor/github.com/Sirupsen/logrus/terminal_darwin.go +++ /dev/null @@ -1,12 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package logrus - -import "syscall" - -const ioctlReadTermios = syscall.TIOCGETA - -type Termios syscall.Termios diff --git a/vendor/github.com/Sirupsen/logrus/terminal_freebsd.go b/vendor/github.com/Sirupsen/logrus/terminal_freebsd.go deleted file mode 100644 index 0428ee5d..00000000 --- a/vendor/github.com/Sirupsen/logrus/terminal_freebsd.go +++ /dev/null @@ -1,20 +0,0 @@ -/* - Go 1.2 doesn't include Termios for FreeBSD. This should be added in 1.3 and this could be merged with terminal_darwin. -*/ -package logrus - -import ( - "syscall" -) - -const ioctlReadTermios = syscall.TIOCGETA - -type Termios struct { - Iflag uint32 - Oflag uint32 - Cflag uint32 - Lflag uint32 - Cc [20]uint8 - Ispeed uint32 - Ospeed uint32 -} diff --git a/vendor/github.com/Sirupsen/logrus/terminal_linux.go b/vendor/github.com/Sirupsen/logrus/terminal_linux.go deleted file mode 100644 index a2c0b40d..00000000 --- a/vendor/github.com/Sirupsen/logrus/terminal_linux.go +++ /dev/null @@ -1,12 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package logrus - -import "syscall" - -const ioctlReadTermios = syscall.TCGETS - -type Termios syscall.Termios diff --git a/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go b/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go deleted file mode 100644 index 276447bd..00000000 --- a/vendor/github.com/Sirupsen/logrus/terminal_notwindows.go +++ /dev/null @@ -1,21 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux,!appengine darwin freebsd - -package logrus - -import ( - "syscall" - "unsafe" -) - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal() bool { - fd := syscall.Stdout - var termios Termios - _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, uintptr(fd), ioctlReadTermios, uintptr(unsafe.Pointer(&termios)), 0, 0, 0) - return err == 0 -} diff --git a/vendor/github.com/Sirupsen/logrus/terminal_windows.go b/vendor/github.com/Sirupsen/logrus/terminal_windows.go deleted file mode 100644 index 2e09f6f7..00000000 --- a/vendor/github.com/Sirupsen/logrus/terminal_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// Based on ssh/terminal: -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package logrus - -import ( - "syscall" - "unsafe" -) - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -var ( - procGetConsoleMode = kernel32.NewProc("GetConsoleMode") -) - -// IsTerminal returns true if the given file descriptor is a terminal. -func IsTerminal() bool { - fd := syscall.Stdout - var st uint32 - r, _, e := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(fd), uintptr(unsafe.Pointer(&st)), 0) - return r != 0 && e == 0 -} diff --git a/vendor/github.com/Sirupsen/logrus/text_formatter.go b/vendor/github.com/Sirupsen/logrus/text_formatter.go deleted file mode 100644 index d71eba18..00000000 --- a/vendor/github.com/Sirupsen/logrus/text_formatter.go +++ /dev/null @@ -1,85 +0,0 @@ -package logrus - -import ( - "bytes" - "fmt" - "sort" - "strings" - "time" -) - -const ( - nocolor = 0 - red = 31 - green = 32 - yellow = 33 - blue = 34 -) - -func init() { - baseTimestamp = time.Now() -} - -func miniTS() int { - return int(time.Since(baseTimestamp) / time.Second) -} - -type TextFormatter struct { - // Set to true to bypass checking for a TTY before outputting colors. - ForceColors bool -} - -func (f *TextFormatter) Format(entry *Entry) ([]byte, error) { - b := &bytes.Buffer{} - - prefixFieldClashes(entry) - - if f.ForceColors || IsTerminal() { - levelText := strings.ToUpper(entry.Data["level"].(string))[0:4] - - levelColor := blue - - if entry.Data["level"] == "warning" { - levelColor = yellow - } else if entry.Data["level"] == "error" || - entry.Data["level"] == "fatal" || - entry.Data["level"] == "panic" { - levelColor = red - } - - fmt.Fprintf(b, "\x1b[%dm%s\x1b[0m[%04d] %-44s ", levelColor, levelText, miniTS(), entry.Data["msg"]) - - keys := make([]string, 0) - for k, _ := range entry.Data { - if k != "level" && k != "time" && k != "msg" { - keys = append(keys, k) - } - } - sort.Strings(keys) - for _, k := range keys { - v := entry.Data[k] - fmt.Fprintf(b, " \x1b[%dm%s\x1b[0m=%v", levelColor, k, v) - } - } else { - f.AppendKeyValue(b, "time", entry.Data["time"].(string)) - f.AppendKeyValue(b, "level", entry.Data["level"].(string)) - f.AppendKeyValue(b, "msg", entry.Data["msg"].(string)) - - for key, value := range entry.Data { - if key != "time" && key != "level" && key != "msg" { - f.AppendKeyValue(b, key, value) - } - } - } - - b.WriteByte('\n') - return b.Bytes(), nil -} - -func (f *TextFormatter) AppendKeyValue(b *bytes.Buffer, key, value interface{}) { - if _, ok := value.(string); ok { - fmt.Fprintf(b, "%v=%q ", key, value) - } else { - fmt.Fprintf(b, "%v=%v ", key, value) - } -} diff --git a/vendor/github.com/codegangsta/negroni/.gitignore b/vendor/github.com/codegangsta/negroni/.gitignore new file mode 100644 index 00000000..3f2bc474 --- /dev/null +++ b/vendor/github.com/codegangsta/negroni/.gitignore @@ -0,0 +1 @@ +/coverage.txt diff --git a/vendor/github.com/codegangsta/negroni/.travis.yml b/vendor/github.com/codegangsta/negroni/.travis.yml new file mode 100644 index 00000000..18104334 --- /dev/null +++ b/vendor/github.com/codegangsta/negroni/.travis.yml @@ -0,0 +1,27 @@ +language: go + +sudo: false +dist: trusty + +go: +- 1.x +- 1.2.x +- 1.3.x +- 1.4.x +- 1.5.x +- 1.6.x +- 1.7.x +- 1.8.x +- master + +before_install: +- find "${GOPATH%%:*}" -name '*.a' -delete +- rm -rf "${GOPATH%%:*}/src/golang.org" +- go get golang.org/x/tools/cover +- go get golang.org/x/tools/cmd/cover + +script: +- go test -race -coverprofile=coverage.txt -covermode=atomic + +after_success: +- bash <(curl -s "https://codecov.io/bash") diff --git a/vendor/github.com/codegangsta/negroni/CHANGELOG.md b/vendor/github.com/codegangsta/negroni/CHANGELOG.md new file mode 100644 index 00000000..f4104318 --- /dev/null +++ b/vendor/github.com/codegangsta/negroni/CHANGELOG.md @@ -0,0 +1,64 @@ +# Change Log + +**ATTN**: This project uses [semantic versioning](http://semver.org/). + +## [Unreleased] - + +## [0.3.0] - 2017-11-11 +### Added +- `With()` helper for building a new `Negroni` struct chaining handlers from + existing `Negroni` structs +- Format log output in `Logger` middleware via a configurable `text/template` + string injectable via `.SetFormat`. Added `LoggerDefaultFormat` and + `LoggerDefaultDateFormat` to configure the default template and date format + used by the `Logger` middleware. +- Support for HTTP/2 pusher support via `http.Pusher` interface for Go 1.8+. +- `WrapFunc` to convert `http.HandlerFunc` into a `negroni.Handler` +- `Formatter` field added to `Recovery` middleware to allow configuring how + `panic`s are output. Default of `TextFormatter` (how it was output in + `0.2.0`) used. `HTMLPanicFormatter` also added to allow easy outputing of + `panic`s as HTML. + +### Fixed +- `Written()` correct returns `false` if no response header has been written +- Only implement `http.CloseNotifier` with the `negroni.ResponseWriter` if the + underlying `http.ResponseWriter` implements it (previously would always + implement it and panic if the underlying `http.ResponseWriter` did not. + +### Changed +- Set default status to `0` in the case that no handler writes status -- was + previously `200` (in 0.2.0, before that it was `0` so this reestablishes that + behavior) +- Catch `panic`s thrown by callbacks provided to the `Recovery` handler +- Recovery middleware will set `text/plain` content-type if none is set +- `ALogger` interface to allow custom logger outputs to be used with the + `Logger` middleware. Changes embeded field in `negroni.Logger` from `Logger` + to `ALogger`. +- Default `Logger` middleware output changed to be more structure and verbose + (also now configurable, see `Added`) +- Automatically bind to port specified in `$PORT` in `.Run()` if an address is + not passed in. Fall back to binding to `:8080` if no address specified + (configuable via `DefaultAddress`). +- `PanicHandlerFunc` added to `Recovery` middleware to enhance custom handling + of `panic`s by providing additional information to the handler including the + stack and the `http.Request`. `Recovery.ErrorHandlerFunc` was also added, but + deprecated in favor of the new `PanicHandlerFunc`. + +## [0.2.0] - 2016-05-10 +### Added +- Support for variadic handlers in `New()` +- Added `Negroni.Handlers()` to fetch all of the handlers for a given chain +- Allowed size in `Recovery` handler was bumped to 8k +- `Negroni.UseFunc` to push another handler onto the chain + +### Changed +- Set the status before calling `beforeFuncs` so the information is available to them +- Set default status to `200` in the case that no handler writes status -- was previously `0` +- Panic if `nil` handler is given to `negroni.Use` + +## 0.1.0 - 2013-07-22 +### Added +- Initial implementation. + +[Unreleased]: https://github.com/urfave/negroni/compare/v0.2.0...HEAD +[0.2.0]: https://github.com/urfave/negroni/compare/v0.1.0...v0.2.0 diff --git a/vendor/github.com/codegangsta/negroni/README.md b/vendor/github.com/codegangsta/negroni/README.md index d880c1c0..8c2e9d85 100644 --- a/vendor/github.com/codegangsta/negroni/README.md +++ b/vendor/github.com/codegangsta/negroni/README.md @@ -1,20 +1,42 @@ -# Negroni [![GoDoc](https://godoc.org/github.com/codegangsta/negroni?status.svg)](http://godoc.org/github.com/codegangsta/negroni) [![wercker status](https://app.wercker.com/status/13688a4a94b82d84a0b8d038c4965b61/s "wercker status")](https://app.wercker.com/project/bykey/13688a4a94b82d84a0b8d038c4965b61) +# Negroni +[![GoDoc](https://godoc.org/github.com/urfave/negroni?status.svg)](http://godoc.org/github.com/urfave/negroni) +[![Build Status](https://travis-ci.org/urfave/negroni.svg?branch=master)](https://travis-ci.org/urfave/negroni) +[![codebeat](https://codebeat.co/badges/47d320b1-209e-45e8-bd99-9094bc5111e2)](https://codebeat.co/projects/github-com-urfave-negroni) +[![codecov](https://codecov.io/gh/urfave/negroni/branch/master/graph/badge.svg)](https://codecov.io/gh/urfave/negroni) -Negroni is an idiomatic approach to web middleware in Go. It is tiny, non-intrusive, and encourages use of `net/http` Handlers. +**Notice:** This is the library formerly known as +`github.com/codegangsta/negroni` -- Github will automatically redirect requests +to this repository, but we recommend updating your references for clarity. -If you like the idea of [Martini](http://github.com/go-martini/martini), but you think it contains too much magic, then Negroni is a great fit. +Negroni is an idiomatic approach to web middleware in Go. It is tiny, +non-intrusive, and encourages use of `net/http` Handlers. + +If you like the idea of [Martini](https://github.com/go-martini/martini), but +you think it contains too much magic, then Negroni is a great fit. + +Language Translations: +* [Deutsch (de_DE)](translations/README_de_de.md) +* [Português Brasileiro (pt_BR)](translations/README_pt_br.md) +* [简体中文 (zh_cn)](translations/README_zh_CN.md) +* [ç¹é«”中文 (zh_tw)](translations/README_zh_tw.md) +* [日本語 (ja_JP)](translations/README_ja_JP.md) +* [Français (fr_FR)](translations/README_fr_FR.md) ## Getting Started -After installing Go and setting up your [GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. We'll call it `server.go`. +After installing Go and setting up your +[GOPATH](http://golang.org/doc/code.html#GOPATH), create your first `.go` file. +We'll call it `server.go`. -~~~ go + +``` go package main import ( - "github.com/codegangsta/negroni" - "net/http" "fmt" + "net/http" + + "github.com/urfave/negroni" ) func main() { @@ -23,34 +45,47 @@ func main() { fmt.Fprintf(w, "Welcome to the home page!") }) - n := negroni.Classic() + n := negroni.Classic() // Includes some default middlewares n.UseHandler(mux) - n.Run(":3000") -} -~~~ -Then install the Negroni package (**go 1.1** and greater is required): -~~~ -go get github.com/codegangsta/negroni -~~~ + http.ListenAndServe(":3000", n) +} +``` + +Then install the Negroni package (**NOTE**: >= **go 1.1** is required): + +``` +go get github.com/urfave/negroni +``` Then run your server: -~~~ + +``` go run server.go -~~~ +``` -You will now have a Go net/http webserver running on `localhost:3000`. +You will now have a Go `net/http` webserver running on `localhost:3000`. -## Need Help? -If you have a question or feature request, [go ask the mailing list](https://groups.google.com/forum/#!forum/negroni-users). The GitHub issues for Negroni will be used exclusively for bug reports and pull requests. +### Packaging + +If you are on Debian, `negroni` is also available as [a +package](https://packages.debian.org/sid/golang-github-urfave-negroni-dev) that +you can install via `apt install golang-github-urfave-negroni-dev` (at the time +of writing, it is in the `sid` repositories). ## Is Negroni a Framework? -Negroni is **not** a framework. It is a library that is designed to work directly with net/http. + +Negroni is **not** a framework. It is a middleware-focused library that is +designed to work directly with `net/http`. ## Routing? -Negroni is BYOR (Bring your own Router). The Go community already has a number of great http routers available, Negroni tries to play well with all of them by fully supporting `net/http`. For instance, integrating with [Gorilla Mux](http://github.com/gorilla/mux) looks like so: -~~~ go +Negroni is BYOR (Bring your own Router). The Go community already has a number +of great http routers available, and Negroni tries to play well with all of them +by fully supporting `net/http`. For instance, integrating with [Gorilla Mux] +looks like so: + +``` go router := mux.NewRouter() router.HandleFunc("/", HomeHandler) @@ -60,47 +95,54 @@ n.Use(Middleware3) // router goes last n.UseHandler(router) -n.Run(":3000") -~~~ +http.ListenAndServe(":3001", n) +``` ## `negroni.Classic()` -`negroni.Classic()` provides some default middleware that is useful for most applications: -* `negroni.Recovery` - Panic Recovery Middleware. -* `negroni.Logging` - Request/Response Logging Middleware. -* `negroni.Static` - Static File serving under the "public" directory. +`negroni.Classic()` provides some default middleware that is useful for most +applications: + +* [`negroni.Recovery`](#recovery) - Panic Recovery Middleware. +* [`negroni.Logger`](#logger) - Request/Response Logger Middleware. +* [`negroni.Static`](#static) - Static File serving under the "public" + directory. This makes it really easy to get started with some useful features from Negroni. ## Handlers -Negroni provides a bidirectional middleware flow. This is done through the `negroni.Handler` interface: -~~~ go +Negroni provides a bidirectional middleware flow. This is done through the +`negroni.Handler` interface: + +``` go type Handler interface { ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) } -~~~ +``` -If a middleware hasn't already written to the ResponseWriter, it should call the next `http.HandlerFunc` in the chain to yield to the next middleware handler. This can be used for great good: +If a middleware hasn't already written to the `ResponseWriter`, it should call +the next `http.HandlerFunc` in the chain to yield to the next middleware +handler. This can be used for great good: -~~~ go +``` go func MyMiddleware(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { // do some stuff before next(rw, r) // do some stuff after } -~~~ +``` And you can map it to the handler chain with the `Use` function: -~~~ go +``` go n := negroni.New() n.Use(negroni.HandlerFunc(MyMiddleware)) -~~~ +``` You can also map plain old `http.Handler`s: -~~~ go +``` go n := negroni.New() mux := http.NewServeMux() @@ -108,72 +150,397 @@ mux := http.NewServeMux() n.UseHandler(mux) -n.Run(":3000") -~~~ +http.ListenAndServe(":3000", n) +``` + +## `With()` + +Negroni has a convenience function called `With`. `With` takes one or more +`Handler` instances and returns a new `Negroni` with the combination of the +receiver's handlers and the new handlers. + +```go +// middleware we want to reuse +common := negroni.New() +common.Use(MyMiddleware1) +common.Use(MyMiddleware2) + +// `specific` is a new negroni with the handlers from `common` combined with the +// the handlers passed in +specific := common.With( + SpecificMiddleware1, + SpecificMiddleware2 +) +``` ## `Run()` -Negroni has a convenience function called `Run`. `Run` takes an addr string identical to [http.ListenAndServe](http://golang.org/pkg/net/http#ListenAndServe). -~~~ go -n := negroni.Classic() -// ... -log.Fatal(http.ListenAndServe(":8080", n)) -~~~ +Negroni has a convenience function called `Run`. `Run` takes an addr string +identical to [`http.ListenAndServe`](https://godoc.org/net/http#ListenAndServe). + + +``` go +package main + +import ( + "github.com/urfave/negroni" +) + +func main() { + n := negroni.Classic() + n.Run(":8080") +} +``` +If no address is provided, the `PORT` environment variable is used instead. +If the `PORT` environment variable is not defined, the default address will be used. +See [Run](https://godoc.org/github.com/urfave/negroni#Negroni.Run) for a complete description. + +In general, you will want to use `net/http` methods and pass `negroni` as a +`Handler`, as this is more flexible, e.g.: + + +``` go +package main + +import ( + "fmt" + "log" + "net/http" + "time" + + "github.com/urfave/negroni" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "Welcome to the home page!") + }) + + n := negroni.Classic() // Includes some default middlewares + n.UseHandler(mux) + + s := &http.Server{ + Addr: ":8080", + Handler: n, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + MaxHeaderBytes: 1 << 20, + } + log.Fatal(s.ListenAndServe()) +} +``` ## Route Specific Middleware -If you have a route group of routes that need specific middleware to be executed, you can simply create a new Negroni instance and use it as your route handler. -~~~ go +If you have a route group of routes that need specific middleware to be +executed, you can simply create a new Negroni instance and use it as your route +handler. + +``` go +router := mux.NewRouter() +adminRoutes := mux.NewRouter() +// add admin routes here + +// Create a new negroni for the admin middleware +router.PathPrefix("/admin").Handler(negroni.New( + Middleware1, + Middleware2, + negroni.Wrap(adminRoutes), +)) +``` + +If you are using [Gorilla Mux], here is an example using a subrouter: + +``` go +router := mux.NewRouter() +subRouter := mux.NewRouter().PathPrefix("/subpath").Subrouter().StrictSlash(true) +subRouter.HandleFunc("/", someSubpathHandler) // "/subpath/" +subRouter.HandleFunc("/:id", someSubpathHandler) // "/subpath/:id" + +// "/subpath" is necessary to ensure the subRouter and main router linkup +router.PathPrefix("/subpath").Handler(negroni.New( + Middleware1, + Middleware2, + negroni.Wrap(subRouter), +)) +``` + +`With()` can be used to eliminate redundancy for middlewares shared across +routes. + +``` go router := mux.NewRouter() apiRoutes := mux.NewRouter() // add api routes here -// eg apiRoutes.HandleFunc("/api", apiHandler) -// eg apiRoutes.HandleFunc("/api/users", userHandler) -// eg apiRoutes.HandleFunc("/api/products", productHandler) +webRoutes := mux.NewRouter() +// add web routes here -// Create a new negroni for the api middleware -router.PathPrefix("/api").Handler( negroni.New( - Middleware1, - Middleware2, +// create common middleware to be shared across routes +common := negroni.New( + Middleware1, + Middleware2, +) + +// create a new negroni for the api middleware +// using the common middleware as a base +router.PathPrefix("/api").Handler(common.With( + APIMiddleware1, negroni.Wrap(apiRoutes), )) -~~~ +// create a new negroni for the web middleware +// using the common middleware as a base +router.PathPrefix("/web").Handler(common.With( + WebMiddleware1, + negroni.Wrap(webRoutes), +)) +``` + +## Bundled Middleware + +### Static + +This middleware will serve files on the filesystem. If the files do not exist, +it proxies the request to the next middleware. If you want the requests for +non-existent files to return a `404 File Not Found` to the user you should look +at using [http.FileServer](https://golang.org/pkg/net/http/#FileServer) as +a handler. + +Example: + + +``` go +package main + +import ( + "fmt" + "net/http" + + "github.com/urfave/negroni" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "Welcome to the home page!") + }) + + // Example of using a http.FileServer if you want "server-like" rather than "middleware" behavior + // mux.Handle("/public", http.FileServer(http.Dir("/home/public"))) + + n := negroni.New() + n.Use(negroni.NewStatic(http.Dir("/tmp"))) + n.UseHandler(mux) + + http.ListenAndServe(":3002", n) +} +``` + +Will serve files from the `/tmp` directory first, but proxy calls to the next +handler if the request does not match a file on the filesystem. + +### Recovery + +This middleware catches `panic`s and responds with a `500` response code. If +any other middleware has written a response code or body, this middleware will +fail to properly send a 500 to the client, as the client has already received +the HTTP response code. Additionally, an `PanicHandlerFunc` can be attached +to report 500's to an error reporting service such as Sentry or Airbrake. + +Example: + + +``` go +package main + +import ( + "net/http" + + "github.com/urfave/negroni" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + panic("oh no") + }) + + n := negroni.New() + n.Use(negroni.NewRecovery()) + n.UseHandler(mux) + + http.ListenAndServe(":3003", n) +} +``` + +Will return a `500 Internal Server Error` to each request. It will also log the +stack traces as well as print the stack trace to the requester if `PrintStack` +is set to `true` (the default). + +Example with error handler: + +``` go +package main + +import ( + "net/http" + + "github.com/urfave/negroni" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + panic("oh no") + }) + + n := negroni.New() + recovery := negroni.NewRecovery() + recovery.PanicHandlerFunc = reportToSentry + n.Use(recovery) + n.UseHandler(mux) + + http.ListenAndServe(":3003", n) +} + +func reportToSentry(info *negroni.PanicInformation) { + // write code here to report error to Sentry +} +``` + +The middleware simply output the informations on STDOUT by default. +You can customize the output process by using the `SetFormatter()` function. + +You can use also the `HTMLPanicFormatter` to display a pretty HTML when a crash occurs. + + +``` go +package main + +import ( + "net/http" + + "github.com/urfave/negroni" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + panic("oh no") + }) + + n := negroni.New() + recovery := negroni.NewRecovery() + recovery.Formatter = &negroni.HTMLPanicFormatter{} + n.Use(recovery) + n.UseHandler(mux) + + http.ListenAndServe(":3003", n) +} +``` + +## Logger + +This middleware logs each incoming request and response. + +Example: + + +``` go +package main + +import ( + "fmt" + "net/http" + + "github.com/urfave/negroni" +) + +func main() { + mux := http.NewServeMux() + mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) { + fmt.Fprintf(w, "Welcome to the home page!") + }) + + n := negroni.New() + n.Use(negroni.NewLogger()) + n.UseHandler(mux) + + http.ListenAndServe(":3004", n) +} +``` + +Will print a log similar to: + +``` +[negroni] 2017-10-04T14:56:25+02:00 | 200 | 378µs | localhost:3004 | GET / +``` + +on each request. + +You can also set your own log format by calling the `SetFormat` function. The format is a template string with fields as mentioned in the `LoggerEntry` struct. So, as an example - + +```go +l.SetFormat("[{{.Status}} {{.Duration}}] - {{.Request.UserAgent}}") +``` + +will show something like - `[200 18.263µs] - Go-User-Agent/1.1 ` ## Third Party Middleware -Here is a current list of Negroni compatible middlware. Feel free to put up a PR linking your middleware if you have built one: - +Here is a current list of Negroni compatible middlware. Feel free to put up a PR +linking your middleware if you have built one: | Middleware | Author | Description | | -----------|--------|-------------| -| [RestGate](https://github.com/pjebs/restgate) | [Prasanga Siripala](https://github.com/pjebs) | Secure authentication for REST API endpoints | -| [Graceful](https://github.com/stretchr/graceful) | [Tyler Bunnell](https://github.com/tylerb) | Graceful HTTP Shutdown | -| [secure](https://github.com/unrolled/secure) | [Cory Jacobsen](https://github.com/unrolled) | Middleware that implements a few quick security wins | -| [JWT Middleware](https://github.com/auth0/go-jwt-middleware) | [Auth0](https://github.com/auth0) | Middleware checks for a JWT on the `Authorization` header on incoming requests and decodes it| +| [authz](https://github.com/casbin/negroni-authz) | [Yang Luo](https://github.com/hsluoyz) | ACL, RBAC, ABAC Authorization middlware based on [Casbin](https://github.com/casbin/casbin) | | [binding](https://github.com/mholt/binding) | [Matt Holt](https://github.com/mholt) | Data binding from HTTP requests into structs | -| [logrus](https://github.com/meatballhat/negroni-logrus) | [Dan Buch](https://github.com/meatballhat) | Logrus-based logger | -| [render](https://github.com/unrolled/render) | [Cory Jacobsen](https://github.com/unrolled) | Render JSON, XML and HTML templates | -| [gorelic](https://github.com/jingweno/negroni-gorelic) | [Jingwen Owen Ou](https://github.com/jingweno) | New Relic agent for Go runtime | -| [gzip](https://github.com/phyber/negroni-gzip) | [phyber](https://github.com/phyber) | GZIP response compression | -| [oauth2](https://github.com/goincremental/negroni-oauth2) | [David Bochenski](https://github.com/bochenski) | oAuth2 middleware | -| [sessions](https://github.com/goincremental/negroni-sessions) | [David Bochenski](https://github.com/bochenski) | Session Management | -| [permissions2](https://github.com/xyproto/permissions2) | [Alexander Rødseth](https://github.com/xyproto) | Cookies, users and permissions | -| [onthefly](https://github.com/xyproto/onthefly) | [Alexander Rødseth](https://github.com/xyproto) | Generate TinySVG, HTML and CSS on the fly | +| [cloudwatch](https://github.com/cvillecsteele/negroni-cloudwatch) | [Colin Steele](https://github.com/cvillecsteele) | AWS cloudwatch metrics middleware | | [cors](https://github.com/rs/cors) | [Olivier Poitrey](https://github.com/rs) | [Cross Origin Resource Sharing](http://www.w3.org/TR/cors/) (CORS) support | -| [xrequestid](https://github.com/pilu/xrequestid) | [Andrea Franz](https://github.com/pilu) | Middleware that assigns a random X-Request-Id header to each request | +| [csp](https://github.com/awakenetworks/csp) | [Awake Networks](https://github.com/awakenetworks) | [Content Security Policy](https://www.w3.org/TR/CSP2/) (CSP) support | +| [delay](https://github.com/jeffbmartinez/delay) | [Jeff Martinez](https://github.com/jeffbmartinez) | Add delays/latency to endpoints. Useful when testing effects of high latency | +| [New Relic Go Agent](https://github.com/yadvendar/negroni-newrelic-go-agent) | [Yadvendar Champawat](https://github.com/yadvendar) | Official [New Relic Go Agent](https://github.com/newrelic/go-agent) (currently in beta) | +| [gorelic](https://github.com/jingweno/negroni-gorelic) | [Jingwen Owen Ou](https://github.com/jingweno) | New Relic agent for Go runtime | +| [Graceful](https://github.com/tylerb/graceful) | [Tyler Bunnell](https://github.com/tylerb) | Graceful HTTP Shutdown | +| [gzip](https://github.com/phyber/negroni-gzip) | [phyber](https://github.com/phyber) | GZIP response compression | +| [JWT Middleware](https://github.com/auth0/go-jwt-middleware) | [Auth0](https://github.com/auth0) | Middleware checks for a JWT on the `Authorization` header on incoming requests and decodes it| +| [logrus](https://github.com/meatballhat/negroni-logrus) | [Dan Buch](https://github.com/meatballhat) | Logrus-based logger | +| [oauth2](https://github.com/goincremental/negroni-oauth2) | [David Bochenski](https://github.com/bochenski) | oAuth2 middleware | +| [onthefly](https://github.com/xyproto/onthefly) | [Alexander Rødseth](https://github.com/xyproto) | Generate TinySVG, HTML and CSS on the fly | +| [permissions2](https://github.com/xyproto/permissions2) | [Alexander Rødseth](https://github.com/xyproto) | Cookies, users and permissions | +| [prometheus](https://github.com/zbindenren/negroni-prometheus) | [Rene Zbinden](https://github.com/zbindenren) | Easily create metrics endpoint for the [prometheus](http://prometheus.io) instrumentation tool | +| [render](https://github.com/unrolled/render) | [Cory Jacobsen](https://github.com/unrolled) | Render JSON, XML and HTML templates | +| [RestGate](https://github.com/pjebs/restgate) | [Prasanga Siripala](https://github.com/pjebs) | Secure authentication for REST API endpoints | +| [secure](https://github.com/unrolled/secure) | [Cory Jacobsen](https://github.com/unrolled) | Middleware that implements a few quick security wins | +| [sessions](https://github.com/goincremental/negroni-sessions) | [David Bochenski](https://github.com/bochenski) | Session Management | +| [stats](https://github.com/thoas/stats) | [Florent Messa](https://github.com/thoas) | Store information about your web application (response time, etc.) | | [VanGoH](https://github.com/auroratechnologies/vangoh) | [Taylor Wrobel](https://github.com/twrobel3) | Configurable [AWS-Style](http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html) HMAC authentication middleware | +| [xrequestid](https://github.com/pilu/xrequestid) | [Andrea Franz](https://github.com/pilu) | Middleware that assigns a random X-Request-Id header to each request | +| [mgo session](https://github.com/joeljames/nigroni-mgo-session) | [Joel James](https://github.com/joeljames) | Middleware that handles creating and closing mgo sessions per request | +| [digits](https://github.com/bamarni/digits) | [Bilal Amarni](https://github.com/bamarni) | Middleware that handles [Twitter Digits](https://get.digits.com/) authentication | ## Examples -[Alexander Rødseth](https://github.com/xyproto) created [mooseware](https://github.com/xyproto/mooseware), a skeleton for writing a Negroni middleware handler. + +[Alexander Rødseth](https://github.com/xyproto) created +[mooseware](https://github.com/xyproto/mooseware), a skeleton for writing a +Negroni middleware handler. + +[Prasanga Siripala](https://github.com/pjebs) created an effective skeleton structure for web-based Go/Negroni projects: [Go-Skeleton](https://github.com/pjebs/go-skeleton) ## Live code reload? -[gin](https://github.com/codegangsta/gin) and [fresh](https://github.com/pilu/fresh) both live reload negroni apps. + +[gin](https://github.com/codegangsta/gin) and +[fresh](https://github.com/pilu/fresh) both live reload negroni apps. ## Essential Reading for Beginners of Go & Negroni * [Using a Context to pass information from middleware to end handler](http://elithrar.github.io/article/map-string-interface/) -* [Understanding middleware](http://mattstauffer.co/blog/laravel-5.0-middleware-replacing-filters) +* [Understanding middleware](https://mattstauffer.co/blog/laravel-5.0-middleware-filter-style) ## About -Negroni is obsessively designed by none other than the [Code Gangsta](http://codegangsta.io/) +Negroni is obsessively designed by none other than the [Code +Gangsta](https://codegangsta.io/) + +[Gorilla Mux]: https://github.com/gorilla/mux +[`http.FileSystem`]: https://godoc.org/net/http#FileSystem diff --git a/vendor/github.com/codegangsta/negroni/doc.go b/vendor/github.com/codegangsta/negroni/doc.go index 24d6572c..add1ed9f 100644 --- a/vendor/github.com/codegangsta/negroni/doc.go +++ b/vendor/github.com/codegangsta/negroni/doc.go @@ -2,12 +2,12 @@ // // If you like the idea of Martini, but you think it contains too much magic, then Negroni is a great fit. // -// For a full guide visit http://github.com/codegangsta/negroni +// For a full guide visit http://github.com/urfave/negroni // // package main // // import ( -// "github.com/codegangsta/negroni" +// "github.com/urfave/negroni" // "net/http" // "fmt" // ) diff --git a/vendor/github.com/codegangsta/negroni/logger.go b/vendor/github.com/codegangsta/negroni/logger.go index e3828ef3..5bf7731c 100644 --- a/vendor/github.com/codegangsta/negroni/logger.go +++ b/vendor/github.com/codegangsta/negroni/logger.go @@ -1,29 +1,82 @@ package negroni import ( + "bytes" + "log" "net/http" "os" + "text/template" "time" ) +// LoggerEntry is the structure +// passed to the template. +type LoggerEntry struct { + StartTime string + Status int + Duration time.Duration + Hostname string + Method string + Path string + Request *http.Request +} + +// LoggerDefaultFormat is the format +// logged used by the default Logger instance. +var LoggerDefaultFormat = "{{.StartTime}} | {{.Status}} | \t {{.Duration}} | {{.Hostname}} | {{.Method}} {{.Path}} \n" + +// LoggerDefaultDateFormat is the +// format used for date by the +// default Logger instance. +var LoggerDefaultDateFormat = time.RFC3339 + +// ALogger interface +type ALogger interface { + Println(v ...interface{}) + Printf(format string, v ...interface{}) +} + // Logger is a middleware handler that logs the request as it goes in and the response as it goes out. type Logger struct { - // Logger inherits from log.Logger used to log messages with the Logger middleware - *log.Logger + // ALogger implements just enough log.Logger interface to be compatible with other implementations + ALogger + dateFormat string + template *template.Template } // NewLogger returns a new Logger instance func NewLogger() *Logger { - return &Logger{log.New(os.Stdout, "[negroni] ", 0)} + logger := &Logger{ALogger: log.New(os.Stdout, "[negroni] ", 0), dateFormat: LoggerDefaultDateFormat} + logger.SetFormat(LoggerDefaultFormat) + return logger +} + +func (l *Logger) SetFormat(format string) { + l.template = template.Must(template.New("negroni_parser").Parse(format)) +} + +func (l *Logger) SetDateFormat(format string) { + l.dateFormat = format } func (l *Logger) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { start := time.Now() - l.Printf("Started %s %s", r.Method, r.URL.Path) next(rw, r) res := rw.(ResponseWriter) - l.Printf("Completed %v %s in %v", res.Status(), http.StatusText(res.Status()), time.Since(start)) + log := LoggerEntry{ + StartTime: start.Format(l.dateFormat), + Status: res.Status(), + Duration: time.Since(start), + Hostname: r.Host, + Method: r.Method, + Path: r.URL.Path, + Request: r, + } + + buff := &bytes.Buffer{} + l.template.Execute(buff, log) + l.Printf(buff.String()) } diff --git a/vendor/github.com/codegangsta/negroni/logger_test.go b/vendor/github.com/codegangsta/negroni/logger_test.go deleted file mode 100644 index 880337d1..00000000 --- a/vendor/github.com/codegangsta/negroni/logger_test.go +++ /dev/null @@ -1,33 +0,0 @@ -package negroni - -import ( - "bytes" - "log" - "net/http" - "net/http/httptest" - "testing" -) - -func Test_Logger(t *testing.T) { - buff := bytes.NewBufferString("") - recorder := httptest.NewRecorder() - - l := NewLogger() - l.Logger = log.New(buff, "[negroni] ", 0) - - n := New() - // replace log for testing - n.Use(l) - n.UseHandler(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rw.WriteHeader(http.StatusNotFound) - })) - - req, err := http.NewRequest("GET", "http://localhost:3000/foobar", nil) - if err != nil { - t.Error(err) - } - - n.ServeHTTP(recorder, req) - expect(t, recorder.Code, http.StatusNotFound) - refute(t, len(buff.String()), 0) -} diff --git a/vendor/github.com/codegangsta/negroni/negroni.go b/vendor/github.com/codegangsta/negroni/negroni.go index e367b7c2..d1d77820 100644 --- a/vendor/github.com/codegangsta/negroni/negroni.go +++ b/vendor/github.com/codegangsta/negroni/negroni.go @@ -6,6 +6,11 @@ import ( "os" ) +const ( + // DefaultAddress is used if no other is specified. + DefaultAddress = ":8080" +) + // Handler handler is an interface that objects can implement to be registered to serve as middleware // in the Negroni middleware stack. // ServeHTTP should yield to the next middleware in the chain by invoking the next http.HandlerFunc @@ -43,6 +48,16 @@ func Wrap(handler http.Handler) Handler { }) } +// WrapFunc converts a http.HandlerFunc into a negroni.Handler so it can be used as a Negroni +// middleware. The next http.HandlerFunc is automatically called after the Handler +// is executed. +func WrapFunc(handlerFunc http.HandlerFunc) Handler { + return HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { + handlerFunc(rw, r) + next(rw, r) + }) +} + // Negroni is a stack of Middleware Handlers that can be invoked as an http.Handler. // Negroni middleware is evaluated in the order that they are added to the stack using // the Use and UseHandler methods. @@ -59,6 +74,14 @@ func New(handlers ...Handler) *Negroni { } } +// With returns a new Negroni instance that is a combination of the negroni +// receiver's handlers and the provided handlers. +func (n *Negroni) With(handlers ...Handler) *Negroni { + return New( + append(n.handlers, handlers...)..., + ) +} + // Classic returns a new Negroni instance with the default middleware already // in the stack. // @@ -75,25 +98,52 @@ func (n *Negroni) ServeHTTP(rw http.ResponseWriter, r *http.Request) { // Use adds a Handler onto the middleware stack. Handlers are invoked in the order they are added to a Negroni. func (n *Negroni) Use(handler Handler) { + if handler == nil { + panic("handler cannot be nil") + } + n.handlers = append(n.handlers, handler) n.middleware = build(n.handlers) } +// UseFunc adds a Negroni-style handler function onto the middleware stack. +func (n *Negroni) UseFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc)) { + n.Use(HandlerFunc(handlerFunc)) +} + // UseHandler adds a http.Handler onto the middleware stack. Handlers are invoked in the order they are added to a Negroni. func (n *Negroni) UseHandler(handler http.Handler) { n.Use(Wrap(handler)) } +// UseHandlerFunc adds a http.HandlerFunc-style handler function onto the middleware stack. +func (n *Negroni) UseHandlerFunc(handlerFunc func(rw http.ResponseWriter, r *http.Request)) { + n.UseHandler(http.HandlerFunc(handlerFunc)) +} + // Run is a convenience function that runs the negroni stack as an HTTP -// server. The addr string takes the same format as http.ListenAndServe. -func (n *Negroni) Run(addr string) { +// server. The addr string, if provided, takes the same format as http.ListenAndServe. +// If no address is provided but the PORT environment variable is set, the PORT value is used. +// If neither is provided, the address' value will equal the DefaultAddress constant. +func (n *Negroni) Run(addr ...string) { l := log.New(os.Stdout, "[negroni] ", 0) - l.Printf("listening on %s", addr) - l.Fatal(http.ListenAndServe(addr, n)) + finalAddr := detectAddress(addr...) + l.Printf("listening on %s", finalAddr) + l.Fatal(http.ListenAndServe(finalAddr, n)) +} + +func detectAddress(addr ...string) string { + if len(addr) > 0 { + return addr[0] + } + if port := os.Getenv("PORT"); port != "" { + return ":" + port + } + return DefaultAddress } // Returns a list of all the handlers in the current Negroni middleware chain. -func (n *Negroni) Handlers() ([]Handler) { +func (n *Negroni) Handlers() []Handler { return n.handlers } diff --git a/vendor/github.com/codegangsta/negroni/negroni_test.go b/vendor/github.com/codegangsta/negroni/negroni_test.go deleted file mode 100644 index 9fac0085..00000000 --- a/vendor/github.com/codegangsta/negroni/negroni_test.go +++ /dev/null @@ -1,75 +0,0 @@ -package negroni - -import ( - "net/http" - "net/http/httptest" - "reflect" - "testing" -) - -/* Test Helpers */ -func expect(t *testing.T, a interface{}, b interface{}) { - if a != b { - t.Errorf("Expected %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) - } -} - -func refute(t *testing.T, a interface{}, b interface{}) { - if a == b { - t.Errorf("Did not expect %v (type %v) - Got %v (type %v)", b, reflect.TypeOf(b), a, reflect.TypeOf(a)) - } -} - -func TestNegroniRun(t *testing.T) { - // just test that Run doesn't bomb - go New().Run(":3000") -} - -func TestNegroniServeHTTP(t *testing.T) { - result := "" - response := httptest.NewRecorder() - - n := New() - n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - result += "foo" - next(rw, r) - result += "ban" - })) - n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - result += "bar" - next(rw, r) - result += "baz" - })) - n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - result += "bat" - rw.WriteHeader(http.StatusBadRequest) - })) - - n.ServeHTTP(response, (*http.Request)(nil)) - - expect(t, result, "foobarbatbazban") - expect(t, response.Code, http.StatusBadRequest) -} - -// Ensures that a Negroni middleware chain -// can correctly return all of its handlers. -func TestHandlers(t *testing.T) { - response := httptest.NewRecorder() - n := New() - handlers := n.Handlers() - expect(t, 0, len(handlers)) - - n.Use(HandlerFunc(func(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) { - rw.WriteHeader(http.StatusOK) - })) - - // Expects the length of handlers to be exactly 1 - // after adding exactly one handler to the middleware chain - handlers = n.Handlers() - expect(t, 1, len(handlers)) - - // Ensures that the first handler that is in sequence behaves - // exactly the same as the one that was registered earlier - handlers[0].ServeHTTP(response, (*http.Request)(nil), nil) - expect(t, response.Code, http.StatusOK) -} diff --git a/vendor/github.com/codegangsta/negroni/recovery.go b/vendor/github.com/codegangsta/negroni/recovery.go index d790cade..c6fc24ef 100644 --- a/vendor/github.com/codegangsta/negroni/recovery.go +++ b/vendor/github.com/codegangsta/negroni/recovery.go @@ -6,14 +6,137 @@ import ( "net/http" "os" "runtime" + "runtime/debug" + "text/template" ) +const ( + panicText = "PANIC: %s\n%s" + panicHTML = ` +PANIC: {{.RecoveredPanic}} + + +

Negroni - PANIC

+ +
+

{{.RequestDescription}}

+ Runtime error: {{.RecoveredPanic}} +
+ +{{ if .Stack }} +
+

Runtime Stack

+
{{.StackAsString}}
+
+{{ end }} + + +` + nilRequestMessage = "Request is nil" +) + +var panicHTMLTemplate = template.Must(template.New("PanicPage").Parse(panicHTML)) + +// PanicInformation contains all +// elements for printing stack informations. +type PanicInformation struct { + RecoveredPanic interface{} + Stack []byte + Request *http.Request +} + +// StackAsString returns a printable version of the stack +func (p *PanicInformation) StackAsString() string { + return string(p.Stack) +} + +// RequestDescription returns a printable description of the url +func (p *PanicInformation) RequestDescription() string { + + if p.Request == nil { + return nilRequestMessage + } + + var queryOutput string + if p.Request.URL.RawQuery != "" { + queryOutput = "?" + p.Request.URL.RawQuery + } + return fmt.Sprintf("%s %s%s", p.Request.Method, p.Request.URL.Path, queryOutput) +} + +// PanicFormatter is an interface on object can implement +// to be able to output the stack trace +type PanicFormatter interface { + // FormatPanicError output the stack for a given answer/response. + // In case the the middleware should not output the stack trace, + // the field `Stack` of the passed `PanicInformation` instance equals `[]byte{}`. + FormatPanicError(rw http.ResponseWriter, r *http.Request, infos *PanicInformation) +} + +// TextPanicFormatter output the stack +// as simple text on os.Stdout. If no `Content-Type` is set, +// it will output the data as `text/plain; charset=utf-8`. +// Otherwise, the origin `Content-Type` is kept. +type TextPanicFormatter struct{} + +func (t *TextPanicFormatter) FormatPanicError(rw http.ResponseWriter, r *http.Request, infos *PanicInformation) { + if rw.Header().Get("Content-Type") == "" { + rw.Header().Set("Content-Type", "text/plain; charset=utf-8") + } + fmt.Fprintf(rw, panicText, infos.RecoveredPanic, infos.Stack) +} + +// HTMLPanicFormatter output the stack inside +// an HTML page. This has been largely inspired by +// https://github.com/go-martini/martini/pull/156/commits. +type HTMLPanicFormatter struct{} + +func (t *HTMLPanicFormatter) FormatPanicError(rw http.ResponseWriter, r *http.Request, infos *PanicInformation) { + if rw.Header().Get("Content-Type") == "" { + rw.Header().Set("Content-Type", "text/html; charset=utf-8") + } + panicHTMLTemplate.Execute(rw, infos) +} + // Recovery is a Negroni middleware that recovers from any panics and writes a 500 if there was one. type Recovery struct { - Logger *log.Logger - PrintStack bool - StackAll bool - StackSize int + Logger ALogger + PrintStack bool + PanicHandlerFunc func(*PanicInformation) + StackAll bool + StackSize int + Formatter PanicFormatter + + // Deprecated: Use PanicHandlerFunc instead to receive panic + // error with additional information (see PanicInformation) + ErrorHandlerFunc func(interface{}) } // NewRecovery returns a new instance of Recovery @@ -23,6 +146,7 @@ func NewRecovery() *Recovery { PrintStack: true, StackAll: false, StackSize: 1024 * 8, + Formatter: &TextPanicFormatter{}, } } @@ -30,14 +154,38 @@ func (rec *Recovery) ServeHTTP(rw http.ResponseWriter, r *http.Request, next htt defer func() { if err := recover(); err != nil { rw.WriteHeader(http.StatusInternalServerError) + stack := make([]byte, rec.StackSize) stack = stack[:runtime.Stack(stack, rec.StackAll)] - - f := "PANIC: %s\n%s" - rec.Logger.Printf(f, err, stack) + infos := &PanicInformation{RecoveredPanic: err, Request: r} if rec.PrintStack { - fmt.Fprintf(rw, f, err, stack) + infos.Stack = stack + } + rec.Logger.Printf(panicText, err, stack) + rec.Formatter.FormatPanicError(rw, r, infos) + + if rec.ErrorHandlerFunc != nil { + func() { + defer func() { + if err := recover(); err != nil { + rec.Logger.Printf("provided ErrorHandlerFunc panic'd: %s, trace:\n%s", err, debug.Stack()) + rec.Logger.Printf("%s\n", debug.Stack()) + } + }() + rec.ErrorHandlerFunc(err) + }() + } + if rec.PanicHandlerFunc != nil { + func() { + defer func() { + if err := recover(); err != nil { + rec.Logger.Printf("provided PanicHandlerFunc panic'd: %s, trace:\n%s", err, debug.Stack()) + rec.Logger.Printf("%s\n", debug.Stack()) + } + }() + rec.PanicHandlerFunc(infos) + }() } } }() diff --git a/vendor/github.com/codegangsta/negroni/recovery_test.go b/vendor/github.com/codegangsta/negroni/recovery_test.go deleted file mode 100644 index 3fa264ac..00000000 --- a/vendor/github.com/codegangsta/negroni/recovery_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package negroni - -import ( - "bytes" - "log" - "net/http" - "net/http/httptest" - "testing" -) - -func TestRecovery(t *testing.T) { - buff := bytes.NewBufferString("") - recorder := httptest.NewRecorder() - - rec := NewRecovery() - rec.Logger = log.New(buff, "[negroni] ", 0) - - n := New() - // replace log for testing - n.Use(rec) - n.UseHandler(http.HandlerFunc(func(res http.ResponseWriter, req *http.Request) { - panic("here is a panic!") - })) - n.ServeHTTP(recorder, (*http.Request)(nil)) - expect(t, recorder.Code, http.StatusInternalServerError) - refute(t, recorder.Body.Len(), 0) - refute(t, len(buff.String()), 0) -} diff --git a/vendor/github.com/codegangsta/negroni/response_writer.go b/vendor/github.com/codegangsta/negroni/response_writer.go index ea86a265..cc507eb4 100644 --- a/vendor/github.com/codegangsta/negroni/response_writer.go +++ b/vendor/github.com/codegangsta/negroni/response_writer.go @@ -13,7 +13,8 @@ import ( type ResponseWriter interface { http.ResponseWriter http.Flusher - // Status returns the status code of the response or 0 if the response has not been written. + // Status returns the status code of the response or 0 if the response has + // not been written Status() int // Written returns whether or not the ResponseWriter has been written. Written() bool @@ -28,7 +29,15 @@ type beforeFunc func(ResponseWriter) // NewResponseWriter creates a ResponseWriter that wraps an http.ResponseWriter func NewResponseWriter(rw http.ResponseWriter) ResponseWriter { - return &responseWriter{rw, 0, 0, nil} + nrw := &responseWriter{ + ResponseWriter: rw, + } + + if _, ok := rw.(http.CloseNotifier); ok { + return &responseWriterCloseNotifer{nrw} + } + + return nrw } type responseWriter struct { @@ -78,10 +87,6 @@ func (rw *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { return hijacker.Hijack() } -func (rw *responseWriter) CloseNotify() <-chan bool { - return rw.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - func (rw *responseWriter) callBefore() { for i := len(rw.beforeFuncs) - 1; i >= 0; i-- { rw.beforeFuncs[i](rw) @@ -91,6 +96,18 @@ func (rw *responseWriter) callBefore() { func (rw *responseWriter) Flush() { flusher, ok := rw.ResponseWriter.(http.Flusher) if ok { + if !rw.Written() { + // The status will be StatusOK if WriteHeader has not been called yet + rw.WriteHeader(http.StatusOK) + } flusher.Flush() } } + +type responseWriterCloseNotifer struct { + *responseWriter +} + +func (rw *responseWriterCloseNotifer) CloseNotify() <-chan bool { + return rw.ResponseWriter.(http.CloseNotifier).CloseNotify() +} diff --git a/vendor/github.com/codegangsta/negroni/response_writer_pusher.go b/vendor/github.com/codegangsta/negroni/response_writer_pusher.go new file mode 100644 index 00000000..213cb35f --- /dev/null +++ b/vendor/github.com/codegangsta/negroni/response_writer_pusher.go @@ -0,0 +1,16 @@ +//+build go1.8 + +package negroni + +import ( + "fmt" + "net/http" +) + +func (rw *responseWriter) Push(target string, opts *http.PushOptions) error { + pusher, ok := rw.ResponseWriter.(http.Pusher) + if ok { + return pusher.Push(target, opts) + } + return fmt.Errorf("the ResponseWriter doesn't support the Pusher interface") +} diff --git a/vendor/github.com/codegangsta/negroni/response_writer_test.go b/vendor/github.com/codegangsta/negroni/response_writer_test.go deleted file mode 100644 index ed1ee70a..00000000 --- a/vendor/github.com/codegangsta/negroni/response_writer_test.go +++ /dev/null @@ -1,150 +0,0 @@ -package negroni - -import ( - "bufio" - "net" - "net/http" - "net/http/httptest" - "testing" - "time" -) - -type closeNotifyingRecorder struct { - *httptest.ResponseRecorder - closed chan bool -} - -func newCloseNotifyingRecorder() *closeNotifyingRecorder { - return &closeNotifyingRecorder{ - httptest.NewRecorder(), - make(chan bool, 1), - } -} - -func (c *closeNotifyingRecorder) close() { - c.closed <- true -} - -func (c *closeNotifyingRecorder) CloseNotify() <-chan bool { - return c.closed -} - -type hijackableResponse struct { - Hijacked bool -} - -func newHijackableResponse() *hijackableResponse { - return &hijackableResponse{} -} - -func (h *hijackableResponse) Header() http.Header { return nil } -func (h *hijackableResponse) Write(buf []byte) (int, error) { return 0, nil } -func (h *hijackableResponse) WriteHeader(code int) {} -func (h *hijackableResponse) Flush() {} -func (h *hijackableResponse) Hijack() (net.Conn, *bufio.ReadWriter, error) { - h.Hijacked = true - return nil, nil, nil -} - -func TestResponseWriterWritingString(t *testing.T) { - rec := httptest.NewRecorder() - rw := NewResponseWriter(rec) - - rw.Write([]byte("Hello world")) - - expect(t, rec.Code, rw.Status()) - expect(t, rec.Body.String(), "Hello world") - expect(t, rw.Status(), http.StatusOK) - expect(t, rw.Size(), 11) - expect(t, rw.Written(), true) -} - -func TestResponseWriterWritingStrings(t *testing.T) { - rec := httptest.NewRecorder() - rw := NewResponseWriter(rec) - - rw.Write([]byte("Hello world")) - rw.Write([]byte("foo bar bat baz")) - - expect(t, rec.Code, rw.Status()) - expect(t, rec.Body.String(), "Hello worldfoo bar bat baz") - expect(t, rw.Status(), http.StatusOK) - expect(t, rw.Size(), 26) -} - -func TestResponseWriterWritingHeader(t *testing.T) { - rec := httptest.NewRecorder() - rw := NewResponseWriter(rec) - - rw.WriteHeader(http.StatusNotFound) - - expect(t, rec.Code, rw.Status()) - expect(t, rec.Body.String(), "") - expect(t, rw.Status(), http.StatusNotFound) - expect(t, rw.Size(), 0) -} - -func TestResponseWriterBefore(t *testing.T) { - rec := httptest.NewRecorder() - rw := NewResponseWriter(rec) - result := "" - - rw.Before(func(ResponseWriter) { - result += "foo" - }) - rw.Before(func(ResponseWriter) { - result += "bar" - }) - - rw.WriteHeader(http.StatusNotFound) - - expect(t, rec.Code, rw.Status()) - expect(t, rec.Body.String(), "") - expect(t, rw.Status(), http.StatusNotFound) - expect(t, rw.Size(), 0) - expect(t, result, "barfoo") -} - -func TestResponseWriterHijack(t *testing.T) { - hijackable := newHijackableResponse() - rw := NewResponseWriter(hijackable) - hijacker, ok := rw.(http.Hijacker) - expect(t, ok, true) - _, _, err := hijacker.Hijack() - if err != nil { - t.Error(err) - } - expect(t, hijackable.Hijacked, true) -} - -func TestResponseWriteHijackNotOK(t *testing.T) { - hijackable := new(http.ResponseWriter) - rw := NewResponseWriter(*hijackable) - hijacker, ok := rw.(http.Hijacker) - expect(t, ok, true) - _, _, err := hijacker.Hijack() - - refute(t, err, nil) -} - -func TestResponseWriterCloseNotify(t *testing.T) { - rec := newCloseNotifyingRecorder() - rw := NewResponseWriter(rec) - closed := false - notifier := rw.(http.CloseNotifier).CloseNotify() - rec.close() - select { - case <-notifier: - closed = true - case <-time.After(time.Second): - } - expect(t, closed, true) -} - -func TestResponseWriterFlusher(t *testing.T) { - rec := httptest.NewRecorder() - rw := NewResponseWriter(rec) - - _, ok := rw.(http.Flusher) - expect(t, ok, true) -} diff --git a/vendor/github.com/codegangsta/negroni/static.go b/vendor/github.com/codegangsta/negroni/static.go index c5af4e68..34be967c 100644 --- a/vendor/github.com/codegangsta/negroni/static.go +++ b/vendor/github.com/codegangsta/negroni/static.go @@ -6,7 +6,11 @@ import ( "strings" ) -// Static is a middleware handler that serves static files in the given directory/filesystem. +// Static is a middleware handler that serves static files in the given +// directory/filesystem. If the file does not exist on the filesystem, it +// passes along to the next middleware in the chain. If you desire "fileserver" +// type behavior where it returns a 404 for unfound files, you should consider +// using http.FileServer from the Go stdlib. type Static struct { // Dir is the directory to serve static files from Dir http.FileSystem diff --git a/vendor/github.com/codegangsta/negroni/static_test.go b/vendor/github.com/codegangsta/negroni/static_test.go deleted file mode 100644 index 637cfcd6..00000000 --- a/vendor/github.com/codegangsta/negroni/static_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package negroni - -import ( - "bytes" - "net/http" - "net/http/httptest" - "testing" -) - -func TestStatic(t *testing.T) { - response := httptest.NewRecorder() - response.Body = new(bytes.Buffer) - - n := New() - n.Use(NewStatic(http.Dir("."))) - - req, err := http.NewRequest("GET", "http://localhost:3000/negroni.go", nil) - if err != nil { - t.Error(err) - } - n.ServeHTTP(response, req) - expect(t, response.Code, http.StatusOK) - expect(t, response.Header().Get("Expires"), "") - if response.Body.Len() == 0 { - t.Errorf("Got empty body for GET request") - } -} - -func TestStaticHead(t *testing.T) { - response := httptest.NewRecorder() - response.Body = new(bytes.Buffer) - - n := New() - n.Use(NewStatic(http.Dir("."))) - n.UseHandler(http.NotFoundHandler()) - - req, err := http.NewRequest("HEAD", "http://localhost:3000/negroni.go", nil) - if err != nil { - t.Error(err) - } - - n.ServeHTTP(response, req) - expect(t, response.Code, http.StatusOK) - if response.Body.Len() != 0 { - t.Errorf("Got non-empty body for HEAD request") - } -} - -func TestStaticAsPost(t *testing.T) { - response := httptest.NewRecorder() - - n := New() - n.Use(NewStatic(http.Dir("."))) - n.UseHandler(http.NotFoundHandler()) - - req, err := http.NewRequest("POST", "http://localhost:3000/negroni.go", nil) - if err != nil { - t.Error(err) - } - - n.ServeHTTP(response, req) - expect(t, response.Code, http.StatusNotFound) -} - -func TestStaticBadDir(t *testing.T) { - response := httptest.NewRecorder() - - n := Classic() - n.UseHandler(http.NotFoundHandler()) - - req, err := http.NewRequest("GET", "http://localhost:3000/negroni.go", nil) - if err != nil { - t.Error(err) - } - - n.ServeHTTP(response, req) - refute(t, response.Code, http.StatusOK) -} - -func TestStaticOptionsServeIndex(t *testing.T) { - response := httptest.NewRecorder() - - n := New() - s := NewStatic(http.Dir(".")) - s.IndexFile = "negroni.go" - n.Use(s) - - req, err := http.NewRequest("GET", "http://localhost:3000/", nil) - if err != nil { - t.Error(err) - } - - n.ServeHTTP(response, req) - expect(t, response.Code, http.StatusOK) -} - -func TestStaticOptionsPrefix(t *testing.T) { - response := httptest.NewRecorder() - - n := New() - s := NewStatic(http.Dir(".")) - s.Prefix = "/public" - n.Use(s) - - // Check file content behaviour - req, err := http.NewRequest("GET", "http://localhost:3000/public/negroni.go", nil) - if err != nil { - t.Error(err) - } - - n.ServeHTTP(response, req) - expect(t, response.Code, http.StatusOK) -} diff --git a/vendor/github.com/dgrijalva/jwt-go/.travis.yml b/vendor/github.com/dgrijalva/jwt-go/.travis.yml index d6089146..1027f56c 100644 --- a/vendor/github.com/dgrijalva/jwt-go/.travis.yml +++ b/vendor/github.com/dgrijalva/jwt-go/.travis.yml @@ -1,7 +1,13 @@ language: go +script: + - go vet ./... + - go test -v ./... + go: - - 1.3.3 - - 1.4.2 + - 1.3 + - 1.4 - 1.5 + - 1.6 + - 1.7 - tip diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md index f48365fa..25aec486 100644 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ b/vendor/github.com/dgrijalva/jwt-go/README.md @@ -4,7 +4,7 @@ A [go](http://www.golang.org) (or 'golang' for search engine friendliness) imple **BREAKING CHANGES:*** Version 3.0.0 is here. It includes _a lot_ of changes including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. -**NOTICE:** A vulnerability in JWT was [recently published](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). As this library doesn't force users to validate the `alg` is what they expected, it's possible your usage is effected. There will be an update soon to remedy this, and it will likey require backwards-incompatible changes to the API. In the short term, please make sure your implementation verifies the `alg` is what you expect. +**NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. ## What the heck is a JWT? @@ -74,7 +74,7 @@ It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is Without going too far down the rabbit hole, here's a description of the interaction of these technologies: -* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. +* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. * OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. * Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. @@ -82,4 +82,4 @@ Without going too far down the rabbit hole, here's a description of the interact Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). -The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in to documentation. +The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md index b605b450..c21551f6 100644 --- a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md +++ b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md @@ -1,5 +1,11 @@ ## `jwt-go` Version History +#### 3.1.0 + +* Improvements to `jwt` command line tool +* Added `SkipClaimsValidation` option to `Parser` +* Documentation updates + #### 3.0.0 * **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code diff --git a/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/README.md b/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/README.md deleted file mode 100644 index c05150e3..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/README.md +++ /dev/null @@ -1,13 +0,0 @@ -`jwt` command-line tool -======================= - -This is a simple tool to sign, verify and show JSON Web Tokens from -the command line. - -The following will create and sign a token, then verify it and output the original claims: - - echo {\"foo\":\"bar\"} | ./jwt -key ../../test/sample_key -alg RS256 -sign - | ./jwt -key ../../test/sample_key.pub -alg RS256 -verify - - -To simply display a token, use: - - echo $JWT | ./jwt -show - diff --git a/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/app.go b/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/app.go deleted file mode 100644 index 727182a9..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/app.go +++ /dev/null @@ -1,282 +0,0 @@ -// A useful example app. You can use this to debug your tokens on the command line. -// This is also a great place to look at how you might use this library. -// -// Example usage: -// The following will create and sign a token, then verify it and output the original claims. -// echo {\"foo\":\"bar\"} | bin/jwt -key test/sample_key -alg RS256 -sign - | bin/jwt -key test/sample_key.pub -verify - -package main - -import ( - "encoding/json" - "flag" - "fmt" - "io" - "io/ioutil" - "os" - "regexp" - "strings" - - jwt "github.com/dgrijalva/jwt-go" -) - -var ( - // Options - flagAlg = flag.String("alg", "", "signing algorithm identifier") - flagKey = flag.String("key", "", "path to key file or '-' to read from stdin") - flagCompact = flag.Bool("compact", false, "output compact JSON") - flagDebug = flag.Bool("debug", false, "print out all kinds of debug data") - flagClaims = make(ArgList) - flagHead = make(ArgList) - - // Modes - exactly one of these is required - flagSign = flag.String("sign", "", "path to claims object to sign, '-' to read from stdin, or '+' to use only -claim args") - flagVerify = flag.String("verify", "", "path to JWT token to verify or '-' to read from stdin") - flagShow = flag.String("show", "", "path to JWT file or '-' to read from stdin") -) - -func main() { - // Plug in Var flags - flag.Var(flagClaims, "claim", "add additional claims. may be used more than once") - flag.Var(flagHead, "header", "add additional header params. may be used more than once") - - // Usage message if you ask for -help or if you mess up inputs. - flag.Usage = func() { - fmt.Fprintf(os.Stderr, "Usage of %s:\n", os.Args[0]) - fmt.Fprintf(os.Stderr, " One of the following flags is required: sign, verify\n") - flag.PrintDefaults() - } - - // Parse command line options - flag.Parse() - - // Do the thing. If something goes wrong, print error to stderr - // and exit with a non-zero status code - if err := start(); err != nil { - fmt.Fprintf(os.Stderr, "Error: %v\n", err) - os.Exit(1) - } -} - -// Figure out which thing to do and then do that -func start() error { - if *flagSign != "" { - return signToken() - } else if *flagVerify != "" { - return verifyToken() - } else if *flagShow != "" { - return showToken() - } else { - flag.Usage() - return fmt.Errorf("None of the required flags are present. What do you want me to do?") - } -} - -// Helper func: Read input from specified file or stdin -func loadData(p string) ([]byte, error) { - if p == "" { - return nil, fmt.Errorf("No path specified") - } - - var rdr io.Reader - if p == "-" { - rdr = os.Stdin - } else if p == "+" { - return []byte("{}"), nil - } else { - if f, err := os.Open(p); err == nil { - rdr = f - defer f.Close() - } else { - return nil, err - } - } - return ioutil.ReadAll(rdr) -} - -// Print a json object in accordance with the prophecy (or the command line options) -func printJSON(j interface{}) error { - var out []byte - var err error - - if *flagCompact == false { - out, err = json.MarshalIndent(j, "", " ") - } else { - out, err = json.Marshal(j) - } - - if err == nil { - fmt.Println(string(out)) - } - - return err -} - -// Verify a token and output the claims. This is a great example -// of how to verify and view a token. -func verifyToken() error { - // get the token - tokData, err := loadData(*flagVerify) - if err != nil { - return fmt.Errorf("Couldn't read token: %v", err) - } - - // trim possible whitespace from token - tokData = regexp.MustCompile(`\s*$`).ReplaceAll(tokData, []byte{}) - if *flagDebug { - fmt.Fprintf(os.Stderr, "Token len: %v bytes\n", len(tokData)) - } - - // Parse the token. Load the key from command line option - token, err := jwt.Parse(string(tokData), func(t *jwt.Token) (interface{}, error) { - data, err := loadData(*flagKey) - if err != nil { - return nil, err - } - if isEs() { - return jwt.ParseECPublicKeyFromPEM(data) - } else if isRs() { - return jwt.ParseRSAPublicKeyFromPEM(data) - } - return data, nil - }) - - // Print some debug data - if *flagDebug && token != nil { - fmt.Fprintf(os.Stderr, "Header:\n%v\n", token.Header) - fmt.Fprintf(os.Stderr, "Claims:\n%v\n", token.Claims) - } - - // Print an error if we can't parse for some reason - if err != nil { - return fmt.Errorf("Couldn't parse token: %v", err) - } - - // Is token invalid? - if !token.Valid { - return fmt.Errorf("Token is invalid") - } - - // Print the token details - if err := printJSON(token.Claims); err != nil { - return fmt.Errorf("Failed to output claims: %v", err) - } - - return nil -} - -// Create, sign, and output a token. This is a great, simple example of -// how to use this library to create and sign a token. -func signToken() error { - // get the token data from command line arguments - tokData, err := loadData(*flagSign) - if err != nil { - return fmt.Errorf("Couldn't read token: %v", err) - } else if *flagDebug { - fmt.Fprintf(os.Stderr, "Token: %v bytes", len(tokData)) - } - - // parse the JSON of the claims - var claims jwt.MapClaims - if err := json.Unmarshal(tokData, &claims); err != nil { - return fmt.Errorf("Couldn't parse claims JSON: %v", err) - } - - // add command line claims - if len(flagClaims) > 0 { - for k, v := range flagClaims { - claims[k] = v - } - } - - // get the key - var key interface{} - key, err = loadData(*flagKey) - if err != nil { - return fmt.Errorf("Couldn't read key: %v", err) - } - - // get the signing alg - alg := jwt.GetSigningMethod(*flagAlg) - if alg == nil { - return fmt.Errorf("Couldn't find signing method: %v", *flagAlg) - } - - // create a new token - token := jwt.NewWithClaims(alg, claims) - - // add command line headers - if len(flagHead) > 0 { - for k, v := range flagHead { - token.Header[k] = v - } - } - - if isEs() { - if k, ok := key.([]byte); !ok { - return fmt.Errorf("Couldn't convert key data to key") - } else { - key, err = jwt.ParseECPrivateKeyFromPEM(k) - if err != nil { - return err - } - } - } else if isRs() { - if k, ok := key.([]byte); !ok { - return fmt.Errorf("Couldn't convert key data to key") - } else { - key, err = jwt.ParseRSAPrivateKeyFromPEM(k) - if err != nil { - return err - } - } - } - - if out, err := token.SignedString(key); err == nil { - fmt.Println(out) - } else { - return fmt.Errorf("Error signing token: %v", err) - } - - return nil -} - -// showToken pretty-prints the token on the command line. -func showToken() error { - // get the token - tokData, err := loadData(*flagShow) - if err != nil { - return fmt.Errorf("Couldn't read token: %v", err) - } - - // trim possible whitespace from token - tokData = regexp.MustCompile(`\s*$`).ReplaceAll(tokData, []byte{}) - if *flagDebug { - fmt.Fprintf(os.Stderr, "Token len: %v bytes\n", len(tokData)) - } - - token, err := jwt.Parse(string(tokData), nil) - if token == nil { - return fmt.Errorf("malformed token: %v", err) - } - - // Print the token details - fmt.Println("Header:") - if err := printJSON(token.Header); err != nil { - return fmt.Errorf("Failed to output header: %v", err) - } - - fmt.Println("Claims:") - if err := printJSON(token.Claims); err != nil { - return fmt.Errorf("Failed to output claims: %v", err) - } - - return nil -} - -func isEs() bool { - return strings.HasPrefix(*flagAlg, "ES") -} - -func isRs() bool { - return strings.HasPrefix(*flagAlg, "RS") -} diff --git a/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/args.go b/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/args.go deleted file mode 100644 index a5bba5b1..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/cmd/jwt/args.go +++ /dev/null @@ -1,23 +0,0 @@ -package main - -import ( - "encoding/json" - "fmt" - "strings" -) - -type ArgList map[string]string - -func (l ArgList) String() string { - data, _ := json.Marshal(l) - return string(data) -} - -func (l ArgList) Set(arg string) error { - parts := strings.SplitN(arg, "=", 2) - if len(parts) != 2 { - return fmt.Errorf("Invalid argument '%v'. Must use format 'key=value'. %v", arg, parts) - } - l[parts[0]] = parts[1] - return nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_test.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_test.go deleted file mode 100644 index 753047b1..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_test.go +++ /dev/null @@ -1,100 +0,0 @@ -package jwt_test - -import ( - "crypto/ecdsa" - "io/ioutil" - "strings" - "testing" - - "github.com/dgrijalva/jwt-go" -) - -var ecdsaTestData = []struct { - name string - keys map[string]string - tokenString string - alg string - claims map[string]interface{} - valid bool -}{ - { - "Basic ES256", - map[string]string{"private": "test/ec256-private.pem", "public": "test/ec256-public.pem"}, - "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJmb28iOiJiYXIifQ.feG39E-bn8HXAKhzDZq7yEAPWYDhZlwTn3sePJnU9VrGMmwdXAIEyoOnrjreYlVM_Z4N13eK9-TmMTWyfKJtHQ", - "ES256", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic ES384", - map[string]string{"private": "test/ec384-private.pem", "public": "test/ec384-public.pem"}, - "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJmb28iOiJiYXIifQ.ngAfKMbJUh0WWubSIYe5GMsA-aHNKwFbJk_wq3lq23aPp8H2anb1rRILIzVR0gUf4a8WzDtrzmiikuPWyCS6CN4-PwdgTk-5nehC7JXqlaBZU05p3toM3nWCwm_LXcld", - "ES384", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic ES512", - map[string]string{"private": "test/ec512-private.pem", "public": "test/ec512-public.pem"}, - "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzUxMiJ9.eyJmb28iOiJiYXIifQ.AAU0TvGQOcdg2OvrwY73NHKgfk26UDekh9Prz-L_iWuTBIBqOFCWwwLsRiHB1JOddfKAls5do1W0jR_F30JpVd-6AJeTjGKA4C1A1H6gIKwRY0o_tFDIydZCl_lMBMeG5VNFAjO86-WCSKwc3hqaGkq1MugPRq_qrF9AVbuEB4JPLyL5", - "ES512", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "basic ES256 invalid: foo => bar", - map[string]string{"private": "test/ec256-private.pem", "public": "test/ec256-public.pem"}, - "eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.MEQCIHoSJnmGlPaVQDqacx_2XlXEhhqtWceVopjomc2PJLtdAiAUTeGPoNYxZw0z8mgOnnIcjoxRuNDVZvybRZF3wR1l8W", - "ES256", - map[string]interface{}{"foo": "bar"}, - false, - }, -} - -func TestECDSAVerify(t *testing.T) { - for _, data := range ecdsaTestData { - var err error - - key, _ := ioutil.ReadFile(data.keys["public"]) - - var ecdsaKey *ecdsa.PublicKey - if ecdsaKey, err = jwt.ParseECPublicKeyFromPEM(key); err != nil { - t.Errorf("Unable to parse ECDSA public key: %v", err) - } - - parts := strings.Split(data.tokenString, ".") - - method := jwt.GetSigningMethod(data.alg) - err = method.Verify(strings.Join(parts[0:2], "."), parts[2], ecdsaKey) - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying key: %v", data.name, err) - } - if !data.valid && err == nil { - t.Errorf("[%v] Invalid key passed validation", data.name) - } - } -} - -func TestECDSASign(t *testing.T) { - for _, data := range ecdsaTestData { - var err error - key, _ := ioutil.ReadFile(data.keys["private"]) - - var ecdsaKey *ecdsa.PrivateKey - if ecdsaKey, err = jwt.ParseECPrivateKeyFromPEM(key); err != nil { - t.Errorf("Unable to parse ECDSA private key: %v", err) - } - - if data.valid { - parts := strings.Split(data.tokenString, ".") - method := jwt.GetSigningMethod(data.alg) - sig, err := method.Sign(strings.Join(parts[0:2], "."), ecdsaKey) - if err != nil { - t.Errorf("[%v] Error signing token: %v", data.name, err) - } - if sig == parts[2] { - t.Errorf("[%v] Identical signatures\nbefore:\n%v\nafter:\n%v", data.name, parts[2], sig) - } - } - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/example_test.go b/vendor/github.com/dgrijalva/jwt-go/example_test.go deleted file mode 100644 index ae8b788a..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/example_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package jwt_test - -import ( - "fmt" - "github.com/dgrijalva/jwt-go" - "time" -) - -// Example (atypical) using the StandardClaims type by itself to parse a token. -// The StandardClaims type is designed to be embedded into your custom types -// to provide standard validation features. You can use it alone, but there's -// no way to retrieve other fields after parsing. -// See the CustomClaimsType example for intended usage. -func ExampleNewWithClaims_standardClaims() { - mySigningKey := []byte("AllYourBase") - - // Create the Claims - claims := &jwt.StandardClaims{ - ExpiresAt: 15000, - Issuer: "test", - } - - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - ss, err := token.SignedString(mySigningKey) - fmt.Printf("%v %v", ss, err) - //Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.QsODzZu3lUZMVdhbO76u3Jv02iYCvEHcYVUI1kOWEU0 -} - -// Example creating a token using a custom claims type. The StandardClaim is embedded -// in the custom type to allow for easy encoding, parsing and validation of standard claims. -func ExampleNewWithClaims_customClaimsType() { - mySigningKey := []byte("AllYourBase") - - type MyCustomClaims struct { - Foo string `json:"foo"` - jwt.StandardClaims - } - - // Create the Claims - claims := MyCustomClaims{ - "bar", - jwt.StandardClaims{ - ExpiresAt: 15000, - Issuer: "test", - }, - } - - token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims) - ss, err := token.SignedString(mySigningKey) - fmt.Printf("%v %v", ss, err) - //Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c -} - -// Example creating a token using a custom claims type. The StandardClaim is embedded -// in the custom type to allow for easy encoding, parsing and validation of standard claims. -func ExampleParseWithClaims_customClaimsType() { - tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c" - - type MyCustomClaims struct { - Foo string `json:"foo"` - jwt.StandardClaims - } - - // sample token is expired. override time so it parses as valid - at(time.Unix(0, 0), func() { - token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, func(token *jwt.Token) (interface{}, error) { - return []byte("AllYourBase"), nil - }) - - if claims, ok := token.Claims.(*MyCustomClaims); ok && token.Valid { - fmt.Printf("%v %v", claims.Foo, claims.StandardClaims.ExpiresAt) - } else { - fmt.Println(err) - } - }) - - // Output: bar 15000 -} - -// Override time value for tests. Restore default value after. -func at(t time.Time, f func()) { - jwt.TimeFunc = func() time.Time { - return t - } - f() - jwt.TimeFunc = time.Now -} - -// An example of parsing the error types using bitfield checks -func ExampleParse_errorChecking() { - // Token from another example. This token is expired - var tokenString = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJleHAiOjE1MDAwLCJpc3MiOiJ0ZXN0In0.HE7fK0xOQwFEr4WDgRWj4teRPZ6i3GLwD5YCm6Pwu_c" - - token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { - return []byte("AllYourBase"), nil - }) - - if token.Valid { - fmt.Println("You look nice today") - } else if ve, ok := err.(*jwt.ValidationError); ok { - if ve.Errors&jwt.ValidationErrorMalformed != 0 { - fmt.Println("That's not even a token") - } else if ve.Errors&(jwt.ValidationErrorExpired|jwt.ValidationErrorNotValidYet) != 0 { - // Token is either expired or not active yet - fmt.Println("Timing is everything") - } else { - fmt.Println("Couldn't handle this token:", err) - } - } else { - fmt.Println("Couldn't handle this token:", err) - } - - // Output: Timing is everything -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac_example_test.go b/vendor/github.com/dgrijalva/jwt-go/hmac_example_test.go deleted file mode 100644 index 00278314..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac_example_test.go +++ /dev/null @@ -1,66 +0,0 @@ -package jwt_test - -import ( - "fmt" - "github.com/dgrijalva/jwt-go" - "io/ioutil" - "time" -) - -// For HMAC signing method, the key can be any []byte. It is recommended to generate -// a key using crypto/rand or something equivalent. You need the same key for signing -// and validating. -var hmacSampleSecret []byte - -func init() { - // Load sample key data - if keyData, e := ioutil.ReadFile("test/hmacTestKey"); e == nil { - hmacSampleSecret = keyData - } else { - panic(e) - } -} - -// Example creating, signing, and encoding a JWT token using the HMAC signing method -func ExampleNew_hmac() { - // Create a new token object, specifying signing method and the claims - // you would like it to contain. - token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ - "foo": "bar", - "nbf": time.Date(2015, 10, 10, 12, 0, 0, 0, time.UTC).Unix(), - }) - - // Sign and get the complete encoded token as a string using the secret - tokenString, err := token.SignedString(hmacSampleSecret) - - fmt.Println(tokenString, err) - // Output: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYmYiOjE0NDQ0Nzg0MDB9.u1riaD1rW97opCoAuRCTy4w58Br-Zk-bh7vLiRIsrpU -} - -// Example parsing and validating a token using the HMAC signing method -func ExampleParse_hmac() { - // sample token string taken from the New example - tokenString := "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIiLCJuYmYiOjE0NDQ0Nzg0MDB9.u1riaD1rW97opCoAuRCTy4w58Br-Zk-bh7vLiRIsrpU" - - // Parse takes the token string and a function for looking up the key. The latter is especially - // useful if you use multiple keys for your application. The standard is to use 'kid' in the - // head of the token to identify which key to use, but the parsed token (head and claims) is provided - // to the callback, providing flexibility. - token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - } - - // hmacSampleSecret is a []byte containing your secret, e.g. []byte("my_secret_key") - return hmacSampleSecret, nil - }) - - if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { - fmt.Println(claims["foo"], claims["nbf"]) - } else { - fmt.Println(err) - } - - // Output: bar 1.4444784e+09 -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac_test.go b/vendor/github.com/dgrijalva/jwt-go/hmac_test.go deleted file mode 100644 index c7e114f4..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package jwt_test - -import ( - "github.com/dgrijalva/jwt-go" - "io/ioutil" - "strings" - "testing" -) - -var hmacTestData = []struct { - name string - tokenString string - alg string - claims map[string]interface{} - valid bool -}{ - { - "web sample", - "eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk", - "HS256", - map[string]interface{}{"iss": "joe", "exp": 1300819380, "http://example.com/is_root": true}, - true, - }, - { - "HS384", - "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9.eyJleHAiOjEuMzAwODE5MzhlKzA5LCJodHRwOi8vZXhhbXBsZS5jb20vaXNfcm9vdCI6dHJ1ZSwiaXNzIjoiam9lIn0.KWZEuOD5lbBxZ34g7F-SlVLAQ_r5KApWNWlZIIMyQVz5Zs58a7XdNzj5_0EcNoOy", - "HS384", - map[string]interface{}{"iss": "joe", "exp": 1300819380, "http://example.com/is_root": true}, - true, - }, - { - "HS512", - "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJleHAiOjEuMzAwODE5MzhlKzA5LCJodHRwOi8vZXhhbXBsZS5jb20vaXNfcm9vdCI6dHJ1ZSwiaXNzIjoiam9lIn0.CN7YijRX6Aw1n2jyI2Id1w90ja-DEMYiWixhYCyHnrZ1VfJRaFQz1bEbjjA5Fn4CLYaUG432dEYmSbS4Saokmw", - "HS512", - map[string]interface{}{"iss": "joe", "exp": 1300819380, "http://example.com/is_root": true}, - true, - }, - { - "web sample: invalid", - "eyJ0eXAiOiJKV1QiLA0KICJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ.dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXo", - "HS256", - map[string]interface{}{"iss": "joe", "exp": 1300819380, "http://example.com/is_root": true}, - false, - }, -} - -// Sample data from http://tools.ietf.org/html/draft-jones-json-web-signature-04#appendix-A.1 -var hmacTestKey, _ = ioutil.ReadFile("test/hmacTestKey") - -func TestHMACVerify(t *testing.T) { - for _, data := range hmacTestData { - parts := strings.Split(data.tokenString, ".") - - method := jwt.GetSigningMethod(data.alg) - err := method.Verify(strings.Join(parts[0:2], "."), parts[2], hmacTestKey) - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying key: %v", data.name, err) - } - if !data.valid && err == nil { - t.Errorf("[%v] Invalid key passed validation", data.name) - } - } -} - -func TestHMACSign(t *testing.T) { - for _, data := range hmacTestData { - if data.valid { - parts := strings.Split(data.tokenString, ".") - method := jwt.GetSigningMethod(data.alg) - sig, err := method.Sign(strings.Join(parts[0:2], "."), hmacTestKey) - if err != nil { - t.Errorf("[%v] Error signing token: %v", data.name, err) - } - if sig != parts[2] { - t.Errorf("[%v] Incorrect signature.\nwas:\n%v\nexpecting:\n%v", data.name, sig, parts[2]) - } - } - } -} - -func BenchmarkHS256Signing(b *testing.B) { - benchmarkSigning(b, jwt.SigningMethodHS256, hmacTestKey) -} - -func BenchmarkHS384Signing(b *testing.B) { - benchmarkSigning(b, jwt.SigningMethodHS384, hmacTestKey) -} - -func BenchmarkHS512Signing(b *testing.B) { - benchmarkSigning(b, jwt.SigningMethodHS512, hmacTestKey) -} diff --git a/vendor/github.com/dgrijalva/jwt-go/http_example_test.go b/vendor/github.com/dgrijalva/jwt-go/http_example_test.go deleted file mode 100644 index 82e9c50a..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/http_example_test.go +++ /dev/null @@ -1,216 +0,0 @@ -package jwt_test - -// Example HTTP auth using asymmetric crypto/RSA keys -// This is based on a (now outdated) example at https://gist.github.com/cryptix/45c33ecf0ae54828e63b - -import ( - "bytes" - "crypto/rsa" - "fmt" - "github.com/dgrijalva/jwt-go" - "github.com/dgrijalva/jwt-go/request" - "io" - "io/ioutil" - "log" - "net" - "net/http" - "net/url" - "strings" - "time" -) - -// location of the files used for signing and verification -const ( - privKeyPath = "test/sample_key" // openssl genrsa -out app.rsa keysize - pubKeyPath = "test/sample_key.pub" // openssl rsa -in app.rsa -pubout > app.rsa.pub -) - -var ( - verifyKey *rsa.PublicKey - signKey *rsa.PrivateKey - serverPort int - // storing sample username/password pairs - // don't do this on a real server - users = map[string]string{ - "test": "known", - } -) - -// read the key files before starting http handlers -func init() { - signBytes, err := ioutil.ReadFile(privKeyPath) - fatal(err) - - signKey, err = jwt.ParseRSAPrivateKeyFromPEM(signBytes) - fatal(err) - - verifyBytes, err := ioutil.ReadFile(pubKeyPath) - fatal(err) - - verifyKey, err = jwt.ParseRSAPublicKeyFromPEM(verifyBytes) - fatal(err) - - http.HandleFunc("/authenticate", authHandler) - http.HandleFunc("/restricted", restrictedHandler) - - // Setup listener - listener, err := net.ListenTCP("tcp", &net.TCPAddr{}) - serverPort = listener.Addr().(*net.TCPAddr).Port - - log.Println("Listening...") - go func() { - fatal(http.Serve(listener, nil)) - }() -} - -var start func() - -func fatal(err error) { - if err != nil { - log.Fatal(err) - } -} - -// Define some custom types were going to use within our tokens -type CustomerInfo struct { - Name string - Kind string -} - -type CustomClaimsExample struct { - *jwt.StandardClaims - TokenType string - CustomerInfo -} - -func Example_getTokenViaHTTP() { - // See func authHandler for an example auth handler that produces a token - res, err := http.PostForm(fmt.Sprintf("http://localhost:%v/authenticate", serverPort), url.Values{ - "user": {"test"}, - "pass": {"known"}, - }) - if err != nil { - fatal(err) - } - - if res.StatusCode != 200 { - fmt.Println("Unexpected status code", res.StatusCode) - } - - // Read the token out of the response body - buf := new(bytes.Buffer) - io.Copy(buf, res.Body) - res.Body.Close() - tokenString := strings.TrimSpace(buf.String()) - - // Parse the token - token, err := jwt.ParseWithClaims(tokenString, &CustomClaimsExample{}, func(token *jwt.Token) (interface{}, error) { - // since we only use the one private key to sign the tokens, - // we also only use its public counter part to verify - return verifyKey, nil - }) - fatal(err) - - claims := token.Claims.(*CustomClaimsExample) - fmt.Println(claims.CustomerInfo.Name) - - //Output: test -} - -func Example_useTokenViaHTTP() { - - // Make a sample token - // In a real world situation, this token will have been acquired from - // some other API call (see Example_getTokenViaHTTP) - token, err := createToken("foo") - fatal(err) - - // Make request. See func restrictedHandler for example request processor - req, err := http.NewRequest("GET", fmt.Sprintf("http://localhost:%v/restricted", serverPort), nil) - fatal(err) - req.Header.Set("Authorization", fmt.Sprintf("Bearer %v", token)) - res, err := http.DefaultClient.Do(req) - fatal(err) - - // Read the response body - buf := new(bytes.Buffer) - io.Copy(buf, res.Body) - res.Body.Close() - fmt.Println(buf.String()) - - // Output: Welcome, foo -} - -func createToken(user string) (string, error) { - // create a signer for rsa 256 - t := jwt.New(jwt.GetSigningMethod("RS256")) - - // set our claims - t.Claims = &CustomClaimsExample{ - &jwt.StandardClaims{ - // set the expire time - // see http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-20#section-4.1.4 - ExpiresAt: time.Now().Add(time.Minute * 1).Unix(), - }, - "level1", - CustomerInfo{user, "human"}, - } - - // Creat token string - return t.SignedString(signKey) -} - -// reads the form values, checks them and creates the token -func authHandler(w http.ResponseWriter, r *http.Request) { - // make sure its post - if r.Method != "POST" { - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintln(w, "No POST", r.Method) - return - } - - user := r.FormValue("user") - pass := r.FormValue("pass") - - log.Printf("Authenticate: user[%s] pass[%s]\n", user, pass) - - // check values - if user != "test" || pass != "known" { - w.WriteHeader(http.StatusForbidden) - fmt.Fprintln(w, "Wrong info") - return - } - - tokenString, err := createToken(user) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintln(w, "Sorry, error while Signing Token!") - log.Printf("Token Signing error: %v\n", err) - return - } - - w.Header().Set("Content-Type", "application/jwt") - w.WriteHeader(http.StatusOK) - fmt.Fprintln(w, tokenString) -} - -// only accessible with a valid token -func restrictedHandler(w http.ResponseWriter, r *http.Request) { - // Get token from request - token, err := request.ParseFromRequestWithClaims(r, request.OAuth2Extractor, &CustomClaimsExample{}, func(token *jwt.Token) (interface{}, error) { - // since we only use the one private key to sign the tokens, - // we also only use its public counter part to verify - return verifyKey, nil - }) - - // If the token is missing or invalid, return error - if err != nil { - w.WriteHeader(http.StatusUnauthorized) - fmt.Fprintln(w, "Invalid token:", err) - return - } - - // Token is valid - fmt.Fprintln(w, "Welcome,", token.Claims.(*CustomClaimsExample).Name) - return -} diff --git a/vendor/github.com/dgrijalva/jwt-go/none_test.go b/vendor/github.com/dgrijalva/jwt-go/none_test.go deleted file mode 100644 index 29a69efe..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/none_test.go +++ /dev/null @@ -1,72 +0,0 @@ -package jwt_test - -import ( - "github.com/dgrijalva/jwt-go" - "strings" - "testing" -) - -var noneTestData = []struct { - name string - tokenString string - alg string - key interface{} - claims map[string]interface{} - valid bool -}{ - { - "Basic", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.", - "none", - jwt.UnsafeAllowNoneSignatureType, - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic - no key", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.", - "none", - nil, - map[string]interface{}{"foo": "bar"}, - false, - }, - { - "Signed", - "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.W-jEzRfBigtCWsinvVVuldiuilzVdU5ty0MvpLaSaqK9PlAWWlDQ1VIQ_qSKzwL5IXaZkvZFJXT3yL3n7OUVu7zCNJzdwznbC8Z-b0z2lYvcklJYi2VOFRcGbJtXUqgjk2oGsiqUMUMOLP70TTefkpsgqDxbRh9CDUfpOJgW-dU7cmgaoswe3wjUAUi6B6G2YEaiuXC0XScQYSYVKIzgKXJV8Zw-7AN_DBUI4GkTpsvQ9fVVjZM9csQiEXhYekyrKu1nu_POpQonGd8yqkIyXPECNmmqH5jH4sFiF67XhD7_JpkvLziBpI-uh86evBUadmHhb9Otqw3uV3NTaXLzJw", - "none", - jwt.UnsafeAllowNoneSignatureType, - map[string]interface{}{"foo": "bar"}, - false, - }, -} - -func TestNoneVerify(t *testing.T) { - for _, data := range noneTestData { - parts := strings.Split(data.tokenString, ".") - - method := jwt.GetSigningMethod(data.alg) - err := method.Verify(strings.Join(parts[0:2], "."), parts[2], data.key) - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying key: %v", data.name, err) - } - if !data.valid && err == nil { - t.Errorf("[%v] Invalid key passed validation", data.name) - } - } -} - -func TestNoneSign(t *testing.T) { - for _, data := range noneTestData { - if data.valid { - parts := strings.Split(data.tokenString, ".") - method := jwt.GetSigningMethod(data.alg) - sig, err := method.Sign(strings.Join(parts[0:2], "."), data.key) - if err != nil { - t.Errorf("[%v] Error signing token: %v", data.name, err) - } - if sig != parts[2] { - t.Errorf("[%v] Incorrect signature.\nwas:\n%v\nexpecting:\n%v", data.name, sig, parts[2]) - } - } - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser_test.go b/vendor/github.com/dgrijalva/jwt-go/parser_test.go deleted file mode 100644 index f8ad6f90..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/parser_test.go +++ /dev/null @@ -1,261 +0,0 @@ -package jwt_test - -import ( - "crypto/rsa" - "encoding/json" - "fmt" - "reflect" - "testing" - "time" - - "github.com/dgrijalva/jwt-go" - "github.com/dgrijalva/jwt-go/test" -) - -var keyFuncError error = fmt.Errorf("error loading key") - -var ( - jwtTestDefaultKey *rsa.PublicKey - defaultKeyFunc jwt.Keyfunc = func(t *jwt.Token) (interface{}, error) { return jwtTestDefaultKey, nil } - emptyKeyFunc jwt.Keyfunc = func(t *jwt.Token) (interface{}, error) { return nil, nil } - errorKeyFunc jwt.Keyfunc = func(t *jwt.Token) (interface{}, error) { return nil, keyFuncError } - nilKeyFunc jwt.Keyfunc = nil -) - -func init() { - jwtTestDefaultKey = test.LoadRSAPublicKeyFromDisk("test/sample_key.pub") -} - -var jwtTestData = []struct { - name string - tokenString string - keyfunc jwt.Keyfunc - claims jwt.Claims - valid bool - errors uint32 - parser *jwt.Parser -}{ - { - "basic", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.FhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - defaultKeyFunc, - jwt.MapClaims{"foo": "bar"}, - true, - 0, - nil, - }, - { - "basic expired", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "exp": float64(time.Now().Unix() - 100)}, - false, - jwt.ValidationErrorExpired, - nil, - }, - { - "basic nbf", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "nbf": float64(time.Now().Unix() + 100)}, - false, - jwt.ValidationErrorNotValidYet, - nil, - }, - { - "expired and nbf", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "nbf": float64(time.Now().Unix() + 100), "exp": float64(time.Now().Unix() - 100)}, - false, - jwt.ValidationErrorNotValidYet | jwt.ValidationErrorExpired, - nil, - }, - { - "basic invalid", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.EhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - defaultKeyFunc, - jwt.MapClaims{"foo": "bar"}, - false, - jwt.ValidationErrorSignatureInvalid, - nil, - }, - { - "basic nokeyfunc", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.FhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - nilKeyFunc, - jwt.MapClaims{"foo": "bar"}, - false, - jwt.ValidationErrorUnverifiable, - nil, - }, - { - "basic nokey", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.FhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - emptyKeyFunc, - jwt.MapClaims{"foo": "bar"}, - false, - jwt.ValidationErrorSignatureInvalid, - nil, - }, - { - "basic errorkey", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.FhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - errorKeyFunc, - jwt.MapClaims{"foo": "bar"}, - false, - jwt.ValidationErrorUnverifiable, - nil, - }, - { - "invalid signing method", - "", - defaultKeyFunc, - jwt.MapClaims{"foo": "bar"}, - false, - jwt.ValidationErrorSignatureInvalid, - &jwt.Parser{ValidMethods: []string{"HS256"}}, - }, - { - "valid signing method", - "", - defaultKeyFunc, - jwt.MapClaims{"foo": "bar"}, - true, - 0, - &jwt.Parser{ValidMethods: []string{"RS256", "HS256"}}, - }, - { - "JSON Number", - "", - defaultKeyFunc, - jwt.MapClaims{"foo": json.Number("123.4")}, - true, - 0, - &jwt.Parser{UseJSONNumber: true}, - }, - { - "Standard Claims", - "", - defaultKeyFunc, - &jwt.StandardClaims{ - ExpiresAt: time.Now().Add(time.Second * 10).Unix(), - }, - true, - 0, - &jwt.Parser{UseJSONNumber: true}, - }, - { - "JSON Number - basic expired", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "exp": json.Number(fmt.Sprintf("%v", time.Now().Unix()-100))}, - false, - jwt.ValidationErrorExpired, - &jwt.Parser{UseJSONNumber: true}, - }, - { - "JSON Number - basic nbf", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "nbf": json.Number(fmt.Sprintf("%v", time.Now().Unix()+100))}, - false, - jwt.ValidationErrorNotValidYet, - &jwt.Parser{UseJSONNumber: true}, - }, - { - "JSON Number - expired and nbf", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "nbf": json.Number(fmt.Sprintf("%v", time.Now().Unix()+100)), "exp": json.Number(fmt.Sprintf("%v", time.Now().Unix()-100))}, - false, - jwt.ValidationErrorNotValidYet | jwt.ValidationErrorExpired, - &jwt.Parser{UseJSONNumber: true}, - }, - { - "SkipClaimsValidation during token parsing", - "", // autogen - defaultKeyFunc, - jwt.MapClaims{"foo": "bar", "nbf": json.Number(fmt.Sprintf("%v", time.Now().Unix()+100))}, - true, - 0, - &jwt.Parser{UseJSONNumber: true, SkipClaimsValidation: true}, - }, -} - -func TestParser_Parse(t *testing.T) { - privateKey := test.LoadRSAPrivateKeyFromDisk("test/sample_key") - - // Iterate over test data set and run tests - for _, data := range jwtTestData { - // If the token string is blank, use helper function to generate string - if data.tokenString == "" { - data.tokenString = test.MakeSampleToken(data.claims, privateKey) - } - - // Parse the token - var token *jwt.Token - var err error - var parser = data.parser - if parser == nil { - parser = new(jwt.Parser) - } - // Figure out correct claims type - switch data.claims.(type) { - case jwt.MapClaims: - token, err = parser.ParseWithClaims(data.tokenString, jwt.MapClaims{}, data.keyfunc) - case *jwt.StandardClaims: - token, err = parser.ParseWithClaims(data.tokenString, &jwt.StandardClaims{}, data.keyfunc) - } - - // Verify result matches expectation - if !reflect.DeepEqual(data.claims, token.Claims) { - t.Errorf("[%v] Claims mismatch. Expecting: %v Got: %v", data.name, data.claims, token.Claims) - } - - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying token: %T:%v", data.name, err, err) - } - - if !data.valid && err == nil { - t.Errorf("[%v] Invalid token passed validation", data.name) - } - - if (err == nil && !token.Valid) || (err != nil && token.Valid) { - t.Errorf("[%v] Inconsistent behavior between returned error and token.Valid", data.name) - } - - if data.errors != 0 { - if err == nil { - t.Errorf("[%v] Expecting error. Didn't get one.", data.name) - } else { - - ve := err.(*jwt.ValidationError) - // compare the bitfield part of the error - if e := ve.Errors; e != data.errors { - t.Errorf("[%v] Errors don't match expectation. %v != %v", data.name, e, data.errors) - } - - if err.Error() == keyFuncError.Error() && ve.Inner != keyFuncError { - t.Errorf("[%v] Inner error does not match expectation. %v != %v", data.name, ve.Inner, keyFuncError) - } - } - } - if data.valid && token.Signature == "" { - t.Errorf("[%v] Signature is left unpopulated after parsing", data.name) - } - } -} - -// Helper method for benchmarking various methods -func benchmarkSigning(b *testing.B, method jwt.SigningMethod, key interface{}) { - t := jwt.New(method) - b.RunParallel(func(pb *testing.PB) { - for pb.Next() { - if _, err := t.SignedString(key); err != nil { - b.Fatal(err) - } - } - }) - -} diff --git a/vendor/github.com/dgrijalva/jwt-go/request/doc.go b/vendor/github.com/dgrijalva/jwt-go/request/doc.go deleted file mode 100644 index c01069c9..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/doc.go +++ /dev/null @@ -1,7 +0,0 @@ -// Utility package for extracting JWT tokens from -// HTTP requests. -// -// The main function is ParseFromRequest and it's WithClaims variant. -// See examples for how to use the various Extractor implementations -// or roll your own. -package request diff --git a/vendor/github.com/dgrijalva/jwt-go/request/extractor.go b/vendor/github.com/dgrijalva/jwt-go/request/extractor.go deleted file mode 100644 index 14414fe2..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/extractor.go +++ /dev/null @@ -1,81 +0,0 @@ -package request - -import ( - "errors" - "net/http" -) - -// Errors -var ( - ErrNoTokenInRequest = errors.New("no token present in request") -) - -// Interface for extracting a token from an HTTP request. -// The ExtractToken method should return a token string or an error. -// If no token is present, you must return ErrNoTokenInRequest. -type Extractor interface { - ExtractToken(*http.Request) (string, error) -} - -// Extractor for finding a token in a header. Looks at each specified -// header in order until there's a match -type HeaderExtractor []string - -func (e HeaderExtractor) ExtractToken(req *http.Request) (string, error) { - // loop over header names and return the first one that contains data - for _, header := range e { - if ah := req.Header.Get(header); ah != "" { - return ah, nil - } - } - return "", ErrNoTokenInRequest -} - -// Extract token from request arguments. This includes a POSTed form or -// GET URL arguments. Argument names are tried in order until there's a match. -// This extractor calls `ParseMultipartForm` on the request -type ArgumentExtractor []string - -func (e ArgumentExtractor) ExtractToken(req *http.Request) (string, error) { - // Make sure form is parsed - req.ParseMultipartForm(10e6) - - // loop over arg names and return the first one that contains data - for _, arg := range e { - if ah := req.Form.Get(arg); ah != "" { - return ah, nil - } - } - - return "", ErrNoTokenInRequest -} - -// Tries Extractors in order until one returns a token string or an error occurs -type MultiExtractor []Extractor - -func (e MultiExtractor) ExtractToken(req *http.Request) (string, error) { - // loop over header names and return the first one that contains data - for _, extractor := range e { - if tok, err := extractor.ExtractToken(req); tok != "" { - return tok, nil - } else if err != ErrNoTokenInRequest { - return "", err - } - } - return "", ErrNoTokenInRequest -} - -// Wrap an Extractor in this to post-process the value before it's handed off. -// See AuthorizationHeaderExtractor for an example -type PostExtractionFilter struct { - Extractor - Filter func(string) (string, error) -} - -func (e *PostExtractionFilter) ExtractToken(req *http.Request) (string, error) { - if tok, err := e.Extractor.ExtractToken(req); tok != "" { - return e.Filter(tok) - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/request/extractor_example_test.go b/vendor/github.com/dgrijalva/jwt-go/request/extractor_example_test.go deleted file mode 100644 index a994ffe5..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/extractor_example_test.go +++ /dev/null @@ -1,32 +0,0 @@ -package request - -import ( - "fmt" - "net/url" -) - -const ( - exampleTokenA = "A" -) - -func ExampleHeaderExtractor() { - req := makeExampleRequest("GET", "/", map[string]string{"Token": exampleTokenA}, nil) - tokenString, err := HeaderExtractor{"Token"}.ExtractToken(req) - if err == nil { - fmt.Println(tokenString) - } else { - fmt.Println(err) - } - //Output: A -} - -func ExampleArgumentExtractor() { - req := makeExampleRequest("GET", "/", nil, url.Values{"token": {extractorTestTokenA}}) - tokenString, err := ArgumentExtractor{"token"}.ExtractToken(req) - if err == nil { - fmt.Println(tokenString) - } else { - fmt.Println(err) - } - //Output: A -} diff --git a/vendor/github.com/dgrijalva/jwt-go/request/extractor_test.go b/vendor/github.com/dgrijalva/jwt-go/request/extractor_test.go deleted file mode 100644 index e3bbb0a3..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/extractor_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package request - -import ( - "fmt" - "net/http" - "net/url" - "testing" -) - -var extractorTestTokenA = "A" -var extractorTestTokenB = "B" - -var extractorTestData = []struct { - name string - extractor Extractor - headers map[string]string - query url.Values - token string - err error -}{ - { - name: "simple header", - extractor: HeaderExtractor{"Foo"}, - headers: map[string]string{"Foo": extractorTestTokenA}, - query: nil, - token: extractorTestTokenA, - err: nil, - }, - { - name: "simple argument", - extractor: ArgumentExtractor{"token"}, - headers: map[string]string{}, - query: url.Values{"token": {extractorTestTokenA}}, - token: extractorTestTokenA, - err: nil, - }, - { - name: "multiple extractors", - extractor: MultiExtractor{ - HeaderExtractor{"Foo"}, - ArgumentExtractor{"token"}, - }, - headers: map[string]string{"Foo": extractorTestTokenA}, - query: url.Values{"token": {extractorTestTokenB}}, - token: extractorTestTokenA, - err: nil, - }, - { - name: "simple miss", - extractor: HeaderExtractor{"This-Header-Is-Not-Set"}, - headers: map[string]string{"Foo": extractorTestTokenA}, - query: nil, - token: "", - err: ErrNoTokenInRequest, - }, - { - name: "filter", - extractor: AuthorizationHeaderExtractor, - headers: map[string]string{"Authorization": "Bearer " + extractorTestTokenA}, - query: nil, - token: extractorTestTokenA, - err: nil, - }, -} - -func TestExtractor(t *testing.T) { - // Bearer token request - for _, data := range extractorTestData { - // Make request from test struct - r := makeExampleRequest("GET", "/", data.headers, data.query) - - // Test extractor - token, err := data.extractor.ExtractToken(r) - if token != data.token { - t.Errorf("[%v] Expected token '%v'. Got '%v'", data.name, data.token, token) - continue - } - if err != data.err { - t.Errorf("[%v] Expected error '%v'. Got '%v'", data.name, data.err, err) - continue - } - } -} - -func makeExampleRequest(method, path string, headers map[string]string, urlArgs url.Values) *http.Request { - r, _ := http.NewRequest(method, fmt.Sprintf("%v?%v", path, urlArgs.Encode()), nil) - for k, v := range headers { - r.Header.Set(k, v) - } - return r -} diff --git a/vendor/github.com/dgrijalva/jwt-go/request/oauth2.go b/vendor/github.com/dgrijalva/jwt-go/request/oauth2.go deleted file mode 100644 index 5948694a..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/oauth2.go +++ /dev/null @@ -1,28 +0,0 @@ -package request - -import ( - "strings" -) - -// Strips 'Bearer ' prefix from bearer token string -func stripBearerPrefixFromTokenString(tok string) (string, error) { - // Should be a bearer token - if len(tok) > 6 && strings.ToUpper(tok[0:7]) == "BEARER " { - return tok[7:], nil - } - return tok, nil -} - -// Extract bearer token from Authorization header -// Uses PostExtractionFilter to strip "Bearer " prefix from header -var AuthorizationHeaderExtractor = &PostExtractionFilter{ - HeaderExtractor{"Authorization"}, - stripBearerPrefixFromTokenString, -} - -// Extractor for OAuth2 access tokens. Looks in 'Authorization' -// header then 'access_token' argument for a token. -var OAuth2Extractor = &MultiExtractor{ - AuthorizationHeaderExtractor, - ArgumentExtractor{"access_token"}, -} diff --git a/vendor/github.com/dgrijalva/jwt-go/request/request.go b/vendor/github.com/dgrijalva/jwt-go/request/request.go deleted file mode 100644 index 1807b396..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/request.go +++ /dev/null @@ -1,24 +0,0 @@ -package request - -import ( - "github.com/dgrijalva/jwt-go" - "net/http" -) - -// Extract and parse a JWT token from an HTTP request. -// This behaves the same as Parse, but accepts a request and an extractor -// instead of a token string. The Extractor interface allows you to define -// the logic for extracting a token. Several useful implementations are provided. -func ParseFromRequest(req *http.Request, extractor Extractor, keyFunc jwt.Keyfunc) (token *jwt.Token, err error) { - return ParseFromRequestWithClaims(req, extractor, jwt.MapClaims{}, keyFunc) -} - -// ParseFromRequest but with custom Claims type -func ParseFromRequestWithClaims(req *http.Request, extractor Extractor, claims jwt.Claims, keyFunc jwt.Keyfunc) (token *jwt.Token, err error) { - // Extract token from request - if tokStr, err := extractor.ExtractToken(req); err == nil { - return jwt.ParseWithClaims(tokStr, claims, keyFunc) - } else { - return nil, err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/request/request_test.go b/vendor/github.com/dgrijalva/jwt-go/request/request_test.go deleted file mode 100644 index b4365cd8..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/request/request_test.go +++ /dev/null @@ -1,103 +0,0 @@ -package request - -import ( - "fmt" - "github.com/dgrijalva/jwt-go" - "github.com/dgrijalva/jwt-go/test" - "net/http" - "net/url" - "reflect" - "strings" - "testing" -) - -var requestTestData = []struct { - name string - claims jwt.MapClaims - extractor Extractor - headers map[string]string - query url.Values - valid bool -}{ - { - "authorization bearer token", - jwt.MapClaims{"foo": "bar"}, - AuthorizationHeaderExtractor, - map[string]string{"Authorization": "Bearer %v"}, - url.Values{}, - true, - }, - { - "oauth bearer token - header", - jwt.MapClaims{"foo": "bar"}, - OAuth2Extractor, - map[string]string{"Authorization": "Bearer %v"}, - url.Values{}, - true, - }, - { - "oauth bearer token - url", - jwt.MapClaims{"foo": "bar"}, - OAuth2Extractor, - map[string]string{}, - url.Values{"access_token": {"%v"}}, - true, - }, - { - "url token", - jwt.MapClaims{"foo": "bar"}, - ArgumentExtractor{"token"}, - map[string]string{}, - url.Values{"token": {"%v"}}, - true, - }, -} - -func TestParseRequest(t *testing.T) { - // load keys from disk - privateKey := test.LoadRSAPrivateKeyFromDisk("../test/sample_key") - publicKey := test.LoadRSAPublicKeyFromDisk("../test/sample_key.pub") - keyfunc := func(*jwt.Token) (interface{}, error) { - return publicKey, nil - } - - // Bearer token request - for _, data := range requestTestData { - // Make token from claims - tokenString := test.MakeSampleToken(data.claims, privateKey) - - // Make query string - for k, vv := range data.query { - for i, v := range vv { - if strings.Contains(v, "%v") { - data.query[k][i] = fmt.Sprintf(v, tokenString) - } - } - } - - // Make request from test struct - r, _ := http.NewRequest("GET", fmt.Sprintf("/?%v", data.query.Encode()), nil) - for k, v := range data.headers { - if strings.Contains(v, "%v") { - r.Header.Set(k, fmt.Sprintf(v, tokenString)) - } else { - r.Header.Set(k, tokenString) - } - } - token, err := ParseFromRequestWithClaims(r, data.extractor, jwt.MapClaims{}, keyfunc) - - if token == nil { - t.Errorf("[%v] Token was not found: %v", data.name, err) - continue - } - if !reflect.DeepEqual(data.claims, token.Claims) { - t.Errorf("[%v] Claims mismatch. Expecting: %v Got: %v", data.name, data.claims, token.Claims) - } - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying token: %v", data.name, err) - } - if !data.valid && err == nil { - t.Errorf("[%v] Invalid token passed validation", data.name) - } - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss_test.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss_test.go deleted file mode 100644 index 9045aaf3..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// +build go1.4 - -package jwt_test - -import ( - "crypto/rsa" - "io/ioutil" - "strings" - "testing" - - "github.com/dgrijalva/jwt-go" -) - -var rsaPSSTestData = []struct { - name string - tokenString string - alg string - claims map[string]interface{} - valid bool -}{ - { - "Basic PS256", - "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.PPG4xyDVY8ffp4CcxofNmsTDXsrVG2npdQuibLhJbv4ClyPTUtR5giNSvuxo03kB6I8VXVr0Y9X7UxhJVEoJOmULAwRWaUsDnIewQa101cVhMa6iR8X37kfFoiZ6NkS-c7henVkkQWu2HtotkEtQvN5hFlk8IevXXPmvZlhQhwzB1sGzGYnoi1zOfuL98d3BIjUjtlwii5w6gYG2AEEzp7HnHCsb3jIwUPdq86Oe6hIFjtBwduIK90ca4UqzARpcfwxHwVLMpatKask00AgGVI0ysdk0BLMjmLutquD03XbThHScC2C2_Pp4cHWgMzvbgLU2RYYZcZRKr46QeNgz9w", - "PS256", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic PS384", - "eyJhbGciOiJQUzM4NCIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.w7-qqgj97gK4fJsq_DCqdYQiylJjzWONvD0qWWWhqEOFk2P1eDULPnqHRnjgTXoO4HAw4YIWCsZPet7nR3Xxq4ZhMqvKW8b7KlfRTb9cH8zqFvzMmybQ4jv2hKc3bXYqVow3AoR7hN_CWXI3Dv6Kd2X5xhtxRHI6IL39oTVDUQ74LACe-9t4c3QRPuj6Pq1H4FAT2E2kW_0KOc6EQhCLWEhm2Z2__OZskDC8AiPpP8Kv4k2vB7l0IKQu8Pr4RcNBlqJdq8dA5D3hk5TLxP8V5nG1Ib80MOMMqoS3FQvSLyolFX-R_jZ3-zfq6Ebsqr0yEb0AH2CfsECF7935Pa0FKQ", - "PS384", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic PS512", - "eyJhbGciOiJQUzUxMiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.GX1HWGzFaJevuSLavqqFYaW8_TpvcjQ8KfC5fXiSDzSiT9UD9nB_ikSmDNyDILNdtjZLSvVKfXxZJqCfefxAtiozEDDdJthZ-F0uO4SPFHlGiXszvKeodh7BuTWRI2wL9-ZO4mFa8nq3GMeQAfo9cx11i7nfN8n2YNQ9SHGovG7_T_AvaMZB_jT6jkDHpwGR9mz7x1sycckEo6teLdHRnH_ZdlHlxqknmyTu8Odr5Xh0sJFOL8BepWbbvIIn-P161rRHHiDWFv6nhlHwZnVzjx7HQrWSGb6-s2cdLie9QL_8XaMcUpjLkfOMKkDOfHo6AvpL7Jbwi83Z2ZTHjJWB-A", - "PS512", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "basic PS256 invalid: foo => bar", - "eyJhbGciOiJQUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.PPG4xyDVY8ffp4CcxofNmsTDXsrVG2npdQuibLhJbv4ClyPTUtR5giNSvuxo03kB6I8VXVr0Y9X7UxhJVEoJOmULAwRWaUsDnIewQa101cVhMa6iR8X37kfFoiZ6NkS-c7henVkkQWu2HtotkEtQvN5hFlk8IevXXPmvZlhQhwzB1sGzGYnoi1zOfuL98d3BIjUjtlwii5w6gYG2AEEzp7HnHCsb3jIwUPdq86Oe6hIFjtBwduIK90ca4UqzARpcfwxHwVLMpatKask00AgGVI0ysdk0BLMjmLutquD03XbThHScC2C2_Pp4cHWgMzvbgLU2RYYZcZRKr46QeNgz9W", - "PS256", - map[string]interface{}{"foo": "bar"}, - false, - }, -} - -func TestRSAPSSVerify(t *testing.T) { - var err error - - key, _ := ioutil.ReadFile("test/sample_key.pub") - var rsaPSSKey *rsa.PublicKey - if rsaPSSKey, err = jwt.ParseRSAPublicKeyFromPEM(key); err != nil { - t.Errorf("Unable to parse RSA public key: %v", err) - } - - for _, data := range rsaPSSTestData { - parts := strings.Split(data.tokenString, ".") - - method := jwt.GetSigningMethod(data.alg) - err := method.Verify(strings.Join(parts[0:2], "."), parts[2], rsaPSSKey) - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying key: %v", data.name, err) - } - if !data.valid && err == nil { - t.Errorf("[%v] Invalid key passed validation", data.name) - } - } -} - -func TestRSAPSSSign(t *testing.T) { - var err error - - key, _ := ioutil.ReadFile("test/sample_key") - var rsaPSSKey *rsa.PrivateKey - if rsaPSSKey, err = jwt.ParseRSAPrivateKeyFromPEM(key); err != nil { - t.Errorf("Unable to parse RSA private key: %v", err) - } - - for _, data := range rsaPSSTestData { - if data.valid { - parts := strings.Split(data.tokenString, ".") - method := jwt.GetSigningMethod(data.alg) - sig, err := method.Sign(strings.Join(parts[0:2], "."), rsaPSSKey) - if err != nil { - t.Errorf("[%v] Error signing token: %v", data.name, err) - } - if sig == parts[2] { - t.Errorf("[%v] Signatures shouldn't match\nnew:\n%v\noriginal:\n%v", data.name, sig, parts[2]) - } - } - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_test.go b/vendor/github.com/dgrijalva/jwt-go/rsa_test.go deleted file mode 100644 index 2e0f7853..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_test.go +++ /dev/null @@ -1,176 +0,0 @@ -package jwt_test - -import ( - "github.com/dgrijalva/jwt-go" - "io/ioutil" - "strings" - "testing" -) - -var rsaTestData = []struct { - name string - tokenString string - alg string - claims map[string]interface{} - valid bool -}{ - { - "Basic RS256", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.FhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - "RS256", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic RS384", - "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.W-jEzRfBigtCWsinvVVuldiuilzVdU5ty0MvpLaSaqK9PlAWWlDQ1VIQ_qSKzwL5IXaZkvZFJXT3yL3n7OUVu7zCNJzdwznbC8Z-b0z2lYvcklJYi2VOFRcGbJtXUqgjk2oGsiqUMUMOLP70TTefkpsgqDxbRh9CDUfpOJgW-dU7cmgaoswe3wjUAUi6B6G2YEaiuXC0XScQYSYVKIzgKXJV8Zw-7AN_DBUI4GkTpsvQ9fVVjZM9csQiEXhYekyrKu1nu_POpQonGd8yqkIyXPECNmmqH5jH4sFiF67XhD7_JpkvLziBpI-uh86evBUadmHhb9Otqw3uV3NTaXLzJw", - "RS384", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "Basic RS512", - "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.zBlLlmRrUxx4SJPUbV37Q1joRcI9EW13grnKduK3wtYKmDXbgDpF1cZ6B-2Jsm5RB8REmMiLpGms-EjXhgnyh2TSHE-9W2gA_jvshegLWtwRVDX40ODSkTb7OVuaWgiy9y7llvcknFBTIg-FnVPVpXMmeV_pvwQyhaz1SSwSPrDyxEmksz1hq7YONXhXPpGaNbMMeDTNP_1oj8DZaqTIL9TwV8_1wb2Odt_Fy58Ke2RVFijsOLdnyEAjt2n9Mxihu9i3PhNBkkxa2GbnXBfq3kzvZ_xxGGopLdHhJjcGWXO-NiwI9_tiu14NRv4L2xC0ItD9Yz68v2ZIZEp_DuzwRQ", - "RS512", - map[string]interface{}{"foo": "bar"}, - true, - }, - { - "basic invalid: foo => bar", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJmb28iOiJiYXIifQ.EhkiHkoESI_cG3NPigFrxEk9Z60_oXrOT2vGm9Pn6RDgYNovYORQmmA0zs1AoAOf09ly2Nx2YAg6ABqAYga1AcMFkJljwxTT5fYphTuqpWdy4BELeSYJx5Ty2gmr8e7RonuUztrdD5WfPqLKMm1Ozp_T6zALpRmwTIW0QPnaBXaQD90FplAg46Iy1UlDKr-Eupy0i5SLch5Q-p2ZpaL_5fnTIUDlxC3pWhJTyx_71qDI-mAA_5lE_VdroOeflG56sSmDxopPEG3bFlSu1eowyBfxtu0_CuVd-M42RU75Zc4Gsj6uV77MBtbMrf4_7M_NUTSgoIF3fRqxrj0NzihIBg", - "RS256", - map[string]interface{}{"foo": "bar"}, - false, - }, -} - -func TestRSAVerify(t *testing.T) { - keyData, _ := ioutil.ReadFile("test/sample_key.pub") - key, _ := jwt.ParseRSAPublicKeyFromPEM(keyData) - - for _, data := range rsaTestData { - parts := strings.Split(data.tokenString, ".") - - method := jwt.GetSigningMethod(data.alg) - err := method.Verify(strings.Join(parts[0:2], "."), parts[2], key) - if data.valid && err != nil { - t.Errorf("[%v] Error while verifying key: %v", data.name, err) - } - if !data.valid && err == nil { - t.Errorf("[%v] Invalid key passed validation", data.name) - } - } -} - -func TestRSASign(t *testing.T) { - keyData, _ := ioutil.ReadFile("test/sample_key") - key, _ := jwt.ParseRSAPrivateKeyFromPEM(keyData) - - for _, data := range rsaTestData { - if data.valid { - parts := strings.Split(data.tokenString, ".") - method := jwt.GetSigningMethod(data.alg) - sig, err := method.Sign(strings.Join(parts[0:2], "."), key) - if err != nil { - t.Errorf("[%v] Error signing token: %v", data.name, err) - } - if sig != parts[2] { - t.Errorf("[%v] Incorrect signature.\nwas:\n%v\nexpecting:\n%v", data.name, sig, parts[2]) - } - } - } -} - -func TestRSAVerifyWithPreParsedPrivateKey(t *testing.T) { - key, _ := ioutil.ReadFile("test/sample_key.pub") - parsedKey, err := jwt.ParseRSAPublicKeyFromPEM(key) - if err != nil { - t.Fatal(err) - } - testData := rsaTestData[0] - parts := strings.Split(testData.tokenString, ".") - err = jwt.SigningMethodRS256.Verify(strings.Join(parts[0:2], "."), parts[2], parsedKey) - if err != nil { - t.Errorf("[%v] Error while verifying key: %v", testData.name, err) - } -} - -func TestRSAWithPreParsedPrivateKey(t *testing.T) { - key, _ := ioutil.ReadFile("test/sample_key") - parsedKey, err := jwt.ParseRSAPrivateKeyFromPEM(key) - if err != nil { - t.Fatal(err) - } - testData := rsaTestData[0] - parts := strings.Split(testData.tokenString, ".") - sig, err := jwt.SigningMethodRS256.Sign(strings.Join(parts[0:2], "."), parsedKey) - if err != nil { - t.Errorf("[%v] Error signing token: %v", testData.name, err) - } - if sig != parts[2] { - t.Errorf("[%v] Incorrect signature.\nwas:\n%v\nexpecting:\n%v", testData.name, sig, parts[2]) - } -} - -func TestRSAKeyParsing(t *testing.T) { - key, _ := ioutil.ReadFile("test/sample_key") - pubKey, _ := ioutil.ReadFile("test/sample_key.pub") - badKey := []byte("All your base are belong to key") - - // Test parsePrivateKey - if _, e := jwt.ParseRSAPrivateKeyFromPEM(key); e != nil { - t.Errorf("Failed to parse valid private key: %v", e) - } - - if k, e := jwt.ParseRSAPrivateKeyFromPEM(pubKey); e == nil { - t.Errorf("Parsed public key as valid private key: %v", k) - } - - if k, e := jwt.ParseRSAPrivateKeyFromPEM(badKey); e == nil { - t.Errorf("Parsed invalid key as valid private key: %v", k) - } - - // Test parsePublicKey - if _, e := jwt.ParseRSAPublicKeyFromPEM(pubKey); e != nil { - t.Errorf("Failed to parse valid public key: %v", e) - } - - if k, e := jwt.ParseRSAPublicKeyFromPEM(key); e == nil { - t.Errorf("Parsed private key as valid public key: %v", k) - } - - if k, e := jwt.ParseRSAPublicKeyFromPEM(badKey); e == nil { - t.Errorf("Parsed invalid key as valid private key: %v", k) - } - -} - -func BenchmarkRS256Signing(b *testing.B) { - key, _ := ioutil.ReadFile("test/sample_key") - parsedKey, err := jwt.ParseRSAPrivateKeyFromPEM(key) - if err != nil { - b.Fatal(err) - } - - benchmarkSigning(b, jwt.SigningMethodRS256, parsedKey) -} - -func BenchmarkRS384Signing(b *testing.B) { - key, _ := ioutil.ReadFile("test/sample_key") - parsedKey, err := jwt.ParseRSAPrivateKeyFromPEM(key) - if err != nil { - b.Fatal(err) - } - - benchmarkSigning(b, jwt.SigningMethodRS384, parsedKey) -} - -func BenchmarkRS512Signing(b *testing.B) { - key, _ := ioutil.ReadFile("test/sample_key") - parsedKey, err := jwt.ParseRSAPrivateKeyFromPEM(key) - if err != nil { - b.Fatal(err) - } - - benchmarkSigning(b, jwt.SigningMethodRS512, parsedKey) -} diff --git a/vendor/github.com/dgrijalva/jwt-go/test/helpers.go b/vendor/github.com/dgrijalva/jwt-go/test/helpers.go deleted file mode 100644 index f84c3ef6..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/test/helpers.go +++ /dev/null @@ -1,42 +0,0 @@ -package test - -import ( - "crypto/rsa" - "github.com/dgrijalva/jwt-go" - "io/ioutil" -) - -func LoadRSAPrivateKeyFromDisk(location string) *rsa.PrivateKey { - keyData, e := ioutil.ReadFile(location) - if e != nil { - panic(e.Error()) - } - key, e := jwt.ParseRSAPrivateKeyFromPEM(keyData) - if e != nil { - panic(e.Error()) - } - return key -} - -func LoadRSAPublicKeyFromDisk(location string) *rsa.PublicKey { - keyData, e := ioutil.ReadFile(location) - if e != nil { - panic(e.Error()) - } - key, e := jwt.ParseRSAPublicKeyFromPEM(keyData) - if e != nil { - panic(e.Error()) - } - return key -} - -func MakeSampleToken(c jwt.Claims, key interface{}) string { - token := jwt.NewWithClaims(jwt.SigningMethodRS256, c) - s, e := token.SignedString(key) - - if e != nil { - panic(e.Error()) - } - - return s -} diff --git a/vendor/github.com/dgrijalva/jwt-go/test/hmacTestKey b/vendor/github.com/dgrijalva/jwt-go/test/hmacTestKey deleted file mode 100644 index 435b8ddb..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/test/hmacTestKey +++ /dev/null @@ -1 +0,0 @@ -#5K+¥¼ƒ~ew{¦Z³(æðTÉ(©„²ÒP.¿ÓûZ’ÒGï–Š´Ãwb="=.!r.OÀÍšõgЀ£ \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/test/sample_key b/vendor/github.com/dgrijalva/jwt-go/test/sample_key deleted file mode 100644 index abdbade3..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/test/sample_key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEowIBAAKCAQEA4f5wg5l2hKsTeNem/V41fGnJm6gOdrj8ym3rFkEU/wT8RDtn -SgFEZOQpHEgQ7JL38xUfU0Y3g6aYw9QT0hJ7mCpz9Er5qLaMXJwZxzHzAahlfA0i -cqabvJOMvQtzD6uQv6wPEyZtDTWiQi9AXwBpHssPnpYGIn20ZZuNlX2BrClciHhC -PUIIZOQn/MmqTD31jSyjoQoV7MhhMTATKJx2XrHhR+1DcKJzQBSTAGnpYVaqpsAR -ap+nwRipr3nUTuxyGohBTSmjJ2usSeQXHI3bODIRe1AuTyHceAbewn8b462yEWKA -Rdpd9AjQW5SIVPfdsz5B6GlYQ5LdYKtznTuy7wIDAQABAoIBAQCwia1k7+2oZ2d3 -n6agCAbqIE1QXfCmh41ZqJHbOY3oRQG3X1wpcGH4Gk+O+zDVTV2JszdcOt7E5dAy -MaomETAhRxB7hlIOnEN7WKm+dGNrKRvV0wDU5ReFMRHg31/Lnu8c+5BvGjZX+ky9 -POIhFFYJqwCRlopGSUIxmVj5rSgtzk3iWOQXr+ah1bjEXvlxDOWkHN6YfpV5ThdE -KdBIPGEVqa63r9n2h+qazKrtiRqJqGnOrHzOECYbRFYhexsNFz7YT02xdfSHn7gM -IvabDDP/Qp0PjE1jdouiMaFHYnLBbgvlnZW9yuVf/rpXTUq/njxIXMmvmEyyvSDn -FcFikB8pAoGBAPF77hK4m3/rdGT7X8a/gwvZ2R121aBcdPwEaUhvj/36dx596zvY -mEOjrWfZhF083/nYWE2kVquj2wjs+otCLfifEEgXcVPTnEOPO9Zg3uNSL0nNQghj -FuD3iGLTUBCtM66oTe0jLSslHe8gLGEQqyMzHOzYxNqibxcOZIe8Qt0NAoGBAO+U -I5+XWjWEgDmvyC3TrOSf/KCGjtu0TSv30ipv27bDLMrpvPmD/5lpptTFwcxvVhCs -2b+chCjlghFSWFbBULBrfci2FtliClOVMYrlNBdUSJhf3aYSG2Doe6Bgt1n2CpNn -/iu37Y3NfemZBJA7hNl4dYe+f+uzM87cdQ214+jrAoGAXA0XxX8ll2+ToOLJsaNT -OvNB9h9Uc5qK5X5w+7G7O998BN2PC/MWp8H+2fVqpXgNENpNXttkRm1hk1dych86 -EunfdPuqsX+as44oCyJGFHVBnWpm33eWQw9YqANRI+pCJzP08I5WK3osnPiwshd+ -hR54yjgfYhBFNI7B95PmEQkCgYBzFSz7h1+s34Ycr8SvxsOBWxymG5zaCsUbPsL0 -4aCgLScCHb9J+E86aVbbVFdglYa5Id7DPTL61ixhl7WZjujspeXZGSbmq0Kcnckb -mDgqkLECiOJW2NHP/j0McAkDLL4tysF8TLDO8gvuvzNC+WQ6drO2ThrypLVZQ+ry -eBIPmwKBgEZxhqa0gVvHQG/7Od69KWj4eJP28kq13RhKay8JOoN0vPmspXJo1HY3 -CKuHRG+AP579dncdUnOMvfXOtkdM4vk0+hWASBQzM9xzVcztCa+koAugjVaLS9A+ -9uQoqEeVNTckxx0S2bYevRy7hGQmUJTyQm3j1zEUR5jpdbL83Fbq ------END RSA PRIVATE KEY----- diff --git a/vendor/github.com/dgrijalva/jwt-go/test/sample_key.pub b/vendor/github.com/dgrijalva/jwt-go/test/sample_key.pub deleted file mode 100644 index 03dc982a..00000000 --- a/vendor/github.com/dgrijalva/jwt-go/test/sample_key.pub +++ /dev/null @@ -1,9 +0,0 @@ ------BEGIN PUBLIC KEY----- -MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4f5wg5l2hKsTeNem/V41 -fGnJm6gOdrj8ym3rFkEU/wT8RDtnSgFEZOQpHEgQ7JL38xUfU0Y3g6aYw9QT0hJ7 -mCpz9Er5qLaMXJwZxzHzAahlfA0icqabvJOMvQtzD6uQv6wPEyZtDTWiQi9AXwBp -HssPnpYGIn20ZZuNlX2BrClciHhCPUIIZOQn/MmqTD31jSyjoQoV7MhhMTATKJx2 -XrHhR+1DcKJzQBSTAGnpYVaqpsARap+nwRipr3nUTuxyGohBTSmjJ2usSeQXHI3b -ODIRe1AuTyHceAbewn8b462yEWKARdpd9AjQW5SIVPfdsz5B6GlYQ5LdYKtznTuy -7wIDAQAB ------END PUBLIC KEY----- diff --git a/vendor/github.com/documize/blackfriday/.travis.yml b/vendor/github.com/documize/blackfriday/.travis.yml index 4dd7a1c5..a4eb2577 100644 --- a/vendor/github.com/documize/blackfriday/.travis.yml +++ b/vendor/github.com/documize/blackfriday/.travis.yml @@ -5,9 +5,9 @@ language: go go: - - 1.2 - - 1.3 - - 1.4 + - 1.5 + - 1.6 + - 1.7 install: - go get -d -t -v ./... @@ -15,3 +15,4 @@ install: script: - go test -v ./... + - go test -run=^$ -bench=BenchmarkReference -benchmem diff --git a/vendor/github.com/documize/blackfriday/block_test.go b/vendor/github.com/documize/blackfriday/block_test.go deleted file mode 100644 index 0a2a4d84..00000000 --- a/vendor/github.com/documize/blackfriday/block_test.go +++ /dev/null @@ -1,1691 +0,0 @@ -// -// Blackfriday Markdown Processor -// Available at http://github.com/russross/blackfriday -// -// Copyright © 2011 Russ Ross . -// Distributed under the Simplified BSD License. -// See README.md for details. -// - -// -// Unit tests for block parsing -// - -package blackfriday - -import ( - "strings" - "testing" -) - -func TestPrefixHeaderNoExtensions(t *testing.T) { - var tests = []string{ - "# Header 1\n", - "

Header 1

\n", - - "## Header 2\n", - "

Header 2

\n", - - "### Header 3\n", - "

Header 3

\n", - - "#### Header 4\n", - "

Header 4

\n", - - "##### Header 5\n", - "
Header 5
\n", - - "###### Header 6\n", - "
Header 6
\n", - - "####### Header 7\n", - "
# Header 7
\n", - - "#Header 1\n", - "

Header 1

\n", - - "##Header 2\n", - "

Header 2

\n", - - "###Header 3\n", - "

Header 3

\n", - - "####Header 4\n", - "

Header 4

\n", - - "#####Header 5\n", - "
Header 5
\n", - - "######Header 6\n", - "
Header 6
\n", - - "#######Header 7\n", - "
#Header 7
\n", - - "Hello\n# Header 1\nGoodbye\n", - "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", - - "* List\n# Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n#Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n * Nested list\n # Nested header\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + - "

      Nested header

    • \n
  • \n
\n", - - "#Header 1 \\#\n", - "

Header 1 #

\n", - - "#Header 1 \\# foo\n", - "

Header 1 # foo

\n", - - "#Header 1 #\\##\n", - "

Header 1 ##

\n", - } - doTestsBlock(t, tests, 0) -} - -func TestPrefixHeaderSpaceExtension(t *testing.T) { - var tests = []string{ - "# Header 1\n", - "

Header 1

\n", - - "## Header 2\n", - "

Header 2

\n", - - "### Header 3\n", - "

Header 3

\n", - - "#### Header 4\n", - "

Header 4

\n", - - "##### Header 5\n", - "
Header 5
\n", - - "###### Header 6\n", - "
Header 6
\n", - - "####### Header 7\n", - "

####### Header 7

\n", - - "#Header 1\n", - "

#Header 1

\n", - - "##Header 2\n", - "

##Header 2

\n", - - "###Header 3\n", - "

###Header 3

\n", - - "####Header 4\n", - "

####Header 4

\n", - - "#####Header 5\n", - "

#####Header 5

\n", - - "######Header 6\n", - "

######Header 6

\n", - - "#######Header 7\n", - "

#######Header 7

\n", - - "Hello\n# Header 1\nGoodbye\n", - "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", - - "* List\n# Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n#Header\n* List\n", - "
    \n
  • List\n#Header
  • \n
  • List
  • \n
\n", - - "* List\n * Nested list\n # Nested header\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + - "

      Nested header

    • \n
  • \n
\n", - } - doTestsBlock(t, tests, SpaceHeadings) -} - -func TestPrefixHeaderIdExtension(t *testing.T) { - var tests = []string{ - "# Header 1 {#someid}\n", - "

Header 1

\n", - - "# Header 1 {#someid} \n", - "

Header 1

\n", - - "# Header 1 {#someid}\n", - "

Header 1

\n", - - "# Header 1 {#someid\n", - "

Header 1 {#someid

\n", - - "# Header 1 {#someid\n", - "

Header 1 {#someid

\n", - - "# Header 1 {#someid}}\n", - "

Header 1

\n\n

}

\n", - - "## Header 2 {#someid}\n", - "

Header 2

\n", - - "### Header 3 {#someid}\n", - "

Header 3

\n", - - "#### Header 4 {#someid}\n", - "

Header 4

\n", - - "##### Header 5 {#someid}\n", - "
Header 5
\n", - - "###### Header 6 {#someid}\n", - "
Header 6
\n", - - "####### Header 7 {#someid}\n", - "
# Header 7
\n", - - "# Header 1 # {#someid}\n", - "

Header 1

\n", - - "## Header 2 ## {#someid}\n", - "

Header 2

\n", - - "Hello\n# Header 1\nGoodbye\n", - "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", - - "* List\n# Header {#someid}\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n#Header {#someid}\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n * Nested list\n # Nested header {#someid}\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + - "

      Nested header

    • \n
  • \n
\n", - } - doTestsBlock(t, tests, HeadingIDs) -} - -func TestPrefixHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { - var tests = []string{ - "# header 1 {#someid}\n", - "

header 1

\n", - - "## header 2 {#someid}\n", - "

header 2

\n", - - "### header 3 {#someid}\n", - "

header 3

\n", - - "#### header 4 {#someid}\n", - "

header 4

\n", - - "##### header 5 {#someid}\n", - "
header 5
\n", - - "###### header 6 {#someid}\n", - "
header 6
\n", - - "####### header 7 {#someid}\n", - "
# header 7
\n", - - "# header 1 # {#someid}\n", - "

header 1

\n", - - "## header 2 ## {#someid}\n", - "

header 2

\n", - - "* List\n# Header {#someid}\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n#Header {#someid}\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n * Nested list\n # Nested header {#someid}\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + - "

      Nested header

    • \n
  • \n
\n", - } - - parameters := HTMLRendererParameters{ - HeadingIDPrefix: "PRE:", - HeadingIDSuffix: ":POST", - } - - doTestsParam(t, tests, TestParams{ - extensions: HeadingIDs, - HTMLFlags: UseXHTML, - HTMLRendererParameters: parameters, - }) -} - -func TestPrefixAutoHeaderIdExtension(t *testing.T) { - var tests = []string{ - "# Header 1\n", - "

Header 1

\n", - - "# Header 1 \n", - "

Header 1

\n", - - "## Header 2\n", - "

Header 2

\n", - - "### Header 3\n", - "

Header 3

\n", - - "#### Header 4\n", - "

Header 4

\n", - - "##### Header 5\n", - "
Header 5
\n", - - "###### Header 6\n", - "
Header 6
\n", - - "####### Header 7\n", - "
# Header 7
\n", - - "Hello\n# Header 1\nGoodbye\n", - "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", - - "* List\n# Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n#Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n * Nested list\n # Nested header\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + - "

      Nested header

    • \n
  • \n
\n", - - "# Header\n\n# Header\n", - "

Header

\n\n

Header

\n", - - "# Header 1\n\n# Header 1", - "

Header 1

\n\n

Header 1

\n", - - "# Header\n\n# Header 1\n\n# Header\n\n# Header", - "

Header

\n\n

Header 1

\n\n

Header

\n\n

Header

\n", - } - doTestsBlock(t, tests, AutoHeadingIDs) -} - -func TestPrefixAutoHeaderIdExtensionWithPrefixAndSuffix(t *testing.T) { - var tests = []string{ - "# Header 1\n", - "

Header 1

\n", - - "# Header 1 \n", - "

Header 1

\n", - - "## Header 2\n", - "

Header 2

\n", - - "### Header 3\n", - "

Header 3

\n", - - "#### Header 4\n", - "

Header 4

\n", - - "##### Header 5\n", - "
Header 5
\n", - - "###### Header 6\n", - "
Header 6
\n", - - "####### Header 7\n", - "
# Header 7
\n", - - "Hello\n# Header 1\nGoodbye\n", - "

Hello

\n\n

Header 1

\n\n

Goodbye

\n", - - "* List\n# Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n#Header\n* List\n", - "
    \n
  • List

    \n\n

    Header

  • \n\n
  • List

  • \n
\n", - - "* List\n * Nested list\n # Nested header\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list

      \n\n" + - "

      Nested header

    • \n
  • \n
\n", - - "# Header\n\n# Header\n", - "

Header

\n\n

Header

\n", - - "# Header 1\n\n# Header 1", - "

Header 1

\n\n

Header 1

\n", - - "# Header\n\n# Header 1\n\n# Header\n\n# Header", - "

Header

\n\n

Header 1

\n\n

Header

\n\n

Header

\n", - } - - parameters := HTMLRendererParameters{ - HeadingIDPrefix: "PRE:", - HeadingIDSuffix: ":POST", - } - - doTestsParam(t, tests, TestParams{ - extensions: AutoHeadingIDs, - HTMLFlags: UseXHTML, - HTMLRendererParameters: parameters, - }) -} - -func TestPrefixMultipleHeaderExtensions(t *testing.T) { - var tests = []string{ - "# Header\n\n# Header {#header}\n\n# Header 1", - "

Header

\n\n

Header

\n\n

Header 1

\n", - } - doTestsBlock(t, tests, AutoHeadingIDs|HeadingIDs) -} - -func TestUnderlineHeaders(t *testing.T) { - var tests = []string{ - "Header 1\n========\n", - "

Header 1

\n", - - "Header 2\n--------\n", - "

Header 2

\n", - - "A\n=\n", - "

A

\n", - - "B\n-\n", - "

B

\n", - - "Paragraph\nHeader\n=\n", - "

Paragraph

\n\n

Header

\n", - - "Header\n===\nParagraph\n", - "

Header

\n\n

Paragraph

\n", - - "Header\n===\nAnother header\n---\n", - "

Header

\n\n

Another header

\n", - - " Header\n======\n", - "

Header

\n", - - " Code\n========\n", - "
Code\n
\n\n

========

\n", - - "Header with *inline*\n=====\n", - "

Header with inline

\n", - - "* List\n * Sublist\n Not a header\n ------\n", - "
    \n
  • List\n\n
      \n
    • Sublist\nNot a header\n------
    • \n
  • \n
\n", - - "Paragraph\n\n\n\n\nHeader\n===\n", - "

Paragraph

\n\n

Header

\n", - - "Trailing space \n==== \n\n", - "

Trailing space

\n", - - "Trailing spaces\n==== \n\n", - "

Trailing spaces

\n", - - "Double underline\n=====\n=====\n", - "

Double underline

\n\n

=====

\n", - } - doTestsBlock(t, tests, 0) -} - -func TestUnderlineHeadersAutoIDs(t *testing.T) { - var tests = []string{ - "Header 1\n========\n", - "

Header 1

\n", - - "Header 2\n--------\n", - "

Header 2

\n", - - "A\n=\n", - "

A

\n", - - "B\n-\n", - "

B

\n", - - "Paragraph\nHeader\n=\n", - "

Paragraph

\n\n

Header

\n", - - "Header\n===\nParagraph\n", - "

Header

\n\n

Paragraph

\n", - - "Header\n===\nAnother header\n---\n", - "

Header

\n\n

Another header

\n", - - " Header\n======\n", - "

Header

\n", - - "Header with *inline*\n=====\n", - "

Header with inline

\n", - - "Paragraph\n\n\n\n\nHeader\n===\n", - "

Paragraph

\n\n

Header

\n", - - "Trailing space \n==== \n\n", - "

Trailing space

\n", - - "Trailing spaces\n==== \n\n", - "

Trailing spaces

\n", - - "Double underline\n=====\n=====\n", - "

Double underline

\n\n

=====

\n", - - "Header\n======\n\nHeader\n======\n", - "

Header

\n\n

Header

\n", - - "Header 1\n========\n\nHeader 1\n========\n", - "

Header 1

\n\n

Header 1

\n", - } - doTestsBlock(t, tests, AutoHeadingIDs) -} - -func TestHorizontalRule(t *testing.T) { - var tests = []string{ - "-\n", - "

-

\n", - - "--\n", - "

--

\n", - - "---\n", - "
\n", - - "----\n", - "
\n", - - "*\n", - "

*

\n", - - "**\n", - "

**

\n", - - "***\n", - "
\n", - - "****\n", - "
\n", - - "_\n", - "

_

\n", - - "__\n", - "

__

\n", - - "___\n", - "
\n", - - "____\n", - "
\n", - - "-*-\n", - "

-*-

\n", - - "- - -\n", - "
\n", - - "* * *\n", - "
\n", - - "_ _ _\n", - "
\n", - - "-----*\n", - "

-----*

\n", - - " ------ \n", - "
\n", - - "Hello\n***\n", - "

Hello

\n\n
\n", - - "---\n***\n___\n", - "
\n\n
\n\n
\n", - } - doTestsBlock(t, tests, 0) -} - -func TestUnorderedList(t *testing.T) { - var tests = []string{ - "* Hello\n", - "
    \n
  • Hello
  • \n
\n", - - "* Yin\n* Yang\n", - "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", - - "* Ting\n* Bong\n* Goo\n", - "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", - - "* Yin\n\n* Yang\n", - "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", - - "* Ting\n\n* Bong\n* Goo\n", - "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", - - "+ Hello\n", - "
    \n
  • Hello
  • \n
\n", - - "+ Yin\n+ Yang\n", - "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", - - "+ Ting\n+ Bong\n+ Goo\n", - "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", - - "+ Yin\n\n+ Yang\n", - "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", - - "+ Ting\n\n+ Bong\n+ Goo\n", - "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", - - "- Hello\n", - "
    \n
  • Hello
  • \n
\n", - - "- Yin\n- Yang\n", - "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", - - "- Ting\n- Bong\n- Goo\n", - "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", - - "- Yin\n\n- Yang\n", - "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", - - "- Ting\n\n- Bong\n- Goo\n", - "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", - - "*Hello\n", - "

*Hello

\n", - - "* Hello \n", - "
    \n
  • Hello
  • \n
\n", - - "* Hello \n Next line \n", - "
    \n
  • Hello\nNext line
  • \n
\n", - - "Paragraph\n* No linebreak\n", - "

Paragraph\n* No linebreak

\n", - - "Paragraph\n\n* Linebreak\n", - "

Paragraph

\n\n
    \n
  • Linebreak
  • \n
\n", - - "* List\n * Nested list\n", - "
    \n
  • List\n\n
      \n
    • Nested list
    • \n
  • \n
\n", - - "* List\n\n * Nested list\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list
    • \n
  • \n
\n", - - "* List\n Second line\n\n + Nested\n", - "
    \n
  • List\nSecond line

    \n\n
      \n
    • Nested
    • \n
  • \n
\n", - - "* List\n + Nested\n\n Continued\n", - "
    \n
  • List

    \n\n
      \n
    • Nested
    • \n
    \n\n

    Continued

  • \n
\n", - - "* List\n * shallow indent\n", - "
    \n
  • List\n\n
      \n
    • shallow indent
    • \n
  • \n
\n", - - "* List\n" + - " * shallow indent\n" + - " * part of second list\n" + - " * still second\n" + - " * almost there\n" + - " * third level\n", - "
    \n" + - "
  • List\n\n" + - "
      \n" + - "
    • shallow indent
    • \n" + - "
    • part of second list
    • \n" + - "
    • still second
    • \n" + - "
    • almost there\n\n" + - "
        \n" + - "
      • third level
      • \n" + - "
    • \n" + - "
  • \n" + - "
\n", - - "* List\n extra indent, same paragraph\n", - "
    \n
  • List\n extra indent, same paragraph
  • \n
\n", - - "* List\n\n code block\n", - "
    \n
  • List

    \n\n
    code block\n
  • \n
\n", - - "* List\n\n code block with spaces\n", - "
    \n
  • List

    \n\n
      code block with spaces\n
  • \n
\n", - - "* List\n\n * sublist\n\n normal text\n\n * another sublist\n", - "
    \n
  • List

    \n\n
      \n
    • sublist
    • \n
    \n\n

    normal text

    \n\n
      \n
    • another sublist
    • \n
  • \n
\n", - } - doTestsBlock(t, tests, 0) -} - -func TestOrderedList(t *testing.T) { - var tests = []string{ - "1. Hello\n", - "
    \n
  1. Hello
  2. \n
\n", - - "1. Yin\n2. Yang\n", - "
    \n
  1. Yin
  2. \n
  3. Yang
  4. \n
\n", - - "1. Ting\n2. Bong\n3. Goo\n", - "
    \n
  1. Ting
  2. \n
  3. Bong
  4. \n
  5. Goo
  6. \n
\n", - - "1. Yin\n\n2. Yang\n", - "
    \n
  1. Yin

  2. \n\n
  3. Yang

  4. \n
\n", - - "1. Ting\n\n2. Bong\n3. Goo\n", - "
    \n
  1. Ting

  2. \n\n
  3. Bong

  4. \n\n
  5. Goo

  6. \n
\n", - - "1 Hello\n", - "

1 Hello

\n", - - "1.Hello\n", - "

1.Hello

\n", - - "1. Hello \n", - "
    \n
  1. Hello
  2. \n
\n", - - "1. Hello \n Next line \n", - "
    \n
  1. Hello\nNext line
  2. \n
\n", - - "Paragraph\n1. No linebreak\n", - "

Paragraph\n1. No linebreak

\n", - - "Paragraph\n\n1. Linebreak\n", - "

Paragraph

\n\n
    \n
  1. Linebreak
  2. \n
\n", - - "1. List\n 1. Nested list\n", - "
    \n
  1. List\n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", - - "1. List\n\n 1. Nested list\n", - "
    \n
  1. List

    \n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", - - "1. List\n Second line\n\n 1. Nested\n", - "
    \n
  1. List\nSecond line

    \n\n
      \n
    1. Nested
    2. \n
  2. \n
\n", - - "1. List\n 1. Nested\n\n Continued\n", - "
    \n
  1. List

    \n\n
      \n
    1. Nested
    2. \n
    \n\n

    Continued

  2. \n
\n", - - "1. List\n 1. shallow indent\n", - "
    \n
  1. List\n\n
      \n
    1. shallow indent
    2. \n
  2. \n
\n", - - "1. List\n" + - " 1. shallow indent\n" + - " 2. part of second list\n" + - " 3. still second\n" + - " 4. almost there\n" + - " 1. third level\n", - "
    \n" + - "
  1. List\n\n" + - "
      \n" + - "
    1. shallow indent
    2. \n" + - "
    3. part of second list
    4. \n" + - "
    5. still second
    6. \n" + - "
    7. almost there\n\n" + - "
        \n" + - "
      1. third level
      2. \n" + - "
    8. \n" + - "
  2. \n" + - "
\n", - - "1. List\n extra indent, same paragraph\n", - "
    \n
  1. List\n extra indent, same paragraph
  2. \n
\n", - - "1. List\n\n code block\n", - "
    \n
  1. List

    \n\n
    code block\n
  2. \n
\n", - - "1. List\n\n code block with spaces\n", - "
    \n
  1. List

    \n\n
      code block with spaces\n
  2. \n
\n", - - "1. List\n * Mixted list\n", - "
    \n
  1. List\n\n
      \n
    • Mixted list
    • \n
  2. \n
\n", - - "1. List\n * Mixed list\n", - "
    \n
  1. List\n\n
      \n
    • Mixed list
    • \n
  2. \n
\n", - - "* Start with unordered\n 1. Ordered\n", - "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", - - "* Start with unordered\n 1. Ordered\n", - "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", - - "1. numbers\n1. are ignored\n", - "
    \n
  1. numbers
  2. \n
  3. are ignored
  4. \n
\n", - } - doTestsBlock(t, tests, 0) -} - -func TestDefinitionList(t *testing.T) { - var tests = []string{ - "Term 1\n: Definition a\n", - "
\n
Term 1
\n
Definition a
\n
\n", - - "Term 1\n: Definition a \n", - "
\n
Term 1
\n
Definition a
\n
\n", - - "Term 1\n: Definition a\n: Definition b\n", - "
\n
Term 1
\n
Definition a
\n
Definition b
\n
\n", - - "Term 1\n: Definition a\n\nTerm 2\n: Definition b\n", - "
\n" + - "
Term 1
\n" + - "
Definition a
\n" + - "
Term 2
\n" + - "
Definition b
\n" + - "
\n", - - "Term 1\n: Definition a\n\nTerm 2\n: Definition b\n\nTerm 3\n: Definition c\n", - "
\n" + - "
Term 1
\n" + - "
Definition a
\n" + - "
Term 2
\n" + - "
Definition b
\n" + - "
Term 3
\n" + - "
Definition c
\n" + - "
\n", - - "Term 1\n: Definition a\n: Definition b\n\nTerm 2\n: Definition c\n", - "
\n" + - "
Term 1
\n" + - "
Definition a
\n" + - "
Definition b
\n" + - "
Term 2
\n" + - "
Definition c
\n" + - "
\n", - - "Term 1\n\n: Definition a\n\nTerm 2\n\n: Definition b\n", - "
\n" + - "
Term 1
\n" + - "

Definition a

\n" + - "
Term 2
\n" + - "

Definition b

\n" + - "
\n", - - "Term 1\n\n: Definition a\n\n: Definition b\n\nTerm 2\n\n: Definition c\n", - "
\n" + - "
Term 1
\n" + - "

Definition a

\n" + - "

Definition b

\n" + - "
Term 2
\n" + - "

Definition c

\n" + - "
\n", - - "Term 1\n: Definition a\nNext line\n", - "
\n
Term 1
\n
Definition a\nNext line
\n
\n", - - "Term 1\n: Definition a\n Next line\n", - "
\n
Term 1
\n
Definition a\nNext line
\n
\n", - - "Term 1\n: Definition a \n Next line \n", - "
\n
Term 1
\n
Definition a\nNext line
\n
\n", - - "Term 1\n: Definition a\nNext line\n\nTerm 2\n: Definition b", - "
\n" + - "
Term 1
\n" + - "
Definition a\nNext line
\n" + - "
Term 2
\n" + - "
Definition b
\n" + - "
\n", - - "Term 1\n: Definition a\n", - "
\n
Term 1
\n
Definition a
\n
\n", - - "Term 1\n:Definition a\n", - "

Term 1\n:Definition a

\n", - - "Term 1\n\n: Definition a\n\nTerm 2\n\n: Definition b\n\nText 1", - "
\n" + - "
Term 1
\n" + - "

Definition a

\n" + - "
Term 2
\n" + - "

Definition b

\n" + - "
\n" + - "\n

Text 1

\n", - - "Term 1\n\n: Definition a\n\nText 1\n\nTerm 2\n\n: Definition b\n\nText 2", - "
\n" + - "
Term 1
\n" + - "

Definition a

\n" + - "
\n" + - "\n

Text 1

\n" + - "\n
\n" + - "
Term 2
\n" + - "

Definition b

\n" + - "
\n" + - "\n

Text 2

\n", - } - doTestsBlock(t, tests, DefinitionLists) -} - -func TestPreformattedHtml(t *testing.T) { - var tests = []string{ - "
\n", - "
\n", - - "
\n
\n", - "
\n
\n", - - "
\n
\nParagraph\n", - "

\n
\nParagraph

\n", - - "
\n
\n", - "
\n
\n", - - "
\nAnything here\n
\n", - "
\nAnything here\n
\n", - - "
\n Anything here\n
\n", - "
\n Anything here\n
\n", - - "
\nAnything here\n
\n", - "
\nAnything here\n
\n", - - "
\nThis is *not* &proceessed\n
\n", - "
\nThis is *not* &proceessed\n
\n", - - "\n Something\n\n", - "

\n Something\n

\n", - - "
\n Something here\n\n", - "

\n Something here\n

\n", - - "Paragraph\n
\nHere? >&<\n
\n", - "

Paragraph\n

\nHere? >&<\n

\n", - - "Paragraph\n\n
\nHow about here? >&<\n
\n", - "

Paragraph

\n\n
\nHow about here? >&<\n
\n", - - "Paragraph\n
\nHere? >&<\n
\nAnd here?\n", - "

Paragraph\n

\nHere? >&<\n
\nAnd here?

\n", - - "Paragraph\n\n
\nHow about here? >&<\n
\nAnd here?\n", - "

Paragraph

\n\n

\nHow about here? >&<\n
\nAnd here?

\n", - - "Paragraph\n
\nHere? >&<\n
\n\nAnd here?\n", - "

Paragraph\n

\nHere? >&<\n

\n\n

And here?

\n", - - "Paragraph\n\n
\nHow about here? >&<\n
\n\nAnd here?\n", - "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", - } - doTestsBlock(t, tests, 0) -} - -func TestPreformattedHtmlLax(t *testing.T) { - var tests = []string{ - "Paragraph\n
\nHere? >&<\n
\n", - "

Paragraph

\n\n
\nHere? >&<\n
\n", - - "Paragraph\n\n
\nHow about here? >&<\n
\n", - "

Paragraph

\n\n
\nHow about here? >&<\n
\n", - - "Paragraph\n
\nHere? >&<\n
\nAnd here?\n", - "

Paragraph

\n\n
\nHere? >&<\n
\n\n

And here?

\n", - - "Paragraph\n\n
\nHow about here? >&<\n
\nAnd here?\n", - "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", - - "Paragraph\n
\nHere? >&<\n
\n\nAnd here?\n", - "

Paragraph

\n\n
\nHere? >&<\n
\n\n

And here?

\n", - - "Paragraph\n\n
\nHow about here? >&<\n
\n\nAnd here?\n", - "

Paragraph

\n\n
\nHow about here? >&<\n
\n\n

And here?

\n", - } - doTestsBlock(t, tests, LaxHTMLBlocks) -} - -func TestFencedCodeBlock(t *testing.T) { - var tests = []string{ - "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", - "
func foo() bool {\n\treturn true;\n}\n
\n", - - "``` c\n/* special & char < > \" escaping */\n```\n", - "
/* special & char < > " escaping */\n
\n", - - "``` c\nno *inline* processing ~~of text~~\n```\n", - "
no *inline* processing ~~of text~~\n
\n", - - "```\nNo language\n```\n", - "
No language\n
\n", - - "``` {ocaml}\nlanguage in braces\n```\n", - "
language in braces\n
\n", - - "``` {ocaml} \nwith extra whitespace\n```\n", - "
with extra whitespace\n
\n", - - "```{ ocaml }\nwith extra whitespace\n```\n", - "
with extra whitespace\n
\n", - - "~ ~~ java\nWith whitespace\n~~~\n", - "

~ ~~ java\nWith whitespace\n~~~

\n", - - "~~\nonly two\n~~\n", - "

~~\nonly two\n~~

\n", - - "```` python\nextra\n````\n", - "
extra\n
\n", - - "~~~ perl\nthree to start, four to end\n~~~~\n", - "

~~~ perl\nthree to start, four to end\n~~~~

\n", - - "~~~~ perl\nfour to start, three to end\n~~~\n", - "

~~~~ perl\nfour to start, three to end\n~~~

\n", - - "~~~ bash\ntildes\n~~~\n", - "
tildes\n
\n", - - "``` lisp\nno ending\n", - "

``` lisp\nno ending

\n", - - "~~~ lisp\nend with language\n~~~ lisp\n", - "

~~~ lisp\nend with language\n~~~ lisp

\n", - - "```\nmismatched begin and end\n~~~\n", - "

```\nmismatched begin and end\n~~~

\n", - - "~~~\nmismatched begin and end\n```\n", - "

~~~\nmismatched begin and end\n```

\n", - - " ``` oz\nleading spaces\n```\n", - "
leading spaces\n
\n", - - " ``` oz\nleading spaces\n ```\n", - "
leading spaces\n
\n", - - " ``` oz\nleading spaces\n ```\n", - "
leading spaces\n
\n", - - "``` oz\nleading spaces\n ```\n", - "
leading spaces\n
\n", - - " ``` oz\nleading spaces\n ```\n", - "
``` oz\n
\n\n

leading spaces\n ```

\n", - - "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n", - "

Bla bla

\n\n
code blocks breakup paragraphs\n
\n\n

Bla Bla

\n", - - "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nAnd some text after a fenced code block", - "

Some text before a fenced code block

\n\n
code blocks breakup paragraphs\n
\n\n

And some text after a fenced code block

\n", - - "`", - "

`

\n", - - "Bla bla\n\n``` oz\ncode blocks breakup paragraphs\n```\n\nBla Bla\n\n``` oz\nmultiple code blocks work okay\n```\n\nBla Bla\n", - "

Bla bla

\n\n
code blocks breakup paragraphs\n
\n\n

Bla Bla

\n\n
multiple code blocks work okay\n
\n\n

Bla Bla

\n", - - "Some text before a fenced code block\n``` oz\ncode blocks breakup paragraphs\n```\nSome text in between\n``` oz\nmultiple code blocks work okay\n```\nAnd some text after a fenced code block", - "

Some text before a fenced code block

\n\n
code blocks breakup paragraphs\n
\n\n

Some text in between

\n\n
multiple code blocks work okay\n
\n\n

And some text after a fenced code block

\n", - - "```\n[]:()\n```\n", - "
[]:()\n
\n", - - "```\n[]:()\n[]:)\n[]:(\n[]:x\n[]:testing\n[:testing\n\n[]:\nlinebreak\n[]()\n\n[]:\n[]()\n```", - "
[]:()\n[]:)\n[]:(\n[]:x\n[]:testing\n[:testing\n\n[]:\nlinebreak\n[]()\n\n[]:\n[]()\n
\n", - } - doTestsBlock(t, tests, FencedCode) -} - -func TestFencedCodeInsideBlockquotes(t *testing.T) { - cat := func(s ...string) string { return strings.Join(s, "\n") } - var tests = []string{ - cat("> ```go", - "package moo", - "", - "```", - ""), - `
-
package moo
-
-
-
-`, - // ------------------------------------------- - cat("> foo", - "> ", - "> ```go", - "package moo", - "```", - "> ", - "> goo.", - ""), - `
-

foo

- -
package moo
-
- -

goo.

-
-`, - // ------------------------------------------- - cat("> foo", - "> ", - "> quote", - "continues", - "```", - ""), - `
-

foo

- -

quote -continues -` + "```" + `

-
-`, - // ------------------------------------------- - cat("> foo", - "> ", - "> ```go", - "package moo", - "```", - "> ", - "> goo.", - "> ", - "> ```go", - "package zoo", - "```", - "> ", - "> woo.", - ""), - `
-

foo

- -
package moo
-
- -

goo.

- -
package zoo
-
- -

woo.

-
-`, - } - - // These 2 alternative forms of blockquoted fenced code blocks should produce same output. - forms := [2]string{ - cat("> plain quoted text", - "> ```fenced", - "code", - " with leading single space correctly preserved", - "okay", - "```", - "> rest of quoted text"), - cat("> plain quoted text", - "> ```fenced", - "> code", - "> with leading single space correctly preserved", - "> okay", - "> ```", - "> rest of quoted text"), - } - want := `
-

plain quoted text

- -
code
- with leading single space correctly preserved
-okay
-
- -

rest of quoted text

-
-` - tests = append(tests, forms[0], want) - tests = append(tests, forms[1], want) - - doTestsBlock(t, tests, FencedCode) -} - -func TestTable(t *testing.T) { - var tests = []string{ - "a | b\n---|---\nc | d\n", - "\n\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n
ab
cd
\n", - - "a | b\n---|--\nc | d\n", - "

a | b\n---|--\nc | d

\n", - - "|a|b|c|d|\n|----|----|----|---|\n|e|f|g|h|\n", - "\n\n\n\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n\n\n
abcd
efgh
\n", - - "*a*|__b__|[c](C)|d\n---|---|---|---\ne|f|g|h\n", - "\n\n\n\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n\n\n
abcd
efgh
\n", - - "a|b|c\n---|---|---\nd|e|f\ng|h\ni|j|k|l|m\nn|o|p\n", - "\n\n\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n" + - "\n\n\n\n\n\n" + - "\n\n\n\n\n\n
abc
def
gh
ijk
nop
\n", - - "a|b|c\n---|---|---\n*d*|__e__|f\n", - "\n\n\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n\n
abc
def
\n", - - "a|b|c|d\n:--|--:|:-:|---\ne|f|g|h\n", - "\n\n\n\n\n" + - "\n\n\n\n\n" + - "\n\n\n\n" + - "\n\n\n\n
abcd
efgh
\n", - - "a|b|c\n---|---|---\n", - "\n\n\n\n\n\n\n\n\n\n\n
abc
\n", - - "a| b|c | d | e\n---|---|---|---|---\nf| g|h | i |j\n", - "\n\n\n\n\n\n\n\n\n\n\n" + - "\n\n\n\n\n\n\n\n\n
abcde
fghij
\n", - - "a|b\\|c|d\n---|---|---\nf|g\\|h|i\n", - "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ab|cd
fg|hi
\n", - } - doTestsBlock(t, tests, Tables) -} - -func TestUnorderedListWith_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { - var tests = []string{ - "* Hello\n", - "
    \n
  • Hello
  • \n
\n", - - "* Yin\n* Yang\n", - "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", - - "* Ting\n* Bong\n* Goo\n", - "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", - - "* Yin\n\n* Yang\n", - "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", - - "* Ting\n\n* Bong\n* Goo\n", - "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", - - "+ Hello\n", - "
    \n
  • Hello
  • \n
\n", - - "+ Yin\n+ Yang\n", - "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", - - "+ Ting\n+ Bong\n+ Goo\n", - "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", - - "+ Yin\n\n+ Yang\n", - "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", - - "+ Ting\n\n+ Bong\n+ Goo\n", - "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", - - "- Hello\n", - "
    \n
  • Hello
  • \n
\n", - - "- Yin\n- Yang\n", - "
    \n
  • Yin
  • \n
  • Yang
  • \n
\n", - - "- Ting\n- Bong\n- Goo\n", - "
    \n
  • Ting
  • \n
  • Bong
  • \n
  • Goo
  • \n
\n", - - "- Yin\n\n- Yang\n", - "
    \n
  • Yin

  • \n\n
  • Yang

  • \n
\n", - - "- Ting\n\n- Bong\n- Goo\n", - "
    \n
  • Ting

  • \n\n
  • Bong

  • \n\n
  • Goo

  • \n
\n", - - "*Hello\n", - "

*Hello

\n", - - "* Hello \n", - "
    \n
  • Hello
  • \n
\n", - - "* Hello \n Next line \n", - "
    \n
  • Hello\nNext line
  • \n
\n", - - "Paragraph\n* No linebreak\n", - "

Paragraph

\n\n
    \n
  • No linebreak
  • \n
\n", - - "Paragraph\n\n* Linebreak\n", - "

Paragraph

\n\n
    \n
  • Linebreak
  • \n
\n", - - "* List\n * Nested list\n", - "
    \n
  • List\n\n
      \n
    • Nested list
    • \n
  • \n
\n", - - "* List\n\n * Nested list\n", - "
    \n
  • List

    \n\n
      \n
    • Nested list
    • \n
  • \n
\n", - - "* List\n Second line\n\n + Nested\n", - "
    \n
  • List\nSecond line

    \n\n
      \n
    • Nested
    • \n
  • \n
\n", - - "* List\n + Nested\n\n Continued\n", - "
    \n
  • List

    \n\n
      \n
    • Nested
    • \n
    \n\n

    Continued

  • \n
\n", - - "* List\n * shallow indent\n", - "
    \n
  • List\n\n
      \n
    • shallow indent
    • \n
  • \n
\n", - - "* List\n" + - " * shallow indent\n" + - " * part of second list\n" + - " * still second\n" + - " * almost there\n" + - " * third level\n", - "
    \n" + - "
  • List\n\n" + - "
      \n" + - "
    • shallow indent
    • \n" + - "
    • part of second list
    • \n" + - "
    • still second
    • \n" + - "
    • almost there\n\n" + - "
        \n" + - "
      • third level
      • \n" + - "
    • \n" + - "
  • \n" + - "
\n", - - "* List\n extra indent, same paragraph\n", - "
    \n
  • List\n extra indent, same paragraph
  • \n
\n", - - "* List\n\n code block\n", - "
    \n
  • List

    \n\n
    code block\n
  • \n
\n", - - "* List\n\n code block with spaces\n", - "
    \n
  • List

    \n\n
      code block with spaces\n
  • \n
\n", - - "* List\n\n * sublist\n\n normal text\n\n * another sublist\n", - "
    \n
  • List

    \n\n
      \n
    • sublist
    • \n
    \n\n

    normal text

    \n\n
      \n
    • another sublist
    • \n
  • \n
\n", - } - doTestsBlock(t, tests, NoEmptyLineBeforeBlock) -} - -func TestOrderedList_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { - var tests = []string{ - "1. Hello\n", - "
    \n
  1. Hello
  2. \n
\n", - - "1. Yin\n2. Yang\n", - "
    \n
  1. Yin
  2. \n
  3. Yang
  4. \n
\n", - - "1. Ting\n2. Bong\n3. Goo\n", - "
    \n
  1. Ting
  2. \n
  3. Bong
  4. \n
  5. Goo
  6. \n
\n", - - "1. Yin\n\n2. Yang\n", - "
    \n
  1. Yin

  2. \n\n
  3. Yang

  4. \n
\n", - - "1. Ting\n\n2. Bong\n3. Goo\n", - "
    \n
  1. Ting

  2. \n\n
  3. Bong

  4. \n\n
  5. Goo

  6. \n
\n", - - "1 Hello\n", - "

1 Hello

\n", - - "1.Hello\n", - "

1.Hello

\n", - - "1. Hello \n", - "
    \n
  1. Hello
  2. \n
\n", - - "1. Hello \n Next line \n", - "
    \n
  1. Hello\nNext line
  2. \n
\n", - - "Paragraph\n1. No linebreak\n", - "

Paragraph

\n\n
    \n
  1. No linebreak
  2. \n
\n", - - "Paragraph\n\n1. Linebreak\n", - "

Paragraph

\n\n
    \n
  1. Linebreak
  2. \n
\n", - - "1. List\n 1. Nested list\n", - "
    \n
  1. List\n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", - - "1. List\n\n 1. Nested list\n", - "
    \n
  1. List

    \n\n
      \n
    1. Nested list
    2. \n
  2. \n
\n", - - "1. List\n Second line\n\n 1. Nested\n", - "
    \n
  1. List\nSecond line

    \n\n
      \n
    1. Nested
    2. \n
  2. \n
\n", - - "1. List\n 1. Nested\n\n Continued\n", - "
    \n
  1. List

    \n\n
      \n
    1. Nested
    2. \n
    \n\n

    Continued

  2. \n
\n", - - "1. List\n 1. shallow indent\n", - "
    \n
  1. List\n\n
      \n
    1. shallow indent
    2. \n
  2. \n
\n", - - "1. List\n" + - " 1. shallow indent\n" + - " 2. part of second list\n" + - " 3. still second\n" + - " 4. almost there\n" + - " 1. third level\n", - "
    \n" + - "
  1. List\n\n" + - "
      \n" + - "
    1. shallow indent
    2. \n" + - "
    3. part of second list
    4. \n" + - "
    5. still second
    6. \n" + - "
    7. almost there\n\n" + - "
        \n" + - "
      1. third level
      2. \n" + - "
    8. \n" + - "
  2. \n" + - "
\n", - - "1. List\n extra indent, same paragraph\n", - "
    \n
  1. List\n extra indent, same paragraph
  2. \n
\n", - - "1. List\n\n code block\n", - "
    \n
  1. List

    \n\n
    code block\n
  2. \n
\n", - - "1. List\n\n code block with spaces\n", - "
    \n
  1. List

    \n\n
      code block with spaces\n
  2. \n
\n", - - "1. List\n * Mixted list\n", - "
    \n
  1. List\n\n
      \n
    • Mixted list
    • \n
  2. \n
\n", - - "1. List\n * Mixed list\n", - "
    \n
  1. List\n\n
      \n
    • Mixed list
    • \n
  2. \n
\n", - - "* Start with unordered\n 1. Ordered\n", - "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", - - "* Start with unordered\n 1. Ordered\n", - "
    \n
  • Start with unordered\n\n
      \n
    1. Ordered
    2. \n
  • \n
\n", - - "1. numbers\n1. are ignored\n", - "
    \n
  1. numbers
  2. \n
  3. are ignored
  4. \n
\n", - } - doTestsBlock(t, tests, NoEmptyLineBeforeBlock) -} - -func TestFencedCodeBlock_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { - var tests = []string{ - "``` go\nfunc foo() bool {\n\treturn true;\n}\n```\n", - "
func foo() bool {\n\treturn true;\n}\n
\n", - - "``` c\n/* special & char < > \" escaping */\n```\n", - "
/* special & char < > " escaping */\n
\n", - - "``` c\nno *inline* processing ~~of text~~\n```\n", - "
no *inline* processing ~~of text~~\n
\n", - - "```\nNo language\n```\n", - "
No language\n
\n", - - "``` {ocaml}\nlanguage in braces\n```\n", - "
language in braces\n
\n", - - "``` {ocaml} \nwith extra whitespace\n```\n", - "
with extra whitespace\n
\n", - - "```{ ocaml }\nwith extra whitespace\n```\n", - "
with extra whitespace\n
\n", - - "~ ~~ java\nWith whitespace\n~~~\n", - "

~ ~~ java\nWith whitespace\n~~~

\n", - - "~~\nonly two\n~~\n", - "

~~\nonly two\n~~

\n", - - "```` python\nextra\n````\n", - "
extra\n
\n", - - "~~~ perl\nthree to start, four to end\n~~~~\n", - "

~~~ perl\nthree to start, four to end\n~~~~

\n", - - "~~~~ perl\nfour to start, three to end\n~~~\n", - "

~~~~ perl\nfour to start, three to end\n~~~

\n", - - "~~~ bash\ntildes\n~~~\n", - "
tildes\n
\n", - - "``` lisp\nno ending\n", - "

``` lisp\nno ending

\n", - - "~~~ lisp\nend with language\n~~~ lisp\n", - "

~~~ lisp\nend with language\n~~~ lisp

\n", - - "```\nmismatched begin and end\n~~~\n", - "

```\nmismatched begin and end\n~~~

\n", - - "~~~\nmismatched begin and end\n```\n", - "

~~~\nmismatched begin and end\n```

\n", - - " ``` oz\nleading spaces\n```\n", - "
leading spaces\n
\n", - - " ``` oz\nleading spaces\n ```\n", - "
leading spaces\n
\n", - - " ``` oz\nleading spaces\n ```\n", - "
leading spaces\n
\n", - - "``` oz\nleading spaces\n ```\n", - "
leading spaces\n
\n", - - " ``` oz\nleading spaces\n ```\n", - "
``` oz\n
\n\n

leading spaces

\n\n
```\n
\n", - } - doTestsBlock(t, tests, FencedCode|NoEmptyLineBeforeBlock) -} - -func TestTitleBlock_EXTENSION_TITLEBLOCK(t *testing.T) { - var tests = []string{ - "% Some title\n" + - "% Another title line\n" + - "% Yep, more here too\n", - "

" + - "Some title\n" + - "Another title line\n" + - "Yep, more here too" + - "

\n", - } - doTestsBlock(t, tests, Titleblock) -} - -func TestBlockComments(t *testing.T) { - var tests = []string{ - "Some text\n\n\n", - "

Some text

\n\n\n", - - "Some text\n\n\n", - "

Some text

\n\n\n", - - "Some text\n\n\n", - "

Some text

\n\n\n", - } - doTestsBlock(t, tests, 0) -} - -func TestTOC(t *testing.T) { - var tests = []string{ - "# Title\n\n##Subtitle1\n\n##Subtitle2", - //"\n\n

Title

\n\n

Subtitle1

\n\n

Subtitle2

\n", - ` - -

Title

- -

Subtitle1

- -

Subtitle2

-`, - - "# Title\n\n##Subtitle\n\n#Title2", - //"\n\n

Title

\n\n

Subtitle

\n\n

Title2

\n", - ` - -

Title

- -

Subtitle

- -

Title2

-`, - - "## Subtitle\n\n# Title", - ` - -

Subtitle

- -

Title

-`, - - "# Title 1\n\n## Subtitle 1\n\n### Subsubtitle 1\n\n# Title 2\n\n### Subsubtitle 2", - ` - -

Title 1

- -

Subtitle 1

- -

Subsubtitle 1

- -

Title 2

- -

Subsubtitle 2

-`, - - "# Title with `code`", - ` - -

Title with code

-`, - - // Trigger empty TOC - "#", - "", - } - doTestsParam(t, tests, TestParams{ - HTMLFlags: UseXHTML | TOC, - }) -} - -func TestCompletePage(t *testing.T) { - var tests = []string{ - "*foo*", - ` - - - - - - - - -

foo

- - - -`, - } - doTestsParam(t, tests, TestParams{HTMLFlags: UseXHTML | CompletePage}) -} - -func TestIsFenceLine(t *testing.T) { - tests := []struct { - data []byte - syntaxRequested bool - wantEnd int - wantMarker string - wantSyntax string - }{ - { - data: []byte("```"), - wantEnd: 3, - wantMarker: "```", - }, - { - data: []byte("```\nstuff here\n"), - wantEnd: 4, - wantMarker: "```", - }, - { - data: []byte("```\nstuff here\n"), - syntaxRequested: true, - wantEnd: 4, - wantMarker: "```", - }, - { - data: []byte("stuff here\n```\n"), - wantEnd: 0, - }, - { - data: []byte("```"), - syntaxRequested: true, - wantEnd: 3, - wantMarker: "```", - }, - { - data: []byte("``` go"), - syntaxRequested: true, - wantEnd: 6, - wantMarker: "```", - wantSyntax: "go", - }, - } - - for _, test := range tests { - var syntax *string - if test.syntaxRequested { - syntax = new(string) - } - end, marker := isFenceLine(test.data, syntax, "```") - if got, want := end, test.wantEnd; got != want { - t.Errorf("got end %v, want %v", got, want) - } - if got, want := marker, test.wantMarker; got != want { - t.Errorf("got marker %q, want %q", got, want) - } - if test.syntaxRequested { - if got, want := *syntax, test.wantSyntax; got != want { - t.Errorf("got syntax %q, want %q", got, want) - } - } - } -} diff --git a/vendor/github.com/documize/blackfriday/esc_test.go b/vendor/github.com/documize/blackfriday/esc_test.go deleted file mode 100644 index ff67d546..00000000 --- a/vendor/github.com/documize/blackfriday/esc_test.go +++ /dev/null @@ -1,48 +0,0 @@ -package blackfriday - -import ( - "bytes" - "testing" -) - -func TestEsc(t *testing.T) { - tests := []string{ - "abc", "abc", - "a&c", "a&c", - "<", "<", - "[]:<", "[]:<", - "Hello \n", - "

Hello

\n", - - "Hello ", - "

Hello

\n", - - "Hello \n", - "

Hello

\n", - - "Hello \na", - "

Hello \na

\n", - - "* list \n", - "
    \n
  • list
  • \n
\n", - - " comment\n", - "

comment

\n", - - "blahblah\n\nrhubarb\n", - "

blahblah\n\nrhubarb

\n", - } - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants | SmartypantsDashes}) -} - -func TestSmartDoubleQuotes(t *testing.T) { - var tests = []string{ - "this should be normal \"quoted\" text.\n", - "

this should be normal “quoted” text.

\n", - "this \" single double\n", - "

this “ single double

\n", - "two pair of \"some\" quoted \"text\".\n", - "

two pair of “some” quoted “text”.

\n"} - - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants}) -} - -func TestSmartDoubleQuotesNBSP(t *testing.T) { - var tests = []string{ - "this should be normal \"quoted\" text.\n", - "

this should be normal “ quoted ” text.

\n", - "this \" single double\n", - "

this “  single double

\n", - "two pair of \"some\" quoted \"text\".\n", - "

two pair of “ some ” quoted “ text ”.

\n"} - - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants | SmartypantsQuotesNBSP}) -} - -func TestSmartAngledDoubleQuotes(t *testing.T) { - var tests = []string{ - "this should be angled \"quoted\" text.\n", - "

this should be angled «quoted» text.

\n", - "this \" single double\n", - "

this « single double

\n", - "two pair of \"some\" quoted \"text\".\n", - "

two pair of «some» quoted «text».

\n"} - - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants | SmartypantsAngledQuotes}) -} - -func TestSmartAngledDoubleQuotesNBSP(t *testing.T) { - var tests = []string{ - "this should be angled \"quoted\" text.\n", - "

this should be angled « quoted » text.

\n", - "this \" single double\n", - "

this «  single double

\n", - "two pair of \"some\" quoted \"text\".\n", - "

two pair of « some » quoted « text ».

\n"} - - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants | SmartypantsAngledQuotes | SmartypantsQuotesNBSP}) -} - -func TestSmartFractions(t *testing.T) { - var tests = []string{ - "1/2, 1/4 and 3/4; 1/4th and 3/4ths\n", - "

½, ¼ and ¾; ¼th and ¾ths

\n", - "1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.\n", - "

1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.

\n"} - - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants}) - - tests = []string{ - "1/2, 2/3, 81/100 and 1000000/1048576.\n", - "

12, 23, 81100 and 10000001048576.

\n", - "1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.\n", - "

1/2/2015, 1/4/2015, 3/4/2015; 2015/1/2, 2015/1/4, 2015/3/4.

\n"} - - doTestsInlineParam(t, tests, TestParams{HTMLFlags: Smartypants | SmartypantsFractions}) -} - -func TestDisableSmartDashes(t *testing.T) { - doTestsInlineParam(t, []string{ - "foo - bar\n", - "

foo - bar

\n", - "foo -- bar\n", - "

foo -- bar

\n", - "foo --- bar\n", - "

foo --- bar

\n", - }, TestParams{}) - doTestsInlineParam(t, []string{ - "foo - bar\n", - "

foo – bar

\n", - "foo -- bar\n", - "

foo — bar

\n", - "foo --- bar\n", - "

foo —– bar

\n", - }, TestParams{HTMLFlags: Smartypants | SmartypantsDashes}) - doTestsInlineParam(t, []string{ - "foo - bar\n", - "

foo - bar

\n", - "foo -- bar\n", - "

foo – bar

\n", - "foo --- bar\n", - "

foo — bar

\n", - }, TestParams{HTMLFlags: Smartypants | SmartypantsLatexDashes | SmartypantsDashes}) - doTestsInlineParam(t, []string{ - "foo - bar\n", - "

foo - bar

\n", - "foo -- bar\n", - "

foo -- bar

\n", - "foo --- bar\n", - "

foo --- bar

\n", - }, TestParams{HTMLFlags: Smartypants | SmartypantsLatexDashes}) -} - -func TestSkipLinks(t *testing.T) { - doTestsInlineParam(t, []string{ - "[foo](gopher://foo.bar)", - "

foo

\n", - - "[foo](mailto://bar/)\n", - "

foo

\n", - }, TestParams{ - HTMLFlags: SkipLinks, - }) -} - -func TestSkipImages(t *testing.T) { - doTestsInlineParam(t, []string{ - "![foo](/bar/)\n", - "

\n", - }, TestParams{ - HTMLFlags: SkipImages, - }) -} - -func TestUseXHTML(t *testing.T) { - doTestsParam(t, []string{ - "---", - "
\n", - }, TestParams{}) - doTestsParam(t, []string{ - "---", - "
\n", - }, TestParams{HTMLFlags: UseXHTML}) -} - -func TestSkipHTML(t *testing.T) { - doTestsParam(t, []string{ - "
\n\ntext\n\n
the form
", - "

text

\n\n

the form

\n", - - "text inline html more text", - "

text inline html more text

\n", - }, TestParams{HTMLFlags: SkipHTML}) -} - -func BenchmarkSmartDoubleQuotes(b *testing.B) { - params := TestParams{HTMLFlags: Smartypants} - params.extensions |= Autolink | Strikethrough - params.HTMLFlags |= UseXHTML - - for i := 0; i < b.N; i++ { - runMarkdown("this should be normal \"quoted\" text.\n", params) - } -} diff --git a/vendor/github.com/documize/blackfriday/markdown_test.go b/vendor/github.com/documize/blackfriday/markdown_test.go deleted file mode 100644 index 2c7a262b..00000000 --- a/vendor/github.com/documize/blackfriday/markdown_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// -// Blackfriday Markdown Processor -// Available at http://github.com/russross/blackfriday -// -// Copyright © 2011 Russ Ross . -// Distributed under the Simplified BSD License. -// See README.md for details. -// - -// -// Unit tests for full document parsing and rendering -// - -package blackfriday - -import "testing" - -func TestDocument(t *testing.T) { - var tests = []string{ - // Empty document. - "", - "", - - " ", - "", - - // This shouldn't panic. - // https://github.com/russross/blackfriday/issues/172 - "[]:<", - "

[]:<

\n", - - // This shouldn't panic. - // https://github.com/russross/blackfriday/issues/173 - " [", - "

[

\n", - } - doTests(t, tests) -} diff --git a/vendor/github.com/documize/blackfriday/ref_test.go b/vendor/github.com/documize/blackfriday/ref_test.go deleted file mode 100644 index 4375f540..00000000 --- a/vendor/github.com/documize/blackfriday/ref_test.go +++ /dev/null @@ -1,124 +0,0 @@ -// -// Blackfriday Markdown Processor -// Available at http://github.com/russross/blackfriday -// -// Copyright © 2011 Russ Ross . -// Distributed under the Simplified BSD License. -// See README.md for details. -// - -// -// Markdown 1.0.3 reference tests -// - -package blackfriday - -import ( - "io/ioutil" - "path/filepath" - "testing" -) - -func TestReference(t *testing.T) { - files := []string{ - "Amps and angle encoding", - "Auto links", - "Backslash escapes", - "Blockquotes with code blocks", - "Code Blocks", - "Code Spans", - "Hard-wrapped paragraphs with list-like lines", - "Horizontal rules", - "Inline HTML (Advanced)", - "Inline HTML (Simple)", - "Inline HTML comments", - "Links, inline style", - "Links, reference style", - "Links, shortcut references", - "Literal quotes in titles", - "Markdown Documentation - Basics", - "Markdown Documentation - Syntax", - "Nested blockquotes", - "Ordered and unordered lists", - "Strong and em together", - "Tabs", - "Tidyness", - } - doTestsReference(t, files, 0) -} - -func TestReference_EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK(t *testing.T) { - files := []string{ - "Amps and angle encoding", - "Auto links", - "Backslash escapes", - "Blockquotes with code blocks", - "Code Blocks", - "Code Spans", - "Hard-wrapped paragraphs with list-like lines no empty line before block", - "Horizontal rules", - "Inline HTML (Advanced)", - "Inline HTML (Simple)", - "Inline HTML comments", - "Links, inline style", - "Links, reference style", - "Links, shortcut references", - "Literal quotes in titles", - "Markdown Documentation - Basics", - "Markdown Documentation - Syntax", - "Nested blockquotes", - "Ordered and unordered lists", - "Strong and em together", - "Tabs", - "Tidyness", - } - doTestsReference(t, files, NoEmptyLineBeforeBlock) -} - -// benchResultAnchor is an anchor variable to store the result of a benchmarked -// code so that compiler could never optimize away the call to runMarkdown() -var benchResultAnchor string - -func BenchmarkReference(b *testing.B) { - params := TestParams{extensions: CommonExtensions} - files := []string{ - "Amps and angle encoding", - "Auto links", - "Backslash escapes", - "Blockquotes with code blocks", - "Code Blocks", - "Code Spans", - "Hard-wrapped paragraphs with list-like lines", - "Horizontal rules", - "Inline HTML (Advanced)", - "Inline HTML (Simple)", - "Inline HTML comments", - "Links, inline style", - "Links, reference style", - "Links, shortcut references", - "Literal quotes in titles", - "Markdown Documentation - Basics", - "Markdown Documentation - Syntax", - "Nested blockquotes", - "Ordered and unordered lists", - "Strong and em together", - "Tabs", - "Tidyness", - } - var tests []string - for _, basename := range files { - filename := filepath.Join("testdata", basename+".text") - inputBytes, err := ioutil.ReadFile(filename) - if err != nil { - b.Errorf("Couldn't open '%s', error: %v\n", filename, err) - continue - } - tests = append(tests, string(inputBytes)) - } - b.ResetTimer() - for n := 0; n < b.N; n++ { - for _, test := range tests { - benchResultAnchor = runMarkdown(test, params) - } - } -} diff --git a/vendor/github.com/documize/blackfriday/testdata/Amps and angle encoding.html b/vendor/github.com/documize/blackfriday/testdata/Amps and angle encoding.html deleted file mode 100644 index 483f8ffa..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Amps and angle encoding.html +++ /dev/null @@ -1,17 +0,0 @@ -

AT&T has an ampersand in their name.

- -

AT&T is another way to write it.

- -

This & that.

- -

4 < 5.

- -

6 > 5.

- -

Here's a link with an ampersand in the URL.

- -

Here's a link with an amersand in the link text: AT&T.

- -

Here's an inline link.

- -

Here's an inline link.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Amps and angle encoding.text b/vendor/github.com/documize/blackfriday/testdata/Amps and angle encoding.text deleted file mode 100644 index 0e9527f9..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Amps and angle encoding.text +++ /dev/null @@ -1,21 +0,0 @@ -AT&T has an ampersand in their name. - -AT&T is another way to write it. - -This & that. - -4 < 5. - -6 > 5. - -Here's a [link] [1] with an ampersand in the URL. - -Here's a link with an amersand in the link text: [AT&T] [2]. - -Here's an inline [link](/script?foo=1&bar=2). - -Here's an inline [link](). - - -[1]: http://example.com/?foo=1&bar=2 -[2]: http://att.com/ "AT&T" \ No newline at end of file diff --git a/vendor/github.com/documize/blackfriday/testdata/Auto links.html b/vendor/github.com/documize/blackfriday/testdata/Auto links.html deleted file mode 100644 index b1791e7f..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Auto links.html +++ /dev/null @@ -1,18 +0,0 @@ -

Link: http://example.com/.

- -

With an ampersand: http://example.com/?foo=1&bar=2

- - - -
-

Blockquoted: http://example.com/

-
- -

Auto-links should not occur here: <http://example.com/>

- -
or here: <http://example.com/>
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Auto links.text b/vendor/github.com/documize/blackfriday/testdata/Auto links.text deleted file mode 100644 index abbc4886..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Auto links.text +++ /dev/null @@ -1,13 +0,0 @@ -Link: . - -With an ampersand: - -* In a list? -* -* It should. - -> Blockquoted: - -Auto-links should not occur here: `` - - or here: \ No newline at end of file diff --git a/vendor/github.com/documize/blackfriday/testdata/Backslash escapes.html b/vendor/github.com/documize/blackfriday/testdata/Backslash escapes.html deleted file mode 100644 index a73c998f..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Backslash escapes.html +++ /dev/null @@ -1,123 +0,0 @@ -

These should all get escaped:

- -

Backslash: \

- -

Backtick: `

- -

Asterisk: *

- -

Underscore: _

- -

Left brace: {

- -

Right brace: }

- -

Left bracket: [

- -

Right bracket: ]

- -

Left paren: (

- -

Right paren: )

- -

Greater-than: >

- -

Hash: #

- -

Period: .

- -

Bang: !

- -

Plus: +

- -

Minus: -

- -

Tilde: ~

- -

These should not, because they occur within a code block:

- -
Backslash: \\
-
-Backtick: \`
-
-Asterisk: \*
-
-Underscore: \_
-
-Left brace: \{
-
-Right brace: \}
-
-Left bracket: \[
-
-Right bracket: \]
-
-Left paren: \(
-
-Right paren: \)
-
-Greater-than: \>
-
-Hash: \#
-
-Period: \.
-
-Bang: \!
-
-Plus: \+
-
-Minus: \-
-
-Tilde: \~
-
- -

Nor should these, which occur in code spans:

- -

Backslash: \\

- -

Backtick: \`

- -

Asterisk: \*

- -

Underscore: \_

- -

Left brace: \{

- -

Right brace: \}

- -

Left bracket: \[

- -

Right bracket: \]

- -

Left paren: \(

- -

Right paren: \)

- -

Greater-than: \>

- -

Hash: \#

- -

Period: \.

- -

Bang: \!

- -

Plus: \+

- -

Minus: \-

- -

Tilde: \~

- -

These should get escaped, even though they're matching pairs for -other Markdown constructs:

- -

*asterisks*

- -

_underscores_

- -

`backticks`

- -

This is a code span with a literal backslash-backtick sequence: \`

- -

This is a tag with unescaped backticks bar.

- -

This is a tag with backslashes bar.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Backslash escapes.text b/vendor/github.com/documize/blackfriday/testdata/Backslash escapes.text deleted file mode 100644 index 04c20bd3..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Backslash escapes.text +++ /dev/null @@ -1,126 +0,0 @@ -These should all get escaped: - -Backslash: \\ - -Backtick: \` - -Asterisk: \* - -Underscore: \_ - -Left brace: \{ - -Right brace: \} - -Left bracket: \[ - -Right bracket: \] - -Left paren: \( - -Right paren: \) - -Greater-than: \> - -Hash: \# - -Period: \. - -Bang: \! - -Plus: \+ - -Minus: \- - -Tilde: \~ - - - -These should not, because they occur within a code block: - - Backslash: \\ - - Backtick: \` - - Asterisk: \* - - Underscore: \_ - - Left brace: \{ - - Right brace: \} - - Left bracket: \[ - - Right bracket: \] - - Left paren: \( - - Right paren: \) - - Greater-than: \> - - Hash: \# - - Period: \. - - Bang: \! - - Plus: \+ - - Minus: \- - - Tilde: \~ - - -Nor should these, which occur in code spans: - -Backslash: `\\` - -Backtick: `` \` `` - -Asterisk: `\*` - -Underscore: `\_` - -Left brace: `\{` - -Right brace: `\}` - -Left bracket: `\[` - -Right bracket: `\]` - -Left paren: `\(` - -Right paren: `\)` - -Greater-than: `\>` - -Hash: `\#` - -Period: `\.` - -Bang: `\!` - -Plus: `\+` - -Minus: `\-` - -Tilde: `\~` - - -These should get escaped, even though they're matching pairs for -other Markdown constructs: - -\*asterisks\* - -\_underscores\_ - -\`backticks\` - -This is a code span with a literal backslash-backtick sequence: `` \` `` - -This is a tag with unescaped backticks bar. - -This is a tag with backslashes bar. diff --git a/vendor/github.com/documize/blackfriday/testdata/Blockquotes with code blocks.html b/vendor/github.com/documize/blackfriday/testdata/Blockquotes with code blocks.html deleted file mode 100644 index 360fa9b1..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Blockquotes with code blocks.html +++ /dev/null @@ -1,15 +0,0 @@ -
-

Example:

- -
sub status {
-    print "working";
-}
-
- -

Or:

- -
sub status {
-    return "working";
-}
-
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Blockquotes with code blocks.text b/vendor/github.com/documize/blackfriday/testdata/Blockquotes with code blocks.text deleted file mode 100644 index c31d1710..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Blockquotes with code blocks.text +++ /dev/null @@ -1,11 +0,0 @@ -> Example: -> -> sub status { -> print "working"; -> } -> -> Or: -> -> sub status { -> return "working"; -> } diff --git a/vendor/github.com/documize/blackfriday/testdata/Code Blocks.html b/vendor/github.com/documize/blackfriday/testdata/Code Blocks.html deleted file mode 100644 index 32703f5c..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Code Blocks.html +++ /dev/null @@ -1,18 +0,0 @@ -
code block on the first line
-
- -

Regular text.

- -
code block indented by spaces
-
- -

Regular text.

- -
the lines in this block  
-all contain trailing spaces  
-
- -

Regular Text.

- -
code block on the last line
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Code Blocks.text b/vendor/github.com/documize/blackfriday/testdata/Code Blocks.text deleted file mode 100644 index b54b0928..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Code Blocks.text +++ /dev/null @@ -1,14 +0,0 @@ - code block on the first line - -Regular text. - - code block indented by spaces - -Regular text. - - the lines in this block - all contain trailing spaces - -Regular Text. - - code block on the last line \ No newline at end of file diff --git a/vendor/github.com/documize/blackfriday/testdata/Code Spans.html b/vendor/github.com/documize/blackfriday/testdata/Code Spans.html deleted file mode 100644 index ef85f95e..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Code Spans.html +++ /dev/null @@ -1,5 +0,0 @@ -

<test a=" content of attribute ">

- -

Fix for backticks within HTML tag: like this

- -

Here's how you put `backticks` in a code span.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Code Spans.text b/vendor/github.com/documize/blackfriday/testdata/Code Spans.text deleted file mode 100644 index 750a1973..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Code Spans.text +++ /dev/null @@ -1,6 +0,0 @@ -`` - -Fix for backticks within HTML tag: like this - -Here's how you put `` `backticks` `` in a code span. - diff --git a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html b/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html deleted file mode 100644 index fc253194..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.html +++ /dev/null @@ -1,14 +0,0 @@ -

In Markdown 1.0.0 and earlier. Version

- -
    -
  1. This line turns into a list item. -Because a hard-wrapped line in the -middle of a paragraph looked like a -list item.
  2. -
- -

Here's one with a bullet.

- -
    -
  • criminey.
  • -
diff --git a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text b/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text deleted file mode 100644 index f8a5b27b..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines no empty line before block.text +++ /dev/null @@ -1,8 +0,0 @@ -In Markdown 1.0.0 and earlier. Version -8. This line turns into a list item. -Because a hard-wrapped line in the -middle of a paragraph looked like a -list item. - -Here's one with a bullet. -* criminey. diff --git a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html b/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html deleted file mode 100644 index e21ac79a..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.html +++ /dev/null @@ -1,8 +0,0 @@ -

In Markdown 1.0.0 and earlier. Version -8. This line turns into a list item. -Because a hard-wrapped line in the -middle of a paragraph looked like a -list item.

- -

Here's one with a bullet. -* criminey.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text b/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text deleted file mode 100644 index f8a5b27b..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Hard-wrapped paragraphs with list-like lines.text +++ /dev/null @@ -1,8 +0,0 @@ -In Markdown 1.0.0 and earlier. Version -8. This line turns into a list item. -Because a hard-wrapped line in the -middle of a paragraph looked like a -list item. - -Here's one with a bullet. -* criminey. diff --git a/vendor/github.com/documize/blackfriday/testdata/Horizontal rules.html b/vendor/github.com/documize/blackfriday/testdata/Horizontal rules.html deleted file mode 100644 index e60d4ba2..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Horizontal rules.html +++ /dev/null @@ -1,71 +0,0 @@ -

Dashes:

- -
- -
- -
- -
- -
---
-
- -
- -
- -
- -
- -
- - -
-
- -

Asterisks:

- -
- -
- -
- -
- -
***
-
- -
- -
- -
- -
- -
* * *
-
- -

Underscores:

- -
- -
- -
- -
- -
___
-
- -
- -
- -
- -
- -
_ _ _
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Horizontal rules.text b/vendor/github.com/documize/blackfriday/testdata/Horizontal rules.text deleted file mode 100644 index 1594bda2..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Horizontal rules.text +++ /dev/null @@ -1,67 +0,0 @@ -Dashes: - ---- - - --- - - --- - - --- - - --- - -- - - - - - - - - - - - - - - - - - - - - - - - - -Asterisks: - -*** - - *** - - *** - - *** - - *** - -* * * - - * * * - - * * * - - * * * - - * * * - - -Underscores: - -___ - - ___ - - ___ - - ___ - - ___ - -_ _ _ - - _ _ _ - - _ _ _ - - _ _ _ - - _ _ _ diff --git a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Advanced).html b/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Advanced).html deleted file mode 100644 index 3af9cafb..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Advanced).html +++ /dev/null @@ -1,15 +0,0 @@ -

Simple block on one line:

- -
foo
- -

And nested without indentation:

- -
-
-
-foo -
-
-
-
bar
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Advanced).text b/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Advanced).text deleted file mode 100644 index 86b7206d..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Advanced).text +++ /dev/null @@ -1,15 +0,0 @@ -Simple block on one line: - -
foo
- -And nested without indentation: - -
-
-
-foo -
-
-
-
bar
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Simple).html b/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Simple).html deleted file mode 100644 index f84939c3..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Simple).html +++ /dev/null @@ -1,72 +0,0 @@ -

Here's a simple block:

- -
- foo -
- -

This should be a code block, though:

- -
<div>
-	foo
-</div>
-
- -

As should this:

- -
<div>foo</div>
-
- -

Now, nested:

- -
-
-
- foo -
-
-
- -

This should just be an HTML comment:

- - - -

Multiline:

- - - -

Code block:

- -
<!-- Comment -->
-
- -

Just plain comment, with trailing spaces on the line:

- - - -

Code:

- -
<hr />
-
- -

Hr's:

- -
- -
- -
- -
- -
- -
- -
- -
- -
diff --git a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Simple).text b/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Simple).text deleted file mode 100644 index 14aa2dc2..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Inline HTML (Simple).text +++ /dev/null @@ -1,69 +0,0 @@ -Here's a simple block: - -
- foo -
- -This should be a code block, though: - -
- foo -
- -As should this: - -
foo
- -Now, nested: - -
-
-
- foo -
-
-
- -This should just be an HTML comment: - - - -Multiline: - - - -Code block: - - - -Just plain comment, with trailing spaces on the line: - - - -Code: - -
- -Hr's: - -
- -
- -
- -
- -
- -
- -
- -
- -
- diff --git a/vendor/github.com/documize/blackfriday/testdata/Inline HTML comments.html b/vendor/github.com/documize/blackfriday/testdata/Inline HTML comments.html deleted file mode 100644 index f201242d..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Inline HTML comments.html +++ /dev/null @@ -1,13 +0,0 @@ -

Paragraph one.

- - - - - -

Paragraph two.

- - - -

The end.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Inline HTML comments.text b/vendor/github.com/documize/blackfriday/testdata/Inline HTML comments.text deleted file mode 100644 index 41d830d0..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Inline HTML comments.text +++ /dev/null @@ -1,13 +0,0 @@ -Paragraph one. - - - - - -Paragraph two. - - - -The end. diff --git a/vendor/github.com/documize/blackfriday/testdata/Links, inline style.html b/vendor/github.com/documize/blackfriday/testdata/Links, inline style.html deleted file mode 100644 index 5802f2de..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Links, inline style.html +++ /dev/null @@ -1,11 +0,0 @@ -

Just a URL.

- -

URL and title.

- -

URL and title.

- -

URL and title.

- -

URL and title.

- -

[Empty]().

diff --git a/vendor/github.com/documize/blackfriday/testdata/Links, inline style.text b/vendor/github.com/documize/blackfriday/testdata/Links, inline style.text deleted file mode 100644 index 09017a90..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Links, inline style.text +++ /dev/null @@ -1,12 +0,0 @@ -Just a [URL](/url/). - -[URL and title](/url/ "title"). - -[URL and title](/url/ "title preceded by two spaces"). - -[URL and title](/url/ "title preceded by a tab"). - -[URL and title](/url/ "title has spaces afterward" ). - - -[Empty](). diff --git a/vendor/github.com/documize/blackfriday/testdata/Links, reference style.html b/vendor/github.com/documize/blackfriday/testdata/Links, reference style.html deleted file mode 100644 index bebefdee..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Links, reference style.html +++ /dev/null @@ -1,52 +0,0 @@ -

Foo bar.

- -

Foo bar.

- -

Foo bar.

- -

With embedded [brackets].

- -

Indented once.

- -

Indented twice.

- -

Indented thrice.

- -

Indented [four][] times.

- -
[four]: /url
-
- -
- -

this should work

- -

So should this.

- -

And this.

- -

And this.

- -

And this.

- -

But not [that] [].

- -

Nor [that][].

- -

Nor [that].

- -

[Something in brackets like this should work]

- -

[Same with this.]

- -

In this case, this points to something else.

- -

Backslashing should suppress [this] and [this].

- -
- -

Here's one where the link -breaks across lines.

- -

Here's another where the link -breaks across lines, but with a line-ending space.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Links, reference style.text b/vendor/github.com/documize/blackfriday/testdata/Links, reference style.text deleted file mode 100644 index 341ec88e..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Links, reference style.text +++ /dev/null @@ -1,71 +0,0 @@ -Foo [bar] [1]. - -Foo [bar][1]. - -Foo [bar] -[1]. - -[1]: /url/ "Title" - - -With [embedded [brackets]] [b]. - - -Indented [once][]. - -Indented [twice][]. - -Indented [thrice][]. - -Indented [four][] times. - - [once]: /url - - [twice]: /url - - [thrice]: /url - - [four]: /url - - -[b]: /url/ - -* * * - -[this] [this] should work - -So should [this][this]. - -And [this] []. - -And [this][]. - -And [this]. - -But not [that] []. - -Nor [that][]. - -Nor [that]. - -[Something in brackets like [this][] should work] - -[Same with [this].] - -In this case, [this](/somethingelse/) points to something else. - -Backslashing should suppress \[this] and [this\]. - -[this]: foo - - -* * * - -Here's one where the [link -breaks] across lines. - -Here's another where the [link -breaks] across lines, but with a line-ending space. - - -[link breaks]: /url/ diff --git a/vendor/github.com/documize/blackfriday/testdata/Links, shortcut references.html b/vendor/github.com/documize/blackfriday/testdata/Links, shortcut references.html deleted file mode 100644 index 0b5e1d64..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Links, shortcut references.html +++ /dev/null @@ -1,9 +0,0 @@ -

This is the simple case.

- -

This one has a line -break.

- -

This one has a line -break with a line-ending space.

- -

this and the other

diff --git a/vendor/github.com/documize/blackfriday/testdata/Links, shortcut references.text b/vendor/github.com/documize/blackfriday/testdata/Links, shortcut references.text deleted file mode 100644 index 8c44c98f..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Links, shortcut references.text +++ /dev/null @@ -1,20 +0,0 @@ -This is the [simple case]. - -[simple case]: /simple - - - -This one has a [line -break]. - -This one has a [line -break] with a line-ending space. - -[line break]: /foo - - -[this] [that] and the [other] - -[this]: /this -[that]: /that -[other]: /other diff --git a/vendor/github.com/documize/blackfriday/testdata/Literal quotes in titles.html b/vendor/github.com/documize/blackfriday/testdata/Literal quotes in titles.html deleted file mode 100644 index 611c1ac6..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Literal quotes in titles.html +++ /dev/null @@ -1,3 +0,0 @@ -

Foo bar.

- -

Foo bar.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Literal quotes in titles.text b/vendor/github.com/documize/blackfriday/testdata/Literal quotes in titles.text deleted file mode 100644 index 29d0e423..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Literal quotes in titles.text +++ /dev/null @@ -1,7 +0,0 @@ -Foo [bar][]. - -Foo [bar](/url/ "Title with "quotes" inside"). - - - [bar]: /url/ "Title with "quotes" inside" - diff --git a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Basics.html b/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Basics.html deleted file mode 100644 index ea3a61c3..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Basics.html +++ /dev/null @@ -1,314 +0,0 @@ -

Markdown: Basics

- - - -

Getting the Gist of Markdown's Formatting Syntax

- -

This page offers a brief overview of what it's like to use Markdown. -The syntax page provides complete, detailed documentation for -every feature, but Markdown should be very easy to pick up simply by -looking at a few examples of it in action. The examples on this page -are written in a before/after style, showing example syntax and the -HTML output produced by Markdown.

- -

It's also helpful to simply try Markdown out; the Dingus is a -web application that allows you type your own Markdown-formatted text -and translate it to XHTML.

- -

Note: This document is itself written using Markdown; you -can see the source for it by adding '.text' to the URL.

- -

Paragraphs, Headers, Blockquotes

- -

A paragraph is simply one or more consecutive lines of text, separated -by one or more blank lines. (A blank line is any line that looks like a -blank line -- a line containing nothing spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs.

- -

Markdown offers two styles of headers: Setext and atx. -Setext-style headers for <h1> and <h2> are created by -"underlining" with equal signs (=) and hyphens (-), respectively. -To create an atx-style header, you put 1-6 hash marks (#) at the -beginning of the line -- the number of hashes equals the resulting -HTML header level.

- -

Blockquotes are indicated using email-style '>' angle brackets.

- -

Markdown:

- -
A First Level Header
-====================
-
-A Second Level Header
----------------------
-
-Now is the time for all good men to come to
-the aid of their country. This is just a
-regular paragraph.
-
-The quick brown fox jumped over the lazy
-dog's back.
-
-### Header 3
-
-> This is a blockquote.
-> 
-> This is the second paragraph in the blockquote.
->
-> ## This is an H2 in a blockquote
-
- -

Output:

- -
<h1>A First Level Header</h1>
-
-<h2>A Second Level Header</h2>
-
-<p>Now is the time for all good men to come to
-the aid of their country. This is just a
-regular paragraph.</p>
-
-<p>The quick brown fox jumped over the lazy
-dog's back.</p>
-
-<h3>Header 3</h3>
-
-<blockquote>
-    <p>This is a blockquote.</p>
-
-    <p>This is the second paragraph in the blockquote.</p>
-
-    <h2>This is an H2 in a blockquote</h2>
-</blockquote>
-
- -

Phrase Emphasis

- -

Markdown uses asterisks and underscores to indicate spans of emphasis.

- -

Markdown:

- -
Some of these words *are emphasized*.
-Some of these words _are emphasized also_.
-
-Use two asterisks for **strong emphasis**.
-Or, if you prefer, __use two underscores instead__.
-
- -

Output:

- -
<p>Some of these words <em>are emphasized</em>.
-Some of these words <em>are emphasized also</em>.</p>
-
-<p>Use two asterisks for <strong>strong emphasis</strong>.
-Or, if you prefer, <strong>use two underscores instead</strong>.</p>
-
- -

Lists

- -

Unordered (bulleted) lists use asterisks, pluses, and hyphens (*, -+, and -) as list markers. These three markers are -interchangable; this:

- -
*   Candy.
-*   Gum.
-*   Booze.
-
- -

this:

- -
+   Candy.
-+   Gum.
-+   Booze.
-
- -

and this:

- -
-   Candy.
--   Gum.
--   Booze.
-
- -

all produce the same output:

- -
<ul>
-<li>Candy.</li>
-<li>Gum.</li>
-<li>Booze.</li>
-</ul>
-
- -

Ordered (numbered) lists use regular numbers, followed by periods, as -list markers:

- -
1.  Red
-2.  Green
-3.  Blue
-
- -

Output:

- -
<ol>
-<li>Red</li>
-<li>Green</li>
-<li>Blue</li>
-</ol>
-
- -

If you put blank lines between items, you'll get <p> tags for the -list item text. You can create multi-paragraph list items by indenting -the paragraphs by 4 spaces or 1 tab:

- -
*   A list item.
-
-    With multiple paragraphs.
-
-*   Another item in the list.
-
- -

Output:

- -
<ul>
-<li><p>A list item.</p>
-<p>With multiple paragraphs.</p></li>
-<li><p>Another item in the list.</p></li>
-</ul>
-
- -

Links

- -

Markdown supports two styles for creating links: inline and -reference. With both styles, you use square brackets to delimit the -text you want to turn into a link.

- -

Inline-style links use parentheses immediately after the link text. -For example:

- -
This is an [example link](http://example.com/).
-
- -

Output:

- -
<p>This is an <a href="http://example.com/">
-example link</a>.</p>
-
- -

Optionally, you may include a title attribute in the parentheses:

- -
This is an [example link](http://example.com/ "With a Title").
-
- -

Output:

- -
<p>This is an <a href="http://example.com/" title="With a Title">
-example link</a>.</p>
-
- -

Reference-style links allow you to refer to your links by names, which -you define elsewhere in your document:

- -
I get 10 times more traffic from [Google][1] than from
-[Yahoo][2] or [MSN][3].
-
-[1]: http://google.com/        "Google"
-[2]: http://search.yahoo.com/  "Yahoo Search"
-[3]: http://search.msn.com/    "MSN Search"
-
- -

Output:

- -
<p>I get 10 times more traffic from <a href="http://google.com/"
-title="Google">Google</a> than from <a href="http://search.yahoo.com/"
-title="Yahoo Search">Yahoo</a> or <a href="http://search.msn.com/"
-title="MSN Search">MSN</a>.</p>
-
- -

The title attribute is optional. Link names may contain letters, -numbers and spaces, but are not case sensitive:

- -
I start my morning with a cup of coffee and
-[The New York Times][NY Times].
-
-[ny times]: http://www.nytimes.com/
-
- -

Output:

- -
<p>I start my morning with a cup of coffee and
-<a href="http://www.nytimes.com/">The New York Times</a>.</p>
-
- -

Images

- -

Image syntax is very much like link syntax.

- -

Inline (titles are optional):

- -
![alt text](/path/to/img.jpg "Title")
-
- -

Reference-style:

- -
![alt text][id]
-
-[id]: /path/to/img.jpg "Title"
-
- -

Both of the above examples produce the same output:

- -
<img src="/path/to/img.jpg" alt="alt text" title="Title" />
-
- -

Code

- -

In a regular paragraph, you can create code span by wrapping text in -backtick quotes. Any ampersands (&) and angle brackets (< or ->) will automatically be translated into HTML entities. This makes -it easy to use Markdown to write about HTML example code:

- -
I strongly recommend against using any `<blink>` tags.
-
-I wish SmartyPants used named entities like `&mdash;`
-instead of decimal-encoded entites like `&#8212;`.
-
- -

Output:

- -
<p>I strongly recommend against using any
-<code>&lt;blink&gt;</code> tags.</p>
-
-<p>I wish SmartyPants used named entities like
-<code>&amp;mdash;</code> instead of decimal-encoded
-entites like <code>&amp;#8212;</code>.</p>
-
- -

To specify an entire block of pre-formatted code, indent every line of -the block by 4 spaces or 1 tab. Just like with code spans, &, <, -and > characters will be escaped automatically.

- -

Markdown:

- -
If you want your page to validate under XHTML 1.0 Strict,
-you've got to put paragraph tags in your blockquotes:
-
-    <blockquote>
-        <p>For example.</p>
-    </blockquote>
-
- -

Output:

- -
<p>If you want your page to validate under XHTML 1.0 Strict,
-you've got to put paragraph tags in your blockquotes:</p>
-
-<pre><code>&lt;blockquote&gt;
-    &lt;p&gt;For example.&lt;/p&gt;
-&lt;/blockquote&gt;
-</code></pre>
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Basics.text b/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Basics.text deleted file mode 100644 index 486055ca..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Basics.text +++ /dev/null @@ -1,306 +0,0 @@ -Markdown: Basics -================ - - - - -Getting the Gist of Markdown's Formatting Syntax ------------------------------------------------- - -This page offers a brief overview of what it's like to use Markdown. -The [syntax page] [s] provides complete, detailed documentation for -every feature, but Markdown should be very easy to pick up simply by -looking at a few examples of it in action. The examples on this page -are written in a before/after style, showing example syntax and the -HTML output produced by Markdown. - -It's also helpful to simply try Markdown out; the [Dingus] [d] is a -web application that allows you type your own Markdown-formatted text -and translate it to XHTML. - -**Note:** This document is itself written using Markdown; you -can [see the source for it by adding '.text' to the URL] [src]. - - [s]: /projects/markdown/syntax "Markdown Syntax" - [d]: /projects/markdown/dingus "Markdown Dingus" - [src]: /projects/markdown/basics.text - - -## Paragraphs, Headers, Blockquotes ## - -A paragraph is simply one or more consecutive lines of text, separated -by one or more blank lines. (A blank line is any line that looks like a -blank line -- a line containing nothing spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs. - -Markdown offers two styles of headers: *Setext* and *atx*. -Setext-style headers for `

` and `

` are created by -"underlining" with equal signs (`=`) and hyphens (`-`), respectively. -To create an atx-style header, you put 1-6 hash marks (`#`) at the -beginning of the line -- the number of hashes equals the resulting -HTML header level. - -Blockquotes are indicated using email-style '`>`' angle brackets. - -Markdown: - - A First Level Header - ==================== - - A Second Level Header - --------------------- - - Now is the time for all good men to come to - the aid of their country. This is just a - regular paragraph. - - The quick brown fox jumped over the lazy - dog's back. - - ### Header 3 - - > This is a blockquote. - > - > This is the second paragraph in the blockquote. - > - > ## This is an H2 in a blockquote - - -Output: - -

A First Level Header

- -

A Second Level Header

- -

Now is the time for all good men to come to - the aid of their country. This is just a - regular paragraph.

- -

The quick brown fox jumped over the lazy - dog's back.

- -

Header 3

- -
-

This is a blockquote.

- -

This is the second paragraph in the blockquote.

- -

This is an H2 in a blockquote

-
- - - -### Phrase Emphasis ### - -Markdown uses asterisks and underscores to indicate spans of emphasis. - -Markdown: - - Some of these words *are emphasized*. - Some of these words _are emphasized also_. - - Use two asterisks for **strong emphasis**. - Or, if you prefer, __use two underscores instead__. - -Output: - -

Some of these words are emphasized. - Some of these words are emphasized also.

- -

Use two asterisks for strong emphasis. - Or, if you prefer, use two underscores instead.

- - - -## Lists ## - -Unordered (bulleted) lists use asterisks, pluses, and hyphens (`*`, -`+`, and `-`) as list markers. These three markers are -interchangable; this: - - * Candy. - * Gum. - * Booze. - -this: - - + Candy. - + Gum. - + Booze. - -and this: - - - Candy. - - Gum. - - Booze. - -all produce the same output: - -
    -
  • Candy.
  • -
  • Gum.
  • -
  • Booze.
  • -
- -Ordered (numbered) lists use regular numbers, followed by periods, as -list markers: - - 1. Red - 2. Green - 3. Blue - -Output: - -
    -
  1. Red
  2. -
  3. Green
  4. -
  5. Blue
  6. -
- -If you put blank lines between items, you'll get `

` tags for the -list item text. You can create multi-paragraph list items by indenting -the paragraphs by 4 spaces or 1 tab: - - * A list item. - - With multiple paragraphs. - - * Another item in the list. - -Output: - -

    -
  • A list item.

    -

    With multiple paragraphs.

  • -
  • Another item in the list.

  • -
- - - -### Links ### - -Markdown supports two styles for creating links: *inline* and -*reference*. With both styles, you use square brackets to delimit the -text you want to turn into a link. - -Inline-style links use parentheses immediately after the link text. -For example: - - This is an [example link](http://example.com/). - -Output: - -

This is an - example link.

- -Optionally, you may include a title attribute in the parentheses: - - This is an [example link](http://example.com/ "With a Title"). - -Output: - -

This is an - example link.

- -Reference-style links allow you to refer to your links by names, which -you define elsewhere in your document: - - I get 10 times more traffic from [Google][1] than from - [Yahoo][2] or [MSN][3]. - - [1]: http://google.com/ "Google" - [2]: http://search.yahoo.com/ "Yahoo Search" - [3]: http://search.msn.com/ "MSN Search" - -Output: - -

I get 10 times more traffic from Google than from Yahoo or MSN.

- -The title attribute is optional. Link names may contain letters, -numbers and spaces, but are *not* case sensitive: - - I start my morning with a cup of coffee and - [The New York Times][NY Times]. - - [ny times]: http://www.nytimes.com/ - -Output: - -

I start my morning with a cup of coffee and - The New York Times.

- - -### Images ### - -Image syntax is very much like link syntax. - -Inline (titles are optional): - - ![alt text](/path/to/img.jpg "Title") - -Reference-style: - - ![alt text][id] - - [id]: /path/to/img.jpg "Title" - -Both of the above examples produce the same output: - - alt text - - - -### Code ### - -In a regular paragraph, you can create code span by wrapping text in -backtick quotes. Any ampersands (`&`) and angle brackets (`<` or -`>`) will automatically be translated into HTML entities. This makes -it easy to use Markdown to write about HTML example code: - - I strongly recommend against using any `` tags. - - I wish SmartyPants used named entities like `—` - instead of decimal-encoded entites like `—`. - -Output: - -

I strongly recommend against using any - <blink> tags.

- -

I wish SmartyPants used named entities like - &mdash; instead of decimal-encoded - entites like &#8212;.

- - -To specify an entire block of pre-formatted code, indent every line of -the block by 4 spaces or 1 tab. Just like with code spans, `&`, `<`, -and `>` characters will be escaped automatically. - -Markdown: - - If you want your page to validate under XHTML 1.0 Strict, - you've got to put paragraph tags in your blockquotes: - -
-

For example.

-
- -Output: - -

If you want your page to validate under XHTML 1.0 Strict, - you've got to put paragraph tags in your blockquotes:

- -
<blockquote>
-        <p>For example.</p>
-    </blockquote>
-    
diff --git a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Syntax.html b/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Syntax.html deleted file mode 100644 index 6cd05fb9..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Syntax.html +++ /dev/null @@ -1,946 +0,0 @@ -

Markdown: Syntax

- - - - - -

Note: This document is itself written using Markdown; you -can see the source for it by adding '.text' to the URL.

- -
- -

Overview

- -

Philosophy

- -

Markdown is intended to be as easy-to-read and easy-to-write as is feasible.

- -

Readability, however, is emphasized above all else. A Markdown-formatted -document should be publishable as-is, as plain text, without looking -like it's been marked up with tags or formatting instructions. While -Markdown's syntax has been influenced by several existing text-to-HTML -filters -- including Setext, atx, Textile, reStructuredText, -Grutatext, and EtText -- the single biggest source of -inspiration for Markdown's syntax is the format of plain text email.

- -

To this end, Markdown's syntax is comprised entirely of punctuation -characters, which punctuation characters have been carefully chosen so -as to look like what they mean. E.g., asterisks around a word actually -look like *emphasis*. Markdown lists look like, well, lists. Even -blockquotes look like quoted passages of text, assuming you've ever -used email.

- -

Inline HTML

- -

Markdown's syntax is intended for one purpose: to be used as a -format for writing for the web.

- -

Markdown is not a replacement for HTML, or even close to it. Its -syntax is very small, corresponding only to a very small subset of -HTML tags. The idea is not to create a syntax that makes it easier -to insert HTML tags. In my opinion, HTML tags are already easy to -insert. The idea for Markdown is to make it easy to read, write, and -edit prose. HTML is a publishing format; Markdown is a writing -format. Thus, Markdown's formatting syntax only addresses issues that -can be conveyed in plain text.

- -

For any markup that is not covered by Markdown's syntax, you simply -use HTML itself. There's no need to preface it or delimit it to -indicate that you're switching from Markdown to HTML; you just use -the tags.

- -

The only restrictions are that block-level HTML elements -- e.g. <div>, -<table>, <pre>, <p>, etc. -- must be separated from surrounding -content by blank lines, and the start and end tags of the block should -not be indented with tabs or spaces. Markdown is smart enough not -to add extra (unwanted) <p> tags around HTML block-level tags.

- -

For example, to add an HTML table to a Markdown article:

- -
This is a regular paragraph.
-
-<table>
-    <tr>
-        <td>Foo</td>
-    </tr>
-</table>
-
-This is another regular paragraph.
-
- -

Note that Markdown formatting syntax is not processed within block-level -HTML tags. E.g., you can't use Markdown-style *emphasis* inside an -HTML block.

- -

Span-level HTML tags -- e.g. <span>, <cite>, or <del> -- can be -used anywhere in a Markdown paragraph, list item, or header. If you -want, you can even use HTML tags instead of Markdown formatting; e.g. if -you'd prefer to use HTML <a> or <img> tags instead of Markdown's -link or image syntax, go right ahead.

- -

Unlike block-level HTML tags, Markdown syntax is processed within -span-level tags.

- -

Automatic Escaping for Special Characters

- -

In HTML, there are two characters that demand special treatment: < -and &. Left angle brackets are used to start tags; ampersands are -used to denote HTML entities. If you want to use them as literal -characters, you must escape them as entities, e.g. &lt;, and -&amp;.

- -

Ampersands in particular are bedeviling for web writers. If you want to -write about 'AT&T', you need to write 'AT&amp;T'. You even need to -escape ampersands within URLs. Thus, if you want to link to:

- -
http://images.google.com/images?num=30&q=larry+bird
-
- -

you need to encode the URL as:

- -
http://images.google.com/images?num=30&amp;q=larry+bird
-
- -

in your anchor tag href attribute. Needless to say, this is easy to -forget, and is probably the single most common source of HTML validation -errors in otherwise well-marked-up web sites.

- -

Markdown allows you to use these characters naturally, taking care of -all the necessary escaping for you. If you use an ampersand as part of -an HTML entity, it remains unchanged; otherwise it will be translated -into &amp;.

- -

So, if you want to include a copyright symbol in your article, you can write:

- -
&copy;
-
- -

and Markdown will leave it alone. But if you write:

- -
AT&T
-
- -

Markdown will translate it to:

- -
AT&amp;T
-
- -

Similarly, because Markdown supports inline HTML, if you use -angle brackets as delimiters for HTML tags, Markdown will treat them as -such. But if you write:

- -
4 < 5
-
- -

Markdown will translate it to:

- -
4 &lt; 5
-
- -

However, inside Markdown code spans and blocks, angle brackets and -ampersands are always encoded automatically. This makes it easy to use -Markdown to write about HTML code. (As opposed to raw HTML, which is a -terrible format for writing about HTML syntax, because every single < -and & in your example code needs to be escaped.)

- -
- -

Block Elements

- -

Paragraphs and Line Breaks

- -

A paragraph is simply one or more consecutive lines of text, separated -by one or more blank lines. (A blank line is any line that looks like a -blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs.

- -

The implication of the "one or more consecutive lines of text" rule is -that Markdown supports "hard-wrapped" text paragraphs. This differs -significantly from most other text-to-HTML formatters (including Movable -Type's "Convert Line Breaks" option) which translate every line break -character in a paragraph into a <br /> tag.

- -

When you do want to insert a <br /> break tag using Markdown, you -end a line with two or more spaces, then type return.

- -

Yes, this takes a tad more effort to create a <br />, but a simplistic -"every line break is a <br />" rule wouldn't work for Markdown. -Markdown's email-style blockquoting and multi-paragraph list items -work best -- and look better -- when you format them with hard breaks.

- - - -

Markdown supports two styles of headers, Setext and atx.

- -

Setext-style headers are "underlined" using equal signs (for first-level -headers) and dashes (for second-level headers). For example:

- -
This is an H1
-=============
-
-This is an H2
--------------
-
- -

Any number of underlining ='s or -'s will work.

- -

Atx-style headers use 1-6 hash characters at the start of the line, -corresponding to header levels 1-6. For example:

- -
# This is an H1
-
-## This is an H2
-
-###### This is an H6
-
- -

Optionally, you may "close" atx-style headers. This is purely -cosmetic -- you can use this if you think it looks better. The -closing hashes don't even need to match the number of hashes -used to open the header. (The number of opening hashes -determines the header level.) :

- -
# This is an H1 #
-
-## This is an H2 ##
-
-### This is an H3 ######
-
- -

Blockquotes

- -

Markdown uses email-style > characters for blockquoting. If you're -familiar with quoting passages of text in an email message, then you -know how to create a blockquote in Markdown. It looks best if you hard -wrap the text and put a > before every line:

- -
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
-> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
-> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
-> 
-> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
-> id sem consectetuer libero luctus adipiscing.
-
- -

Markdown allows you to be lazy and only put the > before the first -line of a hard-wrapped paragraph:

- -
> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
-consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
-Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
-
-> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
-id sem consectetuer libero luctus adipiscing.
-
- -

Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by -adding additional levels of >:

- -
> This is the first level of quoting.
->
-> > This is nested blockquote.
->
-> Back to the first level.
-
- -

Blockquotes can contain other Markdown elements, including headers, lists, -and code blocks:

- -
> ## This is a header.
-> 
-> 1.   This is the first list item.
-> 2.   This is the second list item.
-> 
-> Here's some example code:
-> 
->     return shell_exec("echo $input | $markdown_script");
-
- -

Any decent text editor should make email-style quoting easy. For -example, with BBEdit, you can make a selection and choose Increase -Quote Level from the Text menu.

- -

Lists

- -

Markdown supports ordered (numbered) and unordered (bulleted) lists.

- -

Unordered lists use asterisks, pluses, and hyphens -- interchangably --- as list markers:

- -
*   Red
-*   Green
-*   Blue
-
- -

is equivalent to:

- -
+   Red
-+   Green
-+   Blue
-
- -

and:

- -
-   Red
--   Green
--   Blue
-
- -

Ordered lists use numbers followed by periods:

- -
1.  Bird
-2.  McHale
-3.  Parish
-
- -

It's important to note that the actual numbers you use to mark the -list have no effect on the HTML output Markdown produces. The HTML -Markdown produces from the above list is:

- -
<ol>
-<li>Bird</li>
-<li>McHale</li>
-<li>Parish</li>
-</ol>
-
- -

If you instead wrote the list in Markdown like this:

- -
1.  Bird
-1.  McHale
-1.  Parish
-
- -

or even:

- -
3. Bird
-1. McHale
-8. Parish
-
- -

you'd get the exact same HTML output. The point is, if you want to, -you can use ordinal numbers in your ordered Markdown lists, so that -the numbers in your source match the numbers in your published HTML. -But if you want to be lazy, you don't have to.

- -

If you do use lazy list numbering, however, you should still start the -list with the number 1. At some point in the future, Markdown may support -starting ordered lists at an arbitrary number.

- -

List markers typically start at the left margin, but may be indented by -up to three spaces. List markers must be followed by one or more spaces -or a tab.

- -

To make lists look nice, you can wrap items with hanging indents:

- -
*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
-    viverra nec, fringilla in, laoreet vitae, risus.
-*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
-    Suspendisse id sem consectetuer libero luctus adipiscing.
-
- -

But if you want to be lazy, you don't have to:

- -
*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
-Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
-viverra nec, fringilla in, laoreet vitae, risus.
-*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
-Suspendisse id sem consectetuer libero luctus adipiscing.
-
- -

If list items are separated by blank lines, Markdown will wrap the -items in <p> tags in the HTML output. For example, this input:

- -
*   Bird
-*   Magic
-
- -

will turn into:

- -
<ul>
-<li>Bird</li>
-<li>Magic</li>
-</ul>
-
- -

But this:

- -
*   Bird
-
-*   Magic
-
- -

will turn into:

- -
<ul>
-<li><p>Bird</p></li>
-<li><p>Magic</p></li>
-</ul>
-
- -

List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces -or one tab:

- -
1.  This is a list item with two paragraphs. Lorem ipsum dolor
-    sit amet, consectetuer adipiscing elit. Aliquam hendrerit
-    mi posuere lectus.
-
-    Vestibulum enim wisi, viverra nec, fringilla in, laoreet
-    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
-    sit amet velit.
-
-2.  Suspendisse id sem consectetuer libero luctus adipiscing.
-
- -

It looks nice if you indent every line of the subsequent -paragraphs, but here again, Markdown will allow you to be -lazy:

- -
*   This is a list item with two paragraphs.
-
-    This is the second paragraph in the list item. You're
-only required to indent the first line. Lorem ipsum dolor
-sit amet, consectetuer adipiscing elit.
-
-*   Another item in the same list.
-
- -

To put a blockquote within a list item, the blockquote's > -delimiters need to be indented:

- -
*   A list item with a blockquote:
-
-    > This is a blockquote
-    > inside a list item.
-
- -

To put a code block within a list item, the code block needs -to be indented twice -- 8 spaces or two tabs:

- -
*   A list item with a code block:
-
-        <code goes here>
-
- -

It's worth noting that it's possible to trigger an ordered list by -accident, by writing something like this:

- -
1986. What a great season.
-
- -

In other words, a number-period-space sequence at the beginning of a -line. To avoid this, you can backslash-escape the period:

- -
1986\. What a great season.
-
- -

Code Blocks

- -

Pre-formatted code blocks are used for writing about programming or -markup source code. Rather than forming normal paragraphs, the lines -of a code block are interpreted literally. Markdown wraps a code block -in both <pre> and <code> tags.

- -

To produce a code block in Markdown, simply indent every line of the -block by at least 4 spaces or 1 tab. For example, given this input:

- -
This is a normal paragraph:
-
-    This is a code block.
-
- -

Markdown will generate:

- -
<p>This is a normal paragraph:</p>
-
-<pre><code>This is a code block.
-</code></pre>
-
- -

One level of indentation -- 4 spaces or 1 tab -- is removed from each -line of the code block. For example, this:

- -
Here is an example of AppleScript:
-
-    tell application "Foo"
-        beep
-    end tell
-
- -

will turn into:

- -
<p>Here is an example of AppleScript:</p>
-
-<pre><code>tell application "Foo"
-    beep
-end tell
-</code></pre>
-
- -

A code block continues until it reaches a line that is not indented -(or the end of the article).

- -

Within a code block, ampersands (&) and angle brackets (< and >) -are automatically converted into HTML entities. This makes it very -easy to include example HTML source code using Markdown -- just paste -it and indent it, and Markdown will handle the hassle of encoding the -ampersands and angle brackets. For example, this:

- -
    <div class="footer">
-        &copy; 2004 Foo Corporation
-    </div>
-
- -

will turn into:

- -
<pre><code>&lt;div class="footer"&gt;
-    &amp;copy; 2004 Foo Corporation
-&lt;/div&gt;
-</code></pre>
-
- -

Regular Markdown syntax is not processed within code blocks. E.g., -asterisks are just literal asterisks within a code block. This means -it's also easy to use Markdown to write about Markdown's own syntax.

- -

Horizontal Rules

- -

You can produce a horizontal rule tag (<hr />) by placing three or -more hyphens, asterisks, or underscores on a line by themselves. If you -wish, you may use spaces between the hyphens or asterisks. Each of the -following lines will produce a horizontal rule:

- -
* * *
-
-***
-
-*****
-
-- - -
-
----------------------------------------
-
-_ _ _
-
- -
- -

Span Elements

- - - -

Markdown supports two style of links: inline and reference.

- -

In both styles, the link text is delimited by [square brackets].

- -

To create an inline link, use a set of regular parentheses immediately -after the link text's closing square bracket. Inside the parentheses, -put the URL where you want the link to point, along with an optional -title for the link, surrounded in quotes. For example:

- -
This is [an example](http://example.com/ "Title") inline link.
-
-[This link](http://example.net/) has no title attribute.
-
- -

Will produce:

- -
<p>This is <a href="http://example.com/" title="Title">
-an example</a> inline link.</p>
-
-<p><a href="http://example.net/">This link</a> has no
-title attribute.</p>
-
- -

If you're referring to a local resource on the same server, you can -use relative paths:

- -
See my [About](/about/) page for details.
-
- -

Reference-style links use a second set of square brackets, inside -which you place a label of your choosing to identify the link:

- -
This is [an example][id] reference-style link.
-
- -

You can optionally use a space to separate the sets of brackets:

- -
This is [an example] [id] reference-style link.
-
- -

Then, anywhere in the document, you define your link label like this, -on a line by itself:

- -
[id]: http://example.com/  "Optional Title Here"
-
- -

That is:

- -
    -
  • Square brackets containing the link identifier (optionally -indented from the left margin using up to three spaces);
  • -
  • followed by a colon;
  • -
  • followed by one or more spaces (or tabs);
  • -
  • followed by the URL for the link;
  • -
  • optionally followed by a title attribute for the link, enclosed -in double or single quotes.
  • -
- -

The link URL may, optionally, be surrounded by angle brackets:

- -
[id]: <http://example.com/>  "Optional Title Here"
-
- -

You can put the title attribute on the next line and use extra spaces -or tabs for padding, which tends to look better with longer URLs:

- -
[id]: http://example.com/longish/path/to/resource/here
-    "Optional Title Here"
-
- -

Link definitions are only used for creating links during Markdown -processing, and are stripped from your document in the HTML output.

- -

Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are not case sensitive. E.g. these two links:

- -
[link text][a]
-[link text][A]
-
- -

are equivalent.

- -

The implicit link name shortcut allows you to omit the name of the -link, in which case the link text itself is used as the name. -Just use an empty set of square brackets -- e.g., to link the word -"Google" to the google.com web site, you could simply write:

- -
[Google][]
-
- -

And then define the link:

- -
[Google]: http://google.com/
-
- -

Because link names may contain spaces, this shortcut even works for -multiple words in the link text:

- -
Visit [Daring Fireball][] for more information.
-
- -

And then define the link:

- -
[Daring Fireball]: http://daringfireball.net/
-
- -

Link definitions can be placed anywhere in your Markdown document. I -tend to put them immediately after each paragraph in which they're -used, but if you want, you can put them all at the end of your -document, sort of like footnotes.

- -

Here's an example of reference links in action:

- -
I get 10 times more traffic from [Google] [1] than from
-[Yahoo] [2] or [MSN] [3].
-
-  [1]: http://google.com/        "Google"
-  [2]: http://search.yahoo.com/  "Yahoo Search"
-  [3]: http://search.msn.com/    "MSN Search"
-
- -

Using the implicit link name shortcut, you could instead write:

- -
I get 10 times more traffic from [Google][] than from
-[Yahoo][] or [MSN][].
-
-  [google]: http://google.com/        "Google"
-  [yahoo]:  http://search.yahoo.com/  "Yahoo Search"
-  [msn]:    http://search.msn.com/    "MSN Search"
-
- -

Both of the above examples will produce the following HTML output:

- -
<p>I get 10 times more traffic from <a href="http://google.com/"
-title="Google">Google</a> than from
-<a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a>
-or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
-
- -

For comparison, here is the same paragraph written using -Markdown's inline link style:

- -
I get 10 times more traffic from [Google](http://google.com/ "Google")
-than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or
-[MSN](http://search.msn.com/ "MSN Search").
-
- -

The point of reference-style links is not that they're easier to -write. The point is that with reference-style links, your document -source is vastly more readable. Compare the above examples: using -reference-style links, the paragraph itself is only 81 characters -long; with inline-style links, it's 176 characters; and as raw HTML, -it's 234 characters. In the raw HTML, there's more markup than there -is text.

- -

With Markdown's reference-style links, a source document much more -closely resembles the final output, as rendered in a browser. By -allowing you to move the markup-related metadata out of the paragraph, -you can add links without interrupting the narrative flow of your -prose.

- -

Emphasis

- -

Markdown treats asterisks (*) and underscores (_) as indicators of -emphasis. Text wrapped with one * or _ will be wrapped with an -HTML <em> tag; double *'s or _'s will be wrapped with an HTML -<strong> tag. E.g., this input:

- -
*single asterisks*
-
-_single underscores_
-
-**double asterisks**
-
-__double underscores__
-
- -

will produce:

- -
<em>single asterisks</em>
-
-<em>single underscores</em>
-
-<strong>double asterisks</strong>
-
-<strong>double underscores</strong>
-
- -

You can use whichever style you prefer; the lone restriction is that -the same character must be used to open and close an emphasis span.

- -

Emphasis can be used in the middle of a word:

- -
un*fucking*believable
-
- -

But if you surround an * or _ with spaces, it'll be treated as a -literal asterisk or underscore.

- -

To produce a literal asterisk or underscore at a position where it -would otherwise be used as an emphasis delimiter, you can backslash -escape it:

- -
\*this text is surrounded by literal asterisks\*
-
- -

Code

- -

To indicate a span of code, wrap it with backtick quotes (`). -Unlike a pre-formatted code block, a code span indicates code within a -normal paragraph. For example:

- -
Use the `printf()` function.
-
- -

will produce:

- -
<p>Use the <code>printf()</code> function.</p>
-
- -

To include a literal backtick character within a code span, you can use -multiple backticks as the opening and closing delimiters:

- -
``There is a literal backtick (`) here.``
-
- -

which will produce this:

- -
<p><code>There is a literal backtick (`) here.</code></p>
-
- -

The backtick delimiters surrounding a code span may include spaces -- -one after the opening, one before the closing. This allows you to place -literal backtick characters at the beginning or end of a code span:

- -
A single backtick in a code span: `` ` ``
-
-A backtick-delimited string in a code span: `` `foo` ``
-
- -

will produce:

- -
<p>A single backtick in a code span: <code>`</code></p>
-
-<p>A backtick-delimited string in a code span: <code>`foo`</code></p>
-
- -

With a code span, ampersands and angle brackets are encoded as HTML -entities automatically, which makes it easy to include example HTML -tags. Markdown will turn this:

- -
Please don't use any `<blink>` tags.
-
- -

into:

- -
<p>Please don't use any <code>&lt;blink&gt;</code> tags.</p>
-
- -

You can write this:

- -
`&#8212;` is the decimal-encoded equivalent of `&mdash;`.
-
- -

to produce:

- -
<p><code>&amp;#8212;</code> is the decimal-encoded
-equivalent of <code>&amp;mdash;</code>.</p>
-
- -

Images

- -

Admittedly, it's fairly difficult to devise a "natural" syntax for -placing images into a plain text document format.

- -

Markdown uses an image syntax that is intended to resemble the syntax -for links, allowing for two styles: inline and reference.

- -

Inline image syntax looks like this:

- -
![Alt text](/path/to/img.jpg)
-
-![Alt text](/path/to/img.jpg "Optional title")
-
- -

That is:

- -
    -
  • An exclamation mark: !;
  • -
  • followed by a set of square brackets, containing the alt -attribute text for the image;
  • -
  • followed by a set of parentheses, containing the URL or path to -the image, and an optional title attribute enclosed in double -or single quotes.
  • -
- -

Reference-style image syntax looks like this:

- -
![Alt text][id]
-
- -

Where "id" is the name of a defined image reference. Image references -are defined using syntax identical to link references:

- -
[id]: url/to/image  "Optional title attribute"
-
- -

As of this writing, Markdown has no syntax for specifying the -dimensions of an image; if this is important to you, you can simply -use regular HTML <img> tags.

- -
- -

Miscellaneous

- - - -

Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this:

- -
<http://example.com/>
-
- -

Markdown will turn this into:

- -
<a href="http://example.com/">http://example.com/</a>
-
- -

Automatic links for email addresses work similarly, except that -Markdown will also perform a bit of randomized decimal and hex -entity-encoding to help obscure your address from address-harvesting -spambots. For example, Markdown will turn this:

- -
<address@example.com>
-
- -

into something like this:

- -
<a href="&#x6D;&#x61;i&#x6C;&#x74;&#x6F;:&#x61;&#x64;&#x64;&#x72;&#x65;
-&#115;&#115;&#64;&#101;&#120;&#x61;&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;
-&#109;">&#x61;&#x64;&#x64;&#x72;&#x65;&#115;&#115;&#64;&#101;&#120;&#x61;
-&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>
-
- -

which will render in a browser as a clickable link to "address@example.com".

- -

(This sort of entity-encoding trick will indeed fool many, if not -most, address-harvesting bots, but it definitely won't fool all of -them. It's better than nothing, but an address published in this way -will probably eventually start receiving spam.)

- -

Backslash Escapes

- -

Markdown allows you to use backslash escapes to generate literal -characters which would otherwise have special meaning in Markdown's -formatting syntax. For example, if you wanted to surround a word with -literal asterisks (instead of an HTML <em> tag), you can backslashes -before the asterisks, like this:

- -
\*literal asterisks\*
-
- -

Markdown provides backslash escapes for the following characters:

- -
\   backslash
-`   backtick
-*   asterisk
-_   underscore
-{}  curly braces
-[]  square brackets
-()  parentheses
-#   hash mark
-+	plus sign
--	minus sign (hyphen)
-.   dot
-!   exclamation mark
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Syntax.text b/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Syntax.text deleted file mode 100644 index 57360a16..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Markdown Documentation - Syntax.text +++ /dev/null @@ -1,888 +0,0 @@ -Markdown: Syntax -================ - - - - -* [Overview](#overview) - * [Philosophy](#philosophy) - * [Inline HTML](#html) - * [Automatic Escaping for Special Characters](#autoescape) -* [Block Elements](#block) - * [Paragraphs and Line Breaks](#p) - * [Headers](#header) - * [Blockquotes](#blockquote) - * [Lists](#list) - * [Code Blocks](#precode) - * [Horizontal Rules](#hr) -* [Span Elements](#span) - * [Links](#link) - * [Emphasis](#em) - * [Code](#code) - * [Images](#img) -* [Miscellaneous](#misc) - * [Backslash Escapes](#backslash) - * [Automatic Links](#autolink) - - -**Note:** This document is itself written using Markdown; you -can [see the source for it by adding '.text' to the URL][src]. - - [src]: /projects/markdown/syntax.text - -* * * - -

Overview

- -

Philosophy

- -Markdown is intended to be as easy-to-read and easy-to-write as is feasible. - -Readability, however, is emphasized above all else. A Markdown-formatted -document should be publishable as-is, as plain text, without looking -like it's been marked up with tags or formatting instructions. While -Markdown's syntax has been influenced by several existing text-to-HTML -filters -- including [Setext] [1], [atx] [2], [Textile] [3], [reStructuredText] [4], -[Grutatext] [5], and [EtText] [6] -- the single biggest source of -inspiration for Markdown's syntax is the format of plain text email. - - [1]: http://docutils.sourceforge.net/mirror/setext.html - [2]: http://www.aaronsw.com/2002/atx/ - [3]: http://textism.com/tools/textile/ - [4]: http://docutils.sourceforge.net/rst.html - [5]: http://www.triptico.com/software/grutatxt.html - [6]: http://ettext.taint.org/doc/ - -To this end, Markdown's syntax is comprised entirely of punctuation -characters, which punctuation characters have been carefully chosen so -as to look like what they mean. E.g., asterisks around a word actually -look like \*emphasis\*. Markdown lists look like, well, lists. Even -blockquotes look like quoted passages of text, assuming you've ever -used email. - - - -

Inline HTML

- -Markdown's syntax is intended for one purpose: to be used as a -format for *writing* for the web. - -Markdown is not a replacement for HTML, or even close to it. Its -syntax is very small, corresponding only to a very small subset of -HTML tags. The idea is *not* to create a syntax that makes it easier -to insert HTML tags. In my opinion, HTML tags are already easy to -insert. The idea for Markdown is to make it easy to read, write, and -edit prose. HTML is a *publishing* format; Markdown is a *writing* -format. Thus, Markdown's formatting syntax only addresses issues that -can be conveyed in plain text. - -For any markup that is not covered by Markdown's syntax, you simply -use HTML itself. There's no need to preface it or delimit it to -indicate that you're switching from Markdown to HTML; you just use -the tags. - -The only restrictions are that block-level HTML elements -- e.g. `
`, -``, `
`, `

`, etc. -- must be separated from surrounding -content by blank lines, and the start and end tags of the block should -not be indented with tabs or spaces. Markdown is smart enough not -to add extra (unwanted) `

` tags around HTML block-level tags. - -For example, to add an HTML table to a Markdown article: - - This is a regular paragraph. - -

- - - -
Foo
- - This is another regular paragraph. - -Note that Markdown formatting syntax is not processed within block-level -HTML tags. E.g., you can't use Markdown-style `*emphasis*` inside an -HTML block. - -Span-level HTML tags -- e.g. ``, ``, or `` -- can be -used anywhere in a Markdown paragraph, list item, or header. If you -want, you can even use HTML tags instead of Markdown formatting; e.g. if -you'd prefer to use HTML `` or `` tags instead of Markdown's -link or image syntax, go right ahead. - -Unlike block-level HTML tags, Markdown syntax *is* processed within -span-level tags. - - -

Automatic Escaping for Special Characters

- -In HTML, there are two characters that demand special treatment: `<` -and `&`. Left angle brackets are used to start tags; ampersands are -used to denote HTML entities. If you want to use them as literal -characters, you must escape them as entities, e.g. `<`, and -`&`. - -Ampersands in particular are bedeviling for web writers. If you want to -write about 'AT&T', you need to write '`AT&T`'. You even need to -escape ampersands within URLs. Thus, if you want to link to: - - http://images.google.com/images?num=30&q=larry+bird - -you need to encode the URL as: - - http://images.google.com/images?num=30&q=larry+bird - -in your anchor tag `href` attribute. Needless to say, this is easy to -forget, and is probably the single most common source of HTML validation -errors in otherwise well-marked-up web sites. - -Markdown allows you to use these characters naturally, taking care of -all the necessary escaping for you. If you use an ampersand as part of -an HTML entity, it remains unchanged; otherwise it will be translated -into `&`. - -So, if you want to include a copyright symbol in your article, you can write: - - © - -and Markdown will leave it alone. But if you write: - - AT&T - -Markdown will translate it to: - - AT&T - -Similarly, because Markdown supports [inline HTML](#html), if you use -angle brackets as delimiters for HTML tags, Markdown will treat them as -such. But if you write: - - 4 < 5 - -Markdown will translate it to: - - 4 < 5 - -However, inside Markdown code spans and blocks, angle brackets and -ampersands are *always* encoded automatically. This makes it easy to use -Markdown to write about HTML code. (As opposed to raw HTML, which is a -terrible format for writing about HTML syntax, because every single `<` -and `&` in your example code needs to be escaped.) - - -* * * - - -

Block Elements

- - -

Paragraphs and Line Breaks

- -A paragraph is simply one or more consecutive lines of text, separated -by one or more blank lines. (A blank line is any line that looks like a -blank line -- a line containing nothing but spaces or tabs is considered -blank.) Normal paragraphs should not be intended with spaces or tabs. - -The implication of the "one or more consecutive lines of text" rule is -that Markdown supports "hard-wrapped" text paragraphs. This differs -significantly from most other text-to-HTML formatters (including Movable -Type's "Convert Line Breaks" option) which translate every line break -character in a paragraph into a `
` tag. - -When you *do* want to insert a `
` break tag using Markdown, you -end a line with two or more spaces, then type return. - -Yes, this takes a tad more effort to create a `
`, but a simplistic -"every line break is a `
`" rule wouldn't work for Markdown. -Markdown's email-style [blockquoting][bq] and multi-paragraph [list items][l] -work best -- and look better -- when you format them with hard breaks. - - [bq]: #blockquote - [l]: #list - - - - - -Markdown supports two styles of headers, [Setext] [1] and [atx] [2]. - -Setext-style headers are "underlined" using equal signs (for first-level -headers) and dashes (for second-level headers). For example: - - This is an H1 - ============= - - This is an H2 - ------------- - -Any number of underlining `=`'s or `-`'s will work. - -Atx-style headers use 1-6 hash characters at the start of the line, -corresponding to header levels 1-6. For example: - - # This is an H1 - - ## This is an H2 - - ###### This is an H6 - -Optionally, you may "close" atx-style headers. This is purely -cosmetic -- you can use this if you think it looks better. The -closing hashes don't even need to match the number of hashes -used to open the header. (The number of opening hashes -determines the header level.) : - - # This is an H1 # - - ## This is an H2 ## - - ### This is an H3 ###### - - -

Blockquotes

- -Markdown uses email-style `>` characters for blockquoting. If you're -familiar with quoting passages of text in an email message, then you -know how to create a blockquote in Markdown. It looks best if you hard -wrap the text and put a `>` before every line: - - > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, - > consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. - > Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. - > - > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse - > id sem consectetuer libero luctus adipiscing. - -Markdown allows you to be lazy and only put the `>` before the first -line of a hard-wrapped paragraph: - - > This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet, - consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus. - Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus. - - > Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse - id sem consectetuer libero luctus adipiscing. - -Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by -adding additional levels of `>`: - - > This is the first level of quoting. - > - > > This is nested blockquote. - > - > Back to the first level. - -Blockquotes can contain other Markdown elements, including headers, lists, -and code blocks: - - > ## This is a header. - > - > 1. This is the first list item. - > 2. This is the second list item. - > - > Here's some example code: - > - > return shell_exec("echo $input | $markdown_script"); - -Any decent text editor should make email-style quoting easy. For -example, with BBEdit, you can make a selection and choose Increase -Quote Level from the Text menu. - - -

Lists

- -Markdown supports ordered (numbered) and unordered (bulleted) lists. - -Unordered lists use asterisks, pluses, and hyphens -- interchangably --- as list markers: - - * Red - * Green - * Blue - -is equivalent to: - - + Red - + Green - + Blue - -and: - - - Red - - Green - - Blue - -Ordered lists use numbers followed by periods: - - 1. Bird - 2. McHale - 3. Parish - -It's important to note that the actual numbers you use to mark the -list have no effect on the HTML output Markdown produces. The HTML -Markdown produces from the above list is: - -
    -
  1. Bird
  2. -
  3. McHale
  4. -
  5. Parish
  6. -
- -If you instead wrote the list in Markdown like this: - - 1. Bird - 1. McHale - 1. Parish - -or even: - - 3. Bird - 1. McHale - 8. Parish - -you'd get the exact same HTML output. The point is, if you want to, -you can use ordinal numbers in your ordered Markdown lists, so that -the numbers in your source match the numbers in your published HTML. -But if you want to be lazy, you don't have to. - -If you do use lazy list numbering, however, you should still start the -list with the number 1. At some point in the future, Markdown may support -starting ordered lists at an arbitrary number. - -List markers typically start at the left margin, but may be indented by -up to three spaces. List markers must be followed by one or more spaces -or a tab. - -To make lists look nice, you can wrap items with hanging indents: - - * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. - Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, - viverra nec, fringilla in, laoreet vitae, risus. - * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. - Suspendisse id sem consectetuer libero luctus adipiscing. - -But if you want to be lazy, you don't have to: - - * Lorem ipsum dolor sit amet, consectetuer adipiscing elit. - Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi, - viverra nec, fringilla in, laoreet vitae, risus. - * Donec sit amet nisl. Aliquam semper ipsum sit amet velit. - Suspendisse id sem consectetuer libero luctus adipiscing. - -If list items are separated by blank lines, Markdown will wrap the -items in `

` tags in the HTML output. For example, this input: - - * Bird - * Magic - -will turn into: - -

    -
  • Bird
  • -
  • Magic
  • -
- -But this: - - * Bird - - * Magic - -will turn into: - -
    -
  • Bird

  • -
  • Magic

  • -
- -List items may consist of multiple paragraphs. Each subsequent -paragraph in a list item must be intended by either 4 spaces -or one tab: - - 1. This is a list item with two paragraphs. Lorem ipsum dolor - sit amet, consectetuer adipiscing elit. Aliquam hendrerit - mi posuere lectus. - - Vestibulum enim wisi, viverra nec, fringilla in, laoreet - vitae, risus. Donec sit amet nisl. Aliquam semper ipsum - sit amet velit. - - 2. Suspendisse id sem consectetuer libero luctus adipiscing. - -It looks nice if you indent every line of the subsequent -paragraphs, but here again, Markdown will allow you to be -lazy: - - * This is a list item with two paragraphs. - - This is the second paragraph in the list item. You're - only required to indent the first line. Lorem ipsum dolor - sit amet, consectetuer adipiscing elit. - - * Another item in the same list. - -To put a blockquote within a list item, the blockquote's `>` -delimiters need to be indented: - - * A list item with a blockquote: - - > This is a blockquote - > inside a list item. - -To put a code block within a list item, the code block needs -to be indented *twice* -- 8 spaces or two tabs: - - * A list item with a code block: - - - - -It's worth noting that it's possible to trigger an ordered list by -accident, by writing something like this: - - 1986. What a great season. - -In other words, a *number-period-space* sequence at the beginning of a -line. To avoid this, you can backslash-escape the period: - - 1986\. What a great season. - - - -

Code Blocks

- -Pre-formatted code blocks are used for writing about programming or -markup source code. Rather than forming normal paragraphs, the lines -of a code block are interpreted literally. Markdown wraps a code block -in both `
` and `` tags.
-
-To produce a code block in Markdown, simply indent every line of the
-block by at least 4 spaces or 1 tab. For example, given this input:
-
-    This is a normal paragraph:
-
-        This is a code block.
-
-Markdown will generate:
-
-    

This is a normal paragraph:

- -
This is a code block.
-    
- -One level of indentation -- 4 spaces or 1 tab -- is removed from each -line of the code block. For example, this: - - Here is an example of AppleScript: - - tell application "Foo" - beep - end tell - -will turn into: - -

Here is an example of AppleScript:

- -
tell application "Foo"
-        beep
-    end tell
-    
- -A code block continues until it reaches a line that is not indented -(or the end of the article). - -Within a code block, ampersands (`&`) and angle brackets (`<` and `>`) -are automatically converted into HTML entities. This makes it very -easy to include example HTML source code using Markdown -- just paste -it and indent it, and Markdown will handle the hassle of encoding the -ampersands and angle brackets. For example, this: - - - -will turn into: - -
<div class="footer">
-        &copy; 2004 Foo Corporation
-    </div>
-    
- -Regular Markdown syntax is not processed within code blocks. E.g., -asterisks are just literal asterisks within a code block. This means -it's also easy to use Markdown to write about Markdown's own syntax. - - - -

Horizontal Rules

- -You can produce a horizontal rule tag (`
`) by placing three or -more hyphens, asterisks, or underscores on a line by themselves. If you -wish, you may use spaces between the hyphens or asterisks. Each of the -following lines will produce a horizontal rule: - - * * * - - *** - - ***** - - - - - - - --------------------------------------- - - _ _ _ - - -* * * - -

Span Elements

- - - -Markdown supports two style of links: *inline* and *reference*. - -In both styles, the link text is delimited by [square brackets]. - -To create an inline link, use a set of regular parentheses immediately -after the link text's closing square bracket. Inside the parentheses, -put the URL where you want the link to point, along with an *optional* -title for the link, surrounded in quotes. For example: - - This is [an example](http://example.com/ "Title") inline link. - - [This link](http://example.net/) has no title attribute. - -Will produce: - -

This is - an example inline link.

- -

This link has no - title attribute.

- -If you're referring to a local resource on the same server, you can -use relative paths: - - See my [About](/about/) page for details. - -Reference-style links use a second set of square brackets, inside -which you place a label of your choosing to identify the link: - - This is [an example][id] reference-style link. - -You can optionally use a space to separate the sets of brackets: - - This is [an example] [id] reference-style link. - -Then, anywhere in the document, you define your link label like this, -on a line by itself: - - [id]: http://example.com/ "Optional Title Here" - -That is: - -* Square brackets containing the link identifier (optionally - indented from the left margin using up to three spaces); -* followed by a colon; -* followed by one or more spaces (or tabs); -* followed by the URL for the link; -* optionally followed by a title attribute for the link, enclosed - in double or single quotes. - -The link URL may, optionally, be surrounded by angle brackets: - - [id]: "Optional Title Here" - -You can put the title attribute on the next line and use extra spaces -or tabs for padding, which tends to look better with longer URLs: - - [id]: http://example.com/longish/path/to/resource/here - "Optional Title Here" - -Link definitions are only used for creating links during Markdown -processing, and are stripped from your document in the HTML output. - -Link definition names may constist of letters, numbers, spaces, and punctuation -- but they are *not* case sensitive. E.g. these two links: - - [link text][a] - [link text][A] - -are equivalent. - -The *implicit link name* shortcut allows you to omit the name of the -link, in which case the link text itself is used as the name. -Just use an empty set of square brackets -- e.g., to link the word -"Google" to the google.com web site, you could simply write: - - [Google][] - -And then define the link: - - [Google]: http://google.com/ - -Because link names may contain spaces, this shortcut even works for -multiple words in the link text: - - Visit [Daring Fireball][] for more information. - -And then define the link: - - [Daring Fireball]: http://daringfireball.net/ - -Link definitions can be placed anywhere in your Markdown document. I -tend to put them immediately after each paragraph in which they're -used, but if you want, you can put them all at the end of your -document, sort of like footnotes. - -Here's an example of reference links in action: - - I get 10 times more traffic from [Google] [1] than from - [Yahoo] [2] or [MSN] [3]. - - [1]: http://google.com/ "Google" - [2]: http://search.yahoo.com/ "Yahoo Search" - [3]: http://search.msn.com/ "MSN Search" - -Using the implicit link name shortcut, you could instead write: - - I get 10 times more traffic from [Google][] than from - [Yahoo][] or [MSN][]. - - [google]: http://google.com/ "Google" - [yahoo]: http://search.yahoo.com/ "Yahoo Search" - [msn]: http://search.msn.com/ "MSN Search" - -Both of the above examples will produce the following HTML output: - -

I get 10 times more traffic from Google than from - Yahoo - or MSN.

- -For comparison, here is the same paragraph written using -Markdown's inline link style: - - I get 10 times more traffic from [Google](http://google.com/ "Google") - than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or - [MSN](http://search.msn.com/ "MSN Search"). - -The point of reference-style links is not that they're easier to -write. The point is that with reference-style links, your document -source is vastly more readable. Compare the above examples: using -reference-style links, the paragraph itself is only 81 characters -long; with inline-style links, it's 176 characters; and as raw HTML, -it's 234 characters. In the raw HTML, there's more markup than there -is text. - -With Markdown's reference-style links, a source document much more -closely resembles the final output, as rendered in a browser. By -allowing you to move the markup-related metadata out of the paragraph, -you can add links without interrupting the narrative flow of your -prose. - - -

Emphasis

- -Markdown treats asterisks (`*`) and underscores (`_`) as indicators of -emphasis. Text wrapped with one `*` or `_` will be wrapped with an -HTML `` tag; double `*`'s or `_`'s will be wrapped with an HTML -`` tag. E.g., this input: - - *single asterisks* - - _single underscores_ - - **double asterisks** - - __double underscores__ - -will produce: - - single asterisks - - single underscores - - double asterisks - - double underscores - -You can use whichever style you prefer; the lone restriction is that -the same character must be used to open and close an emphasis span. - -Emphasis can be used in the middle of a word: - - un*fucking*believable - -But if you surround an `*` or `_` with spaces, it'll be treated as a -literal asterisk or underscore. - -To produce a literal asterisk or underscore at a position where it -would otherwise be used as an emphasis delimiter, you can backslash -escape it: - - \*this text is surrounded by literal asterisks\* - - - -

Code

- -To indicate a span of code, wrap it with backtick quotes (`` ` ``). -Unlike a pre-formatted code block, a code span indicates code within a -normal paragraph. For example: - - Use the `printf()` function. - -will produce: - -

Use the printf() function.

- -To include a literal backtick character within a code span, you can use -multiple backticks as the opening and closing delimiters: - - ``There is a literal backtick (`) here.`` - -which will produce this: - -

There is a literal backtick (`) here.

- -The backtick delimiters surrounding a code span may include spaces -- -one after the opening, one before the closing. This allows you to place -literal backtick characters at the beginning or end of a code span: - - A single backtick in a code span: `` ` `` - - A backtick-delimited string in a code span: `` `foo` `` - -will produce: - -

A single backtick in a code span: `

- -

A backtick-delimited string in a code span: `foo`

- -With a code span, ampersands and angle brackets are encoded as HTML -entities automatically, which makes it easy to include example HTML -tags. Markdown will turn this: - - Please don't use any `` tags. - -into: - -

Please don't use any <blink> tags.

- -You can write this: - - `—` is the decimal-encoded equivalent of `—`. - -to produce: - -

&#8212; is the decimal-encoded - equivalent of &mdash;.

- - - -

Images

- -Admittedly, it's fairly difficult to devise a "natural" syntax for -placing images into a plain text document format. - -Markdown uses an image syntax that is intended to resemble the syntax -for links, allowing for two styles: *inline* and *reference*. - -Inline image syntax looks like this: - - ![Alt text](/path/to/img.jpg) - - ![Alt text](/path/to/img.jpg "Optional title") - -That is: - -* An exclamation mark: `!`; -* followed by a set of square brackets, containing the `alt` - attribute text for the image; -* followed by a set of parentheses, containing the URL or path to - the image, and an optional `title` attribute enclosed in double - or single quotes. - -Reference-style image syntax looks like this: - - ![Alt text][id] - -Where "id" is the name of a defined image reference. Image references -are defined using syntax identical to link references: - - [id]: url/to/image "Optional title attribute" - -As of this writing, Markdown has no syntax for specifying the -dimensions of an image; if this is important to you, you can simply -use regular HTML `` tags. - - -* * * - - -

Miscellaneous

- - - -Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this: - - - -Markdown will turn this into: - - http://example.com/ - -Automatic links for email addresses work similarly, except that -Markdown will also perform a bit of randomized decimal and hex -entity-encoding to help obscure your address from address-harvesting -spambots. For example, Markdown will turn this: - - - -into something like this: - - address@exa - mple.com - -which will render in a browser as a clickable link to "address@example.com". - -(This sort of entity-encoding trick will indeed fool many, if not -most, address-harvesting bots, but it definitely won't fool all of -them. It's better than nothing, but an address published in this way -will probably eventually start receiving spam.) - - - -

Backslash Escapes

- -Markdown allows you to use backslash escapes to generate literal -characters which would otherwise have special meaning in Markdown's -formatting syntax. For example, if you wanted to surround a word with -literal asterisks (instead of an HTML `` tag), you can backslashes -before the asterisks, like this: - - \*literal asterisks\* - -Markdown provides backslash escapes for the following characters: - - \ backslash - ` backtick - * asterisk - _ underscore - {} curly braces - [] square brackets - () parentheses - # hash mark - + plus sign - - minus sign (hyphen) - . dot - ! exclamation mark - diff --git a/vendor/github.com/documize/blackfriday/testdata/Nested blockquotes.html b/vendor/github.com/documize/blackfriday/testdata/Nested blockquotes.html deleted file mode 100644 index 538bb4fe..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Nested blockquotes.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

foo

- -
-

bar

-
- -

foo

-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Nested blockquotes.text b/vendor/github.com/documize/blackfriday/testdata/Nested blockquotes.text deleted file mode 100644 index ed3c624f..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Nested blockquotes.text +++ /dev/null @@ -1,5 +0,0 @@ -> foo -> -> > bar -> -> foo diff --git a/vendor/github.com/documize/blackfriday/testdata/Ordered and unordered lists.html b/vendor/github.com/documize/blackfriday/testdata/Ordered and unordered lists.html deleted file mode 100644 index d6fa4278..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Ordered and unordered lists.html +++ /dev/null @@ -1,166 +0,0 @@ -

Unordered

- -

Asterisks tight:

- -
    -
  • asterisk 1
  • -
  • asterisk 2
  • -
  • asterisk 3
  • -
- -

Asterisks loose:

- -
    -
  • asterisk 1

  • - -
  • asterisk 2

  • - -
  • asterisk 3

  • -
- -
- -

Pluses tight:

- -
    -
  • Plus 1
  • -
  • Plus 2
  • -
  • Plus 3
  • -
- -

Pluses loose:

- -
    -
  • Plus 1

  • - -
  • Plus 2

  • - -
  • Plus 3

  • -
- -
- -

Minuses tight:

- -
    -
  • Minus 1
  • -
  • Minus 2
  • -
  • Minus 3
  • -
- -

Minuses loose:

- -
    -
  • Minus 1

  • - -
  • Minus 2

  • - -
  • Minus 3

  • -
- -

Ordered

- -

Tight:

- -
    -
  1. First
  2. -
  3. Second
  4. -
  5. Third
  6. -
- -

and:

- -
    -
  1. One
  2. -
  3. Two
  4. -
  5. Three
  6. -
- -

Loose using tabs:

- -
    -
  1. First

  2. - -
  3. Second

  4. - -
  5. Third

  6. -
- -

and using spaces:

- -
    -
  1. One

  2. - -
  3. Two

  4. - -
  5. Three

  6. -
- -

Multiple paragraphs:

- -
    -
  1. Item 1, graf one.

    - -

    Item 2. graf two. The quick brown fox jumped over the lazy dog's -back.

  2. - -
  3. Item 2.

  4. - -
  5. Item 3.

  6. -
- -

Nested

- -
    -
  • Tab - -
      -
    • Tab - -
        -
      • Tab
      • -
    • -
  • -
- -

Here's another:

- -
    -
  1. First
  2. -
  3. Second: - -
      -
    • Fee
    • -
    • Fie
    • -
    • Foe
    • -
  4. -
  5. Third
  6. -
- -

Same thing but with paragraphs:

- -
    -
  1. First

  2. - -
  3. Second:

    - -
      -
    • Fee
    • -
    • Fie
    • -
    • Foe
    • -
  4. - -
  5. Third

  6. -
- -

This was an error in Markdown 1.0.1:

- -
    -
  • this

    - -
      -
    • sub
    • -
    - -

    that

  • -
diff --git a/vendor/github.com/documize/blackfriday/testdata/Ordered and unordered lists.text b/vendor/github.com/documize/blackfriday/testdata/Ordered and unordered lists.text deleted file mode 100644 index 7f3b4977..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Ordered and unordered lists.text +++ /dev/null @@ -1,131 +0,0 @@ -## Unordered - -Asterisks tight: - -* asterisk 1 -* asterisk 2 -* asterisk 3 - - -Asterisks loose: - -* asterisk 1 - -* asterisk 2 - -* asterisk 3 - -* * * - -Pluses tight: - -+ Plus 1 -+ Plus 2 -+ Plus 3 - - -Pluses loose: - -+ Plus 1 - -+ Plus 2 - -+ Plus 3 - -* * * - - -Minuses tight: - -- Minus 1 -- Minus 2 -- Minus 3 - - -Minuses loose: - -- Minus 1 - -- Minus 2 - -- Minus 3 - - -## Ordered - -Tight: - -1. First -2. Second -3. Third - -and: - -1. One -2. Two -3. Three - - -Loose using tabs: - -1. First - -2. Second - -3. Third - -and using spaces: - -1. One - -2. Two - -3. Three - -Multiple paragraphs: - -1. Item 1, graf one. - - Item 2. graf two. The quick brown fox jumped over the lazy dog's - back. - -2. Item 2. - -3. Item 3. - - - -## Nested - -* Tab - * Tab - * Tab - -Here's another: - -1. First -2. Second: - * Fee - * Fie - * Foe -3. Third - -Same thing but with paragraphs: - -1. First - -2. Second: - * Fee - * Fie - * Foe - -3. Third - - -This was an error in Markdown 1.0.1: - -* this - - * sub - - that diff --git a/vendor/github.com/documize/blackfriday/testdata/Strong and em together.html b/vendor/github.com/documize/blackfriday/testdata/Strong and em together.html deleted file mode 100644 index 71ec78c7..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Strong and em together.html +++ /dev/null @@ -1,7 +0,0 @@ -

This is strong and em.

- -

So is this word.

- -

This is strong and em.

- -

So is this word.

diff --git a/vendor/github.com/documize/blackfriday/testdata/Strong and em together.text b/vendor/github.com/documize/blackfriday/testdata/Strong and em together.text deleted file mode 100644 index 95ee690d..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Strong and em together.text +++ /dev/null @@ -1,7 +0,0 @@ -***This is strong and em.*** - -So is ***this*** word. - -___This is strong and em.___ - -So is ___this___ word. diff --git a/vendor/github.com/documize/blackfriday/testdata/Tabs.html b/vendor/github.com/documize/blackfriday/testdata/Tabs.html deleted file mode 100644 index 509b41c6..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Tabs.html +++ /dev/null @@ -1,26 +0,0 @@ -
    -
  • this is a list item -indented with tabs

  • - -
  • this is a list item -indented with spaces

  • -
- -

Code:

- -
this code block is indented by one tab
-
- -

And:

- -
	this code block is indented by two tabs
-
- -

And:

- -
+	this is an example list item
-	indented with tabs
-
-+   this is an example list item
-    indented with spaces
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Tabs.text b/vendor/github.com/documize/blackfriday/testdata/Tabs.text deleted file mode 100644 index 589d1136..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Tabs.text +++ /dev/null @@ -1,21 +0,0 @@ -+ this is a list item - indented with tabs - -+ this is a list item - indented with spaces - -Code: - - this code block is indented by one tab - -And: - - this code block is indented by two tabs - -And: - - + this is an example list item - indented with tabs - - + this is an example list item - indented with spaces diff --git a/vendor/github.com/documize/blackfriday/testdata/Tidyness.html b/vendor/github.com/documize/blackfriday/testdata/Tidyness.html deleted file mode 100644 index 9c45b69c..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Tidyness.html +++ /dev/null @@ -1,9 +0,0 @@ -
-

A list within a blockquote:

- -
    -
  • asterisk 1
  • -
  • asterisk 2
  • -
  • asterisk 3
  • -
-
diff --git a/vendor/github.com/documize/blackfriday/testdata/Tidyness.text b/vendor/github.com/documize/blackfriday/testdata/Tidyness.text deleted file mode 100644 index 5f18b8da..00000000 --- a/vendor/github.com/documize/blackfriday/testdata/Tidyness.text +++ /dev/null @@ -1,5 +0,0 @@ -> A list within a blockquote: -> -> * asterisk 1 -> * asterisk 2 -> * asterisk 3 diff --git a/vendor/github.com/documize/glick/.gitignore b/vendor/github.com/documize/glick/.gitignore new file mode 100644 index 00000000..df5ab13d --- /dev/null +++ b/vendor/github.com/documize/glick/.gitignore @@ -0,0 +1,24 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so +*.out + +# Folders +_obj + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof diff --git a/vendor/github.com/documize/glick/cmd_test.go b/vendor/github.com/documize/glick/cmd_test.go deleted file mode 100644 index f6ceccb6..00000000 --- a/vendor/github.com/documize/glick/cmd_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package glick_test - -import ( - "strings" - "testing" - "time" - - "github.com/documize/glick" -) - -func TestCmd(t *testing.T) { - l, errN := glick.New(nil) - if errN != nil { - t.Error(errN) - } - var proto string - outProto := func() interface{} { var s string; return interface{}(&s) } - if err := l.RegAPI("string/&string", proto, outProto, 10*time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("string/&string", "pwdBad", - glick.PluginCmd([]string{"pwdBad"}, &proto), nil); err == nil { - t.Error("incorrect cmd plugin did not fail") - return - } - if _, err := l.Run(nil, "string/&string", "pwdBad", proto); err == nil { - t.Error("bad simple command did not fail") - return - } - if err := l.RegPlugin("string/&string", "pwd", - glick.PluginCmd([]string{"pwd"}, &proto), nil); err != nil { - t.Error(err) - return - } - if proto, err := l.Run(nil, "string/&string", "pwd", proto); err != nil { - t.Error(err) - } else { - p := *proto.(*string) - if !strings.HasSuffix(p, "/glick\n") { - t.Error("wrong output from pwd: " + p) - } - } - if err := l.RegPlugin("string/&string", "exit1", - glick.PluginCmd([]string{"bash", "./_test/exit1.sh"}, &proto), nil); err != nil { - t.Error(err) - return - } - if _, err := l.Run(nil, "string/&string", "exit1", proto); err == nil { - t.Error("exit1.sh does not give an error") - } -} - -func TestBadInterface(t *testing.T) { - l, errN := glick.New(nil) - if errN != nil { - t.Error(errN) - } - var proto string - var ip int - ipProto := func() interface{} { var i int; return interface{}(&i) } - if err := l.RegAPI("int/&int", ip, ipProto, 3*time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("int/&int", "pwd", - glick.PluginCmd([]string{"pwd"}, &proto), nil); err != nil { - t.Error(err) - return - } - if _, err := l.Run(nil, "int/&int", "pwd", 11); err == nil { - t.Error("does not error on non string input value") - return - } - if err := l.RegAPI("string/&int", proto, ipProto, 3*time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("string/&int", "pwd", - glick.PluginCmd([]string{"pwd"}, &proto), nil); err != nil { - t.Error(err) - return - } - if _, err := l.Run(nil, "string/&int", "pwd", "foo"); err == nil { - t.Error("does not error on non *string ouput value") - return - } -} - -func TestTimeout(t *testing.T) { - l, errN := glick.New(nil) - if errN != nil { - t.Error(errN) - } - var proto string - outProto := func() interface{} { var s string; return interface{}(&s) } - if err := l.RegAPI("alwaysTimeout", proto, outProto, 1*time.Second); err != nil { - t.Error(err) - } - if err := l.RegPlugin("alwaysTimeout", "sleep", - glick.PluginCmd([]string{"sleep", "10"}, &proto), nil); err != nil { - t.Error(err) - return - } - if _, err := l.Run(nil, "alwaysTimeout", "sleep", "foo"); err == nil { - t.Error("does not timeout when it should") - } -} diff --git a/vendor/github.com/documize/glick/config_test.go b/vendor/github.com/documize/glick/config_test.go deleted file mode 100644 index 4150e8de..00000000 --- a/vendor/github.com/documize/glick/config_test.go +++ /dev/null @@ -1,114 +0,0 @@ -package glick_test - -import ( - "testing" - - "github.com/documize/glick" - test "github.com/documize/glick/_test" -) - -func TestBadConfig(t *testing.T) { - l, ne := glick.New(nil) - if ne != nil { - t.Error(ne) - } - if err := l.Configure([]byte("±§~`-=_+")); err == nil { - t.Error("did not error on rubbish") - } - if err := l.Configure([]byte("[]")); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"p22",API":"missing"} - ]`)); err == nil { - t.Error("missing API not an error") - } - if err := l.AddConfigurator("zombie", nil); err == nil { - t.Error("nil configurator not spotted") - } - if err := glick.ConfigGetURL(l); err == nil { - t.Error("duplicate configurator not spotted") - } -} - -func TestConfig(t *testing.T) { - l, ne := glick.New(nil) - if ne != nil { - t.Error(ne) - } - protoString := "" - outProtoString := func() interface{} { var s string; return interface{}(&s) } - - if err := l.RegAPI("string/*string", protoString, outProtoString, 0); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"p34","API":"string/*string","Actions":["doIt"]} - ]`)); err == nil { - t.Error("missing Type not an error") - } - if err := l.Configure([]byte(`[ -{"Plugin":"p39","API":"string/*string","Actions":["pwd"],"Type":"CMD","Cmd":["pwd"]} - ]`)); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"p44","API":"string/*string","Actions":["garbage"],"Type":"CMD","Cmd":["garbage"]} - ]`)); err == nil { - t.Error("garbage cmd path did not error") - } - if err := l.RegAPI("int/*string", 42, outProtoString, 0); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"p52","API":"int/*string","Actions":["badAPI"],"Type":"CMD","Cmd":["pwd"]} - ]`)); err == nil { - t.Error("unsuited API for cmd did not error") - } - if err := l.Configure([]byte(`[ -{"Plugin":"p57","API":"int/*string","Actions":["badAPI"],"Type":"URL","Path":["pwd"]} - ]`)); err == nil { - t.Error("unsuited API for URL did not error") - } -} - -func TestConfig2(t *testing.T) { - l, ne := glick.New(nil) - if ne != nil { - t.Error(ne) - } - protoString := "" - outProtoString := func() interface{} { var s string; return interface{}(&s) } - outProtoInt := func() interface{} { var i int; return interface{}(&i) } - - if err := l.RegAPI("string/*string", protoString, outProtoString, 0); err != nil { - t.Error(err) - } - var is test.IntStr - if err := l.RegAPI("test", is, outProtoInt, 0); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"p66","API":"test","Actions":["intStr3"],"Type":"RPC","Path":"localhost:4242","Method":"foo.bar","Token":"ABC"} - ]`)); err != nil { - t.Error(err) - } - if l.Token("test", "intStr3") != "ABC" { - t.Error("Token value not set and retrieved") - } - if err := l.Configure([]byte(`[ -{"Plugin":"p74","API":"test","Actions":["intStr4"],"Type":"RPC","Path":"foo;;:4242"} - ]`)); err == nil { - t.Error("unsuited endPoint not spotted") - } - if err := l.Configure([]byte(`[ -{"Plugin":"p79","API":"string/*string","Actions":["goodURL"],"Type":"URL","Path":"http://golang.org","Static":true} - ]`)); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"p84","API":"string/*string","Actions":["badURL"],"Type":"URL","Path":"","Static":true} - ]`)); err == nil { - t.Error("unsuited URL not spotted") - } -} diff --git a/vendor/github.com/documize/glick/examples_test.go b/vendor/github.com/documize/glick/examples_test.go deleted file mode 100644 index 495602cf..00000000 --- a/vendor/github.com/documize/glick/examples_test.go +++ /dev/null @@ -1,77 +0,0 @@ -package glick_test - -import ( - "fmt" - "testing" - "time" - - "github.com/documize/glick" - "golang.org/x/net/context" -) - -func Example() { - - goDatePlugin := func(ctx context.Context, in interface{}) (interface{}, error) { - return time.Now().String(), nil - } - - runtimeRerouter := func(ctx context.Context, api, action string, handler glick.Plugin) (context.Context, glick.Plugin, error) { - // if we hit a particular set of circumstances return the go version - if ctx.Value("bingo") != nil && api == "timeNow" && action == "lookup" { - return ctx, goDatePlugin, nil - } - // otherwise return what we we were planning to do anyway - return ctx, handler, nil - } - - lib, nerr := glick.New(runtimeRerouter) - if nerr != nil { - fmt.Println(nerr) - return - } - - timeNowAPIproto := "" - if err := lib.RegAPI("timeNow", timeNowAPIproto, - func() interface{} { return timeNowAPIproto }, - time.Second); err != nil { - fmt.Println(err) - return - } - - // the set-up version of the plugin, in Go - if err := lib.RegPlugin("timeNow", "lookup", goDatePlugin, nil); err != nil { - fmt.Println(err) - return - } - - ctx := context.Background() - - lookup := func() { - if S, err := lib.Run(ctx, "timeNow", "lookup", ""); err != nil { - fmt.Println(err) - } else { - fmt.Println(S) - } - } - - lookup() // should run the go version - - // now overload an os version of timeNow/lookup via a JSON config - if err := lib.Configure([]byte(`[ -{"Plugin":"OS-style-date","API":"timeNow","Actions":["lookup"],"Type":"CMD","Cmd":["date"]} - ]`)); err != nil { - fmt.Println(err) - } - - lookup() // should run the os command 'date' and print the output - - // now set a specific context to be picked-up in runtimeRerouter - ctx = context.WithValue(ctx, "bingo", "house") - - lookup() // should run the go version again after being re-routed - -} - -func TestExample(t *testing.T) { - Example() -} diff --git a/vendor/github.com/documize/glick/geturl_test.go b/vendor/github.com/documize/glick/geturl_test.go deleted file mode 100644 index 2457fb09..00000000 --- a/vendor/github.com/documize/glick/geturl_test.go +++ /dev/null @@ -1,82 +0,0 @@ -package glick_test - -import ( - "testing" - "time" - - "github.com/documize/glick" -) - -func TestGetURL(t *testing.T) { - outProtoString := func() interface{} { var s string; return interface{}(&s) } - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - proto := "" - if err := l.RegAPI("string/*string", proto, outProtoString, 2*time.Second); err != nil { - t.Error(err) - } - if err := l.RegPlugin("string/*string", "bad1", - glick.PluginGetURL(true, "", &proto), nil); err == nil { - t.Error("empty url not errored") - } - if err := l.RegPlugin("string/*string", "dynamic1", - glick.PluginGetURL(false, "", &proto), nil); err != nil { - t.Error(err) - } - if err := l.RegPlugin("string/*string", "documize", - glick.PluginGetURL(true, "https://documize.com", &proto), nil); err != nil { - t.Error(err) - } - if _, err := l.Run(nil, "string/*string", "documize", ""); err != nil { - t.Error(err) - } - if _, err := l.Run(nil, "string/*string", "dynamic1", "http://golang.org"); err != nil { - t.Error(err) - } - if _, err := l.Run(nil, "string/*string", "dynamic1", ""); err == nil { - t.Error("empty url did not error") - } - if _, err := l.Run(nil, "string/*string", "dynamic1", "!@£$%^&*()"); err == nil { - t.Error("bad url did not error") - } -} - -func TestGetURLint(t *testing.T) { - outProtoString := func() interface{} { var s string; return interface{}(&s) } - outProtoInt := func() interface{} { var i int; return interface{}(&i) } - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - proto := "" - - ip := 0 - if err := l.RegAPI("int/*string", ip, outProtoString, 2*time.Second); err != nil { - t.Error(err) - } - if err := l.RegPlugin("int/*string", "documize", - glick.PluginGetURL(true, "https://documize.com", &proto), nil); err != nil { - t.Error(err) - } - if _, err := l.Run(nil, "int/*string", "documize", 42); err == nil { - t.Error("bad api in did not error") - } - if err := l.RegAPI("string/*int", proto, outProtoInt, 2*time.Second); err != nil { - t.Error(err) - } - if err := l.RegPlugin("string/*int", "documize", - glick.PluginGetURL(true, "https://documize.com", &proto), nil); err != nil { - t.Error(err) - } - if _, err := l.Run(nil, "string/*int", "documize", ""); err == nil { - t.Error("bad api out did not error") - } - if _, err := l.Run(nil, "string/*string", "documize", nil); err == nil { - t.Error("nil input value did not error") - } - if _, err := l.Run(nil, "string/*string", "documize", true); err == nil { - t.Error("incorrect input value did not error") - } -} diff --git a/vendor/github.com/documize/glick/glgrpc/README.md b/vendor/github.com/documize/glick/glgrpc/README.md deleted file mode 100644 index c06c70f5..00000000 --- a/vendor/github.com/documize/glick/glgrpc/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains an example of using the [gRPC framework](http://www.grpc.io/) to create glick plugins. - - \ No newline at end of file diff --git a/vendor/github.com/documize/glick/glgrpc/example_test.go b/vendor/github.com/documize/glick/glgrpc/example_test.go deleted file mode 100644 index 9c6409de..00000000 --- a/vendor/github.com/documize/glick/glgrpc/example_test.go +++ /dev/null @@ -1,150 +0,0 @@ -package glgrpc_test - -import ( - "errors" - "fmt" - "log" - "net" - "time" - - "github.com/documize/glick" - - "golang.org/x/net/context" - "google.golang.org/grpc" - - pb "google.golang.org/grpc/examples/helloworld/helloworld" -) - -const ( - address = "localhost:50051" -) - -func ConfigGRPChw(lib *glick.Library) error { - return lib.AddConfigurator("gRPChw", func(l *glick.Library, line int, cfg *glick.Config) error { - for _, action := range cfg.Actions { - if err := l.RegPlugin(cfg.API, action, - func(ctx context.Context, in interface{}) (out interface{}, err error) { - ins, ok := in.(*pb.HelloRequest) - if !ok { - return nil, errors.New("not *pb.HelloRequest") - } - out = interface{}(&pb.HelloReply{}) - outsp := out.(*pb.HelloReply) - dialOpt := []grpc.DialOption{grpc.WithInsecure()} - if deadline, ok := ctx.Deadline(); ok { - dialOpt = append(dialOpt, - grpc.WithTimeout(deadline.Sub(time.Now()))) - } - conn, err := grpc.Dial(address, dialOpt...) - if err != nil { - return nil, err - } - defer func() { - if e := conn.Close(); e != nil { - panic(e) - } - }() - c := pb.NewGreeterClient(conn) - - r, err := c.SayHello(context.Background(), ins) - if err != nil { - return nil, err - } - *outsp = *r - return out, nil - }, cfg); err != nil { - return fmt.Errorf("entry %d GRPChw register plugin error: %v", - line, err) - } - } - return nil - }) -} - -func ExampleGRPChw() { - go servermain() - time.Sleep(time.Second) - - l, nerr := glick.New(nil) - if nerr != nil { - log.Fatal(nerr) - } - var req pb.HelloRequest - var err error - if err = l.RegAPI("hw", &req, func() interface{} { var hr pb.HelloReply; return interface{}(&hr) }, 2*time.Second); err != nil { - log.Fatal(err) - } - if err := ConfigGRPChw(l); err != nil { - log.Fatal(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"ExampleGRPChw","API":"hw","Actions":["hwAct"],"Type":"gRPChw","Path":"` + address + `"} - ]`)); err != nil { - log.Fatal(err) - } - req.Name = "gRPC" - ctx, cancelCtx := context.WithTimeout(context.Background(), time.Second) - defer cancelCtx() - repI, err := l.Run(ctx, "hw", "hwAct", &req) - if err != nil { - log.Fatal(err) - } - fmt.Println(repI.(*pb.HelloReply).Message) - // output: Hello gRPC -} - -// code below copied and slightly modified from google.golang.org/grpc/examples/helloworld/greeter_server - -/* - * - * Copyright 2015, Google Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -// server is used to implement hellowrld.GreeterServer. -type server struct{} - -// SayHello implements helloworld.GreeterServer -func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) { - return &pb.HelloReply{Message: "Hello " + in.Name}, nil -} - -func servermain() { - lis, err := net.Listen("tcp", address) - if err != nil { - log.Fatalf("failed to Listen: %v", err) - } - s := grpc.NewServer() - pb.RegisterGreeterServer(s, &server{}) - err = s.Serve(lis) - if err != nil { - log.Fatalf("failed to Serve: %v", err) - } -} diff --git a/vendor/github.com/documize/glick/glkit/README.md b/vendor/github.com/documize/glick/glkit/README.md deleted file mode 100644 index b921f188..00000000 --- a/vendor/github.com/documize/glick/glkit/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains the code for creating simple [Go-Kit](http://gokit.io/) glick plugins. - -Note that a glick Pugin type has the same Go signature as a go-kit Endpoint type. This means that glick Plugins can be used as go-kit Endpoints (or vice-versa). diff --git a/vendor/github.com/documize/glick/glkit/gokit.go b/vendor/github.com/documize/glick/glkit/gokit.go deleted file mode 100644 index 2dc674db..00000000 --- a/vendor/github.com/documize/glick/glkit/gokit.go +++ /dev/null @@ -1,85 +0,0 @@ -// Package glkit enables integration with gokit.io from the glick library. -// It can do so in two ways, either within the server, or as a client. -// -// Within a go-kit server, the glick package can provide gokit endpoints -// created using glick (and therefore the glick 3-level configuration) -// by using the MakeEndpoint() function. -// -// When writing a client to a go-kit server, the PluginKitJSONoverHTTP() -// function allows the creation of simple plugins for JSON over HTTP -// (the most basic form of microservice available within go-kit); -// while ConfigKit() allows those simple plugins to be configured via -// the library JSON configuration process. -// -package glkit - -import ( - "bytes" - "encoding/json" - "fmt" - "io/ioutil" - "net/http" - - "github.com/documize/glick" - "github.com/go-kit/kit/endpoint" - "golang.org/x/net/context" -) - -// MakeEndpoint returns a gokit.io endpoint from a glick library, -// it is intended for use inside servers constructed using gokit. -func MakeEndpoint(l *glick.Library, api, action string) endpoint.Endpoint { - return func(ctx context.Context, in interface{}) (interface{}, error) { - return l.Run(ctx, api, action, in) - } -} - -// PluginKitJSONoverHTTP enables calls to plugin commands -// implemented as microservices using "gokit.io". -func PluginKitJSONoverHTTP(cmdPath string, ppo glick.ProtoPlugOut) glick.Plugin { - return func(ctx context.Context, in interface{}) (out interface{}, err error) { - var j, b []byte - var r *http.Response - if j, err = json.Marshal(in); err != nil { - return nil, err - } - if r, err = http.Post(cmdPath, "application/json", bytes.NewReader(j)); err != nil { - return nil, err - } - if b, err = ioutil.ReadAll(r.Body); err != nil { - return nil, err - } - out = ppo() - if err = json.Unmarshal(b, &out); err != nil { - return nil, err - } - return out, nil - } -} - -// ConfigKit provides the Configurator for the GoKit class of plugin. -func ConfigKit(lib *glick.Library) error { - if lib == nil { - return glick.ErrNilLib - } - return lib.AddConfigurator("KIT", func(l *glick.Library, line int, cfg *glick.Config) error { - ppo, err := l.ProtoPlugOut(cfg.API) - if err != nil { // internal error, simple test case impossible - return fmt.Errorf( - "entry %d Go-Kit plugin error for api: %s actions: %v error: %s", - line, cfg.API, cfg.Actions, err) - } - if cfg.Gob { - return fmt.Errorf( - "entry %d Go-Kit: non-JSON plugins are not supported", - line) - } - for _, action := range cfg.Actions { - if err := l.RegPlugin(cfg.API, action, PluginKitJSONoverHTTP(cfg.Path, ppo), cfg); err != nil { - // internal error, simple test case impossible - return fmt.Errorf("entry %d Go-Kit register plugin error: %v", - line, err) - } - } - return nil - }) -} diff --git a/vendor/github.com/documize/glick/glkit/gokit_test.go b/vendor/github.com/documize/glick/glkit/gokit_test.go deleted file mode 100644 index 9d823cea..00000000 --- a/vendor/github.com/documize/glick/glkit/gokit_test.go +++ /dev/null @@ -1,223 +0,0 @@ -package glkit_test - -import ( - "testing" - "time" - - "github.com/documize/glick" - "github.com/documize/glick/glkit" - - "encoding/json" - "errors" - "log" - "net/http" - "strings" - - "golang.org/x/net/context" - - "github.com/go-kit/kit/endpoint" - httptransport "github.com/go-kit/kit/transport/http" -) - -func TestGoKitStringsvc1(t *testing.T) { - go servermain() - - <-time.After(2 * time.Second) - - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - - if err := glkit.ConfigKit(l); err != nil { - t.Error(err) - } - if err := l.RegAPI("uppercase", uppercaseRequest{}, - func() interface{} { return &uppercaseResponse{} }, time.Second); err != nil { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"gk","API":"uppercase","Actions":["uc"],"Type":"KIT","Path":"http://localhost:8080/uppercase","JSON":true}, -{"Plugin":"gk","API":"uppercase","Actions":["lc"],"Type":"KIT","Path":"http://localhost:8080/lowercase","JSON":true} - ]`)); err != nil { - t.Error(err) - } - if rep, err := l.Run(nil, "uppercase", "uc", uppercaseRequest{S: "abc"}); err == nil { - if rep.(*uppercaseResponse).V != "ABC" { - t.Error("uppercase did not work") - } - } else { - t.Error(err) - } - if rep, err := l.Run(nil, "uppercase", "lc", uppercaseRequest{S: "XYZ"}); err == nil { - if rep.(*uppercaseResponse).V != "xyz" { - t.Error("lowercase did not work") - } - } else { - t.Error(err) - } - if err := l.Configure([]byte(`[ -{"Plugin":"gk","API":"uppercase","Actions":["uc"],"Type":"KIT","Path":"http://localhost:8080/uppercase","Gob":true} - ]`)); err == nil { - t.Error("did not spot non-JSON") - } - - testCount(t) -} - -func testCount(t *testing.T) { - // use the more direct method for count - count := glkit.PluginKitJSONoverHTTP("http://localhost:8080/count", - func() interface{} { return &countResponse{} }) - cc, ecc := count(nil, countRequest{S: "abc"}) - if ecc != nil { - t.Error(ecc) - } - if cc.(*countResponse).V != 3 { - t.Error("count did not work") - } -} - -func TestAssignFn(t *testing.T) { - var glp glick.Plugin - var kep endpoint.Endpoint - - x := func(c context.Context, i interface{}) (interface{}, error) { - return nil, nil - } - - glp = x - kep = x - glp = glick.Plugin(kep) - kep = endpoint.Endpoint(glp) - // NOTE: kep assigned to but never used, so: - _ = kep -} - -// example below modified from https://github.com/go-kit/kit/blob/master/examples/stringsvc1/main.go - -// StringService provides operations on strings. -type StringService interface { - Uppercase(string) (string, error) - Count(string) int -} - -type stringService struct{} - -func (stringService) Uppercase(s string) (string, error) { - if s == "" { - return "", ErrEmpty - } - return strings.ToUpper(s), nil -} - -func (stringService) Count(s string) int { - return len(s) -} - -func servermain() { - lib, nerr := glick.New(nil) - if nerr != nil { - panic(nerr) - } - if err := lib.RegAPI("api", uppercaseRequest{}, - func() interface{} { return uppercaseResponse{} }, time.Second); err != nil { - panic(err) - } - if err := lib.RegPlugin("api", "lc", - func(ctx context.Context, in interface{}) (interface{}, error) { - return uppercaseResponse{ - V: strings.ToLower(in.(uppercaseRequest).S), - }, nil - }, nil); err != nil { - panic(err) - } - - ctx := context.Background() - svc := stringService{} - - lowercaseHandler := httptransport.NewServer( - ctx, - glkit.MakeEndpoint(lib, "api", "lc"), - decodeUppercaseRequest, - encodeResponse, - ) - - uppercaseHandler := httptransport.NewServer( - ctx, - makeUppercaseEndpoint(svc), - decodeUppercaseRequest, - encodeResponse, - ) - - countHandler := httptransport.NewServer( - ctx, - makeCountEndpoint(svc), - decodeCountRequest, - encodeResponse, - ) - - http.Handle("/uppercase", uppercaseHandler) - http.Handle("/lowercase", lowercaseHandler) - http.Handle("/count", countHandler) - log.Fatal(http.ListenAndServe("localhost:8080", nil)) -} - -func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(uppercaseRequest) - v, err := svc.Uppercase(req.S) - if err != nil { - return uppercaseResponse{v, err.Error()}, nil - } - return uppercaseResponse{v, ""}, nil - } -} - -func makeCountEndpoint(svc StringService) endpoint.Endpoint { - return func(ctx context.Context, request interface{}) (interface{}, error) { - req := request.(countRequest) - v := svc.Count(req.S) - return countResponse{v}, nil - } -} - -func decodeUppercaseRequest(r *http.Request) (interface{}, error) { - var request uppercaseRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func decodeCountRequest(r *http.Request) (interface{}, error) { - var request countRequest - if err := json.NewDecoder(r.Body).Decode(&request); err != nil { - return nil, err - } - return request, nil -} - -func encodeResponse(w http.ResponseWriter, response interface{}) error { - return json.NewEncoder(w).Encode(response) -} - -type uppercaseRequest struct { - S string `json:"s"` -} - -type uppercaseResponse struct { - V string `json:"v"` - Err string `json:"err,omitempty"` // errors don't define JSON marshaling -} - -type countRequest struct { - S string `json:"s"` -} - -type countResponse struct { - V int `json:"v"` -} - -// ErrEmpty is returned when an input string is empty. -var ErrEmpty = errors.New("empty string") diff --git a/vendor/github.com/documize/glick/glpie/README.md b/vendor/github.com/documize/glick/glpie/README.md deleted file mode 100644 index 35b71e13..00000000 --- a/vendor/github.com/documize/glick/glpie/README.md +++ /dev/null @@ -1,2 +0,0 @@ -This directory contains the code for creating simple [PIE](https://github.com/natefinch/pie) glick plugins. - diff --git a/vendor/github.com/documize/glick/glpie/pie.go b/vendor/github.com/documize/glick/glpie/pie.go deleted file mode 100644 index d8f204ec..00000000 --- a/vendor/github.com/documize/glick/glpie/pie.go +++ /dev/null @@ -1,99 +0,0 @@ -// Package glpie exists to allow use of "github.com/natefinch/pie" -// (a toolkit for creating plugins for Go applications) from -// the glick package. -// -package glpie - -import ( - "fmt" - "net/rpc" - "net/rpc/jsonrpc" - "os" - "sync" - - "github.com/documize/glick" - - "golang.org/x/net/context" - - "github.com/natefinch/pie" -) - -// pi provides the underlying type for running plugin commands created using github.com/natefinch/pie. -type pi struct { - useJSON bool - serviceMethod string - cmdPath string - args []string - // this servers runtime info - mtx sync.Mutex - client *rpc.Client - err error -} - -func (p *pi) newClient() { - // note if the client is still running we can't p.client.Close() without a data-race - // TODO investigate if there is a better way to clean-up - if p.useJSON { - p.client, p.err = pie.StartProviderCodec( - jsonrpc.NewClientCodec, os.Stderr, p.cmdPath, p.args...) - } else { - p.client, p.err = pie.StartProvider(os.Stderr, p.cmdPath, p.args...) - } - if p.err != nil { - p.err = fmt.Errorf("plugin %#v failed, error %v", *p, p.err) - } -} - -func (p *pi) plugin(ctx context.Context, in, out interface{}) error { - p.mtx.Lock() - defer p.mtx.Unlock() - if p.err != nil { - defer p.newClient() //set up again if we've had an error last time - return p.err - } - return p.client.Call(p.serviceMethod, in, out) -} - -// PluginPie enables plugin commands created using github.com/natefinch/pie. -func PluginPie(useJSON bool, serviceMethod string, cmd []string, ppo glick.ProtoPlugOut) glick.Plugin { - if len(cmd) == 0 { - return nil - } - f, e := os.Open(cmd[0]) - if e != nil { - return nil - } - e = f.Close() - if e != nil { - return nil - } - ret := &pi{useJSON, serviceMethod, cmd[0], cmd[1:], sync.Mutex{}, nil, nil} - ret.newClient() - return func(ctx context.Context, in interface{}) (out interface{}, err error) { - out = ppo() - err = ret.plugin(ctx, in, out) - return - } -} - -// ConfigPIE provides the Configurator for the PIE class of plugin. -func ConfigPIE(lib *glick.Library) error { - if lib == nil { - return glick.ErrNilLib - } - return lib.AddConfigurator("PIE", func(l *glick.Library, line int, cfg *glick.Config) error { - ppo, err := l.ProtoPlugOut(cfg.API) - if err != nil { - return fmt.Errorf("entry %d PIE register plugin error: %v", - line, err) // no simple test possible for this path - } - pi := PluginPie(!cfg.Gob, cfg.Method, cfg.Cmd, ppo) - for _, action := range cfg.Actions { - if err := l.RegPlugin(cfg.API, action, pi, cfg); err != nil { - return fmt.Errorf("entry %d PIE register plugin error: %v", - line, err) - } - } - return nil - }) -} diff --git a/vendor/github.com/documize/glick/glpie/pie_test.go b/vendor/github.com/documize/glick/glpie/pie_test.go deleted file mode 100644 index ea3f898d..00000000 --- a/vendor/github.com/documize/glick/glpie/pie_test.go +++ /dev/null @@ -1,125 +0,0 @@ -package glpie_test - -import ( - "fmt" - "testing" - "time" - - "github.com/documize/glick" - test "github.com/documize/glick/_test" - "github.com/documize/glick/glpie" -) - -func pieSwitchTest(t *testing.T, useJSON bool) { - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - return - } - if err := glpie.ConfigPIE(l); err != nil { - t.Error(err) - return - } - var proto string - protoOut := func() interface{} { - s := "" - return interface{}(&s) - } - if err := l.RegAPI("string/&string", proto, protoOut, 10*time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("string/&string", "cmdBad", - glpie.PluginPie(useJSON, "dingbat", []string{"doodah"}, protoOut), nil); err == nil { - t.Error("garbage pie plugin did not fail") - return - } - if _, err := l.Run(nil, "string/&string", "cmdBad", proto); err == nil { - t.Error("bad command did not fail") - return - } - api := fmt.Sprintf("API%v", useJSON) - act := fmt.Sprintf("ACT%v", useJSON) - tisOut := func() interface{} { - return interface{}(&test.IntStr{}) - } - if err := l.RegAPI(api, test.IntStr{}, tisOut, 2*time.Second); err != nil { - t.Error(err) - return - } - cmdPath := "./_test/gob/gob" - if useJSON { - cmdPath = "./_test/json/json" - } - if err := l.RegPlugin(api, act, - glpie.PluginPie(useJSON, "CI.CopyIntX", []string{cmdPath}, tisOut), nil); err != nil { - t.Error("unable to create " + err.Error()) - return - } - - parTest(t, l, api, act, cmdPath, useJSON, tisOut) - -} -func parTest(t *testing.T, l *glick.Library, api, act, cmdPath string, useJSON bool, tisOut func() interface{}) { - par := test.IntStr{I: 42} - if ret, err := l.Run(nil, api, act, par); err != nil { - t.Error("unable to run pie " + err.Error()) - } else { - if ret.(*test.IntStr).I != 42 { - t.Error("pie integer copy did not work") - } - } - par.I = 4 - if _, err := l.Run(nil, api, act, par); err == nil { - t.Error("over-long pie plugin did not timeout") - } - if err := l.RegPlugin(api, act+"bad", - glpie.PluginPie(true, "CI.CopyIntX", []string{"./_test/bad/bad"}, tisOut), nil); err != nil { - t.Error("unable to create " + err.Error()) - } - par.I = 0 - if _, err := l.Run(nil, api, act+"bad", par); err == nil { - t.Error("bad pie plugin did not error") - } - if err := l.RegPlugin(api, act+"badder", - glpie.PluginPie(true, "CI.CopyIntX", []string{"./_test/bad/main.go"}, tisOut), nil); err != nil { - t.Error("unable to create " + err.Error()) - } - par.I = 0 - if _, err := l.Run(nil, api, act+"badder", par); err == nil { - t.Error("non-runnable bad pie plugin did not error") - } - parTestGobler(t, l, api, act, cmdPath, useJSON, tisOut) -} -func parTestGobler(t *testing.T, l *glick.Library, api, act, cmdPath string, useJSON bool, tisOut func() interface{}) { - gobbler := fmt.Sprintf("%v", !useJSON) - if err := l.Configure([]byte(`[ -{"Plugin":"pie1","API":"` + api + `","Actions":["intStr1"],"Type":"PIE","Cmd":["` + cmdPath + `"],"Method":"CI.CopyIntX","Gob":` + gobbler + `} - ]`)); err != nil { - t.Error(err) - } - par := test.IntStr{I: 42} - if _, err := l.Run(nil, api, "intStr1", par); err != nil { - t.Error("unable to run intStr1 for " + api + " err=" + err.Error()) - } - if err := l.Configure([]byte(`[ -{"Plugin":"pie2","API":"` + api + `","Actions":["intStr2"],"Type":"PIE"} - ]`)); err == nil { - t.Error("unsuited end pie exe not spotted") - } - if err := l.Configure([]byte(`[ -{"Plugin":"pie3","API":"` + api + `","Actions":["intStr1"],"Type":"PIE","Cmd":["illegal path"]} - ]`)); err == nil { - t.Error("unsuited pie exe path not spotted") - } - if err := l.Configure([]byte(`[ -{"Plugin":"pie4","API":"nothing here","Actions":["intStr1"],"Type":"PIE"} - ]`)); err == nil { - t.Error("unsuited pie api not spotted") - } -} - -func TestPie(t *testing.T) { - pieSwitchTest(t, true) - pieSwitchTest(t, false) -} diff --git a/vendor/github.com/documize/glick/plugin.go b/vendor/github.com/documize/glick/plugin.go index 99af4bf3..e67331c9 100644 --- a/vendor/github.com/documize/glick/plugin.go +++ b/vendor/github.com/documize/glick/plugin.go @@ -130,7 +130,7 @@ func (l *Library) RegPlugin(api, action string, handler Plugin, cfg *Config) err return errNoAPI(api) } if handler == nil { - return errNoPlug("nil handler for api "+api) + return errNoPlug("nil handler for api " + api) } l.pim[plugkey{api, action}] = plugval{handler, cfg} return nil @@ -196,7 +196,7 @@ func (l *Library) Run(ctx context.Context, api, action string, in interface{}) ( func (l *Library) run(ctx context.Context, api string, found bool, handler Plugin, def apidef, in interface{}) (out interface{}, err error) { if !found || handler == nil { - return nil, errNoPlug("api "+api) + return nil, errNoPlug("api " + api) } reply := make(chan plugOut) ctxWT, cancel := context.WithTimeout(ctx, l.apim[api].timeout) diff --git a/vendor/github.com/documize/glick/plugin_test.go b/vendor/github.com/documize/glick/plugin_test.go deleted file mode 100644 index b7221055..00000000 --- a/vendor/github.com/documize/glick/plugin_test.go +++ /dev/null @@ -1,241 +0,0 @@ -package glick_test - -import ( - "errors" - "reflect" - "testing" - "time" - - "github.com/documize/glick" - - "golang.org/x/net/context" -) - -func TestAPI(t *testing.T) { - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - if err := l.RegAPI("z", nil, nil, time.Second); err != glick.ErrNilAPI { - t.Error("does not return nil api error") - } - var dummy int - outGood := func() interface{} { var d int; return interface{}(&d) } - if err := l.RegAPI("z", dummy, outGood, time.Second); err != nil { - t.Error("1st reg API returns error") - } - if err := l.RegAPI("z", dummy, outGood, time.Second); err == nil { - t.Error("does not return duplicate api error") - } - if _, err := l.Run(nil, "z", "unknown", dummy); err == nil { - t.Error("does not return no plugin") - } - if _, err := l.Run(nil, "unknown", "unknown", dummy); err == nil { - t.Error("does not return unknown api error") - } -} - -func Simp(ctx context.Context, in interface{}) (out interface{}, err error) { - r := in.(int) - return &r, nil -} -func outSimp() interface{} { var i int; return interface{}(&i) } - -func TestSimple(t *testing.T) { - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - api := "S" - var i int - if err := l.RegPlugin("unknown", "Test", Simp, nil); err == nil { - t.Error("register plugin does not give unknown API error") - } - if err := l.RegAPI(api, i, outSimp, time.Second); err != nil { - t.Error(err) - return - } - if er1 := l.RegPlugin(api, "Test", Simp, nil); er1 != nil { - t.Error("register gives error", er1) - } - if ret, err := l.Run(nil, api, "Test", 42); err != nil { - t.Error(err) - } else { - if *ret.(*int) != 42 { - t.Error("called plugin did not work") - } - } - - if ppo, err := l.ProtoPlugOut(api); err == nil { - if reflect.TypeOf(ppo()) != reflect.TypeOf(outSimp()) { - t.Error("wrong proto type") - } - } else { - t.Error(err) - } - if _, err := l.ProtoPlugOut("Sinbad"); err == nil { - t.Error("no error for non-existant api") - } -} - -func TestDup(t *testing.T) { - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - var d struct{} - if er0 := l.RegAPI("A", d, - func() interface{} { var s struct{}; return interface{}(&s) }, - time.Second); er0 != nil { - t.Error("register API gives error") - } - if er1 := l.RegPlugin("A", "B", Simp, nil); er1 != nil { - t.Error("first entry gives error") - } - er2 := l.RegPlugin("A", "B", Simp, nil) - if er2 != nil { - t.Error("second entry should not give error") - } -} - -func Tov(ctx context.Context, in interface{}) (interface{}, error) { - t := true - return &t, nil -} - -func outTov() interface{} { - var t bool - return interface{}(&t) -} - -func Def(ctx context.Context, in interface{}) (interface{}, error) { - t := false - return &t, nil -} - -func outDef() interface{} { - var t bool - return interface{}(&t) -} - -func Forever(ctx context.Context, in interface{}) (interface{}, error) { - time.Sleep(time.Hour) - return nil, nil // this line is unreachable in practice -} -func outForever() interface{} { - var t bool - return interface{}(&t) -} - -func JustBad(ctx context.Context, in interface{}) (interface{}, error) { - return nil, errors.New("just bad, bad, bad") -} - -func outJustBad() interface{} { - var t bool - return interface{}(&t) -} - -func TestOverloaderMOL(t *testing.T) { - hadOvStub := Tov - l, nerr := glick.New(func(ctx context.Context, api, act string, handler glick.Plugin) (context.Context, glick.Plugin, error) { - if api == "abc" && act == "meaning-of-life" { - return ctx, hadOvStub, nil - } - return ctx, nil, nil - }) - if nerr != nil { - t.Error(nerr) - } - var prototype int - if err := l.RegAPI("abc", prototype, - func() interface{} { var b bool; return interface{}(&b) }, - time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("abc", "default", Def, nil); err != nil { - t.Error(err) - return - } - if ret, err := l.Run(nil, "abc", "default", 1); err != nil { - t.Error(err) - } else { - if *ret.(*bool) { - t.Error("Overloaded function called in error") - } - } - if ret, err := l.Run(nil, "abc", "meaning-of-life", 1); err != nil { - t.Error(err) - } else { - if !*ret.(*bool) { - t.Error("Overloaded function not called") - } - } -} - -func TestOverloaderBad(t *testing.T) { - l, nerr := glick.New(func(ctx context.Context, api, act string, handler glick.Plugin) (context.Context, glick.Plugin, error) { - if api == "abc" && act == "bad" { - return ctx, nil, errors.New("you done a bad... bad... thing") - } - return ctx, nil, nil - }) - if nerr != nil { - t.Error(nerr) - } - var prototype int - if err := l.RegAPI("abc", prototype, - func() interface{} { var b bool; return interface{}(&b) }, - time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("abc", "bad", Def, nil); err != nil { - t.Error(err) - return - } - if _, err := l.Run(nil, "abc", "bad", 1); err == nil { - t.Error("overloader should have errored") - return - } - ctx, can := context.WithTimeout(context.Background(), time.Millisecond) - defer can() - if err := l.RegPlugin("abc", "justBad", JustBad, nil); err != nil { - t.Error(err) - return - } - ctx, can = context.WithTimeout(context.Background(), time.Millisecond) - defer can() - if _, err := l.Run(ctx, "abc", "justBad", 1); err == nil { - t.Error("overloader should have errored") - return - } - -} - -func TestOverloaderForever(t *testing.T) { - l, nerr := glick.New(func(ctx context.Context, api, act string, handler glick.Plugin) (context.Context, glick.Plugin, error) { - return ctx, nil, nil - }) - if nerr != nil { - t.Error(nerr) - } - var prototype int - if err := l.RegAPI("abc", prototype, - func() interface{} { var b bool; return interface{}(&b) }, - time.Second); err != nil { - t.Error(err) - return - } - if err := l.RegPlugin("abc", "forever", Forever, nil); err != nil { - t.Error(err) - return - } - ctx, can := context.WithTimeout(context.Background(), time.Millisecond) - defer can() - if _, err := l.Run(ctx, "abc", "forever", 1); err == nil { - t.Error("overloader should have errored") - return - } -} diff --git a/vendor/github.com/documize/glick/rpc.go b/vendor/github.com/documize/glick/rpc.go index 9f327d68..081af066 100644 --- a/vendor/github.com/documize/glick/rpc.go +++ b/vendor/github.com/documize/glick/rpc.go @@ -39,6 +39,11 @@ func PluginRPC(useJSON bool, serviceMethod, endPoint string, ppo ProtoPlugOut) P return func(ctx context.Context, in interface{}) (out interface{}, err error) { var client *rpc.Client var conn *tls.Conn + var connClose = func() { + if e := conn.Close(); err == nil { + err = e + } + } var errDial error var cfg = &tls.Config{ InsecureSkipVerify: InsecureSkipVerifyTLS, @@ -47,7 +52,7 @@ func PluginRPC(useJSON bool, serviceMethod, endPoint string, ppo ProtoPlugOut) P if useTLS { conn, errDial = tls.Dial("tcp", endPoint, cfg) if errDial == nil { - defer conn.Close() + defer connClose() client = jsonrpc.NewClient(conn) } } else { @@ -57,7 +62,7 @@ func PluginRPC(useJSON bool, serviceMethod, endPoint string, ppo ProtoPlugOut) P if useTLS { conn, errDial = tls.Dial("tcp", endPoint, cfg) if errDial == nil { - defer conn.Close() + defer connClose() client = rpc.NewClient(conn) } } else { diff --git a/vendor/github.com/documize/glick/rpc_test.go b/vendor/github.com/documize/glick/rpc_test.go deleted file mode 100644 index 5602f1d7..00000000 --- a/vendor/github.com/documize/glick/rpc_test.go +++ /dev/null @@ -1,155 +0,0 @@ -package glick_test - -import ( - "net" - "net/rpc" - "net/rpc/jsonrpc" - "sync" - "testing" - "time" - - "github.com/documize/glick" - test "github.com/documize/glick/_test" -) - -func TestRPC(t *testing.T) { - tisOut := func() interface{} { - return interface{}(&test.IntStr{}) - } - - // set up the server - - if err := rpc.Register(&test.CI{}); err != nil { - t.Error(err.Error()) - return - } - - for i := 0; i < 2; i++ { - - endPt := "localhost:808" - endPt += string('8' + i) - - var up sync.WaitGroup - up.Add(1) - - // start the protocol server - go func(ii int, ep string) { - listener, err := net.Listen("tcp", ep) - if err != nil { - t.Error(err.Error()) - return - } - up.Done() - for { - conn, err := listener.Accept() - if err != nil { - t.Error(err.Error()) - return - } - if ii == 0 { - go rpc.ServeConn(conn) - } else { - go jsonrpc.ServeConn(conn) - } - } - }(i, endPt) - - up.Wait() - - // run the client code - var useJSON bool - if i > 0 { - useJSON = true - } - - client(t, useJSON, tisOut, endPt) - clientBad(t, useJSON, tisOut, endPt) - } -} - -func client(t *testing.T, useJSON bool, tisOut func() interface{}, endPt string) { - - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - - api := "ab" - act := "cdef" - if err := l.RegAPI(api, test.IntStr{}, tisOut, 2*time.Second); err != nil { - t.Error(err) - return - } - - if err := l.RegPlugin(api, act, - glick.PluginRPC(useJSON, "CI.CopyIntX", endPt, tisOut), nil); err != nil { - t.Error("unable to create JsonRPC " + err.Error()) - return - } - - par := test.IntStr{I: 42} - if ret, err := l.Run(nil, api, act, par); err != nil { - t.Error("unable to run plugin " + err.Error()) - } else { - if ret.(*test.IntStr).I != 42 { - t.Error("RPC integer copy did not work") - } - } - par.I = 4 - if _, err := l.Run(nil, api, act, par); err == nil { - t.Error("over-long plugin did not timeout") - } - - if err := l.RegPlugin(api, "bep", - glick.PluginRPC(useJSON, "", "localhost:8080", tisOut), nil); err == nil { - t.Error("able to create empty end-point method") - return - } - - if err := l.RegPlugin(api, "bep", - glick.PluginRPC(useJSON, "CI.CopyIntX", "", tisOut), nil); err == nil { - t.Error("able to create empty endpoint") - return - } -} -func clientBad(t *testing.T, useJSON bool, tisOut func() interface{}, endPt string) { - - l, nerr := glick.New(nil) - if nerr != nil { - t.Error(nerr) - } - - api := "ab" - act := "cdef" - if err := l.RegAPI(api, test.IntStr{}, tisOut, 2*time.Second); err != nil { - t.Error(err) - return - } - - if err := l.RegPlugin(api, act, - glick.PluginRPC(useJSON, "CI.CopyIntX", endPt, tisOut), nil); err != nil { - t.Error("unable to create JsonRPC " + err.Error()) - return - } - - par := test.IntStr{I: 42} - - if err := l.RegPlugin(api, "errEP", - glick.PluginRPC(useJSON, "CI.CopyIntX", "localhost:9999", tisOut), nil); err != nil { - t.Error("error on valid (if unused) endpoint") - return - } - if _, err := l.Run(nil, api, "errEP", par); err == nil { - t.Error("did not error on unpopulated end-point") - } - - noPoint := func() interface{} { return interface{}(42) } - if err := l.RegAPI("noPoint", 42, noPoint, 0); err != nil { - t.Error(err) - } - if err := l.RegPlugin("noPoint", "errEP", - glick.PluginRPC(useJSON, "CI.CopyIntX", "localhost:9999", noPoint), nil); err == nil { - t.Error("a non-pointer return should error") - } - -} diff --git a/vendor/github.com/documize/glick/text_test.go b/vendor/github.com/documize/glick/text_test.go deleted file mode 100644 index 6a9345ff..00000000 --- a/vendor/github.com/documize/glick/text_test.go +++ /dev/null @@ -1,85 +0,0 @@ -package glick_test - -import ( - "io/ioutil" - "reflect" - "testing" - - "github.com/documize/glick" -) - -func textReader(t *testing.T, tst interface{}, atp string, i int) { - rdr, err := glick.TextReader(tst) - if err == nil && i == 0 || err != nil && i > 0 { - t.Errorf("unexpected TextReader error for %T: %s", tst, err) - } else { - if i > 0 { - b, err := ioutil.ReadAll(rdr) - if err != nil { - t.Error(err) - } - if string(b) != atp { - t.Error("incorrect output from TextReader") - } - } - } -} -func textBytes(t *testing.T, tst interface{}, atp string, i int) { - byts, err := glick.TextBytes(tst) - if err == nil && i == 0 || err != nil && i > 0 { - t.Errorf("unexpected TextBytes error for %T: %s", tst, err) - } else { - if i > 0 { - if string(byts) != atp { - t.Error("incorrect output from TextBytes") - } - } - } -} -func textConvert(t *testing.T, tst interface{}, atp string, i int, atpB []byte) { - ifc, err := glick.TextConvert(atpB, tst) - if err == nil && i == 0 || err != nil && i > 0 { - t.Errorf("unexpected TextConvert error for %T: %s", tst, err) - } else { - if i > 0 { - if reflect.TypeOf(ifc) != reflect.TypeOf(tst) { - t.Errorf("incorrect output type from TextConvert") - } else { - ifcs := ifcstring(ifc) - if ifcs != atp { - t.Error("strings not equal") - } - } - } - } -} - -func ifcstring(ifc interface{}) string { - ifcs := "NOT-SET" - switch ifc.(type) { - case string: - ifcs = ifc.(string) - case *string: - ifcs = *ifc.(*string) - case []byte: - ifcs = string(ifc.([]byte)) - case *[]byte: - ifcs = string(*ifc.(*[]byte)) - } - return ifcs -} - -func TestText(t *testing.T) { - atp := "a test phrase" - atpB := []byte(atp) - tests := []interface{}{true, atp, &atp, atpB, &atpB} - for i, tst := range tests { - ok := glick.IsText(tst) - if ok && i == 0 || !ok && i > 0 { - t.Errorf("unexpected IsTest for %T", tst) - } - textReader(t, tst, atp, i) - textBytes(t, tst, atp, i) - textConvert(t, tst, atp, i, atpB) - } -} diff --git a/vendor/github.com/documize/html-diff/benchmark_test.go b/vendor/github.com/documize/html-diff/benchmark_test.go deleted file mode 100644 index d784baed..00000000 --- a/vendor/github.com/documize/html-diff/benchmark_test.go +++ /dev/null @@ -1,28 +0,0 @@ -package htmldiff_test - -import ( - "strings" - "testing" - - "github.com/documize/html-diff" -) - -var cfgBench = &htmldiff.Config{ - Granularity: 6, - InsertedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: palegreen; text-decoration: underline;"}}, - DeletedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: lightpink; text-decoration: line-through;"}}, - ReplacedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: lightskyblue; text-decoration: overline;"}}, - CleanTags: []string{"documize"}, -} - -func BenchmarkHTMLdiff(b *testing.B) { - bbc := bbcNews1 + bbcNews2 - bbclc := strings.ToLower(bbc) - args := []string{bbc, bbclc} - for n := 0; n < b.N; n++ { - _, err := cfgBench.HTMLdiff(args) // don't care about the result as we are looking at speed - if err != nil { - b.Errorf("comparing BBC news with its lower-case self error: %s", err) - } - } -} diff --git a/vendor/github.com/documize/html-diff/datafor_test.go b/vendor/github.com/documize/html-diff/datafor_test.go deleted file mode 100644 index 449ab6be..00000000 --- a/vendor/github.com/documize/html-diff/datafor_test.go +++ /dev/null @@ -1,1520 +0,0 @@ -package htmldiff_test - -// from: documize.com -const doc1 = ` - - - - - - - - - - - - - - - - - - - All Your Project Documentation | Documize - - - - - - - -
-
-
-

A single copy of every project document, securely edited, versioned & instantly shared with the project team

-

Gain all this from your browser without Microsoft Word, Email or Document Management Systems — how much time will your project team save this week?

- -

it's free to get started

-
-
-
- -
-
-
-
-

The average project team saves 10 hours a week by killing the 'find-copy-paste, send-email, track-changes, who-has-the-master, nobody-told-me' project documentation pain.

- Documize -
-
-

Get a tonne of crucial team input and participation for documentation that defines your project — requirements, specficiations, change requests, guides, procedures, policies and more.

- Documize -
-
-
-
-
-
-

Very few people like writing documentation — Documize makes it dead-simple to share the burden of producing project documentation.

-
    -
  • Centralized project document hub
  • -
  • Approvals and document baselining
  • -
  • Publishing best practice project templates
  • -
  • Super-fast search - 1 or 1,000 projects
  • - ` -const doc2 = ` -
  • Automated document formatting
  • - ` -const doc3 = ` -
-
-
- -
-
-
` -const doc4 = `
-
-
-

Plans & Pricing

-

Documize is free to use for as long as you want with an unlimited number of people.

-
-
-
-
-

Free

-
$0
-
    -
  • Unlimited Users
  • -
  • Standard Support
  • -
  •  
  • -
  •  
  • -
- Signup -
-
- -
-
-

Standard

-
$5user/month
-
    -
  • Custom Domain
  • -
  • Document Recovery
  • -
  • Priority Support
  • -
  •  
  • -
- Signup -
-
- -
-
-

Enterprise

-
- -
-
    -
  • Hybrid Deployment
  • -
  • Single sign-on
  • -
  • Data Compliance
  • -
  • 24x7 Support
  • -
-
-
-
-
-
- -
-
-

Misplaced, Incomplete, Duplicate Documents Destroy Team Productivity

-

Import existing Word documents and bring your entire project team into Documize

- -

it's free to get started

-
-
- -
- - - - - - - - -` - -// from: http://www.bbc.co.uk/news/business-35530337 -const bbcNews1 = ` - - - - - - Google boss becomes highest-paid in US - BBC News - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - -
-
-
- - - - - - -
- -
- - - Business - - - - -
- -
- - Business - - - - -
-
-

Google boss becomes highest-paid in US

- - -
-
    -
  • 9 February 2016
    -
  • -
  • From the section Business
  • -
-
- -
-
- - - Sundar Pichai, - - - - Image copyright - Getty Images - - - -

The chief executive of Google, Sundar Pichai, has been awarded $199m (£138m) in shares, a regulatory filing has revealed.

It makes him the highest-paid chief executive in the US.

Mr Pichai became chief executive of the search engine giant following the creation of its parent, Alphabet.

The founders of Google, Larry Page and Sergey Brin, have amassed fortunes of $34.6bn and $33.9bn, according to Forbes.

Mr Pichai, 43, was awarded 273,328 Alphabet shares on 3 February, worth a total of $199m, according to a filing with the US Securities and Exchange Commission.

- ` -const bbcNews2 = `

-The new award of shares takes Mr Pichai's total stock value to approximately $650m.

Mr Pichai's share award will vest incrementally each quarter until 2019. In other words, full control over the shares will pass to him on a gradual basis.

The Google chief executive joined the company since 2004, initially leading product management on a number of Google's client software products, including Google Chrome] and Chrome OS, as well as being largely responsible for Google Drive. He also oversaw the development of Gmail and Google Maps.

He previously worked in engineering and product management at Applied Materials and as a management consultant at McKinsey & Company.

It comes at a time of heightened scrutiny of Google's tax affairs, following the company's deal with HM Revenue & Customs to pay back taxes dating from 2005.

The controversial tax deal was labelled derisory by Labour. Shadow Chancellor John McDonnell called for greater transparency, saying it looked like a "sweetheart deal".

"HMRC seems to have settled for a relatively small amount in comparison with the overall profits that are made by the company in this country. And some of the independent analysts have argued that it should be at least 10 times this amount," he said.

Google's regulatory filings for for the period 2005 to 2014, show it generated sales of £24bn ($34.6bn) in the UK during the period with an estimated profit of about £7.2bn on those sales. Page 83 of its most recent 10k report states "revenues by geography are based on the billing addresses of our customers".

Last week, Alphabet - Google's parent company - surpassed Apple as the world's most valuable firm after it reported a profit of $4.9bn (£3.4bn) in the three months to the end of December, an increase from $4.7bn a year ago.

On an annual basis, Alphabet made $16.3bn, but the figures showed that the "Other Bets" business lost $3.6bn during the period, while Google's operating income rose to $23.4bn, as online advertising increased.

An earlier version of this story included a table featuring a list of highest-paid CEOs in the US, which had figures from 2012, not 2015.

-
-
- - -
-

More on this story

- - - - - - - -
- -
- - - - - -
- - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - -` diff --git a/vendor/github.com/documize/html-diff/example_test.go b/vendor/github.com/documize/html-diff/example_test.go deleted file mode 100644 index a60f8e68..00000000 --- a/vendor/github.com/documize/html-diff/example_test.go +++ /dev/null @@ -1,29 +0,0 @@ -package htmldiff_test - -import ( - "fmt" - - "github.com/documize/html-diff" -) - -func ExampleHTMLdiff() { - previousHTML := `

Bullet list:

  • first item
  • 第二
  • 3rd
` - latestHTML := `

Bullet list:

  • first item
  • number two
  • 3rd
` - var cfg = &htmldiff.Config{ - Granularity: 5, - InsertedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: palegreen;"}}, - DeletedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: lightpink;"}}, - ReplacedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: lightskyblue;"}}, - CleanTags: []string{""}, - } - - res, err := cfg.HTMLdiff([]string{previousHTML, latestHTML}) - if err != nil { - fmt.Println(err) - } - mergedHTML := res[0] - - fmt.Println(mergedHTML) - // Output: - //

Bullet list:

  • first item
  • 第二number two
  • 3rd
-} diff --git a/vendor/github.com/documize/html-diff/htmldiff_test.go b/vendor/github.com/documize/html-diff/htmldiff_test.go deleted file mode 100644 index 751aeaf1..00000000 --- a/vendor/github.com/documize/html-diff/htmldiff_test.go +++ /dev/null @@ -1,369 +0,0 @@ -package htmldiff_test - -import ( - "fmt" - "io/ioutil" - "os" - "runtime" - "strings" - "testing" - "time" - - "github.com/documize/html-diff" -) - -var cfg = &htmldiff.Config{ - Granularity: 6, - InsertedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: palegreen; text-decoration: underline;"}}, - DeletedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: lightpink; text-decoration: line-through;"}}, - ReplacedSpan: []htmldiff.Attribute{{Key: "style", Val: "background-color: lightskyblue; text-decoration: overline;"}}, - CleanTags: []string{"documize"}, -} - -type simpleTest struct { - versions, diffs []string -} - -var simpleTests = []simpleTest{ - - {[]string{"chinese中文", `chinese中文`, "中文", "chinese"}, - []string{"chinese中文", - `chinese中文`, - `chinese中文`}}, - - {[]string{"hElLo is that documize!", "Hello is that Documize?"}, - []string{`hEHellLo is that dDocumize!?`}}, - - {[]string{"abc", "abc", "

abc

"}, - []string{`abc`, - `

abc

`}}, - - {[]string{"

def

", "def"}, - []string{`def`}}, - - {[]string{`Documize Logo:Documize`, - "Documize Logo:", `Documize`}, - []string{`Documize Logo:Documize`, - `Documize Logo:Documize`}}, - - {[]string{"
  • 1
  • 2
  • 3
", - "
  • one
  • two
  • three
", - "
  • 1
  • 2
  • 3
  • 4
"}, - []string{`
  • 1one
  • 2two
  • 3three
`, - `
  • 1
  • 2
  • 3
  • 4
`}}, - - {[]string{doc1 + doc2 + doc3 + doc4, doc1 + doc2 + doc3 + doc4, doc1 + doc3 + doc4, doc1 + "" + doc2 + "" + doc3 + doc4, - doc1 + doc2 + "inserted" + doc3 + doc4, doc1 + doc2 + doc3 + "

New Div

" + doc4}, - []string{``, - `
  • Automated document formatting
  • `, - `Automated document formatting`, - `inserted`, - ``}}, - - {[]string{bbcNews1 + bbcNews2, bbcNews1 + "
    HTML-Diff-Inserted
    " + bbcNews2}, - []string{`
    HTML-Diff-Inserted
    `}}, - - {[]string{` - - - - - - - - - - -
    JackandJill
    DerbyandJoan
    `, - ` - - - - - - - - - - -
    JackandVera
    Derbylocomotiveworks
    `, - ` - - - - - - - - - - - - - - - -
    JackandJill
    SamsonandDelilah
    DerbyandJoan
    `, - ` - - - - - - - - - - - - - - - - - - - - -
    JackandJill
    SamsonandDelilah
    DerbyandJoan
    TweedledumandTweedledee
    `, `
    ...and now for something completely different.
    `}, - []string{` - - - - - - - - - - -
    JackandJillVera
    DerbyandlocomotiveJwoanrks
    `, - ` - - - - - - - - - - - - - - - -
    JackandJill
    DerbySamsonandJoDelilanh
    DerbyandJoan
    `, - ` - - - - - - - - - - - - - - - - - - - - -
    JackandJill
    DerbySamsonandJoDelilanh
    DerbyandJoan
    TweedledumandTweedledee
    `, - ` - - - - - - - - - - -
    JackandJill
    DerbyandJoan
    ...and now for something completely different.
    `}}, - - {[]string{"", `
    • A
    • B
    • C
    `}, - []string{`
    • A
    • B
    • C
    `}}, - - {[]string{`

    The following typographical conventions are used in this Standard:

    • The first occurrence of a new term is written in italics. [Example: … is considered normative. end example]
    • A term defined as a basic definition is written in bold. [Example: behavior — External … end example]
    • The name of an XML element is written using an Element style. [Example: The root element is document. end example]
    • The name of an XML element attribute is written using an Attribute style. [Example: … an id attribute. end example]
    • An XML element attribute value is written using a constant-width style. [Example: … value of CommentReference. end example]
    • An XML element type name is written using a Type style. [Example: … as values of the xsd:anyURI data type. end example]
    `, - `

    The following typographical conventions are used in this Standard:

    -
    • The first occurrence of a new term is written in italics. [Example: … is considered normative. end example]
    -
    • A term defined as a basic definition is written in bold. [Example: behavior — External … end example]
    -
    • The name of an XML element attribute is written using an Attribute style. [Example: … an id attribute. end example]
    -
    • And here is another entry in the list!
    -
    • An XML element attribute value is written using a constant-width style. [Example: … value of CommentReference. end example]
    -
    • An XML element type name is written using a Type style. [Example: … as values of the xsd:anyURI data type. end example]
    -
     
    -
    elephant.
    `}, - []string{`

    The following typographical conventions are used in this Standard:

    -
    • The first occurrence of a new term is written in italics. [Example: … is considered normative. end example]
    -
    • A term defined as a basic definition is written in bold. [Example: behavior — External … end example]
    -
    • The name of an XML element is written using an Element style. [Example: The ttroot element is document. end example]• The name of an XML element attribute is written using an Attribute style. [Example: … an id attribute. end example]
    -
    • And here is another entry in the list!
    -
    • An XML element attribute value is written using a constant-width style. [Example: … value of CommentReference. end example]
    -
    • An XML element type name is written using a Type style. [Example: … as values of the xsd:anyURI data type. end example]
    -
     
    -
    elephant.
    `}}, - - {[]string{` - -

    The Graph that Generates Stories

    - -

    StoryGraph is a graph designed to generate and narrate the causal interactions between things in a world. The graph can be populated with entities and expressive rules about the interactions between specific entities or different classes of entities. General rules can create new entities in the graph populated with the specific entities that triggered the rule and attributes defined by those entities. Entities have lifetimes and (coming soon) behaviors that trigger events over time.

    - -

    Story graph is inspired by progamming interactive worlds with linear logic by Chris Martens although it doesn’t realize any of the specific principles she develops in that thesis.

    - -

    There is a more or less fleshed out example in ./example.js that produces sometimes surreal interactions in a snowy forest. To run that example, clone the repo and run the example directly with node.js:

    - -
    $ node example.js
    -
    - -

    You will see output something like this:

    - -
    The river joins with the shadow for a moment. The river does a whirling dance with the shadow. A bluejay discovers the river dancing with the shadow. A bluejay observes the patterns of the river dancing with the shadow. A bluejay dwells in the stillness of life. A duck approaches the whisper. A duck and the whisper pass eachother quietly.
    -
    - -

    This project is licensed under the terms of the MIT license.

    - -

    ##Types

    - -

    The first step is to define types. While it is possible to make rules that apply to specific things, you’ll probably want to make general rules that apply to classes of things. First the basics:

    - -`, `

    The Graph that Generates Stories

    -

    StoryGraph is a graph designed to generate and narrate the causal interactions between things in a world. The graph can be populated with entities and expressive rules about the interactions between specific entities or different classes of entities. General rules can create new entities in the graph populated with the specific entities that triggered the rule and attributes defined by those entities. Entities have lifetimes and (coming soon) behaviors that trigger events over time.

    -

    Story graph is inspired by progamming interactive worlds with linear logic by Chris Martens although it doesn’t realize any of the specific principles she develops in that thesis.

    -

    There is a more or less fleshed out example in ./example.js that produces sometimes surreal interactions in a snowy forest. To run that example, clone the repo and run the example directly with node.js:

    -
    $ node example.js
    -
    -

    Elliott has input another line.

    -

    You will see output something like this:

    -
    The river joins with the shadow for a moment. The river does a whirling dance with the shadow. A bluejay discovers the river dancing with the shadow. A bluejay observes the patterns of the river dancing with the shadow. A bluejay dwells in the stillness of life. A duck approaches the whisper. A duck and the whisper pass eachother quietly.
    -
    -

    This project is licensed under the terms of the MIT license.

    -

    ##Types

    -

    The first step is to define types. While it is possible to make rules that apply to specific things, you’ll probably want to make general rules that apply to classes of things. First the basics:

    `}, - []string{`

    The Graph that Generates Stories

    - -

    StoryGraph is a graph designed to generate and narrate the causal interactions between things in a world. The graph can be populated with entities and expressive rules about the interactions between specific entities or different classes of entities. General rules can create new entities in the graph populated with the specific entities that triggered the rule and attributes defined by those entities. Entities have lifetimes and (coming soon) behaviors that trigger events over time.

    - -

    Story graph is inspired by progamming interactive worlds with linear logic by Chris Martens although it doesn’t realize any of the specific principles she develops in that thesis.

    - -

    There is a more or less fleshed out example in ./example.js that produces sometimes surreal interactions in a snowy forest. To run that example, clone the repo and run the example directly with node.js:

    - -
    $ node example.js
    -
    -

    Elliott has input another line.

    -

    You will see output something like this:

    - -
    The river joins with the shadow for a moment. The river does a whirling dance with the shadow. A bluejay discovers the river dancing with the shadow. A bluejay observes the patterns of the river dancing with the shadow. A bluejay dwells in the stillness of life. A duck approaches the whisper. A duck and the whisper pass eachother quietly.
    -
    - -

    This project is licensed under the terms of the MIT license.

    - -

    ##Types

    - -

    The first step is to define types. While it is possible to make rules that apply to specific things, you’ll probably want to make general rules that apply to classes of things. First the basics:

    - -`}}, -} - -func TestSimple(t *testing.T) { - - for s, st := range simpleTests { - res, err := cfg.HTMLdiff(st.versions) - if err != nil { - t.Errorf("Simple test %d had error %v", s, err) - } - for d := range st.diffs { - if d < len(res) { - fn := fmt.Sprintf("testout/simple%d-%d.html", s, d) - err := ioutil.WriteFile(fn, []byte(res[d]), 0777) - if err != nil { - t.Error(err) - } - if !strings.Contains(res[d], st.diffs[d]) { - if len(res[d]) < 1024 { - t.Errorf("Simple test %d diff %d wanted: `%s` got: `%s`", s, d, st.diffs[d], res[d]) - } else { - t.Errorf("Simple test %d diff %d failed see file: `%s`", s, d, fn) - } - } - } - } - } - -} - -func TestTimeoutAndMemory(t *testing.T) { - dir := "." + string(os.PathSeparator) + "testin" - files, err := ioutil.ReadDir(dir) - if err != nil { - t.Fatal(err) - } - testHTML := make([]string, 0, len(files)) - names := make([]string, 0, len(files)) - - for _, file := range files { - fn := file.Name() - if strings.HasSuffix(fn, ".html") { - ffn := dir + string(os.PathSeparator) + fn - dat, err := ioutil.ReadFile(ffn) - if err != nil { - t.Fatal(err) - } - testHTML = append(testHTML, string(dat)) - names = append(names, fn) - } - } - - fmt.Println("NOTE: this test may take a few minutes to run") - - var ms runtime.MemStats - var alloc1 uint64 - goroutineCount1 := 2 // the number of goroutines in a quiet state, more if test flags are used - for i := 0; i < 2; i++ { - testToMem(testHTML, names, t) - limit := 60 - var goroutineCount, secs int - for secs = 1; secs <= limit; secs++ { - time.Sleep(time.Second) // wait for the timeout goroutines to finish - goroutineCount, _ = runtime.GoroutineProfile(nil) - if goroutineCount == goroutineCount1 { - goto correctGoroutines - } - } - t.Error(fmt.Sprintln("after ", secs, "seconds, num goroutines", goroutineCount, "when should be", goroutineCount1)) - correctGoroutines: - runtime.GC() - runtime.ReadMemStats(&ms) - if alloc1 == 0 { - alloc1 = ms.Alloc // this is set here to allow for static data set-up by 1st pass through - fmt.Println("NOTE: base case established in", secs, "seconds. Memory used=", alloc1) - } else { - increase := (100.0 * float64(ms.Alloc) / float64(alloc1)) - 100.0 - if increase > 0.2 { // % - t.Error(fmt.Sprintln("run", i, "memory usage changed from", alloc1, "to", ms.Alloc, "increase:", ms.Alloc-alloc1, "which is", increase, "%")) - } - } - } -} - -func testToMem(testHTML, names []string, t *testing.T) { - for f := range testHTML { - args := []string{testHTML[f], strings.ToLower(testHTML[f])} - _, err := cfg.HTMLdiff(args) // don't care about the result as we are looking for crashes and time-outs - if err != nil { - if names[f] != "google.html" && names[f] != "bing.html" { // we expect errors on these two - t.Errorf("comparing %s with its lower-case self error: %s", names[f], err) - } - } - } -} diff --git a/vendor/github.com/documize/html-diff/testin/bbc.html b/vendor/github.com/documize/html-diff/testin/bbc.html deleted file mode 100644 index 7656cdd7..00000000 --- a/vendor/github.com/documize/html-diff/testin/bbc.html +++ /dev/null @@ -1,2589 +0,0 @@ - - - - - - Home - BBC News - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - -
    -
    -
    - - - - - - - -
    - - -
    -
    - -
    -
    -

    BBC News Home

    - - -
    - - -
    - -

    - - Top Stories -

    - - - -
    - - - -
    - -
    -
    - -
    -
    - -
    - - -
    - - -
    - - - - - - - - - - - - - -
    - -
    - - - - - - -
    - - -
    - - - -
    - -

    - - The Papers -

    - - - -
    - - - -
    - -

    - The Reporters - -

    -
    -
    - - - -
    -
    - - -
    - - - -
    - -

    - - Features -

    -
    -
    - - - -
    -
    -
    -
    - - - -
    -
    - - -
    - - - -
    - -

    - Explainers - -

    -
    -
    - - - -
    -
    - - -
    - - - -
    - -

    - Sport - -

    - -
    -
    - - - -
    -
    - - -
    - -
    -

    - - Weather -

    -
    -
    - - - -
    - -
    -
    -
    -
    - - - - - - - - -
    - -
    - - - - - - -
    - - -
    - - - - - -
    - -

    - - Follow Us -

    - - -
    - - - -
    - -

    - - Elsewhere on the BBC -

    -
    - - -
    - - -
    - - -
    -
    - -
    -
    - - - - -
    -
    -
    -
    - - - - - -
    - - - - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/vendor/github.com/documize/html-diff/testin/bing.html b/vendor/github.com/documize/html-diff/testin/bing.html deleted file mode 100644 index b967da45..00000000 --- a/vendor/github.com/documize/html-diff/testin/bing.html +++ /dev/null @@ -1,57 +0,0 @@ -Bing News

    Today's headlines

    EU referendum: Iain Duncan Smith claims Cameron's deal will do nothing to red…
    • Iain Duncan Smith says Cameron's EU deal will not curb immigration • Donald Tusk says deal is 'irreversible' • Cameron urged to sack Michael Gove over oppositio…Daily Telegraph
    Migrant crisis: EU meeting seeks to heal growing riftsMinisters from EU and Balkan nations are meeting in Brussels to try to heal divisions over a migrant crisis that could threaten the bloc's survival. Austria, Ser…BBC
    Jimmy Savile sex abuse report to be published - live• Tony Blackburn sacked by BBC ahead of sex abuse report • Stuart Hall blasts 'vindictive, malicious sex accusers' • BBC to pledge end to 'c…Daily Telegraph

    World

    Rubio pushed land deal as he backed law limiting criticsWASHINGTON (AP) — As a young state legislator, Marco Rubio pushed Miami-Dade County officials to allow a multimillion-dollar …
    Daily Mail
    Undercover with the Asian marriage investigatorsA growing number of British Asian families are hiring detectives to check on potential spouses. But does "honeytrapping" cross the …
    BBC
    'I love the poorly educated' Donald Trump WINS in Nevada in move …The outspoken billionaire crushed closest rivals Ted Cruz and Marco Rubio to secure his third successive victory. He picked up 45.9 …
    The Daily Express
    See all World news

    UK

    'Trendy' drama teacher who smeared Nutella over infatuated …A drama teacher who smeared Nutella over the naked body of an infatuated 14-year-old has been jailed for 20 months. Prosecutors …
    Daily Telegraph
    BBC SACKS Tony Blackburn ahead of damning report into Jimmy …The BBC has 'sacked' Radio 2 star Tony Blackburn after five decades on the air ahead of a damning report by Dame Janet Smith into …
    Daily Mail
    More than 2,000 drivers caught speeding at more than 100mph …Greater Manchester, Kent and Thames Valley police did not supply any information, while others submitted only some of the details.
    The Independent
    See all UK news

    Business

    Asian stocks tentative on anxiety over volatile oilMSCI's broadest index of Asia-Pacific shares outside Japan .MIAPJ0000PUS was down a touch, while Japan's Nikkei stock index …
    Reuters
    Lloyds profits fall on PPI claimsLloyds Banking Group has reported a 7% fall in annual pre-tax profits to £1.6bn compared with £1.8bn a year earlier. The bank …
    BBC
    Aston Martin's new DBX crossover will be built in Wales creating 1 …Aston Martin production will remain in the UK the carmaker announced on Wednesday, with the confirmation that it had chosen the St …
    Daily Mail
    See all Business news

    Politics

    Ted Cruz: 'Who knows what the heck Donald Trump would do as …Absent Trump still the focus at Fox News voter summit, as Republican rivals vie to cast themselves as best bet to beat the frontrunner …
    The Guardian
    Australia to boost defence spendingAustralia has announced a surge in defence spending, a move that reflects concern over military expansion in the region. Military …
    BBC
    Only one school has quit Safe Schools LGBTI program after parents' …Exclusive: Number undermines Eric Abetz’s claim that ‘mums and dads all around Australia’ do not want anti-bullying program in …
    The Guardian
    See all Politics news

    Entertainment

    Brits 2016: The real winners and losersAdele may have swept the board at the 2016 Brits, but there's always more to the show than the awards. On a night of joy and …
    BBC
    Stars get their BRITS out: Tearful Adele can barely contain herself (in …Last year's BRITs included the infamous Madonna cape tumble, but if the 2015 ceremony was about the spills, the 2016 BRIT Awards …
    Daily Mail
    Savile BBC abuse report to be published – live updatesWelcome to live coverage of the publication of Dame Janet Smith’s report into the BBC’s failure to prevent abuse by the TV star …
    The Guardian
    See all Entertainment news

    Sport

    Advantage Manchester City as Yaya Touré has last word against …Manchester City should be supremely confident of going beyond the Champions League last 16 at the third time of asking particularly if …
    The Guardian
    Rio Ferdinand jokes 'Fergie never wanted us horny like that' after …Manchester United manager Louis van Gaal bizarrely revealed on Wednesday that he has urged his players to be 'horny' for Europa …
    Daily Mail
    Atlético Madrid take a first-leg draw from 10-man PSV EindhovenPSV Eindhoven played for more than 20 minutes with 10 men but held on for a goalless draw at home against Atlético Madrid in the …
    The Guardian
    See all Sport news

    Sci/Tech

    Feds spank Asus with 20-year audit probe for router security blunderAsus has settled its case with the US Federal Trade Commission (FTC) after hackers pwned nearly 13,000 home routers via an …
    The Register
    Facebook set to be liked by more than half of BritonsMore than 33 million people in the UK are expected to log in regularly to the social network this year, with more than half of mobile …
    The Guardian
    MWC 2016: Pavel Durov backs Apple in not unlocking iPhonePavel Durov, the founder of the secure messaging app Telegram, says he backs Apple in resisting helping US authorities unlock an …
    BBC
    See all Sci/Tech news

    Health

    Avon and Wiltshire mental health trust told again to improveAn NHS trust providing adult mental health services must "significantly improve", inspectors have again warned. The Care Quality …
    BBC
    Pregnant women warned to cover themselves in repellent after ‘Zika …It's often cast away as being a health threat for people in a far away land - but now, the Zika virus is well and truly knocking on …
    Daily Mail
    Gluten-free products cost up to four times as much in supermarkets …Standard Tesco white or brown bread cost from 0.5 to 0.7 per 100g. Its gluten-free alternative costs more than four times the price at …
    The Independent
    See all Health news
    - - - - - - - - - - \ No newline at end of file diff --git a/vendor/github.com/documize/html-diff/testin/google.html b/vendor/github.com/documize/html-diff/testin/google.html deleted file mode 100644 index 49bf8494..00000000 --- a/vendor/github.com/documize/html-diff/testin/google.html +++ /dev/null @@ -1,1261 +0,0 @@ -Google News - -

    Top Stories

    See realtime coverage

    Jimmy Savile sex abuse report to be published - live

    Telegraph.co.uk - ‎1 hour ago‎
    ... • Tony Blackburn sacked by BBC ahead of sex abuse report • Stuart Hall blasts 'vindictive, malicious sex accusers' • BBC to pledge end to 'culture of deference' • Jimmy Savile's career at the BBC - in 60 seconds ...
    See realtime coverage

    Ofcom tells BT to open up cable network to rivals

    BBC News - ‎21 minutes ago‎
    Communications watchdog Ofcom has said BT must open up its cable network, allowing competition to improve UK internet connections.
    See realtime coverage

    Lloyds profits stung by £2.1bn PPI costs

    Telegraph.co.uk - ‎43 minutes ago‎
    Profits at Lloyds Banking Group fell 11pc in 2015 to £1.6bn as the lender continued to count the cost of the payment protection insurance mis-selling scandal.
    See realtime coverage

    Flying Scotsman on London King's Cross to York run

    BBC News - ‎1 hour ago‎
    One of the world's most famous locomotives has set off on its official return to the tracks. The Flying Scotsman is making the journey from London King's Cross to York, where it will go on display at the National Railway Museum (NRM).
    See realtime coverage

    Australia announces 'massive' increase in military spending

    The Hindu - ‎1 hour ago‎
    Australia on Thursday announced an ambitious plan to boost the country's defence capabilities by pledging to spend $ 139 billion over the next decade in what Prime Minister Malcolm Turnbull called “high stakes†and “momentous times†in Asia.
    See realtime coverage

    Indonesian police downplay Australia's travel warning

    SBS - ‎3 hours ago‎
    Indonesian police officers stand guard outside the house of a suspected militant following a raid in Malang, Indonesia, Saturday, Feb. 20, 2016.
    See realtime coverage

    Jeremy Corbyn to attend anti-nuclear weapons march

    The Guardian - ‎1 hour ago‎
    Corbyn's anti-nuclear stance puts him at odds with most of the parliamentary Labour party but not the grassroots membership. Photograph: Mark Kerrison/Demotix/Corbis.
    See realtime coverage

    Man detained after hostage situation at restaurant in central London

    Irish Independent - ‎1 hour ago‎
    A man has been detained by police following a hostage situation at a Bella Italia restaurant in Leicester Square. Share. Facebook · Twitter · Google · Email.
    See realtime coverage

    Tom Watson vows to defy Jeremy Corbyn and vote in favour of Trident

    Mirror.co.uk - ‎13 hours ago‎
    Labour big beast Tom Watson vowed tonight to defy Jeremy Corbyn and vote in favour of Trident. The Deputy Leader said it is vital to give “certainty†to manufacturers and the rest of the world that Britain will keep its nuclear deterrent despite Mr ...
    See realtime coverage

    Thousands of racing greyhounds 'may be killed' after retiring every year

    Evening Standard - ‎1 hour ago‎
    Thousands of retired racing greyhounds are potentially being culled every year, according to a parliamentary report. The Environment, Food and Rural Affairs Committee warns that between 1,000 and 3,700 dogs are unaccounted for each year.
    See realtime coverage

    Japan's Sharp Accepts Takeover by Taiwan's Hon Hai

    New York Times - ‎18 minutes ago‎
    TOKYO - Sharp Corp. agreed Thursday to a 489 billion yen ($4.4 billion) takeover by Taiwan's Hon Hai Precision Industry Co., also known as Foxconn, becoming the first major Japanese electronics maker to be acquired by a foreign company.
    See realtime coverage

    AB InBev warns of slowing emerging markets as results miss target

    Financial Times - ‎28 minutes ago‎
    AB InBev has warned that a slowdown in markets such as Brazil and China will weigh on the group during 2016 after the brewer behind Stella Artois reported full-year results that missed analyst expectations.
    See realtime coverage

    Spirent sees wireless testing division facing headwinds in 2016

    Reuters UK - ‎1 hour ago‎
    Spirent Communications Plc (SPT.L), a British telecoms testing provider, said it expects revenue from the wireless device testing segment to fall by 14 million pounds in 2016.
    See realtime coverage

    Facebook has missed a trick or two with its limited Reactions

    BetaNews - ‎21 minutes ago‎
    After years of pestering, yesterday Facebook finally supplemented the famous Like button with five additional Reactions. To the disappointment of many, the much-requested Dislike button is yet to make an appearance, but this is not the only way in ...
    See realtime coverage

    Verizon supports 'strong encryption with no backdoors': CEO

    The Star Online - ‎2 hours ago‎
    Weighing in: Verizon Communications Inc supports 'the availability of strong encryption with no backdoors,' Chief Executive Lowell McAdam said on Feb 24.
    See realtime coverage

    Nigeria: Blackberry Launches Professional Security Services

    AllAfrica.com - ‎1 hour ago‎
    Canadian phone maker, BlackBerry Limited Wednesday announced the launch of its new Professional Cybersecurity Services practice that will further expand BlackBerry's security portfolio by offering organizations new consulting services, tools and best ...
    See realtime coverage

    The Brit Awards: If pop has a future, it's not going to be British

    Telegraph.co.uk - ‎57 minutes ago‎
    Adele crashed down on the 2016 awards like a singing tsunami, wiping away all opposition. She won almost everything she was nominated for, and you can only suppose that Coldplay and James Bay could count themselves lucky she wasn't eligible in the ...
    See realtime coverage

    Audience walkouts as Sarah Kane play, Cleansed, is revived

    Waikato Times - ‎27 minutes ago‎
    A revival of a brutal play in London showing rape, torture, incest, electrocution, sex assignment surgery and a man having his tongue ripped out has caused audience members to faint and walk out.
    See realtime coverage

    Merlin see profits rise despite Alton Towers accident

    BBC News - ‎38 minutes ago‎
    Profits at theme parks operator Merlin Entertainments have edged up despite last summer's Alton Towers accident which left five people injured.
    See realtime coverage

    Andy King: Leicester City 'under no pressure'

    BBC News - ‎1 hour ago‎
    Leicester City midfielder Andy King says there is absolutely no pressure on the Premier League leaders. The Foxes are currently two points clear at the top with 12 games remaining despite being bottom of the table at the same stage last season.
    See realtime coverage

    Dynamo Kyiv vs. Manchester City – (Watch Live Stream NOW!)

    Nilsen Report - ‎Feb 23, 2016‎
    City have scored more than any other team in the Premier League [alongside Leicester] and their recent defeats mean nothing. Their squad, even without all the injury absentees, includes many top players.
    See realtime coverage

    Lewis Hamilton: FI changes won't have much effect

    RTE.ie - ‎30 minutes ago‎
    Lewis Hamilton has taken aim at Formula One's power brokers in the wake of proposed changes designed to usher in a new era for the sport.
    See realtime coverage

    SpaceX awarded NASA contract for 5 International Space Station cargo missions worth ~$700mn

    RT - ‎3 hours ago‎
    A semi-secret deal between NASA and SpaceX, signed around Christmas but only coming to light now, covers five new re-supply launches to the International Space Station (ISS) and is allegedly worth $700 million.
    See realtime coverage

    Scientists trace mystery 'alien signals' to distant galaxy

    The Nation - ‎2 hours ago‎
    For the first time, scientists have successfully traced mysterious “fast radio bursts†(FRBs), which have been speculated to be signs of extraterrestrial intelligence, to a galaxy six billion light years away.

    Next-Gen Robot Walks Like a Man, Stands Up to Being Pushed

    Tolerance.ca - ‎8 hours ago‎
    If you're not completely heartless, it can be difficult to watch the newest version of the Atlas robot get bullied, teased and pushed around without feeling a twinge of discomfort.
    See realtime coverage

    Mystery of plane spotted at bottom of Minneapolis lake solved

    The Independent - ‎10 hours ago‎
    The mystery behind a ghostly image, seemingly showing a passenger plane “submerged†in a US lake on Google Maps, has been solved.
    See realtime coverage

    Teenagers who stay at school until 18 are more likely to stave off dementia

    Daily Mail - ‎4 hours ago‎
    Teenagers who stay at school until at least the age of 18 are more likely to stave off the effects of dementia in later life, research suggests.
    See realtime coverage

    Learning to live with cancer is more effective than killing it, say scientists

    Irish Independent - ‎2 hours ago‎
    Managing cancer with low doses of chemotherapy could be more effective than attempting to kill the disease, scientists believe. Share.
    See realtime coverage

    Pancreatic cancer identified as 4 different diseases

    Times of India - ‎24 minutes ago‎
    WASHINGTON DC: A recent research has identified that pancreatic cancer is not one, but four diseases, each with different genetic triggers and survival rates, paving the way for more accurate diagnoses and treatments.
    See realtime coverage

    Hepatitis C warning for more than 8000 patients after NHS worker tests positive

    Telegraph.co.uk - ‎Feb 23, 2016‎
    More than 8,000 patients who may have been treated by a former NHS healthcare worker who tested positive for hepatitis C have been recalled for blood tests.
    Weather for Edinburgh, Scotland
    Today
    MOSTLY_SUNNY
     -2°
    Fri
    MOSTLY_CLOUDY
     -1°
    Sat
    PARTLY_CLOUDY
     -1°
    Sun
    MOSTLY_SUNNY
     
     - 
     

    - - - - \ No newline at end of file diff --git a/vendor/github.com/documize/html-diff/testin/reuters.html b/vendor/github.com/documize/html-diff/testin/reuters.html deleted file mode 100644 index 0dc1505c..00000000 --- a/vendor/github.com/documize/html-diff/testin/reuters.html +++ /dev/null @@ -1,1749 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Breaking News, Top News & Latest News Headlines | Reuters.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    - - -
    -
    - -
    -
    - - -
    - -
    - -
    -
    -
    -
    -
    - -
    - - -
    - - - -
    - -
    - - - -
    - -
    - -
    -
    -
    -
    - - - - - - - -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -

    News

    -
    - -
    - -
    - -
    -
    - - -
    - -
    -
    -

    Topics also related to Top News:

    - -
    -
    -
    -
    - -
    -
    - -
    -
    - Photo -

    Obama weighs Republican for Supreme Court -

    WASHINGTON President Barack Obama is considering appointing a moderate Republican to the Supreme Court, a source close to the process said on Wednesday, but leaders in the Republican-led Senate held firm to their threat to block anyone he nominates. | Video -

    -
    -
    -
    - - -
    - - - -
    - -
    -
    -
    - - - -
    - -
    -
    - - - - -
    -
    - -
    -

    - Recent Top News

    -
    -
    -

    Asian stocks slip as China markets slide, oil prices dip -

    TOKYO Asian shares slipped on Thursday as crude oil prices seesawed and Chinese shares dived, rekindling anxiety about the impact of high market volatility on the global economy on the eve of a G20 meeting in Shanghai.

    -
    - 1:52am EST
    -

    Eritrea won't shorten national service despite migration fears -

    ASMARA Eritrea is not prepared to stop forcing its youth into lengthy stretches of work as soldiers and civil servants, a conscription policy that is driving waves of refugees to make the perilous trip across the Sahara desert and Mediterranean Sea to Europe.

    -
    - 2:10am EST
    -

    The Washington insiders who work to get Chinese deals approved -

    WASHINGTON/NEW YORK A spate of proposed Chinese takeovers of U.S. companies, from the Chicago Stock Exchange to makers of high-end semiconductors, has created a vibrant business for a small circuit of Washington insiders who advise on how to get cross-border deals approved by the U.S. government.

    -
    - 24 Feb 2016
    -

    U.S. to boost South China Sea freedom of navigation moves, admiral says -

    WASHINGTON The United States, which is worried by China's military buildup to assert dominance in the South China Sea, will increase freedom-of-navigation operations there, a senior Pentagon official said on Wednesday.

    -
    - - - World, - China, - South China Sea - 12:29am EST
    -

    Connecticut prosecutors ask court to order Kennedy kin back to jail -

    Connecticut prosecutors asked the state's top court on Wednesday to return Kennedy family member Michael Skakel to prison to serve the last nine years of a sentence imposed after he was convicted of murdering a friend four decades ago. | Video -

    -
    - 24 Feb 2016
    -
    -
    -
    - - - - - -
    - - - -
    - -
    - - - - - - -
    - -
    - -
    -
    - -
    -
    - - - -
    - -
    - - -
    - -
    -

    - - U.S. News -

    -
    -
    -
    - Photo -

    U.S. court allows Louisiana abortion restrictions to go into effect -

    A U.S. appeals court on Wednesday allowed Louisiana to enforce a restrictive 2014 abortion law critics say is aimed at shutting clinics, ending a halt to the measure handed out by a lower court judge earlier this year.

    -
    -
    -
    -
    - - - -
    - -
    -

    - - World News -

    -
    -
    -
    - Photo -

    Syrian opposition supports idea of two-week ceasefire -

    BEIRUT/WASHINGTON Syria's opposition indicated on Wednesday it was ready for a two-week truce in Syria, saying it was a chance to test the seriousness of the other side's commitment to a U.S.-Russian plan for a cessation of hostilities. | Video -

    -
    -
    -
    -
    - - - - -
    -
    - -
    -
    - -
    - -
    -
    -
    -
    -
    - -
    -
    -
    - - -
    - -
    -
    -

    Topics also related to Top News:

    - -
    -
    -
    -
    -
    - -
    -
    -
    - - -
    - -
    - -
    -
    -
    -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - -
    -
    - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/github.com/mb0/diff/diff_test.go b/vendor/github.com/documize/html-diff/vendor/github.com/mb0/diff/diff_test.go deleted file mode 100644 index 530d5fde..00000000 --- a/vendor/github.com/documize/html-diff/vendor/github.com/mb0/diff/diff_test.go +++ /dev/null @@ -1,239 +0,0 @@ -// Copyright 2012 Martin Schnabel. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package diff_test - -import ( - "github.com/mb0/diff" - "testing" -) - -type testcase struct { - name string - a, b []int - res []diff.Change -} - -var tests = []testcase{ - {"shift", - []int{1, 2, 3}, - []int{0, 1, 2, 3}, - []diff.Change{{0, 0, 0, 1}}, - }, - {"push", - []int{1, 2, 3}, - []int{1, 2, 3, 4}, - []diff.Change{{3, 3, 0, 1}}, - }, - {"unshift", - []int{0, 1, 2, 3}, - []int{1, 2, 3}, - []diff.Change{{0, 0, 1, 0}}, - }, - {"pop", - []int{1, 2, 3, 4}, - []int{1, 2, 3}, - []diff.Change{{3, 3, 1, 0}}, - }, - {"all changed", - []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - []int{10, 11, 12, 13, 14}, - []diff.Change{ - {0, 0, 10, 5}, - }, - }, - {"all same", - []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, - []diff.Change{}, - }, - {"wrap", - []int{1}, - []int{0, 1, 2, 3}, - []diff.Change{ - {0, 0, 0, 1}, - {1, 2, 0, 2}, - }, - }, - {"snake", - []int{0, 1, 2, 3, 4, 5}, - []int{1, 2, 3, 4, 5, 6}, - []diff.Change{ - {0, 0, 1, 0}, - {6, 5, 0, 1}, - }, - }, - // note: input is ambiguous - // first two traces differ from fig.1 - // it still is a lcs and ses path - {"paper fig. 1", - []int{1, 2, 3, 1, 2, 2, 1}, - []int{3, 2, 1, 2, 1, 3}, - []diff.Change{ - {0, 0, 1, 1}, - {2, 2, 1, 0}, - {5, 4, 1, 0}, - {7, 5, 0, 1}, - }, - }, -} - -func TestDiffAB(t *testing.T) { - for _, test := range tests { - res := diff.Ints(test.a, test.b) - if len(res) != len(test.res) { - t.Error(test.name, "expected length", len(test.res), "for", res) - continue - } - for i, c := range test.res { - if c != res[i] { - t.Error(test.name, "expected ", c, "got", res[i]) - } - } - } -} - -func TestDiffBA(t *testing.T) { - // interesting: fig.1 Diff(b, a) results in the same path as `diff -d a b` - tests[len(tests)-1].res = []diff.Change{ - {0, 0, 2, 0}, - {3, 1, 1, 0}, - {5, 2, 0, 1}, - {7, 5, 0, 1}, - } - for _, test := range tests { - res := diff.Ints(test.b, test.a) - if len(res) != len(test.res) { - t.Error(test.name, "expected length", len(test.res), "for", res) - continue - } - for i, c := range test.res { - // flip change data also - rc := diff.Change{c.B, c.A, c.Ins, c.Del} - if rc != res[i] { - t.Error(test.name, "expected ", rc, "got", res[i]) - } - } - } -} - -func diffsEqual(a, b []diff.Change) bool { - if len(a) != len(b) { - return false - } - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return false - } - } - return true -} - -func TestGranularStrings(t *testing.T) { - a := "abcdefghijklmnopqrstuvwxyza" - b := "AbCdeFghiJklmnOpqrstUvwxyzab" - // each iteration of i increases granularity and will absorb one more lower-letter-followed-by-upper-letters sequence - changesI := [][]diff.Change{ - {{0, 0, 1, 1}, {2, 2, 1, 1}, {5, 5, 1, 1}, {9, 9, 1, 1}, {14, 14, 1, 1}, {20, 20, 1, 1}, {27, 27, 0, 1}}, - {{0, 0, 3, 3}, {5, 5, 1, 1}, {9, 9, 1, 1}, {14, 14, 1, 1}, {20, 20, 1, 1}, {27, 27, 0, 1}}, - {{0, 0, 6, 6}, {9, 9, 1, 1}, {14, 14, 1, 1}, {20, 20, 1, 1}, {27, 27, 0, 1}}, - {{0, 0, 10, 10}, {14, 14, 1, 1}, {20, 20, 1, 1}, {27, 27, 0, 1}}, - {{0, 0, 15, 15}, {20, 20, 1, 1}, {27, 27, 0, 1}}, - {{0, 0, 21, 21}, {27, 27, 0, 1}}, - {{0, 0, 27, 28}}, - } - for i := 0; i < len(changesI); i++ { - diffs := diff.Granular(i, diff.ByteStrings(a, b)) - if !diffsEqual(diffs, changesI[i]) { - t.Errorf("expected %v, got %v", diffs, changesI[i]) - } - } -} - -func TestDiffRunes(t *testing.T) { - a := []rune("brown fox jumps over the lazy dog") - b := []rune("brwn faax junps ovver the lay dago") - res := diff.Runes(a, b) - echange := []diff.Change{ - {2, 2, 1, 0}, - {7, 6, 1, 2}, - {12, 12, 1, 1}, - {18, 18, 0, 1}, - {27, 28, 1, 0}, - {31, 31, 0, 2}, - {32, 34, 1, 0}, - } - for i, c := range res { - t.Log(c) - if c != echange[i] { - t.Error("expected", echange[i], "got", c) - } - } -} - -func TestDiffByteStrings(t *testing.T) { - a := "brown fox jumps over the lazy dog" - b := "brwn faax junps ovver the lay dago" - res := diff.ByteStrings(a, b) - echange := []diff.Change{ - {2, 2, 1, 0}, - {7, 6, 1, 2}, - {12, 12, 1, 1}, - {18, 18, 0, 1}, - {27, 28, 1, 0}, - {31, 31, 0, 2}, - {32, 34, 1, 0}, - } - for i, c := range res { - t.Log(c) - if c != echange[i] { - t.Error("expected", echange[i], "got", c) - } - } -} - -type ints struct{ a, b []int } - -func (d *ints) Equal(i, j int) bool { return d.a[i] == d.b[j] } -func BenchmarkDiff(b *testing.B) { - t := tests[len(tests)-1] - d := &ints{t.a, t.b} - n, m := len(d.a), len(d.b) - for i := 0; i < b.N; i++ { - diff.Diff(n, m, d) - } -} - -func BenchmarkInts(b *testing.B) { - t := tests[len(tests)-1] - d1 := t.a - d2 := t.b - for i := 0; i < b.N; i++ { - diff.Ints(d1, d2) - } -} - -func BenchmarkDiffRunes(b *testing.B) { - d1 := []rune("1231221") - d2 := []rune("321213") - for i := 0; i < b.N; i++ { - diff.Runes(d1, d2) - } -} - -func BenchmarkDiffBytes(b *testing.B) { - d1 := []byte("lorem ipsum dolor sit amet consectetur") - d2 := []byte("lorem lovesum daenerys targaryen ami consecteture") - for i := 0; i < b.N; i++ { - diff.Bytes(d1, d2) - } -} - -func BenchmarkDiffByteStrings(b *testing.B) { - d1 := "lorem ipsum dolor sit amet consectetur" - d2 := "lorem lovesum daenerys targaryen ami consecteture" - for i := 0; i < b.N; i++ { - diff.ByteStrings(d1, d2) - } -} diff --git a/vendor/github.com/documize/html-diff/vendor/github.com/mb0/diff/example_test.go b/vendor/github.com/documize/html-diff/vendor/github.com/mb0/diff/example_test.go deleted file mode 100644 index fd7a2d3c..00000000 --- a/vendor/github.com/documize/html-diff/vendor/github.com/mb0/diff/example_test.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2012 Martin Schnabel. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package diff_test - -import ( - "fmt" - "github.com/mb0/diff" -) - -// Diff on inputs with different representations -type MixedInput struct { - A []int - B []string -} - -var names map[string]int - -func (m *MixedInput) Equal(a, b int) bool { - return m.A[a] == names[m.B[b]] -} - -func ExampleDiff() { - names = map[string]int{ - "one": 1, - "two": 2, - "three": 3, - } - - m := &MixedInput{ - []int{1, 2, 3, 1, 2, 2, 1}, - []string{"three", "two", "one", "two", "one", "three"}, - } - changes := diff.Diff(len(m.A), len(m.B), m) - for _, c := range changes { - fmt.Println("change at", c.A, c.B) - } - // Output: - // change at 0 0 - // change at 2 2 - // change at 5 4 - // change at 7 5 -} - -func ExampleGranular() { - a := "hElLo!" - b := "hello!" - changes := diff.Granular(5, diff.ByteStrings(a, b)) // ignore small gaps in differences - for l := len(changes) - 1; l >= 0; l-- { - change := changes[l] - b = b[:change.B] + "|" + b[change.B:change.B+change.Ins] + "|" + b[change.B+change.Ins:] - } - fmt.Println(b) - // Output: - // h|ell|o! -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/atom.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/atom.go deleted file mode 100644 index cd0a8ac1..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/atom.go +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package atom provides integer codes (also known as atoms) for a fixed set of -// frequently occurring HTML strings: tag names and attribute keys such as "p" -// and "id". -// -// Sharing an atom's name between all elements with the same tag can result in -// fewer string allocations when tokenizing and parsing HTML. Integer -// comparisons are also generally faster than string comparisons. -// -// The value of an atom's particular code is not guaranteed to stay the same -// between versions of this package. Neither is any ordering guaranteed: -// whether atom.H1 < atom.H2 may also change. The codes are not guaranteed to -// be dense. The only guarantees are that e.g. looking up "div" will yield -// atom.Div, calling atom.Div.String will return "div", and atom.Div != 0. -package atom // import "golang.org/x/net/html/atom" - -// Atom is an integer code for a string. The zero value maps to "". -type Atom uint32 - -// String returns the atom's name. -func (a Atom) String() string { - start := uint32(a >> 8) - n := uint32(a & 0xff) - if start+n > uint32(len(atomText)) { - return "" - } - return atomText[start : start+n] -} - -func (a Atom) string() string { - return atomText[a>>8 : a>>8+a&0xff] -} - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s []byte) uint32 { - for i := range s { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -func match(s string, t []byte) bool { - for i, c := range t { - if s[i] != c { - return false - } - } - return true -} - -// Lookup returns the atom whose name is s. It returns zero if there is no -// such atom. The lookup is case sensitive. -func Lookup(s []byte) Atom { - if len(s) == 0 || len(s) > maxAtomLen { - return 0 - } - h := fnv(hash0, s) - if a := table[h&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { - return a - } - if a := table[(h>>16)&uint32(len(table)-1)]; int(a&0xff) == len(s) && match(a.string(), s) { - return a - } - return 0 -} - -// String returns a string whose contents are equal to s. In that sense, it is -// equivalent to string(s) but may be more efficient. -func String(s []byte) string { - if a := Lookup(s); a != 0 { - return a.String() - } - return string(s) -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/atom_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/atom_test.go deleted file mode 100644 index 6e33704d..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/atom_test.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package atom - -import ( - "sort" - "testing" -) - -func TestKnown(t *testing.T) { - for _, s := range testAtomList { - if atom := Lookup([]byte(s)); atom.String() != s { - t.Errorf("Lookup(%q) = %#x (%q)", s, uint32(atom), atom.String()) - } - } -} - -func TestHits(t *testing.T) { - for _, a := range table { - if a == 0 { - continue - } - got := Lookup([]byte(a.String())) - if got != a { - t.Errorf("Lookup(%q) = %#x, want %#x", a.String(), uint32(got), uint32(a)) - } - } -} - -func TestMisses(t *testing.T) { - testCases := []string{ - "", - "\x00", - "\xff", - "A", - "DIV", - "Div", - "dIV", - "aa", - "a\x00", - "ab", - "abb", - "abbr0", - "abbr ", - " abbr", - " a", - "acceptcharset", - "acceptCharset", - "accept_charset", - "h0", - "h1h2", - "h7", - "onClick", - "λ", - // The following string has the same hash (0xa1d7fab7) as "onmouseover". - "\x00\x00\x00\x00\x00\x50\x18\xae\x38\xd0\xb7", - } - for _, tc := range testCases { - got := Lookup([]byte(tc)) - if got != 0 { - t.Errorf("Lookup(%q): got %d, want 0", tc, got) - } - } -} - -func TestForeignObject(t *testing.T) { - const ( - afo = Foreignobject - afO = ForeignObject - sfo = "foreignobject" - sfO = "foreignObject" - ) - if got := Lookup([]byte(sfo)); got != afo { - t.Errorf("Lookup(%q): got %#v, want %#v", sfo, got, afo) - } - if got := Lookup([]byte(sfO)); got != afO { - t.Errorf("Lookup(%q): got %#v, want %#v", sfO, got, afO) - } - if got := afo.String(); got != sfo { - t.Errorf("Atom(%#v).String(): got %q, want %q", afo, got, sfo) - } - if got := afO.String(); got != sfO { - t.Errorf("Atom(%#v).String(): got %q, want %q", afO, got, sfO) - } -} - -func BenchmarkLookup(b *testing.B) { - sortedTable := make([]string, 0, len(table)) - for _, a := range table { - if a != 0 { - sortedTable = append(sortedTable, a.String()) - } - } - sort.Strings(sortedTable) - - x := make([][]byte, 1000) - for i := range x { - x[i] = []byte(sortedTable[i%len(sortedTable)]) - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - for _, s := range x { - Lookup(s) - } - } -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/gen.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/gen.go deleted file mode 100644 index 6bfa8660..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/gen.go +++ /dev/null @@ -1,648 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates table.go and table_test.go. -// Invoke as -// -// go run gen.go |gofmt >table.go -// go run gen.go -test |gofmt >table_test.go - -import ( - "flag" - "fmt" - "math/rand" - "os" - "sort" - "strings" -) - -// identifier converts s to a Go exported identifier. -// It converts "div" to "Div" and "accept-charset" to "AcceptCharset". -func identifier(s string) string { - b := make([]byte, 0, len(s)) - cap := true - for _, c := range s { - if c == '-' { - cap = true - continue - } - if cap && 'a' <= c && c <= 'z' { - c -= 'a' - 'A' - } - cap = false - b = append(b, byte(c)) - } - return string(b) -} - -var test = flag.Bool("test", false, "generate table_test.go") - -func main() { - flag.Parse() - - var all []string - all = append(all, elements...) - all = append(all, attributes...) - all = append(all, eventHandlers...) - all = append(all, extra...) - sort.Strings(all) - - if *test { - fmt.Printf("// generated by go run gen.go -test; DO NOT EDIT\n\n") - fmt.Printf("package atom\n\n") - fmt.Printf("var testAtomList = []string{\n") - for _, s := range all { - fmt.Printf("\t%q,\n", s) - } - fmt.Printf("}\n") - return - } - - // uniq - lists have dups - // compute max len too - maxLen := 0 - w := 0 - for _, s := range all { - if w == 0 || all[w-1] != s { - if maxLen < len(s) { - maxLen = len(s) - } - all[w] = s - w++ - } - } - all = all[:w] - - // Find hash that minimizes table size. - var best *table - for i := 0; i < 1000000; i++ { - if best != nil && 1<<(best.k-1) < len(all) { - break - } - h := rand.Uint32() - for k := uint(0); k <= 16; k++ { - if best != nil && k >= best.k { - break - } - var t table - if t.init(h, k, all) { - best = &t - break - } - } - } - if best == nil { - fmt.Fprintf(os.Stderr, "failed to construct string table\n") - os.Exit(1) - } - - // Lay out strings, using overlaps when possible. - layout := append([]string{}, all...) - - // Remove strings that are substrings of other strings - for changed := true; changed; { - changed = false - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i != j && t != "" && strings.Contains(s, t) { - changed = true - layout[j] = "" - } - } - } - } - - // Join strings where one suffix matches another prefix. - for { - // Find best i, j, k such that layout[i][len-k:] == layout[j][:k], - // maximizing overlap length k. - besti := -1 - bestj := -1 - bestk := 0 - for i, s := range layout { - if s == "" { - continue - } - for j, t := range layout { - if i == j { - continue - } - for k := bestk + 1; k <= len(s) && k <= len(t); k++ { - if s[len(s)-k:] == t[:k] { - besti = i - bestj = j - bestk = k - } - } - } - } - if bestk > 0 { - layout[besti] += layout[bestj][bestk:] - layout[bestj] = "" - continue - } - break - } - - text := strings.Join(layout, "") - - atom := map[string]uint32{} - for _, s := range all { - off := strings.Index(text, s) - if off < 0 { - panic("lost string " + s) - } - atom[s] = uint32(off<<8 | len(s)) - } - - // Generate the Go code. - fmt.Printf("// generated by go run gen.go; DO NOT EDIT\n\n") - fmt.Printf("package atom\n\nconst (\n") - for _, s := range all { - fmt.Printf("\t%s Atom = %#x\n", identifier(s), atom[s]) - } - fmt.Printf(")\n\n") - - fmt.Printf("const hash0 = %#x\n\n", best.h0) - fmt.Printf("const maxAtomLen = %d\n\n", maxLen) - - fmt.Printf("var table = [1<<%d]Atom{\n", best.k) - for i, s := range best.tab { - if s == "" { - continue - } - fmt.Printf("\t%#x: %#x, // %s\n", i, atom[s], s) - } - fmt.Printf("}\n") - datasize := (1 << best.k) * 4 - - fmt.Printf("const atomText =\n") - textsize := len(text) - for len(text) > 60 { - fmt.Printf("\t%q +\n", text[:60]) - text = text[60:] - } - fmt.Printf("\t%q\n\n", text) - - fmt.Fprintf(os.Stderr, "%d atoms; %d string bytes + %d tables = %d total data\n", len(all), textsize, datasize, textsize+datasize) -} - -type byLen []string - -func (x byLen) Less(i, j int) bool { return len(x[i]) > len(x[j]) } -func (x byLen) Swap(i, j int) { x[i], x[j] = x[j], x[i] } -func (x byLen) Len() int { return len(x) } - -// fnv computes the FNV hash with an arbitrary starting value h. -func fnv(h uint32, s string) uint32 { - for i := 0; i < len(s); i++ { - h ^= uint32(s[i]) - h *= 16777619 - } - return h -} - -// A table represents an attempt at constructing the lookup table. -// The lookup table uses cuckoo hashing, meaning that each string -// can be found in one of two positions. -type table struct { - h0 uint32 - k uint - mask uint32 - tab []string -} - -// hash returns the two hashes for s. -func (t *table) hash(s string) (h1, h2 uint32) { - h := fnv(t.h0, s) - h1 = h & t.mask - h2 = (h >> 16) & t.mask - return -} - -// init initializes the table with the given parameters. -// h0 is the initial hash value, -// k is the number of bits of hash value to use, and -// x is the list of strings to store in the table. -// init returns false if the table cannot be constructed. -func (t *table) init(h0 uint32, k uint, x []string) bool { - t.h0 = h0 - t.k = k - t.tab = make([]string, 1< len(t.tab) { - return false - } - s := t.tab[i] - h1, h2 := t.hash(s) - j := h1 + h2 - i - if t.tab[j] != "" && !t.push(j, depth+1) { - return false - } - t.tab[j] = s - return true -} - -// The lists of element names and attribute keys were taken from -// https://html.spec.whatwg.org/multipage/indices.html#index -// as of the "HTML Living Standard - Last Updated 21 February 2015" version. - -var elements = []string{ - "a", - "abbr", - "address", - "area", - "article", - "aside", - "audio", - "b", - "base", - "bdi", - "bdo", - "blockquote", - "body", - "br", - "button", - "canvas", - "caption", - "cite", - "code", - "col", - "colgroup", - "command", - "data", - "datalist", - "dd", - "del", - "details", - "dfn", - "dialog", - "div", - "dl", - "dt", - "em", - "embed", - "fieldset", - "figcaption", - "figure", - "footer", - "form", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "hgroup", - "hr", - "html", - "i", - "iframe", - "img", - "input", - "ins", - "kbd", - "keygen", - "label", - "legend", - "li", - "link", - "map", - "mark", - "menu", - "menuitem", - "meta", - "meter", - "nav", - "noscript", - "object", - "ol", - "optgroup", - "option", - "output", - "p", - "param", - "pre", - "progress", - "q", - "rp", - "rt", - "ruby", - "s", - "samp", - "script", - "section", - "select", - "small", - "source", - "span", - "strong", - "style", - "sub", - "summary", - "sup", - "table", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "tr", - "track", - "u", - "ul", - "var", - "video", - "wbr", -} - -// https://html.spec.whatwg.org/multipage/indices.html#attributes-3 - -var attributes = []string{ - "abbr", - "accept", - "accept-charset", - "accesskey", - "action", - "alt", - "async", - "autocomplete", - "autofocus", - "autoplay", - "challenge", - "charset", - "checked", - "cite", - "class", - "cols", - "colspan", - "command", - "content", - "contenteditable", - "contextmenu", - "controls", - "coords", - "crossorigin", - "data", - "datetime", - "default", - "defer", - "dir", - "dirname", - "disabled", - "download", - "draggable", - "dropzone", - "enctype", - "for", - "form", - "formaction", - "formenctype", - "formmethod", - "formnovalidate", - "formtarget", - "headers", - "height", - "hidden", - "high", - "href", - "hreflang", - "http-equiv", - "icon", - "id", - "inputmode", - "ismap", - "itemid", - "itemprop", - "itemref", - "itemscope", - "itemtype", - "keytype", - "kind", - "label", - "lang", - "list", - "loop", - "low", - "manifest", - "max", - "maxlength", - "media", - "mediagroup", - "method", - "min", - "minlength", - "multiple", - "muted", - "name", - "novalidate", - "open", - "optimum", - "pattern", - "ping", - "placeholder", - "poster", - "preload", - "radiogroup", - "readonly", - "rel", - "required", - "reversed", - "rows", - "rowspan", - "sandbox", - "spellcheck", - "scope", - "scoped", - "seamless", - "selected", - "shape", - "size", - "sizes", - "sortable", - "sorted", - "span", - "src", - "srcdoc", - "srclang", - "start", - "step", - "style", - "tabindex", - "target", - "title", - "translate", - "type", - "typemustmatch", - "usemap", - "value", - "width", - "wrap", -} - -var eventHandlers = []string{ - "onabort", - "onautocomplete", - "onautocompleteerror", - "onafterprint", - "onbeforeprint", - "onbeforeunload", - "onblur", - "oncancel", - "oncanplay", - "oncanplaythrough", - "onchange", - "onclick", - "onclose", - "oncontextmenu", - "oncuechange", - "ondblclick", - "ondrag", - "ondragend", - "ondragenter", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onended", - "onerror", - "onfocus", - "onhashchange", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadstart", - "onmessage", - "onmousedown", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onoffline", - "ononline", - "onpagehide", - "onpageshow", - "onpause", - "onplay", - "onplaying", - "onpopstate", - "onprogress", - "onratechange", - "onreset", - "onresize", - "onscroll", - "onseeked", - "onseeking", - "onselect", - "onshow", - "onsort", - "onstalled", - "onstorage", - "onsubmit", - "onsuspend", - "ontimeupdate", - "ontoggle", - "onunload", - "onvolumechange", - "onwaiting", -} - -// extra are ad-hoc values not covered by any of the lists above. -var extra = []string{ - "align", - "annotation", - "annotation-xml", - "applet", - "basefont", - "bgsound", - "big", - "blink", - "center", - "color", - "desc", - "face", - "font", - "foreignObject", // HTML is case-insensitive, but SVG-embedded-in-HTML is case-sensitive. - "foreignobject", - "frame", - "frameset", - "image", - "isindex", - "listing", - "malignmark", - "marquee", - "math", - "mglyph", - "mi", - "mn", - "mo", - "ms", - "mtext", - "nobr", - "noembed", - "noframes", - "plaintext", - "prompt", - "public", - "spacer", - "strike", - "svg", - "system", - "tt", - "xmp", -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/table.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/table.go deleted file mode 100644 index 2605ba31..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/table.go +++ /dev/null @@ -1,713 +0,0 @@ -// generated by go run gen.go; DO NOT EDIT - -package atom - -const ( - A Atom = 0x1 - Abbr Atom = 0x4 - Accept Atom = 0x2106 - AcceptCharset Atom = 0x210e - Accesskey Atom = 0x3309 - Action Atom = 0x1f606 - Address Atom = 0x4f307 - Align Atom = 0x1105 - Alt Atom = 0x4503 - Annotation Atom = 0x1670a - AnnotationXml Atom = 0x1670e - Applet Atom = 0x2b306 - Area Atom = 0x2fa04 - Article Atom = 0x38807 - Aside Atom = 0x8305 - Async Atom = 0x7b05 - Audio Atom = 0xa605 - Autocomplete Atom = 0x1fc0c - Autofocus Atom = 0xb309 - Autoplay Atom = 0xce08 - B Atom = 0x101 - Base Atom = 0xd604 - Basefont Atom = 0xd608 - Bdi Atom = 0x1a03 - Bdo Atom = 0xe703 - Bgsound Atom = 0x11807 - Big Atom = 0x12403 - Blink Atom = 0x12705 - Blockquote Atom = 0x12c0a - Body Atom = 0x2f04 - Br Atom = 0x202 - Button Atom = 0x13606 - Canvas Atom = 0x7f06 - Caption Atom = 0x1bb07 - Center Atom = 0x5b506 - Challenge Atom = 0x21f09 - Charset Atom = 0x2807 - Checked Atom = 0x32807 - Cite Atom = 0x3c804 - Class Atom = 0x4de05 - Code Atom = 0x14904 - Col Atom = 0x15003 - Colgroup Atom = 0x15008 - Color Atom = 0x15d05 - Cols Atom = 0x16204 - Colspan Atom = 0x16207 - Command Atom = 0x17507 - Content Atom = 0x42307 - Contenteditable Atom = 0x4230f - Contextmenu Atom = 0x3310b - Controls Atom = 0x18808 - Coords Atom = 0x19406 - Crossorigin Atom = 0x19f0b - Data Atom = 0x44a04 - Datalist Atom = 0x44a08 - Datetime Atom = 0x23c08 - Dd Atom = 0x26702 - Default Atom = 0x8607 - Defer Atom = 0x14b05 - Del Atom = 0x3ef03 - Desc Atom = 0x4db04 - Details Atom = 0x4807 - Dfn Atom = 0x6103 - Dialog Atom = 0x1b06 - Dir Atom = 0x6903 - Dirname Atom = 0x6907 - Disabled Atom = 0x10c08 - Div Atom = 0x11303 - Dl Atom = 0x11e02 - Download Atom = 0x40008 - Draggable Atom = 0x17b09 - Dropzone Atom = 0x39108 - Dt Atom = 0x50902 - Em Atom = 0x6502 - Embed Atom = 0x6505 - Enctype Atom = 0x21107 - Face Atom = 0x5b304 - Fieldset Atom = 0x1b008 - Figcaption Atom = 0x1b80a - Figure Atom = 0x1cc06 - Font Atom = 0xda04 - Footer Atom = 0x8d06 - For Atom = 0x1d803 - ForeignObject Atom = 0x1d80d - Foreignobject Atom = 0x1e50d - Form Atom = 0x1f204 - Formaction Atom = 0x1f20a - Formenctype Atom = 0x20d0b - Formmethod Atom = 0x2280a - Formnovalidate Atom = 0x2320e - Formtarget Atom = 0x2470a - Frame Atom = 0x9a05 - Frameset Atom = 0x9a08 - H1 Atom = 0x26e02 - H2 Atom = 0x29402 - H3 Atom = 0x2a702 - H4 Atom = 0x2e902 - H5 Atom = 0x2f302 - H6 Atom = 0x50b02 - Head Atom = 0x2d504 - Header Atom = 0x2d506 - Headers Atom = 0x2d507 - Height Atom = 0x25106 - Hgroup Atom = 0x25906 - Hidden Atom = 0x26506 - High Atom = 0x26b04 - Hr Atom = 0x27002 - Href Atom = 0x27004 - Hreflang Atom = 0x27008 - Html Atom = 0x25504 - HttpEquiv Atom = 0x2780a - I Atom = 0x601 - Icon Atom = 0x42204 - Id Atom = 0x8502 - Iframe Atom = 0x29606 - Image Atom = 0x29c05 - Img Atom = 0x2a103 - Input Atom = 0x3e805 - Inputmode Atom = 0x3e809 - Ins Atom = 0x1a803 - Isindex Atom = 0x2a907 - Ismap Atom = 0x2b005 - Itemid Atom = 0x33c06 - Itemprop Atom = 0x3c908 - Itemref Atom = 0x5ad07 - Itemscope Atom = 0x2b909 - Itemtype Atom = 0x2c308 - Kbd Atom = 0x1903 - Keygen Atom = 0x3906 - Keytype Atom = 0x53707 - Kind Atom = 0x10904 - Label Atom = 0xf005 - Lang Atom = 0x27404 - Legend Atom = 0x18206 - Li Atom = 0x1202 - Link Atom = 0x12804 - List Atom = 0x44e04 - Listing Atom = 0x44e07 - Loop Atom = 0xf404 - Low Atom = 0x11f03 - Malignmark Atom = 0x100a - Manifest Atom = 0x5f108 - Map Atom = 0x2b203 - Mark Atom = 0x1604 - Marquee Atom = 0x2cb07 - Math Atom = 0x2d204 - Max Atom = 0x2e103 - Maxlength Atom = 0x2e109 - Media Atom = 0x6e05 - Mediagroup Atom = 0x6e0a - Menu Atom = 0x33804 - Menuitem Atom = 0x33808 - Meta Atom = 0x45d04 - Meter Atom = 0x24205 - Method Atom = 0x22c06 - Mglyph Atom = 0x2a206 - Mi Atom = 0x2eb02 - Min Atom = 0x2eb03 - Minlength Atom = 0x2eb09 - Mn Atom = 0x23502 - Mo Atom = 0x3ed02 - Ms Atom = 0x2bc02 - Mtext Atom = 0x2f505 - Multiple Atom = 0x30308 - Muted Atom = 0x30b05 - Name Atom = 0x6c04 - Nav Atom = 0x3e03 - Nobr Atom = 0x5704 - Noembed Atom = 0x6307 - Noframes Atom = 0x9808 - Noscript Atom = 0x3d208 - Novalidate Atom = 0x2360a - Object Atom = 0x1ec06 - Ol Atom = 0xc902 - Onabort Atom = 0x13a07 - Onafterprint Atom = 0x1c00c - Onautocomplete Atom = 0x1fa0e - Onautocompleteerror Atom = 0x1fa13 - Onbeforeprint Atom = 0x6040d - Onbeforeunload Atom = 0x4e70e - Onblur Atom = 0xaa06 - Oncancel Atom = 0xe908 - Oncanplay Atom = 0x28509 - Oncanplaythrough Atom = 0x28510 - Onchange Atom = 0x3a708 - Onclick Atom = 0x31007 - Onclose Atom = 0x31707 - Oncontextmenu Atom = 0x32f0d - Oncuechange Atom = 0x3420b - Ondblclick Atom = 0x34d0a - Ondrag Atom = 0x35706 - Ondragend Atom = 0x35709 - Ondragenter Atom = 0x3600b - Ondragleave Atom = 0x36b0b - Ondragover Atom = 0x3760a - Ondragstart Atom = 0x3800b - Ondrop Atom = 0x38f06 - Ondurationchange Atom = 0x39f10 - Onemptied Atom = 0x39609 - Onended Atom = 0x3af07 - Onerror Atom = 0x3b607 - Onfocus Atom = 0x3bd07 - Onhashchange Atom = 0x3da0c - Oninput Atom = 0x3e607 - Oninvalid Atom = 0x3f209 - Onkeydown Atom = 0x3fb09 - Onkeypress Atom = 0x4080a - Onkeyup Atom = 0x41807 - Onlanguagechange Atom = 0x43210 - Onload Atom = 0x44206 - Onloadeddata Atom = 0x4420c - Onloadedmetadata Atom = 0x45510 - Onloadstart Atom = 0x46b0b - Onmessage Atom = 0x47609 - Onmousedown Atom = 0x47f0b - Onmousemove Atom = 0x48a0b - Onmouseout Atom = 0x4950a - Onmouseover Atom = 0x4a20b - Onmouseup Atom = 0x4ad09 - Onmousewheel Atom = 0x4b60c - Onoffline Atom = 0x4c209 - Ononline Atom = 0x4cb08 - Onpagehide Atom = 0x4d30a - Onpageshow Atom = 0x4fe0a - Onpause Atom = 0x50d07 - Onplay Atom = 0x51706 - Onplaying Atom = 0x51709 - Onpopstate Atom = 0x5200a - Onprogress Atom = 0x52a0a - Onratechange Atom = 0x53e0c - Onreset Atom = 0x54a07 - Onresize Atom = 0x55108 - Onscroll Atom = 0x55f08 - Onseeked Atom = 0x56708 - Onseeking Atom = 0x56f09 - Onselect Atom = 0x57808 - Onshow Atom = 0x58206 - Onsort Atom = 0x58b06 - Onstalled Atom = 0x59509 - Onstorage Atom = 0x59e09 - Onsubmit Atom = 0x5a708 - Onsuspend Atom = 0x5bb09 - Ontimeupdate Atom = 0xdb0c - Ontoggle Atom = 0x5c408 - Onunload Atom = 0x5cc08 - Onvolumechange Atom = 0x5d40e - Onwaiting Atom = 0x5e209 - Open Atom = 0x3cf04 - Optgroup Atom = 0xf608 - Optimum Atom = 0x5eb07 - Option Atom = 0x60006 - Output Atom = 0x49c06 - P Atom = 0xc01 - Param Atom = 0xc05 - Pattern Atom = 0x5107 - Ping Atom = 0x7704 - Placeholder Atom = 0xc30b - Plaintext Atom = 0xfd09 - Poster Atom = 0x15706 - Pre Atom = 0x25e03 - Preload Atom = 0x25e07 - Progress Atom = 0x52c08 - Prompt Atom = 0x5fa06 - Public Atom = 0x41e06 - Q Atom = 0x13101 - Radiogroup Atom = 0x30a - Readonly Atom = 0x2fb08 - Rel Atom = 0x25f03 - Required Atom = 0x1d008 - Reversed Atom = 0x5a08 - Rows Atom = 0x9204 - Rowspan Atom = 0x9207 - Rp Atom = 0x1c602 - Rt Atom = 0x13f02 - Ruby Atom = 0xaf04 - S Atom = 0x2c01 - Samp Atom = 0x4e04 - Sandbox Atom = 0xbb07 - Scope Atom = 0x2bd05 - Scoped Atom = 0x2bd06 - Script Atom = 0x3d406 - Seamless Atom = 0x31c08 - Section Atom = 0x4e207 - Select Atom = 0x57a06 - Selected Atom = 0x57a08 - Shape Atom = 0x4f905 - Size Atom = 0x55504 - Sizes Atom = 0x55505 - Small Atom = 0x18f05 - Sortable Atom = 0x58d08 - Sorted Atom = 0x19906 - Source Atom = 0x1aa06 - Spacer Atom = 0x2db06 - Span Atom = 0x9504 - Spellcheck Atom = 0x3230a - Src Atom = 0x3c303 - Srcdoc Atom = 0x3c306 - Srclang Atom = 0x41107 - Start Atom = 0x38605 - Step Atom = 0x5f704 - Strike Atom = 0x53306 - Strong Atom = 0x55906 - Style Atom = 0x61105 - Sub Atom = 0x5a903 - Summary Atom = 0x61607 - Sup Atom = 0x61d03 - Svg Atom = 0x62003 - System Atom = 0x62306 - Tabindex Atom = 0x46308 - Table Atom = 0x42d05 - Target Atom = 0x24b06 - Tbody Atom = 0x2e05 - Td Atom = 0x4702 - Template Atom = 0x62608 - Textarea Atom = 0x2f608 - Tfoot Atom = 0x8c05 - Th Atom = 0x22e02 - Thead Atom = 0x2d405 - Time Atom = 0xdd04 - Title Atom = 0xa105 - Tr Atom = 0x10502 - Track Atom = 0x10505 - Translate Atom = 0x14009 - Tt Atom = 0x5302 - Type Atom = 0x21404 - Typemustmatch Atom = 0x2140d - U Atom = 0xb01 - Ul Atom = 0x8a02 - Usemap Atom = 0x51106 - Value Atom = 0x4005 - Var Atom = 0x11503 - Video Atom = 0x28105 - Wbr Atom = 0x12103 - Width Atom = 0x50705 - Wrap Atom = 0x58704 - Xmp Atom = 0xc103 -) - -const hash0 = 0xc17da63e - -const maxAtomLen = 19 - -var table = [1 << 9]Atom{ - 0x1: 0x48a0b, // onmousemove - 0x2: 0x5e209, // onwaiting - 0x3: 0x1fa13, // onautocompleteerror - 0x4: 0x5fa06, // prompt - 0x7: 0x5eb07, // optimum - 0x8: 0x1604, // mark - 0xa: 0x5ad07, // itemref - 0xb: 0x4fe0a, // onpageshow - 0xc: 0x57a06, // select - 0xd: 0x17b09, // draggable - 0xe: 0x3e03, // nav - 0xf: 0x17507, // command - 0x11: 0xb01, // u - 0x14: 0x2d507, // headers - 0x15: 0x44a08, // datalist - 0x17: 0x4e04, // samp - 0x1a: 0x3fb09, // onkeydown - 0x1b: 0x55f08, // onscroll - 0x1c: 0x15003, // col - 0x20: 0x3c908, // itemprop - 0x21: 0x2780a, // http-equiv - 0x22: 0x61d03, // sup - 0x24: 0x1d008, // required - 0x2b: 0x25e07, // preload - 0x2c: 0x6040d, // onbeforeprint - 0x2d: 0x3600b, // ondragenter - 0x2e: 0x50902, // dt - 0x2f: 0x5a708, // onsubmit - 0x30: 0x27002, // hr - 0x31: 0x32f0d, // oncontextmenu - 0x33: 0x29c05, // image - 0x34: 0x50d07, // onpause - 0x35: 0x25906, // hgroup - 0x36: 0x7704, // ping - 0x37: 0x57808, // onselect - 0x3a: 0x11303, // div - 0x3b: 0x1fa0e, // onautocomplete - 0x40: 0x2eb02, // mi - 0x41: 0x31c08, // seamless - 0x42: 0x2807, // charset - 0x43: 0x8502, // id - 0x44: 0x5200a, // onpopstate - 0x45: 0x3ef03, // del - 0x46: 0x2cb07, // marquee - 0x47: 0x3309, // accesskey - 0x49: 0x8d06, // footer - 0x4a: 0x44e04, // list - 0x4b: 0x2b005, // ismap - 0x51: 0x33804, // menu - 0x52: 0x2f04, // body - 0x55: 0x9a08, // frameset - 0x56: 0x54a07, // onreset - 0x57: 0x12705, // blink - 0x58: 0xa105, // title - 0x59: 0x38807, // article - 0x5b: 0x22e02, // th - 0x5d: 0x13101, // q - 0x5e: 0x3cf04, // open - 0x5f: 0x2fa04, // area - 0x61: 0x44206, // onload - 0x62: 0xda04, // font - 0x63: 0xd604, // base - 0x64: 0x16207, // colspan - 0x65: 0x53707, // keytype - 0x66: 0x11e02, // dl - 0x68: 0x1b008, // fieldset - 0x6a: 0x2eb03, // min - 0x6b: 0x11503, // var - 0x6f: 0x2d506, // header - 0x70: 0x13f02, // rt - 0x71: 0x15008, // colgroup - 0x72: 0x23502, // mn - 0x74: 0x13a07, // onabort - 0x75: 0x3906, // keygen - 0x76: 0x4c209, // onoffline - 0x77: 0x21f09, // challenge - 0x78: 0x2b203, // map - 0x7a: 0x2e902, // h4 - 0x7b: 0x3b607, // onerror - 0x7c: 0x2e109, // maxlength - 0x7d: 0x2f505, // mtext - 0x7e: 0xbb07, // sandbox - 0x7f: 0x58b06, // onsort - 0x80: 0x100a, // malignmark - 0x81: 0x45d04, // meta - 0x82: 0x7b05, // async - 0x83: 0x2a702, // h3 - 0x84: 0x26702, // dd - 0x85: 0x27004, // href - 0x86: 0x6e0a, // mediagroup - 0x87: 0x19406, // coords - 0x88: 0x41107, // srclang - 0x89: 0x34d0a, // ondblclick - 0x8a: 0x4005, // value - 0x8c: 0xe908, // oncancel - 0x8e: 0x3230a, // spellcheck - 0x8f: 0x9a05, // frame - 0x91: 0x12403, // big - 0x94: 0x1f606, // action - 0x95: 0x6903, // dir - 0x97: 0x2fb08, // readonly - 0x99: 0x42d05, // table - 0x9a: 0x61607, // summary - 0x9b: 0x12103, // wbr - 0x9c: 0x30a, // radiogroup - 0x9d: 0x6c04, // name - 0x9f: 0x62306, // system - 0xa1: 0x15d05, // color - 0xa2: 0x7f06, // canvas - 0xa3: 0x25504, // html - 0xa5: 0x56f09, // onseeking - 0xac: 0x4f905, // shape - 0xad: 0x25f03, // rel - 0xae: 0x28510, // oncanplaythrough - 0xaf: 0x3760a, // ondragover - 0xb0: 0x62608, // template - 0xb1: 0x1d80d, // foreignObject - 0xb3: 0x9204, // rows - 0xb6: 0x44e07, // listing - 0xb7: 0x49c06, // output - 0xb9: 0x3310b, // contextmenu - 0xbb: 0x11f03, // low - 0xbc: 0x1c602, // rp - 0xbd: 0x5bb09, // onsuspend - 0xbe: 0x13606, // button - 0xbf: 0x4db04, // desc - 0xc1: 0x4e207, // section - 0xc2: 0x52a0a, // onprogress - 0xc3: 0x59e09, // onstorage - 0xc4: 0x2d204, // math - 0xc5: 0x4503, // alt - 0xc7: 0x8a02, // ul - 0xc8: 0x5107, // pattern - 0xc9: 0x4b60c, // onmousewheel - 0xca: 0x35709, // ondragend - 0xcb: 0xaf04, // ruby - 0xcc: 0xc01, // p - 0xcd: 0x31707, // onclose - 0xce: 0x24205, // meter - 0xcf: 0x11807, // bgsound - 0xd2: 0x25106, // height - 0xd4: 0x101, // b - 0xd5: 0x2c308, // itemtype - 0xd8: 0x1bb07, // caption - 0xd9: 0x10c08, // disabled - 0xdb: 0x33808, // menuitem - 0xdc: 0x62003, // svg - 0xdd: 0x18f05, // small - 0xde: 0x44a04, // data - 0xe0: 0x4cb08, // ononline - 0xe1: 0x2a206, // mglyph - 0xe3: 0x6505, // embed - 0xe4: 0x10502, // tr - 0xe5: 0x46b0b, // onloadstart - 0xe7: 0x3c306, // srcdoc - 0xeb: 0x5c408, // ontoggle - 0xed: 0xe703, // bdo - 0xee: 0x4702, // td - 0xef: 0x8305, // aside - 0xf0: 0x29402, // h2 - 0xf1: 0x52c08, // progress - 0xf2: 0x12c0a, // blockquote - 0xf4: 0xf005, // label - 0xf5: 0x601, // i - 0xf7: 0x9207, // rowspan - 0xfb: 0x51709, // onplaying - 0xfd: 0x2a103, // img - 0xfe: 0xf608, // optgroup - 0xff: 0x42307, // content - 0x101: 0x53e0c, // onratechange - 0x103: 0x3da0c, // onhashchange - 0x104: 0x4807, // details - 0x106: 0x40008, // download - 0x109: 0x14009, // translate - 0x10b: 0x4230f, // contenteditable - 0x10d: 0x36b0b, // ondragleave - 0x10e: 0x2106, // accept - 0x10f: 0x57a08, // selected - 0x112: 0x1f20a, // formaction - 0x113: 0x5b506, // center - 0x115: 0x45510, // onloadedmetadata - 0x116: 0x12804, // link - 0x117: 0xdd04, // time - 0x118: 0x19f0b, // crossorigin - 0x119: 0x3bd07, // onfocus - 0x11a: 0x58704, // wrap - 0x11b: 0x42204, // icon - 0x11d: 0x28105, // video - 0x11e: 0x4de05, // class - 0x121: 0x5d40e, // onvolumechange - 0x122: 0xaa06, // onblur - 0x123: 0x2b909, // itemscope - 0x124: 0x61105, // style - 0x127: 0x41e06, // public - 0x129: 0x2320e, // formnovalidate - 0x12a: 0x58206, // onshow - 0x12c: 0x51706, // onplay - 0x12d: 0x3c804, // cite - 0x12e: 0x2bc02, // ms - 0x12f: 0xdb0c, // ontimeupdate - 0x130: 0x10904, // kind - 0x131: 0x2470a, // formtarget - 0x135: 0x3af07, // onended - 0x136: 0x26506, // hidden - 0x137: 0x2c01, // s - 0x139: 0x2280a, // formmethod - 0x13a: 0x3e805, // input - 0x13c: 0x50b02, // h6 - 0x13d: 0xc902, // ol - 0x13e: 0x3420b, // oncuechange - 0x13f: 0x1e50d, // foreignobject - 0x143: 0x4e70e, // onbeforeunload - 0x144: 0x2bd05, // scope - 0x145: 0x39609, // onemptied - 0x146: 0x14b05, // defer - 0x147: 0xc103, // xmp - 0x148: 0x39f10, // ondurationchange - 0x149: 0x1903, // kbd - 0x14c: 0x47609, // onmessage - 0x14d: 0x60006, // option - 0x14e: 0x2eb09, // minlength - 0x14f: 0x32807, // checked - 0x150: 0xce08, // autoplay - 0x152: 0x202, // br - 0x153: 0x2360a, // novalidate - 0x156: 0x6307, // noembed - 0x159: 0x31007, // onclick - 0x15a: 0x47f0b, // onmousedown - 0x15b: 0x3a708, // onchange - 0x15e: 0x3f209, // oninvalid - 0x15f: 0x2bd06, // scoped - 0x160: 0x18808, // controls - 0x161: 0x30b05, // muted - 0x162: 0x58d08, // sortable - 0x163: 0x51106, // usemap - 0x164: 0x1b80a, // figcaption - 0x165: 0x35706, // ondrag - 0x166: 0x26b04, // high - 0x168: 0x3c303, // src - 0x169: 0x15706, // poster - 0x16b: 0x1670e, // annotation-xml - 0x16c: 0x5f704, // step - 0x16d: 0x4, // abbr - 0x16e: 0x1b06, // dialog - 0x170: 0x1202, // li - 0x172: 0x3ed02, // mo - 0x175: 0x1d803, // for - 0x176: 0x1a803, // ins - 0x178: 0x55504, // size - 0x179: 0x43210, // onlanguagechange - 0x17a: 0x8607, // default - 0x17b: 0x1a03, // bdi - 0x17c: 0x4d30a, // onpagehide - 0x17d: 0x6907, // dirname - 0x17e: 0x21404, // type - 0x17f: 0x1f204, // form - 0x181: 0x28509, // oncanplay - 0x182: 0x6103, // dfn - 0x183: 0x46308, // tabindex - 0x186: 0x6502, // em - 0x187: 0x27404, // lang - 0x189: 0x39108, // dropzone - 0x18a: 0x4080a, // onkeypress - 0x18b: 0x23c08, // datetime - 0x18c: 0x16204, // cols - 0x18d: 0x1, // a - 0x18e: 0x4420c, // onloadeddata - 0x190: 0xa605, // audio - 0x192: 0x2e05, // tbody - 0x193: 0x22c06, // method - 0x195: 0xf404, // loop - 0x196: 0x29606, // iframe - 0x198: 0x2d504, // head - 0x19e: 0x5f108, // manifest - 0x19f: 0xb309, // autofocus - 0x1a0: 0x14904, // code - 0x1a1: 0x55906, // strong - 0x1a2: 0x30308, // multiple - 0x1a3: 0xc05, // param - 0x1a6: 0x21107, // enctype - 0x1a7: 0x5b304, // face - 0x1a8: 0xfd09, // plaintext - 0x1a9: 0x26e02, // h1 - 0x1aa: 0x59509, // onstalled - 0x1ad: 0x3d406, // script - 0x1ae: 0x2db06, // spacer - 0x1af: 0x55108, // onresize - 0x1b0: 0x4a20b, // onmouseover - 0x1b1: 0x5cc08, // onunload - 0x1b2: 0x56708, // onseeked - 0x1b4: 0x2140d, // typemustmatch - 0x1b5: 0x1cc06, // figure - 0x1b6: 0x4950a, // onmouseout - 0x1b7: 0x25e03, // pre - 0x1b8: 0x50705, // width - 0x1b9: 0x19906, // sorted - 0x1bb: 0x5704, // nobr - 0x1be: 0x5302, // tt - 0x1bf: 0x1105, // align - 0x1c0: 0x3e607, // oninput - 0x1c3: 0x41807, // onkeyup - 0x1c6: 0x1c00c, // onafterprint - 0x1c7: 0x210e, // accept-charset - 0x1c8: 0x33c06, // itemid - 0x1c9: 0x3e809, // inputmode - 0x1cb: 0x53306, // strike - 0x1cc: 0x5a903, // sub - 0x1cd: 0x10505, // track - 0x1ce: 0x38605, // start - 0x1d0: 0xd608, // basefont - 0x1d6: 0x1aa06, // source - 0x1d7: 0x18206, // legend - 0x1d8: 0x2d405, // thead - 0x1da: 0x8c05, // tfoot - 0x1dd: 0x1ec06, // object - 0x1de: 0x6e05, // media - 0x1df: 0x1670a, // annotation - 0x1e0: 0x20d0b, // formenctype - 0x1e2: 0x3d208, // noscript - 0x1e4: 0x55505, // sizes - 0x1e5: 0x1fc0c, // autocomplete - 0x1e6: 0x9504, // span - 0x1e7: 0x9808, // noframes - 0x1e8: 0x24b06, // target - 0x1e9: 0x38f06, // ondrop - 0x1ea: 0x2b306, // applet - 0x1ec: 0x5a08, // reversed - 0x1f0: 0x2a907, // isindex - 0x1f3: 0x27008, // hreflang - 0x1f5: 0x2f302, // h5 - 0x1f6: 0x4f307, // address - 0x1fa: 0x2e103, // max - 0x1fb: 0xc30b, // placeholder - 0x1fc: 0x2f608, // textarea - 0x1fe: 0x4ad09, // onmouseup - 0x1ff: 0x3800b, // ondragstart -} - -const atomText = "abbradiogrouparamalignmarkbdialogaccept-charsetbodyaccesskey" + - "genavaluealtdetailsampatternobreversedfnoembedirnamediagroup" + - "ingasyncanvasidefaultfooterowspanoframesetitleaudionblurubya" + - "utofocusandboxmplaceholderautoplaybasefontimeupdatebdoncance" + - "labelooptgrouplaintextrackindisabledivarbgsoundlowbrbigblink" + - "blockquotebuttonabortranslatecodefercolgroupostercolorcolspa" + - "nnotation-xmlcommandraggablegendcontrolsmallcoordsortedcross" + - "originsourcefieldsetfigcaptionafterprintfigurequiredforeignO" + - "bjectforeignobjectformactionautocompleteerrorformenctypemust" + - "matchallengeformmethodformnovalidatetimeterformtargetheightm" + - "lhgroupreloadhiddenhigh1hreflanghttp-equivideoncanplaythroug" + - "h2iframeimageimglyph3isindexismappletitemscopeditemtypemarqu" + - "eematheaderspacermaxlength4minlength5mtextareadonlymultiplem" + - "utedonclickoncloseamlesspellcheckedoncontextmenuitemidoncuec" + - "hangeondblclickondragendondragenterondragleaveondragoverondr" + - "agstarticleondropzonemptiedondurationchangeonendedonerroronf" + - "ocusrcdocitempropenoscriptonhashchangeoninputmodeloninvalido" + - "nkeydownloadonkeypressrclangonkeyupublicontenteditableonlang" + - "uagechangeonloadeddatalistingonloadedmetadatabindexonloadsta" + - "rtonmessageonmousedownonmousemoveonmouseoutputonmouseoveronm" + - "ouseuponmousewheelonofflineononlineonpagehidesclassectionbef" + - "oreunloaddresshapeonpageshowidth6onpausemaponplayingonpopsta" + - "teonprogresstrikeytypeonratechangeonresetonresizestrongonscr" + - "ollonseekedonseekingonselectedonshowraponsortableonstalledon" + - "storageonsubmitemrefacenteronsuspendontoggleonunloadonvolume" + - "changeonwaitingoptimumanifestepromptoptionbeforeprintstylesu" + - "mmarysupsvgsystemplate" diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/table_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/table_test.go deleted file mode 100644 index 0f2ecce4..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/atom/table_test.go +++ /dev/null @@ -1,351 +0,0 @@ -// generated by go run gen.go -test; DO NOT EDIT - -package atom - -var testAtomList = []string{ - "a", - "abbr", - "abbr", - "accept", - "accept-charset", - "accesskey", - "action", - "address", - "align", - "alt", - "annotation", - "annotation-xml", - "applet", - "area", - "article", - "aside", - "async", - "audio", - "autocomplete", - "autofocus", - "autoplay", - "b", - "base", - "basefont", - "bdi", - "bdo", - "bgsound", - "big", - "blink", - "blockquote", - "body", - "br", - "button", - "canvas", - "caption", - "center", - "challenge", - "charset", - "checked", - "cite", - "cite", - "class", - "code", - "col", - "colgroup", - "color", - "cols", - "colspan", - "command", - "command", - "content", - "contenteditable", - "contextmenu", - "controls", - "coords", - "crossorigin", - "data", - "data", - "datalist", - "datetime", - "dd", - "default", - "defer", - "del", - "desc", - "details", - "dfn", - "dialog", - "dir", - "dirname", - "disabled", - "div", - "dl", - "download", - "draggable", - "dropzone", - "dt", - "em", - "embed", - "enctype", - "face", - "fieldset", - "figcaption", - "figure", - "font", - "footer", - "for", - "foreignObject", - "foreignobject", - "form", - "form", - "formaction", - "formenctype", - "formmethod", - "formnovalidate", - "formtarget", - "frame", - "frameset", - "h1", - "h2", - "h3", - "h4", - "h5", - "h6", - "head", - "header", - "headers", - "height", - "hgroup", - "hidden", - "high", - "hr", - "href", - "hreflang", - "html", - "http-equiv", - "i", - "icon", - "id", - "iframe", - "image", - "img", - "input", - "inputmode", - "ins", - "isindex", - "ismap", - "itemid", - "itemprop", - "itemref", - "itemscope", - "itemtype", - "kbd", - "keygen", - "keytype", - "kind", - "label", - "label", - "lang", - "legend", - "li", - "link", - "list", - "listing", - "loop", - "low", - "malignmark", - "manifest", - "map", - "mark", - "marquee", - "math", - "max", - "maxlength", - "media", - "mediagroup", - "menu", - "menuitem", - "meta", - "meter", - "method", - "mglyph", - "mi", - "min", - "minlength", - "mn", - "mo", - "ms", - "mtext", - "multiple", - "muted", - "name", - "nav", - "nobr", - "noembed", - "noframes", - "noscript", - "novalidate", - "object", - "ol", - "onabort", - "onafterprint", - "onautocomplete", - "onautocompleteerror", - "onbeforeprint", - "onbeforeunload", - "onblur", - "oncancel", - "oncanplay", - "oncanplaythrough", - "onchange", - "onclick", - "onclose", - "oncontextmenu", - "oncuechange", - "ondblclick", - "ondrag", - "ondragend", - "ondragenter", - "ondragleave", - "ondragover", - "ondragstart", - "ondrop", - "ondurationchange", - "onemptied", - "onended", - "onerror", - "onfocus", - "onhashchange", - "oninput", - "oninvalid", - "onkeydown", - "onkeypress", - "onkeyup", - "onlanguagechange", - "onload", - "onloadeddata", - "onloadedmetadata", - "onloadstart", - "onmessage", - "onmousedown", - "onmousemove", - "onmouseout", - "onmouseover", - "onmouseup", - "onmousewheel", - "onoffline", - "ononline", - "onpagehide", - "onpageshow", - "onpause", - "onplay", - "onplaying", - "onpopstate", - "onprogress", - "onratechange", - "onreset", - "onresize", - "onscroll", - "onseeked", - "onseeking", - "onselect", - "onshow", - "onsort", - "onstalled", - "onstorage", - "onsubmit", - "onsuspend", - "ontimeupdate", - "ontoggle", - "onunload", - "onvolumechange", - "onwaiting", - "open", - "optgroup", - "optimum", - "option", - "output", - "p", - "param", - "pattern", - "ping", - "placeholder", - "plaintext", - "poster", - "pre", - "preload", - "progress", - "prompt", - "public", - "q", - "radiogroup", - "readonly", - "rel", - "required", - "reversed", - "rows", - "rowspan", - "rp", - "rt", - "ruby", - "s", - "samp", - "sandbox", - "scope", - "scoped", - "script", - "seamless", - "section", - "select", - "selected", - "shape", - "size", - "sizes", - "small", - "sortable", - "sorted", - "source", - "spacer", - "span", - "span", - "spellcheck", - "src", - "srcdoc", - "srclang", - "start", - "step", - "strike", - "strong", - "style", - "style", - "sub", - "summary", - "sup", - "svg", - "system", - "tabindex", - "table", - "target", - "tbody", - "td", - "template", - "textarea", - "tfoot", - "th", - "thead", - "time", - "title", - "title", - "tr", - "track", - "translate", - "tt", - "type", - "typemustmatch", - "u", - "ul", - "usemap", - "value", - "var", - "video", - "wbr", - "width", - "wrap", - "xmp", -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/charset.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/charset.go deleted file mode 100644 index 13bed159..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/charset.go +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package charset provides common text encodings for HTML documents. -// -// The mapping from encoding labels to encodings is defined at -// https://encoding.spec.whatwg.org/. -package charset // import "golang.org/x/net/html/charset" - -import ( - "bytes" - "fmt" - "io" - "mime" - "strings" - "unicode/utf8" - - "golang.org/x/net/html" - "golang.org/x/text/encoding" - "golang.org/x/text/encoding/charmap" - "golang.org/x/text/encoding/htmlindex" - "golang.org/x/text/transform" -) - -// Lookup returns the encoding with the specified label, and its canonical -// name. It returns nil and the empty string if label is not one of the -// standard encodings for HTML. Matching is case-insensitive and ignores -// leading and trailing whitespace. Encoders will use HTML escape sequences for -// runes that are not supported by the character set. -func Lookup(label string) (e encoding.Encoding, name string) { - e, err := htmlindex.Get(label) - if err != nil { - return nil, "" - } - name, _ = htmlindex.Name(e) - return &htmlEncoding{e}, name -} - -type htmlEncoding struct{ encoding.Encoding } - -func (h *htmlEncoding) NewEncoder() *encoding.Encoder { - // HTML requires a non-terminating legacy encoder. We use HTML escapes to - // substitute unsupported code points. - return encoding.HTMLEscapeUnsupported(h.Encoding.NewEncoder()) -} - -// DetermineEncoding determines the encoding of an HTML document by examining -// up to the first 1024 bytes of content and the declared Content-Type. -// -// See http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#determining-the-character-encoding -func DetermineEncoding(content []byte, contentType string) (e encoding.Encoding, name string, certain bool) { - if len(content) > 1024 { - content = content[:1024] - } - - for _, b := range boms { - if bytes.HasPrefix(content, b.bom) { - e, name = Lookup(b.enc) - return e, name, true - } - } - - if _, params, err := mime.ParseMediaType(contentType); err == nil { - if cs, ok := params["charset"]; ok { - if e, name = Lookup(cs); e != nil { - return e, name, true - } - } - } - - if len(content) > 0 { - e, name = prescan(content) - if e != nil { - return e, name, false - } - } - - // Try to detect UTF-8. - // First eliminate any partial rune at the end. - for i := len(content) - 1; i >= 0 && i > len(content)-4; i-- { - b := content[i] - if b < 0x80 { - break - } - if utf8.RuneStart(b) { - content = content[:i] - break - } - } - hasHighBit := false - for _, c := range content { - if c >= 0x80 { - hasHighBit = true - break - } - } - if hasHighBit && utf8.Valid(content) { - return encoding.Nop, "utf-8", false - } - - // TODO: change default depending on user's locale? - return charmap.Windows1252, "windows-1252", false -} - -// NewReader returns an io.Reader that converts the content of r to UTF-8. -// It calls DetermineEncoding to find out what r's encoding is. -func NewReader(r io.Reader, contentType string) (io.Reader, error) { - preview := make([]byte, 1024) - n, err := io.ReadFull(r, preview) - switch { - case err == io.ErrUnexpectedEOF: - preview = preview[:n] - r = bytes.NewReader(preview) - case err != nil: - return nil, err - default: - r = io.MultiReader(bytes.NewReader(preview), r) - } - - if e, _, _ := DetermineEncoding(preview, contentType); e != encoding.Nop { - r = transform.NewReader(r, e.NewDecoder()) - } - return r, nil -} - -// NewReaderLabel returns a reader that converts from the specified charset to -// UTF-8. It uses Lookup to find the encoding that corresponds to label, and -// returns an error if Lookup returns nil. It is suitable for use as -// encoding/xml.Decoder's CharsetReader function. -func NewReaderLabel(label string, input io.Reader) (io.Reader, error) { - e, _ := Lookup(label) - if e == nil { - return nil, fmt.Errorf("unsupported charset: %q", label) - } - return transform.NewReader(input, e.NewDecoder()), nil -} - -func prescan(content []byte) (e encoding.Encoding, name string) { - z := html.NewTokenizer(bytes.NewReader(content)) - for { - switch z.Next() { - case html.ErrorToken: - return nil, "" - - case html.StartTagToken, html.SelfClosingTagToken: - tagName, hasAttr := z.TagName() - if !bytes.Equal(tagName, []byte("meta")) { - continue - } - attrList := make(map[string]bool) - gotPragma := false - - const ( - dontKnow = iota - doNeedPragma - doNotNeedPragma - ) - needPragma := dontKnow - - name = "" - e = nil - for hasAttr { - var key, val []byte - key, val, hasAttr = z.TagAttr() - ks := string(key) - if attrList[ks] { - continue - } - attrList[ks] = true - for i, c := range val { - if 'A' <= c && c <= 'Z' { - val[i] = c + 0x20 - } - } - - switch ks { - case "http-equiv": - if bytes.Equal(val, []byte("content-type")) { - gotPragma = true - } - - case "content": - if e == nil { - name = fromMetaElement(string(val)) - if name != "" { - e, name = Lookup(name) - if e != nil { - needPragma = doNeedPragma - } - } - } - - case "charset": - e, name = Lookup(string(val)) - needPragma = doNotNeedPragma - } - } - - if needPragma == dontKnow || needPragma == doNeedPragma && !gotPragma { - continue - } - - if strings.HasPrefix(name, "utf-16") { - name = "utf-8" - e = encoding.Nop - } - - if e != nil { - return e, name - } - } - } -} - -func fromMetaElement(s string) string { - for s != "" { - csLoc := strings.Index(s, "charset") - if csLoc == -1 { - return "" - } - s = s[csLoc+len("charset"):] - s = strings.TrimLeft(s, " \t\n\f\r") - if !strings.HasPrefix(s, "=") { - continue - } - s = s[1:] - s = strings.TrimLeft(s, " \t\n\f\r") - if s == "" { - return "" - } - if q := s[0]; q == '"' || q == '\'' { - s = s[1:] - closeQuote := strings.IndexRune(s, rune(q)) - if closeQuote == -1 { - return "" - } - return s[:closeQuote] - } - - end := strings.IndexAny(s, "; \t\n\f\r") - if end == -1 { - end = len(s) - } - return s[:end] - } - return "" -} - -var boms = []struct { - bom []byte - enc string -}{ - {[]byte{0xfe, 0xff}, "utf-16be"}, - {[]byte{0xff, 0xfe}, "utf-16le"}, - {[]byte{0xef, 0xbb, 0xbf}, "utf-8"}, -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/charset_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/charset_test.go deleted file mode 100644 index e4e7d86b..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/charset_test.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package charset - -import ( - "bytes" - "encoding/xml" - "io/ioutil" - "runtime" - "strings" - "testing" - - "golang.org/x/text/transform" -) - -func transformString(t transform.Transformer, s string) (string, error) { - r := transform.NewReader(strings.NewReader(s), t) - b, err := ioutil.ReadAll(r) - return string(b), err -} - -type testCase struct { - utf8, other, otherEncoding string -} - -// testCases for encoding and decoding. -var testCases = []testCase{ - {"Résumé", "Résumé", "utf8"}, - {"Résumé", "R\xe9sum\xe9", "latin1"}, - {"ã“ã‚Œã¯æ¼¢å­—ã§ã™ã€‚", "S0\x8c0o0\"oW[g0Y0\x020", "UTF-16LE"}, - {"ã“ã‚Œã¯æ¼¢å­—ã§ã™ã€‚", "0S0\x8c0oo\"[W0g0Y0\x02", "UTF-16BE"}, - {"Hello, world", "Hello, world", "ASCII"}, - {"GdaÅ„sk", "Gda\xf1sk", "ISO-8859-2"}, - {"Ââ ÄŒÄ ÄÄ‘ ÅŠÅ‹ Õõ Å Å¡ Žž Ã…Ã¥ Ää", "\xc2\xe2 \xc8\xe8 \xa9\xb9 \xaf\xbf \xd5\xf5 \xaa\xba \xac\xbc \xc5\xe5 \xc4\xe4", "ISO-8859-10"}, - {"สำหรับ", "\xca\xd3\xcb\xc3\u047a", "ISO-8859-11"}, - {"latvieÅ¡u", "latvie\xf0u", "ISO-8859-13"}, - {"Seònaid", "Se\xf2naid", "ISO-8859-14"}, - {"€1 is cheap", "\xa41 is cheap", "ISO-8859-15"}, - {"româneÈ™te", "rom\xe2ne\xbate", "ISO-8859-16"}, - {"nutraĵo", "nutra\xbco", "ISO-8859-3"}, - {"Kalâdlit", "Kal\xe2dlit", "ISO-8859-4"}, - {"руÑÑкий", "\xe0\xe3\xe1\xe1\xda\xd8\xd9", "ISO-8859-5"}, - {"ελληνικά", "\xe5\xeb\xeb\xe7\xed\xe9\xea\xdc", "ISO-8859-7"}, - {"KaÄŸan", "Ka\xf0an", "ISO-8859-9"}, - {"Résumé", "R\x8esum\x8e", "macintosh"}, - {"GdaÅ„sk", "Gda\xf1sk", "windows-1250"}, - {"руÑÑкий", "\xf0\xf3\xf1\xf1\xea\xe8\xe9", "windows-1251"}, - {"Résumé", "R\xe9sum\xe9", "windows-1252"}, - {"ελληνικά", "\xe5\xeb\xeb\xe7\xed\xe9\xea\xdc", "windows-1253"}, - {"KaÄŸan", "Ka\xf0an", "windows-1254"}, - {"עִבְרִית", "\xf2\xc4\xe1\xc0\xf8\xc4\xe9\xfa", "windows-1255"}, - {"العربية", "\xc7\xe1\xda\xd1\xc8\xed\xc9", "windows-1256"}, - {"latvieÅ¡u", "latvie\xf0u", "windows-1257"}, - {"Việt", "Vi\xea\xf2t", "windows-1258"}, - {"สำหรับ", "\xca\xd3\xcb\xc3\u047a", "windows-874"}, - {"руÑÑкий", "\xd2\xd5\xd3\xd3\xcb\xc9\xca", "KOI8-R"}, - {"українÑька", "\xd5\xcb\xd2\xc1\xa7\xce\xd3\xd8\xcb\xc1", "KOI8-U"}, - {"Hello 常用國字標準字體表", "Hello \xb1`\xa5\u03b0\xea\xa6r\xbc\u0437\u01e6r\xc5\xe9\xaa\xed", "big5"}, - {"Hello 常用國字標準字體表", "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed", "gbk"}, - {"Hello 常用國字標準字體表", "Hello \xb3\xa3\xd3\xc3\x87\xf8\xd7\xd6\x98\xcb\x9c\xca\xd7\xd6\xf3\x77\xb1\xed", "gb18030"}, - {"עִבְרִית", "\x81\x30\xfb\x30\x81\x30\xf6\x34\x81\x30\xf9\x33\x81\x30\xf6\x30\x81\x30\xfb\x36\x81\x30\xf6\x34\x81\x30\xfa\x31\x81\x30\xfb\x38", "gb18030"}, - {"㧯", "\x82\x31\x89\x38", "gb18030"}, - {"ã“ã‚Œã¯æ¼¢å­—ã§ã™ã€‚", "\x82\xb1\x82\xea\x82\xcd\x8a\xbf\x8e\x9a\x82\xc5\x82\xb7\x81B", "SJIS"}, - {"Hello, 世界!", "Hello, \x90\xa2\x8aE!", "SJIS"}, - {"イウエオカ", "\xb2\xb3\xb4\xb5\xb6", "SJIS"}, - {"ã“ã‚Œã¯æ¼¢å­—ã§ã™ã€‚", "\xa4\xb3\xa4\xec\xa4\u03f4\xc1\xbb\xfa\xa4\u01e4\xb9\xa1\xa3", "EUC-JP"}, - {"Hello, 世界!", "Hello, \x1b$B@$3&\x1b(B!", "ISO-2022-JP"}, - {"다ìŒê³¼ ê°™ì€ ì¡°ê±´ì„ ë”°ë¼ì•¼ 합니다: 저작ìží‘œì‹œ", "\xb4\xd9\xc0\xbd\xb0\xfa \xb0\xb0\xc0\xba \xc1\xb6\xb0\xc7\xc0\xbb \xb5\xfb\xb6\xf3\xbe\xdf \xc7Õ´Ï´\xd9: \xc0\xfa\xc0\xdb\xc0\xdaÇ¥\xbd\xc3", "EUC-KR"}, -} - -func TestDecode(t *testing.T) { - testCases := append(testCases, []testCase{ - // Replace multi-byte maximum subpart of ill-formed subsequence with - // single replacement character (WhatWG requirement). - {"Rés\ufffdumé", "Rés\xe1\x80umé", "utf8"}, - }...) - for _, tc := range testCases { - e, _ := Lookup(tc.otherEncoding) - if e == nil { - t.Errorf("%s: not found", tc.otherEncoding) - continue - } - s, err := transformString(e.NewDecoder(), tc.other) - if err != nil { - t.Errorf("%s: decode %q: %v", tc.otherEncoding, tc.other, err) - continue - } - if s != tc.utf8 { - t.Errorf("%s: got %q, want %q", tc.otherEncoding, s, tc.utf8) - } - } -} - -func TestEncode(t *testing.T) { - testCases := append(testCases, []testCase{ - // Use Go-style replacement. - {"Rés\xe1\x80umé", "Rés\ufffd\ufffdumé", "utf8"}, - // U+0144 LATIN SMALL LETTER N WITH ACUTE not supported by encoding. - {"GdaÅ„sk", "Gdańsk", "ISO-8859-11"}, - {"\ufffd", "�", "ISO-8859-11"}, - {"a\xe1\x80b", "a��b", "ISO-8859-11"}, - }...) - for _, tc := range testCases { - e, _ := Lookup(tc.otherEncoding) - if e == nil { - t.Errorf("%s: not found", tc.otherEncoding) - continue - } - s, err := transformString(e.NewEncoder(), tc.utf8) - if err != nil { - t.Errorf("%s: encode %q: %s", tc.otherEncoding, tc.utf8, err) - continue - } - if s != tc.other { - t.Errorf("%s: got %q, want %q", tc.otherEncoding, s, tc.other) - } - } -} - -var sniffTestCases = []struct { - filename, declared, want string -}{ - {"HTTP-charset.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, - {"UTF-16LE-BOM.html", "", "utf-16le"}, - {"UTF-16BE-BOM.html", "", "utf-16be"}, - {"meta-content-attribute.html", "text/html", "iso-8859-15"}, - {"meta-charset-attribute.html", "text/html", "iso-8859-15"}, - {"No-encoding-declaration.html", "text/html", "utf-8"}, - {"HTTP-vs-UTF-8-BOM.html", "text/html; charset=iso-8859-15", "utf-8"}, - {"HTTP-vs-meta-content.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, - {"HTTP-vs-meta-charset.html", "text/html; charset=iso-8859-15", "iso-8859-15"}, - {"UTF-8-BOM-vs-meta-content.html", "text/html", "utf-8"}, - {"UTF-8-BOM-vs-meta-charset.html", "text/html", "utf-8"}, -} - -func TestSniff(t *testing.T) { - switch runtime.GOOS { - case "nacl": // platforms that don't permit direct file system access - t.Skipf("not supported on %q", runtime.GOOS) - } - - for _, tc := range sniffTestCases { - content, err := ioutil.ReadFile("testdata/" + tc.filename) - if err != nil { - t.Errorf("%s: error reading file: %v", tc.filename, err) - continue - } - - _, name, _ := DetermineEncoding(content, tc.declared) - if name != tc.want { - t.Errorf("%s: got %q, want %q", tc.filename, name, tc.want) - continue - } - } -} - -func TestReader(t *testing.T) { - switch runtime.GOOS { - case "nacl": // platforms that don't permit direct file system access - t.Skipf("not supported on %q", runtime.GOOS) - } - - for _, tc := range sniffTestCases { - content, err := ioutil.ReadFile("testdata/" + tc.filename) - if err != nil { - t.Errorf("%s: error reading file: %v", tc.filename, err) - continue - } - - r, err := NewReader(bytes.NewReader(content), tc.declared) - if err != nil { - t.Errorf("%s: error creating reader: %v", tc.filename, err) - continue - } - - got, err := ioutil.ReadAll(r) - if err != nil { - t.Errorf("%s: error reading from charset.NewReader: %v", tc.filename, err) - continue - } - - e, _ := Lookup(tc.want) - want, err := ioutil.ReadAll(transform.NewReader(bytes.NewReader(content), e.NewDecoder())) - if err != nil { - t.Errorf("%s: error decoding with hard-coded charset name: %v", tc.filename, err) - continue - } - - if !bytes.Equal(got, want) { - t.Errorf("%s: got %q, want %q", tc.filename, got, want) - continue - } - } -} - -var metaTestCases = []struct { - meta, want string -}{ - {"", ""}, - {"text/html", ""}, - {"text/html; charset utf-8", ""}, - {"text/html; charset=latin-2", "latin-2"}, - {"text/html; charset; charset = utf-8", "utf-8"}, - {`charset="big5"`, "big5"}, - {"charset='shift_jis'", "shift_jis"}, -} - -func TestFromMeta(t *testing.T) { - for _, tc := range metaTestCases { - got := fromMetaElement(tc.meta) - if got != tc.want { - t.Errorf("%q: got %q, want %q", tc.meta, got, tc.want) - } - } -} - -func TestXML(t *testing.T) { - const s = "r\xe9sum\xe9" - - d := xml.NewDecoder(strings.NewReader(s)) - d.CharsetReader = NewReaderLabel - - var a struct { - Word string - } - err := d.Decode(&a) - if err != nil { - t.Fatalf("Decode: %v", err) - } - - want := "résumé" - if a.Word != want { - t.Errorf("got %q, want %q", a.Word, want) - } -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html deleted file mode 100644 index 9915fa0e..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-charset.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - HTTP charset - - - - - - - - - - - -

    HTTP charset

    - - -
    - - -
     
    - - - - - -
    -

    The character encoding of a page can be set using the HTTP header charset declaration.

    -

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-001
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html deleted file mode 100644 index 26e5d8b4..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - HTTP vs UTF-8 BOM - - - - - - - - - - - -

    HTTP vs UTF-8 BOM

    - - -
    - - -
     
    - - - - - -
    -

    A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.

    -

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    If the test is unsuccessful, the characters  should appear at the top of the page. These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-034
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html deleted file mode 100644 index 2f07e951..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - HTTP vs meta charset - - - - - - - - - - - -

    HTTP vs meta charset

    - - -
    - - -
     
    - - - - - -
    -

    The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.

    -

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-018
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html deleted file mode 100644 index 6853cdde..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - HTTP vs meta content - - - - - - - - - - - -

    HTTP vs meta content

    - - -
    - - -
     
    - - - - - -
    -

    The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.

    -

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-016
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html deleted file mode 100644 index 612e26c6..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - No encoding declaration - - - - - - - - - - - -

    No encoding declaration

    - - -
    - - -
     
    - - - - - -
    -

    A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.

    -

    The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-015
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/README b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/README deleted file mode 100644 index 38ef0f9f..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/README +++ /dev/null @@ -1,9 +0,0 @@ -These test cases come from -http://www.w3.org/International/tests/repository/html5/the-input-byte-stream/results-basics - -Distributed under both the W3C Test Suite License -(http://www.w3.org/Consortium/Legal/2008/04-testsuite-license) -and the W3C 3-clause BSD License -(http://www.w3.org/Consortium/Legal/2008/03-bsd-license). -To contribute to a W3C Test Suite, see the policies and contribution -forms (http://www.w3.org/2004/10/27-testcases). diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html deleted file mode 100644 index 3abf7a93..00000000 Binary files a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html and /dev/null differ diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html deleted file mode 100644 index 76254c98..00000000 Binary files a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html and /dev/null differ diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html deleted file mode 100644 index 83de4333..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - UTF-8 BOM vs meta charset - - - - - - - - - - - -

    UTF-8 BOM vs meta charset

    - - -
    - - -
     
    - - - - - -
    -

    A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.

    -

    The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-038
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html deleted file mode 100644 index 501aac2d..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - UTF-8 BOM vs meta content - - - - - - - - - - - -

    UTF-8 BOM vs meta content

    - - -
    - - -
     
    - - - - - -
    -

    A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.

    -

    The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-037
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html deleted file mode 100644 index 2d7d25ab..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - meta charset attribute - - - - - - - - - - - -

    meta charset attribute

    - - -
    - - -
     
    - - - - - -
    -

    The character encoding of the page can be set by a meta element with charset attribute.

    -

    The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-009
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html deleted file mode 100644 index 1c3f228e..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - meta content attribute - - - - - - - - - - - -

    meta content attribute

    - - -
    - - -
     
    - - - - - -
    -

    The character encoding of the page can be set by a meta element with http-equiv and content attributes.

    -

    The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-007
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/const.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/const.go deleted file mode 100644 index 52f651ff..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/const.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -// Section 12.2.3.2 of the HTML5 specification says "The following elements -// have varying levels of special parsing rules". -// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements -var isSpecialElementMap = map[string]bool{ - "address": true, - "applet": true, - "area": true, - "article": true, - "aside": true, - "base": true, - "basefont": true, - "bgsound": true, - "blockquote": true, - "body": true, - "br": true, - "button": true, - "caption": true, - "center": true, - "col": true, - "colgroup": true, - "dd": true, - "details": true, - "dir": true, - "div": true, - "dl": true, - "dt": true, - "embed": true, - "fieldset": true, - "figcaption": true, - "figure": true, - "footer": true, - "form": true, - "frame": true, - "frameset": true, - "h1": true, - "h2": true, - "h3": true, - "h4": true, - "h5": true, - "h6": true, - "head": true, - "header": true, - "hgroup": true, - "hr": true, - "html": true, - "iframe": true, - "img": true, - "input": true, - "isindex": true, - "li": true, - "link": true, - "listing": true, - "marquee": true, - "menu": true, - "meta": true, - "nav": true, - "noembed": true, - "noframes": true, - "noscript": true, - "object": true, - "ol": true, - "p": true, - "param": true, - "plaintext": true, - "pre": true, - "script": true, - "section": true, - "select": true, - "source": true, - "style": true, - "summary": true, - "table": true, - "tbody": true, - "td": true, - "template": true, - "textarea": true, - "tfoot": true, - "th": true, - "thead": true, - "title": true, - "tr": true, - "track": true, - "ul": true, - "wbr": true, - "xmp": true, -} - -func isSpecialElement(element *Node) bool { - switch element.Namespace { - case "", "html": - return isSpecialElementMap[element.Data] - case "svg": - return element.Data == "foreignObject" - } - return false -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/doc.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/doc.go deleted file mode 100644 index 94f49687..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/doc.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package html implements an HTML5-compliant tokenizer and parser. - -Tokenization is done by creating a Tokenizer for an io.Reader r. It is the -caller's responsibility to ensure that r provides UTF-8 encoded HTML. - - z := html.NewTokenizer(r) - -Given a Tokenizer z, the HTML is tokenized by repeatedly calling z.Next(), -which parses the next token and returns its type, or an error: - - for { - tt := z.Next() - if tt == html.ErrorToken { - // ... - return ... - } - // Process the current token. - } - -There are two APIs for retrieving the current token. The high-level API is to -call Token; the low-level API is to call Text or TagName / TagAttr. Both APIs -allow optionally calling Raw after Next but before Token, Text, TagName, or -TagAttr. In EBNF notation, the valid call sequence per token is: - - Next {Raw} [ Token | Text | TagName {TagAttr} ] - -Token returns an independent data structure that completely describes a token. -Entities (such as "<") are unescaped, tag names and attribute keys are -lower-cased, and attributes are collected into a []Attribute. For example: - - for { - if z.Next() == html.ErrorToken { - // Returning io.EOF indicates success. - return z.Err() - } - emitToken(z.Token()) - } - -The low-level API performs fewer allocations and copies, but the contents of -the []byte values returned by Text, TagName and TagAttr may change on the next -call to Next. For example, to extract an HTML page's anchor text: - - depth := 0 - for { - tt := z.Next() - switch tt { - case ErrorToken: - return z.Err() - case TextToken: - if depth > 0 { - // emitBytes should copy the []byte it receives, - // if it doesn't process it immediately. - emitBytes(z.Text()) - } - case StartTagToken, EndTagToken: - tn, _ := z.TagName() - if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { - depth++ - } else { - depth-- - } - } - } - } - -Parsing is done by calling Parse with an io.Reader, which returns the root of -the parse tree (the document element) as a *Node. It is the caller's -responsibility to ensure that the Reader provides UTF-8 encoded HTML. For -example, to process each anchor node in depth-first order: - - doc, err := html.Parse(r) - if err != nil { - // ... - } - var f func(*html.Node) - f = func(n *html.Node) { - if n.Type == html.ElementNode && n.Data == "a" { - // Do something with n... - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - f(c) - } - } - f(doc) - -The relevant specifications include: -https://html.spec.whatwg.org/multipage/syntax.html and -https://html.spec.whatwg.org/multipage/syntax.html#tokenization -*/ -package html // import "golang.org/x/net/html" - -// The tokenization algorithm implemented by this package is not a line-by-line -// transliteration of the relatively verbose state-machine in the WHATWG -// specification. A more direct approach is used instead, where the program -// counter implies the state, such as whether it is tokenizing a tag or a text -// node. Specification compliance is verified by checking expected and actual -// outputs over a test suite rather than aiming for algorithmic fidelity. - -// TODO(nigeltao): Does a DOM API belong in this package or a separate one? -// TODO(nigeltao): How does parsing interact with a JavaScript engine? diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/doctype.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/doctype.go deleted file mode 100644 index c484e5a9..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/doctype.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "strings" -) - -// parseDoctype parses the data from a DoctypeToken into a name, -// public identifier, and system identifier. It returns a Node whose Type -// is DoctypeNode, whose Data is the name, and which has attributes -// named "system" and "public" for the two identifiers if they were present. -// quirks is whether the document should be parsed in "quirks mode". -func parseDoctype(s string) (n *Node, quirks bool) { - n = &Node{Type: DoctypeNode} - - // Find the name. - space := strings.IndexAny(s, whitespace) - if space == -1 { - space = len(s) - } - n.Data = s[:space] - // The comparison to "html" is case-sensitive. - if n.Data != "html" { - quirks = true - } - n.Data = strings.ToLower(n.Data) - s = strings.TrimLeft(s[space:], whitespace) - - if len(s) < 6 { - // It can't start with "PUBLIC" or "SYSTEM". - // Ignore the rest of the string. - return n, quirks || s != "" - } - - key := strings.ToLower(s[:6]) - s = s[6:] - for key == "public" || key == "system" { - s = strings.TrimLeft(s, whitespace) - if s == "" { - break - } - quote := s[0] - if quote != '"' && quote != '\'' { - break - } - s = s[1:] - q := strings.IndexRune(s, rune(quote)) - var id string - if q == -1 { - id = s - s = "" - } else { - id = s[:q] - s = s[q+1:] - } - n.Attr = append(n.Attr, Attribute{Key: key, Val: id}) - if key == "public" { - key = "system" - } else { - key = "" - } - } - - if key != "" || s != "" { - quirks = true - } else if len(n.Attr) > 0 { - if n.Attr[0].Key == "public" { - public := strings.ToLower(n.Attr[0].Val) - switch public { - case "-//w3o//dtd w3 html strict 3.0//en//", "-/w3d/dtd html 4.0 transitional/en", "html": - quirks = true - default: - for _, q := range quirkyIDs { - if strings.HasPrefix(public, q) { - quirks = true - break - } - } - } - // The following two public IDs only cause quirks mode if there is no system ID. - if len(n.Attr) == 1 && (strings.HasPrefix(public, "-//w3c//dtd html 4.01 frameset//") || - strings.HasPrefix(public, "-//w3c//dtd html 4.01 transitional//")) { - quirks = true - } - } - if lastAttr := n.Attr[len(n.Attr)-1]; lastAttr.Key == "system" && - strings.ToLower(lastAttr.Val) == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd" { - quirks = true - } - } - - return n, quirks -} - -// quirkyIDs is a list of public doctype identifiers that cause a document -// to be interpreted in quirks mode. The identifiers should be in lower case. -var quirkyIDs = []string{ - "+//silmaril//dtd html pro v0r11 19970101//", - "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", - "-//as//dtd html 3.0 aswedit + extensions//", - "-//ietf//dtd html 2.0 level 1//", - "-//ietf//dtd html 2.0 level 2//", - "-//ietf//dtd html 2.0 strict level 1//", - "-//ietf//dtd html 2.0 strict level 2//", - "-//ietf//dtd html 2.0 strict//", - "-//ietf//dtd html 2.0//", - "-//ietf//dtd html 2.1e//", - "-//ietf//dtd html 3.0//", - "-//ietf//dtd html 3.2 final//", - "-//ietf//dtd html 3.2//", - "-//ietf//dtd html 3//", - "-//ietf//dtd html level 0//", - "-//ietf//dtd html level 1//", - "-//ietf//dtd html level 2//", - "-//ietf//dtd html level 3//", - "-//ietf//dtd html strict level 0//", - "-//ietf//dtd html strict level 1//", - "-//ietf//dtd html strict level 2//", - "-//ietf//dtd html strict level 3//", - "-//ietf//dtd html strict//", - "-//ietf//dtd html//", - "-//metrius//dtd metrius presentational//", - "-//microsoft//dtd internet explorer 2.0 html strict//", - "-//microsoft//dtd internet explorer 2.0 html//", - "-//microsoft//dtd internet explorer 2.0 tables//", - "-//microsoft//dtd internet explorer 3.0 html strict//", - "-//microsoft//dtd internet explorer 3.0 html//", - "-//microsoft//dtd internet explorer 3.0 tables//", - "-//netscape comm. corp.//dtd html//", - "-//netscape comm. corp.//dtd strict html//", - "-//o'reilly and associates//dtd html 2.0//", - "-//o'reilly and associates//dtd html extended 1.0//", - "-//o'reilly and associates//dtd html extended relaxed 1.0//", - "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", - "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", - "-//spyglass//dtd html 2.0 extended//", - "-//sq//dtd html 2.0 hotmetal + extensions//", - "-//sun microsystems corp.//dtd hotjava html//", - "-//sun microsystems corp.//dtd hotjava strict html//", - "-//w3c//dtd html 3 1995-03-24//", - "-//w3c//dtd html 3.2 draft//", - "-//w3c//dtd html 3.2 final//", - "-//w3c//dtd html 3.2//", - "-//w3c//dtd html 3.2s draft//", - "-//w3c//dtd html 4.0 frameset//", - "-//w3c//dtd html 4.0 transitional//", - "-//w3c//dtd html experimental 19960712//", - "-//w3c//dtd html experimental 970421//", - "-//w3c//dtd w3 html//", - "-//w3o//dtd w3 html 3.0//", - "-//webtechs//dtd mozilla html 2.0//", - "-//webtechs//dtd mozilla html//", -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/entity.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/entity.go deleted file mode 100644 index a50c04c6..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/entity.go +++ /dev/null @@ -1,2253 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -// All entities that do not end with ';' are 6 or fewer bytes long. -const longestEntityWithoutSemicolon = 6 - -// entity is a map from HTML entity names to their values. The semicolon matters: -// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references -// lists both "amp" and "amp;" as two separate entries. -// -// Note that the HTML5 list is larger than the HTML4 list at -// http://www.w3.org/TR/html4/sgml/entities.html -var entity = map[string]rune{ - "AElig;": '\U000000C6', - "AMP;": '\U00000026', - "Aacute;": '\U000000C1', - "Abreve;": '\U00000102', - "Acirc;": '\U000000C2', - "Acy;": '\U00000410', - "Afr;": '\U0001D504', - "Agrave;": '\U000000C0', - "Alpha;": '\U00000391', - "Amacr;": '\U00000100', - "And;": '\U00002A53', - "Aogon;": '\U00000104', - "Aopf;": '\U0001D538', - "ApplyFunction;": '\U00002061', - "Aring;": '\U000000C5', - "Ascr;": '\U0001D49C', - "Assign;": '\U00002254', - "Atilde;": '\U000000C3', - "Auml;": '\U000000C4', - "Backslash;": '\U00002216', - "Barv;": '\U00002AE7', - "Barwed;": '\U00002306', - "Bcy;": '\U00000411', - "Because;": '\U00002235', - "Bernoullis;": '\U0000212C', - "Beta;": '\U00000392', - "Bfr;": '\U0001D505', - "Bopf;": '\U0001D539', - "Breve;": '\U000002D8', - "Bscr;": '\U0000212C', - "Bumpeq;": '\U0000224E', - "CHcy;": '\U00000427', - "COPY;": '\U000000A9', - "Cacute;": '\U00000106', - "Cap;": '\U000022D2', - "CapitalDifferentialD;": '\U00002145', - "Cayleys;": '\U0000212D', - "Ccaron;": '\U0000010C', - "Ccedil;": '\U000000C7', - "Ccirc;": '\U00000108', - "Cconint;": '\U00002230', - "Cdot;": '\U0000010A', - "Cedilla;": '\U000000B8', - "CenterDot;": '\U000000B7', - "Cfr;": '\U0000212D', - "Chi;": '\U000003A7', - "CircleDot;": '\U00002299', - "CircleMinus;": '\U00002296', - "CirclePlus;": '\U00002295', - "CircleTimes;": '\U00002297', - "ClockwiseContourIntegral;": '\U00002232', - "CloseCurlyDoubleQuote;": '\U0000201D', - "CloseCurlyQuote;": '\U00002019', - "Colon;": '\U00002237', - "Colone;": '\U00002A74', - "Congruent;": '\U00002261', - "Conint;": '\U0000222F', - "ContourIntegral;": '\U0000222E', - "Copf;": '\U00002102', - "Coproduct;": '\U00002210', - "CounterClockwiseContourIntegral;": '\U00002233', - "Cross;": '\U00002A2F', - "Cscr;": '\U0001D49E', - "Cup;": '\U000022D3', - "CupCap;": '\U0000224D', - "DD;": '\U00002145', - "DDotrahd;": '\U00002911', - "DJcy;": '\U00000402', - "DScy;": '\U00000405', - "DZcy;": '\U0000040F', - "Dagger;": '\U00002021', - "Darr;": '\U000021A1', - "Dashv;": '\U00002AE4', - "Dcaron;": '\U0000010E', - "Dcy;": '\U00000414', - "Del;": '\U00002207', - "Delta;": '\U00000394', - "Dfr;": '\U0001D507', - "DiacriticalAcute;": '\U000000B4', - "DiacriticalDot;": '\U000002D9', - "DiacriticalDoubleAcute;": '\U000002DD', - "DiacriticalGrave;": '\U00000060', - "DiacriticalTilde;": '\U000002DC', - "Diamond;": '\U000022C4', - "DifferentialD;": '\U00002146', - "Dopf;": '\U0001D53B', - "Dot;": '\U000000A8', - "DotDot;": '\U000020DC', - "DotEqual;": '\U00002250', - "DoubleContourIntegral;": '\U0000222F', - "DoubleDot;": '\U000000A8', - "DoubleDownArrow;": '\U000021D3', - "DoubleLeftArrow;": '\U000021D0', - "DoubleLeftRightArrow;": '\U000021D4', - "DoubleLeftTee;": '\U00002AE4', - "DoubleLongLeftArrow;": '\U000027F8', - "DoubleLongLeftRightArrow;": '\U000027FA', - "DoubleLongRightArrow;": '\U000027F9', - "DoubleRightArrow;": '\U000021D2', - "DoubleRightTee;": '\U000022A8', - "DoubleUpArrow;": '\U000021D1', - "DoubleUpDownArrow;": '\U000021D5', - "DoubleVerticalBar;": '\U00002225', - "DownArrow;": '\U00002193', - "DownArrowBar;": '\U00002913', - "DownArrowUpArrow;": '\U000021F5', - "DownBreve;": '\U00000311', - "DownLeftRightVector;": '\U00002950', - "DownLeftTeeVector;": '\U0000295E', - "DownLeftVector;": '\U000021BD', - "DownLeftVectorBar;": '\U00002956', - "DownRightTeeVector;": '\U0000295F', - "DownRightVector;": '\U000021C1', - "DownRightVectorBar;": '\U00002957', - "DownTee;": '\U000022A4', - "DownTeeArrow;": '\U000021A7', - "Downarrow;": '\U000021D3', - "Dscr;": '\U0001D49F', - "Dstrok;": '\U00000110', - "ENG;": '\U0000014A', - "ETH;": '\U000000D0', - "Eacute;": '\U000000C9', - "Ecaron;": '\U0000011A', - "Ecirc;": '\U000000CA', - "Ecy;": '\U0000042D', - "Edot;": '\U00000116', - "Efr;": '\U0001D508', - "Egrave;": '\U000000C8', - "Element;": '\U00002208', - "Emacr;": '\U00000112', - "EmptySmallSquare;": '\U000025FB', - "EmptyVerySmallSquare;": '\U000025AB', - "Eogon;": '\U00000118', - "Eopf;": '\U0001D53C', - "Epsilon;": '\U00000395', - "Equal;": '\U00002A75', - "EqualTilde;": '\U00002242', - "Equilibrium;": '\U000021CC', - "Escr;": '\U00002130', - "Esim;": '\U00002A73', - "Eta;": '\U00000397', - "Euml;": '\U000000CB', - "Exists;": '\U00002203', - "ExponentialE;": '\U00002147', - "Fcy;": '\U00000424', - "Ffr;": '\U0001D509', - "FilledSmallSquare;": '\U000025FC', - "FilledVerySmallSquare;": '\U000025AA', - "Fopf;": '\U0001D53D', - "ForAll;": '\U00002200', - "Fouriertrf;": '\U00002131', - "Fscr;": '\U00002131', - "GJcy;": '\U00000403', - "GT;": '\U0000003E', - "Gamma;": '\U00000393', - "Gammad;": '\U000003DC', - "Gbreve;": '\U0000011E', - "Gcedil;": '\U00000122', - "Gcirc;": '\U0000011C', - "Gcy;": '\U00000413', - "Gdot;": '\U00000120', - "Gfr;": '\U0001D50A', - "Gg;": '\U000022D9', - "Gopf;": '\U0001D53E', - "GreaterEqual;": '\U00002265', - "GreaterEqualLess;": '\U000022DB', - "GreaterFullEqual;": '\U00002267', - "GreaterGreater;": '\U00002AA2', - "GreaterLess;": '\U00002277', - "GreaterSlantEqual;": '\U00002A7E', - "GreaterTilde;": '\U00002273', - "Gscr;": '\U0001D4A2', - "Gt;": '\U0000226B', - "HARDcy;": '\U0000042A', - "Hacek;": '\U000002C7', - "Hat;": '\U0000005E', - "Hcirc;": '\U00000124', - "Hfr;": '\U0000210C', - "HilbertSpace;": '\U0000210B', - "Hopf;": '\U0000210D', - "HorizontalLine;": '\U00002500', - "Hscr;": '\U0000210B', - "Hstrok;": '\U00000126', - "HumpDownHump;": '\U0000224E', - "HumpEqual;": '\U0000224F', - "IEcy;": '\U00000415', - "IJlig;": '\U00000132', - "IOcy;": '\U00000401', - "Iacute;": '\U000000CD', - "Icirc;": '\U000000CE', - "Icy;": '\U00000418', - "Idot;": '\U00000130', - "Ifr;": '\U00002111', - "Igrave;": '\U000000CC', - "Im;": '\U00002111', - "Imacr;": '\U0000012A', - "ImaginaryI;": '\U00002148', - "Implies;": '\U000021D2', - "Int;": '\U0000222C', - "Integral;": '\U0000222B', - "Intersection;": '\U000022C2', - "InvisibleComma;": '\U00002063', - "InvisibleTimes;": '\U00002062', - "Iogon;": '\U0000012E', - "Iopf;": '\U0001D540', - "Iota;": '\U00000399', - "Iscr;": '\U00002110', - "Itilde;": '\U00000128', - "Iukcy;": '\U00000406', - "Iuml;": '\U000000CF', - "Jcirc;": '\U00000134', - "Jcy;": '\U00000419', - "Jfr;": '\U0001D50D', - "Jopf;": '\U0001D541', - "Jscr;": '\U0001D4A5', - "Jsercy;": '\U00000408', - "Jukcy;": '\U00000404', - "KHcy;": '\U00000425', - "KJcy;": '\U0000040C', - "Kappa;": '\U0000039A', - "Kcedil;": '\U00000136', - "Kcy;": '\U0000041A', - "Kfr;": '\U0001D50E', - "Kopf;": '\U0001D542', - "Kscr;": '\U0001D4A6', - "LJcy;": '\U00000409', - "LT;": '\U0000003C', - "Lacute;": '\U00000139', - "Lambda;": '\U0000039B', - "Lang;": '\U000027EA', - "Laplacetrf;": '\U00002112', - "Larr;": '\U0000219E', - "Lcaron;": '\U0000013D', - "Lcedil;": '\U0000013B', - "Lcy;": '\U0000041B', - "LeftAngleBracket;": '\U000027E8', - "LeftArrow;": '\U00002190', - "LeftArrowBar;": '\U000021E4', - "LeftArrowRightArrow;": '\U000021C6', - "LeftCeiling;": '\U00002308', - "LeftDoubleBracket;": '\U000027E6', - "LeftDownTeeVector;": '\U00002961', - "LeftDownVector;": '\U000021C3', - "LeftDownVectorBar;": '\U00002959', - "LeftFloor;": '\U0000230A', - "LeftRightArrow;": '\U00002194', - "LeftRightVector;": '\U0000294E', - "LeftTee;": '\U000022A3', - "LeftTeeArrow;": '\U000021A4', - "LeftTeeVector;": '\U0000295A', - "LeftTriangle;": '\U000022B2', - "LeftTriangleBar;": '\U000029CF', - "LeftTriangleEqual;": '\U000022B4', - "LeftUpDownVector;": '\U00002951', - "LeftUpTeeVector;": '\U00002960', - "LeftUpVector;": '\U000021BF', - "LeftUpVectorBar;": '\U00002958', - "LeftVector;": '\U000021BC', - "LeftVectorBar;": '\U00002952', - "Leftarrow;": '\U000021D0', - "Leftrightarrow;": '\U000021D4', - "LessEqualGreater;": '\U000022DA', - "LessFullEqual;": '\U00002266', - "LessGreater;": '\U00002276', - "LessLess;": '\U00002AA1', - "LessSlantEqual;": '\U00002A7D', - "LessTilde;": '\U00002272', - "Lfr;": '\U0001D50F', - "Ll;": '\U000022D8', - "Lleftarrow;": '\U000021DA', - "Lmidot;": '\U0000013F', - "LongLeftArrow;": '\U000027F5', - "LongLeftRightArrow;": '\U000027F7', - "LongRightArrow;": '\U000027F6', - "Longleftarrow;": '\U000027F8', - "Longleftrightarrow;": '\U000027FA', - "Longrightarrow;": '\U000027F9', - "Lopf;": '\U0001D543', - "LowerLeftArrow;": '\U00002199', - "LowerRightArrow;": '\U00002198', - "Lscr;": '\U00002112', - "Lsh;": '\U000021B0', - "Lstrok;": '\U00000141', - "Lt;": '\U0000226A', - "Map;": '\U00002905', - "Mcy;": '\U0000041C', - "MediumSpace;": '\U0000205F', - "Mellintrf;": '\U00002133', - "Mfr;": '\U0001D510', - "MinusPlus;": '\U00002213', - "Mopf;": '\U0001D544', - "Mscr;": '\U00002133', - "Mu;": '\U0000039C', - "NJcy;": '\U0000040A', - "Nacute;": '\U00000143', - "Ncaron;": '\U00000147', - "Ncedil;": '\U00000145', - "Ncy;": '\U0000041D', - "NegativeMediumSpace;": '\U0000200B', - "NegativeThickSpace;": '\U0000200B', - "NegativeThinSpace;": '\U0000200B', - "NegativeVeryThinSpace;": '\U0000200B', - "NestedGreaterGreater;": '\U0000226B', - "NestedLessLess;": '\U0000226A', - "NewLine;": '\U0000000A', - "Nfr;": '\U0001D511', - "NoBreak;": '\U00002060', - "NonBreakingSpace;": '\U000000A0', - "Nopf;": '\U00002115', - "Not;": '\U00002AEC', - "NotCongruent;": '\U00002262', - "NotCupCap;": '\U0000226D', - "NotDoubleVerticalBar;": '\U00002226', - "NotElement;": '\U00002209', - "NotEqual;": '\U00002260', - "NotExists;": '\U00002204', - "NotGreater;": '\U0000226F', - "NotGreaterEqual;": '\U00002271', - "NotGreaterLess;": '\U00002279', - "NotGreaterTilde;": '\U00002275', - "NotLeftTriangle;": '\U000022EA', - "NotLeftTriangleEqual;": '\U000022EC', - "NotLess;": '\U0000226E', - "NotLessEqual;": '\U00002270', - "NotLessGreater;": '\U00002278', - "NotLessTilde;": '\U00002274', - "NotPrecedes;": '\U00002280', - "NotPrecedesSlantEqual;": '\U000022E0', - "NotReverseElement;": '\U0000220C', - "NotRightTriangle;": '\U000022EB', - "NotRightTriangleEqual;": '\U000022ED', - "NotSquareSubsetEqual;": '\U000022E2', - "NotSquareSupersetEqual;": '\U000022E3', - "NotSubsetEqual;": '\U00002288', - "NotSucceeds;": '\U00002281', - "NotSucceedsSlantEqual;": '\U000022E1', - "NotSupersetEqual;": '\U00002289', - "NotTilde;": '\U00002241', - "NotTildeEqual;": '\U00002244', - "NotTildeFullEqual;": '\U00002247', - "NotTildeTilde;": '\U00002249', - "NotVerticalBar;": '\U00002224', - "Nscr;": '\U0001D4A9', - "Ntilde;": '\U000000D1', - "Nu;": '\U0000039D', - "OElig;": '\U00000152', - "Oacute;": '\U000000D3', - "Ocirc;": '\U000000D4', - "Ocy;": '\U0000041E', - "Odblac;": '\U00000150', - "Ofr;": '\U0001D512', - "Ograve;": '\U000000D2', - "Omacr;": '\U0000014C', - "Omega;": '\U000003A9', - "Omicron;": '\U0000039F', - "Oopf;": '\U0001D546', - "OpenCurlyDoubleQuote;": '\U0000201C', - "OpenCurlyQuote;": '\U00002018', - "Or;": '\U00002A54', - "Oscr;": '\U0001D4AA', - "Oslash;": '\U000000D8', - "Otilde;": '\U000000D5', - "Otimes;": '\U00002A37', - "Ouml;": '\U000000D6', - "OverBar;": '\U0000203E', - "OverBrace;": '\U000023DE', - "OverBracket;": '\U000023B4', - "OverParenthesis;": '\U000023DC', - "PartialD;": '\U00002202', - "Pcy;": '\U0000041F', - "Pfr;": '\U0001D513', - "Phi;": '\U000003A6', - "Pi;": '\U000003A0', - "PlusMinus;": '\U000000B1', - "Poincareplane;": '\U0000210C', - "Popf;": '\U00002119', - "Pr;": '\U00002ABB', - "Precedes;": '\U0000227A', - "PrecedesEqual;": '\U00002AAF', - "PrecedesSlantEqual;": '\U0000227C', - "PrecedesTilde;": '\U0000227E', - "Prime;": '\U00002033', - "Product;": '\U0000220F', - "Proportion;": '\U00002237', - "Proportional;": '\U0000221D', - "Pscr;": '\U0001D4AB', - "Psi;": '\U000003A8', - "QUOT;": '\U00000022', - "Qfr;": '\U0001D514', - "Qopf;": '\U0000211A', - "Qscr;": '\U0001D4AC', - "RBarr;": '\U00002910', - "REG;": '\U000000AE', - "Racute;": '\U00000154', - "Rang;": '\U000027EB', - "Rarr;": '\U000021A0', - "Rarrtl;": '\U00002916', - "Rcaron;": '\U00000158', - "Rcedil;": '\U00000156', - "Rcy;": '\U00000420', - "Re;": '\U0000211C', - "ReverseElement;": '\U0000220B', - "ReverseEquilibrium;": '\U000021CB', - "ReverseUpEquilibrium;": '\U0000296F', - "Rfr;": '\U0000211C', - "Rho;": '\U000003A1', - "RightAngleBracket;": '\U000027E9', - "RightArrow;": '\U00002192', - "RightArrowBar;": '\U000021E5', - "RightArrowLeftArrow;": '\U000021C4', - "RightCeiling;": '\U00002309', - "RightDoubleBracket;": '\U000027E7', - "RightDownTeeVector;": '\U0000295D', - "RightDownVector;": '\U000021C2', - "RightDownVectorBar;": '\U00002955', - "RightFloor;": '\U0000230B', - "RightTee;": '\U000022A2', - "RightTeeArrow;": '\U000021A6', - "RightTeeVector;": '\U0000295B', - "RightTriangle;": '\U000022B3', - "RightTriangleBar;": '\U000029D0', - "RightTriangleEqual;": '\U000022B5', - "RightUpDownVector;": '\U0000294F', - "RightUpTeeVector;": '\U0000295C', - "RightUpVector;": '\U000021BE', - "RightUpVectorBar;": '\U00002954', - "RightVector;": '\U000021C0', - "RightVectorBar;": '\U00002953', - "Rightarrow;": '\U000021D2', - "Ropf;": '\U0000211D', - "RoundImplies;": '\U00002970', - "Rrightarrow;": '\U000021DB', - "Rscr;": '\U0000211B', - "Rsh;": '\U000021B1', - "RuleDelayed;": '\U000029F4', - "SHCHcy;": '\U00000429', - "SHcy;": '\U00000428', - "SOFTcy;": '\U0000042C', - "Sacute;": '\U0000015A', - "Sc;": '\U00002ABC', - "Scaron;": '\U00000160', - "Scedil;": '\U0000015E', - "Scirc;": '\U0000015C', - "Scy;": '\U00000421', - "Sfr;": '\U0001D516', - "ShortDownArrow;": '\U00002193', - "ShortLeftArrow;": '\U00002190', - "ShortRightArrow;": '\U00002192', - "ShortUpArrow;": '\U00002191', - "Sigma;": '\U000003A3', - "SmallCircle;": '\U00002218', - "Sopf;": '\U0001D54A', - "Sqrt;": '\U0000221A', - "Square;": '\U000025A1', - "SquareIntersection;": '\U00002293', - "SquareSubset;": '\U0000228F', - "SquareSubsetEqual;": '\U00002291', - "SquareSuperset;": '\U00002290', - "SquareSupersetEqual;": '\U00002292', - "SquareUnion;": '\U00002294', - "Sscr;": '\U0001D4AE', - "Star;": '\U000022C6', - "Sub;": '\U000022D0', - "Subset;": '\U000022D0', - "SubsetEqual;": '\U00002286', - "Succeeds;": '\U0000227B', - "SucceedsEqual;": '\U00002AB0', - "SucceedsSlantEqual;": '\U0000227D', - "SucceedsTilde;": '\U0000227F', - "SuchThat;": '\U0000220B', - "Sum;": '\U00002211', - "Sup;": '\U000022D1', - "Superset;": '\U00002283', - "SupersetEqual;": '\U00002287', - "Supset;": '\U000022D1', - "THORN;": '\U000000DE', - "TRADE;": '\U00002122', - "TSHcy;": '\U0000040B', - "TScy;": '\U00000426', - "Tab;": '\U00000009', - "Tau;": '\U000003A4', - "Tcaron;": '\U00000164', - "Tcedil;": '\U00000162', - "Tcy;": '\U00000422', - "Tfr;": '\U0001D517', - "Therefore;": '\U00002234', - "Theta;": '\U00000398', - "ThinSpace;": '\U00002009', - "Tilde;": '\U0000223C', - "TildeEqual;": '\U00002243', - "TildeFullEqual;": '\U00002245', - "TildeTilde;": '\U00002248', - "Topf;": '\U0001D54B', - "TripleDot;": '\U000020DB', - "Tscr;": '\U0001D4AF', - "Tstrok;": '\U00000166', - "Uacute;": '\U000000DA', - "Uarr;": '\U0000219F', - "Uarrocir;": '\U00002949', - "Ubrcy;": '\U0000040E', - "Ubreve;": '\U0000016C', - "Ucirc;": '\U000000DB', - "Ucy;": '\U00000423', - "Udblac;": '\U00000170', - "Ufr;": '\U0001D518', - "Ugrave;": '\U000000D9', - "Umacr;": '\U0000016A', - "UnderBar;": '\U0000005F', - "UnderBrace;": '\U000023DF', - "UnderBracket;": '\U000023B5', - "UnderParenthesis;": '\U000023DD', - "Union;": '\U000022C3', - "UnionPlus;": '\U0000228E', - "Uogon;": '\U00000172', - "Uopf;": '\U0001D54C', - "UpArrow;": '\U00002191', - "UpArrowBar;": '\U00002912', - "UpArrowDownArrow;": '\U000021C5', - "UpDownArrow;": '\U00002195', - "UpEquilibrium;": '\U0000296E', - "UpTee;": '\U000022A5', - "UpTeeArrow;": '\U000021A5', - "Uparrow;": '\U000021D1', - "Updownarrow;": '\U000021D5', - "UpperLeftArrow;": '\U00002196', - "UpperRightArrow;": '\U00002197', - "Upsi;": '\U000003D2', - "Upsilon;": '\U000003A5', - "Uring;": '\U0000016E', - "Uscr;": '\U0001D4B0', - "Utilde;": '\U00000168', - "Uuml;": '\U000000DC', - "VDash;": '\U000022AB', - "Vbar;": '\U00002AEB', - "Vcy;": '\U00000412', - "Vdash;": '\U000022A9', - "Vdashl;": '\U00002AE6', - "Vee;": '\U000022C1', - "Verbar;": '\U00002016', - "Vert;": '\U00002016', - "VerticalBar;": '\U00002223', - "VerticalLine;": '\U0000007C', - "VerticalSeparator;": '\U00002758', - "VerticalTilde;": '\U00002240', - "VeryThinSpace;": '\U0000200A', - "Vfr;": '\U0001D519', - "Vopf;": '\U0001D54D', - "Vscr;": '\U0001D4B1', - "Vvdash;": '\U000022AA', - "Wcirc;": '\U00000174', - "Wedge;": '\U000022C0', - "Wfr;": '\U0001D51A', - "Wopf;": '\U0001D54E', - "Wscr;": '\U0001D4B2', - "Xfr;": '\U0001D51B', - "Xi;": '\U0000039E', - "Xopf;": '\U0001D54F', - "Xscr;": '\U0001D4B3', - "YAcy;": '\U0000042F', - "YIcy;": '\U00000407', - "YUcy;": '\U0000042E', - "Yacute;": '\U000000DD', - "Ycirc;": '\U00000176', - "Ycy;": '\U0000042B', - "Yfr;": '\U0001D51C', - "Yopf;": '\U0001D550', - "Yscr;": '\U0001D4B4', - "Yuml;": '\U00000178', - "ZHcy;": '\U00000416', - "Zacute;": '\U00000179', - "Zcaron;": '\U0000017D', - "Zcy;": '\U00000417', - "Zdot;": '\U0000017B', - "ZeroWidthSpace;": '\U0000200B', - "Zeta;": '\U00000396', - "Zfr;": '\U00002128', - "Zopf;": '\U00002124', - "Zscr;": '\U0001D4B5', - "aacute;": '\U000000E1', - "abreve;": '\U00000103', - "ac;": '\U0000223E', - "acd;": '\U0000223F', - "acirc;": '\U000000E2', - "acute;": '\U000000B4', - "acy;": '\U00000430', - "aelig;": '\U000000E6', - "af;": '\U00002061', - "afr;": '\U0001D51E', - "agrave;": '\U000000E0', - "alefsym;": '\U00002135', - "aleph;": '\U00002135', - "alpha;": '\U000003B1', - "amacr;": '\U00000101', - "amalg;": '\U00002A3F', - "amp;": '\U00000026', - "and;": '\U00002227', - "andand;": '\U00002A55', - "andd;": '\U00002A5C', - "andslope;": '\U00002A58', - "andv;": '\U00002A5A', - "ang;": '\U00002220', - "ange;": '\U000029A4', - "angle;": '\U00002220', - "angmsd;": '\U00002221', - "angmsdaa;": '\U000029A8', - "angmsdab;": '\U000029A9', - "angmsdac;": '\U000029AA', - "angmsdad;": '\U000029AB', - "angmsdae;": '\U000029AC', - "angmsdaf;": '\U000029AD', - "angmsdag;": '\U000029AE', - "angmsdah;": '\U000029AF', - "angrt;": '\U0000221F', - "angrtvb;": '\U000022BE', - "angrtvbd;": '\U0000299D', - "angsph;": '\U00002222', - "angst;": '\U000000C5', - "angzarr;": '\U0000237C', - "aogon;": '\U00000105', - "aopf;": '\U0001D552', - "ap;": '\U00002248', - "apE;": '\U00002A70', - "apacir;": '\U00002A6F', - "ape;": '\U0000224A', - "apid;": '\U0000224B', - "apos;": '\U00000027', - "approx;": '\U00002248', - "approxeq;": '\U0000224A', - "aring;": '\U000000E5', - "ascr;": '\U0001D4B6', - "ast;": '\U0000002A', - "asymp;": '\U00002248', - "asympeq;": '\U0000224D', - "atilde;": '\U000000E3', - "auml;": '\U000000E4', - "awconint;": '\U00002233', - "awint;": '\U00002A11', - "bNot;": '\U00002AED', - "backcong;": '\U0000224C', - "backepsilon;": '\U000003F6', - "backprime;": '\U00002035', - "backsim;": '\U0000223D', - "backsimeq;": '\U000022CD', - "barvee;": '\U000022BD', - "barwed;": '\U00002305', - "barwedge;": '\U00002305', - "bbrk;": '\U000023B5', - "bbrktbrk;": '\U000023B6', - "bcong;": '\U0000224C', - "bcy;": '\U00000431', - "bdquo;": '\U0000201E', - "becaus;": '\U00002235', - "because;": '\U00002235', - "bemptyv;": '\U000029B0', - "bepsi;": '\U000003F6', - "bernou;": '\U0000212C', - "beta;": '\U000003B2', - "beth;": '\U00002136', - "between;": '\U0000226C', - "bfr;": '\U0001D51F', - "bigcap;": '\U000022C2', - "bigcirc;": '\U000025EF', - "bigcup;": '\U000022C3', - "bigodot;": '\U00002A00', - "bigoplus;": '\U00002A01', - "bigotimes;": '\U00002A02', - "bigsqcup;": '\U00002A06', - "bigstar;": '\U00002605', - "bigtriangledown;": '\U000025BD', - "bigtriangleup;": '\U000025B3', - "biguplus;": '\U00002A04', - "bigvee;": '\U000022C1', - "bigwedge;": '\U000022C0', - "bkarow;": '\U0000290D', - "blacklozenge;": '\U000029EB', - "blacksquare;": '\U000025AA', - "blacktriangle;": '\U000025B4', - "blacktriangledown;": '\U000025BE', - "blacktriangleleft;": '\U000025C2', - "blacktriangleright;": '\U000025B8', - "blank;": '\U00002423', - "blk12;": '\U00002592', - "blk14;": '\U00002591', - "blk34;": '\U00002593', - "block;": '\U00002588', - "bnot;": '\U00002310', - "bopf;": '\U0001D553', - "bot;": '\U000022A5', - "bottom;": '\U000022A5', - "bowtie;": '\U000022C8', - "boxDL;": '\U00002557', - "boxDR;": '\U00002554', - "boxDl;": '\U00002556', - "boxDr;": '\U00002553', - "boxH;": '\U00002550', - "boxHD;": '\U00002566', - "boxHU;": '\U00002569', - "boxHd;": '\U00002564', - "boxHu;": '\U00002567', - "boxUL;": '\U0000255D', - "boxUR;": '\U0000255A', - "boxUl;": '\U0000255C', - "boxUr;": '\U00002559', - "boxV;": '\U00002551', - "boxVH;": '\U0000256C', - "boxVL;": '\U00002563', - "boxVR;": '\U00002560', - "boxVh;": '\U0000256B', - "boxVl;": '\U00002562', - "boxVr;": '\U0000255F', - "boxbox;": '\U000029C9', - "boxdL;": '\U00002555', - "boxdR;": '\U00002552', - "boxdl;": '\U00002510', - "boxdr;": '\U0000250C', - "boxh;": '\U00002500', - "boxhD;": '\U00002565', - "boxhU;": '\U00002568', - "boxhd;": '\U0000252C', - "boxhu;": '\U00002534', - "boxminus;": '\U0000229F', - "boxplus;": '\U0000229E', - "boxtimes;": '\U000022A0', - "boxuL;": '\U0000255B', - "boxuR;": '\U00002558', - "boxul;": '\U00002518', - "boxur;": '\U00002514', - "boxv;": '\U00002502', - "boxvH;": '\U0000256A', - "boxvL;": '\U00002561', - "boxvR;": '\U0000255E', - "boxvh;": '\U0000253C', - "boxvl;": '\U00002524', - "boxvr;": '\U0000251C', - "bprime;": '\U00002035', - "breve;": '\U000002D8', - "brvbar;": '\U000000A6', - "bscr;": '\U0001D4B7', - "bsemi;": '\U0000204F', - "bsim;": '\U0000223D', - "bsime;": '\U000022CD', - "bsol;": '\U0000005C', - "bsolb;": '\U000029C5', - "bsolhsub;": '\U000027C8', - "bull;": '\U00002022', - "bullet;": '\U00002022', - "bump;": '\U0000224E', - "bumpE;": '\U00002AAE', - "bumpe;": '\U0000224F', - "bumpeq;": '\U0000224F', - "cacute;": '\U00000107', - "cap;": '\U00002229', - "capand;": '\U00002A44', - "capbrcup;": '\U00002A49', - "capcap;": '\U00002A4B', - "capcup;": '\U00002A47', - "capdot;": '\U00002A40', - "caret;": '\U00002041', - "caron;": '\U000002C7', - "ccaps;": '\U00002A4D', - "ccaron;": '\U0000010D', - "ccedil;": '\U000000E7', - "ccirc;": '\U00000109', - "ccups;": '\U00002A4C', - "ccupssm;": '\U00002A50', - "cdot;": '\U0000010B', - "cedil;": '\U000000B8', - "cemptyv;": '\U000029B2', - "cent;": '\U000000A2', - "centerdot;": '\U000000B7', - "cfr;": '\U0001D520', - "chcy;": '\U00000447', - "check;": '\U00002713', - "checkmark;": '\U00002713', - "chi;": '\U000003C7', - "cir;": '\U000025CB', - "cirE;": '\U000029C3', - "circ;": '\U000002C6', - "circeq;": '\U00002257', - "circlearrowleft;": '\U000021BA', - "circlearrowright;": '\U000021BB', - "circledR;": '\U000000AE', - "circledS;": '\U000024C8', - "circledast;": '\U0000229B', - "circledcirc;": '\U0000229A', - "circleddash;": '\U0000229D', - "cire;": '\U00002257', - "cirfnint;": '\U00002A10', - "cirmid;": '\U00002AEF', - "cirscir;": '\U000029C2', - "clubs;": '\U00002663', - "clubsuit;": '\U00002663', - "colon;": '\U0000003A', - "colone;": '\U00002254', - "coloneq;": '\U00002254', - "comma;": '\U0000002C', - "commat;": '\U00000040', - "comp;": '\U00002201', - "compfn;": '\U00002218', - "complement;": '\U00002201', - "complexes;": '\U00002102', - "cong;": '\U00002245', - "congdot;": '\U00002A6D', - "conint;": '\U0000222E', - "copf;": '\U0001D554', - "coprod;": '\U00002210', - "copy;": '\U000000A9', - "copysr;": '\U00002117', - "crarr;": '\U000021B5', - "cross;": '\U00002717', - "cscr;": '\U0001D4B8', - "csub;": '\U00002ACF', - "csube;": '\U00002AD1', - "csup;": '\U00002AD0', - "csupe;": '\U00002AD2', - "ctdot;": '\U000022EF', - "cudarrl;": '\U00002938', - "cudarrr;": '\U00002935', - "cuepr;": '\U000022DE', - "cuesc;": '\U000022DF', - "cularr;": '\U000021B6', - "cularrp;": '\U0000293D', - "cup;": '\U0000222A', - "cupbrcap;": '\U00002A48', - "cupcap;": '\U00002A46', - "cupcup;": '\U00002A4A', - "cupdot;": '\U0000228D', - "cupor;": '\U00002A45', - "curarr;": '\U000021B7', - "curarrm;": '\U0000293C', - "curlyeqprec;": '\U000022DE', - "curlyeqsucc;": '\U000022DF', - "curlyvee;": '\U000022CE', - "curlywedge;": '\U000022CF', - "curren;": '\U000000A4', - "curvearrowleft;": '\U000021B6', - "curvearrowright;": '\U000021B7', - "cuvee;": '\U000022CE', - "cuwed;": '\U000022CF', - "cwconint;": '\U00002232', - "cwint;": '\U00002231', - "cylcty;": '\U0000232D', - "dArr;": '\U000021D3', - "dHar;": '\U00002965', - "dagger;": '\U00002020', - "daleth;": '\U00002138', - "darr;": '\U00002193', - "dash;": '\U00002010', - "dashv;": '\U000022A3', - "dbkarow;": '\U0000290F', - "dblac;": '\U000002DD', - "dcaron;": '\U0000010F', - "dcy;": '\U00000434', - "dd;": '\U00002146', - "ddagger;": '\U00002021', - "ddarr;": '\U000021CA', - "ddotseq;": '\U00002A77', - "deg;": '\U000000B0', - "delta;": '\U000003B4', - "demptyv;": '\U000029B1', - "dfisht;": '\U0000297F', - "dfr;": '\U0001D521', - "dharl;": '\U000021C3', - "dharr;": '\U000021C2', - "diam;": '\U000022C4', - "diamond;": '\U000022C4', - "diamondsuit;": '\U00002666', - "diams;": '\U00002666', - "die;": '\U000000A8', - "digamma;": '\U000003DD', - "disin;": '\U000022F2', - "div;": '\U000000F7', - "divide;": '\U000000F7', - "divideontimes;": '\U000022C7', - "divonx;": '\U000022C7', - "djcy;": '\U00000452', - "dlcorn;": '\U0000231E', - "dlcrop;": '\U0000230D', - "dollar;": '\U00000024', - "dopf;": '\U0001D555', - "dot;": '\U000002D9', - "doteq;": '\U00002250', - "doteqdot;": '\U00002251', - "dotminus;": '\U00002238', - "dotplus;": '\U00002214', - "dotsquare;": '\U000022A1', - "doublebarwedge;": '\U00002306', - "downarrow;": '\U00002193', - "downdownarrows;": '\U000021CA', - "downharpoonleft;": '\U000021C3', - "downharpoonright;": '\U000021C2', - "drbkarow;": '\U00002910', - "drcorn;": '\U0000231F', - "drcrop;": '\U0000230C', - "dscr;": '\U0001D4B9', - "dscy;": '\U00000455', - "dsol;": '\U000029F6', - "dstrok;": '\U00000111', - "dtdot;": '\U000022F1', - "dtri;": '\U000025BF', - "dtrif;": '\U000025BE', - "duarr;": '\U000021F5', - "duhar;": '\U0000296F', - "dwangle;": '\U000029A6', - "dzcy;": '\U0000045F', - "dzigrarr;": '\U000027FF', - "eDDot;": '\U00002A77', - "eDot;": '\U00002251', - "eacute;": '\U000000E9', - "easter;": '\U00002A6E', - "ecaron;": '\U0000011B', - "ecir;": '\U00002256', - "ecirc;": '\U000000EA', - "ecolon;": '\U00002255', - "ecy;": '\U0000044D', - "edot;": '\U00000117', - "ee;": '\U00002147', - "efDot;": '\U00002252', - "efr;": '\U0001D522', - "eg;": '\U00002A9A', - "egrave;": '\U000000E8', - "egs;": '\U00002A96', - "egsdot;": '\U00002A98', - "el;": '\U00002A99', - "elinters;": '\U000023E7', - "ell;": '\U00002113', - "els;": '\U00002A95', - "elsdot;": '\U00002A97', - "emacr;": '\U00000113', - "empty;": '\U00002205', - "emptyset;": '\U00002205', - "emptyv;": '\U00002205', - "emsp;": '\U00002003', - "emsp13;": '\U00002004', - "emsp14;": '\U00002005', - "eng;": '\U0000014B', - "ensp;": '\U00002002', - "eogon;": '\U00000119', - "eopf;": '\U0001D556', - "epar;": '\U000022D5', - "eparsl;": '\U000029E3', - "eplus;": '\U00002A71', - "epsi;": '\U000003B5', - "epsilon;": '\U000003B5', - "epsiv;": '\U000003F5', - "eqcirc;": '\U00002256', - "eqcolon;": '\U00002255', - "eqsim;": '\U00002242', - "eqslantgtr;": '\U00002A96', - "eqslantless;": '\U00002A95', - "equals;": '\U0000003D', - "equest;": '\U0000225F', - "equiv;": '\U00002261', - "equivDD;": '\U00002A78', - "eqvparsl;": '\U000029E5', - "erDot;": '\U00002253', - "erarr;": '\U00002971', - "escr;": '\U0000212F', - "esdot;": '\U00002250', - "esim;": '\U00002242', - "eta;": '\U000003B7', - "eth;": '\U000000F0', - "euml;": '\U000000EB', - "euro;": '\U000020AC', - "excl;": '\U00000021', - "exist;": '\U00002203', - "expectation;": '\U00002130', - "exponentiale;": '\U00002147', - "fallingdotseq;": '\U00002252', - "fcy;": '\U00000444', - "female;": '\U00002640', - "ffilig;": '\U0000FB03', - "fflig;": '\U0000FB00', - "ffllig;": '\U0000FB04', - "ffr;": '\U0001D523', - "filig;": '\U0000FB01', - "flat;": '\U0000266D', - "fllig;": '\U0000FB02', - "fltns;": '\U000025B1', - "fnof;": '\U00000192', - "fopf;": '\U0001D557', - "forall;": '\U00002200', - "fork;": '\U000022D4', - "forkv;": '\U00002AD9', - "fpartint;": '\U00002A0D', - "frac12;": '\U000000BD', - "frac13;": '\U00002153', - "frac14;": '\U000000BC', - "frac15;": '\U00002155', - "frac16;": '\U00002159', - "frac18;": '\U0000215B', - "frac23;": '\U00002154', - "frac25;": '\U00002156', - "frac34;": '\U000000BE', - "frac35;": '\U00002157', - "frac38;": '\U0000215C', - "frac45;": '\U00002158', - "frac56;": '\U0000215A', - "frac58;": '\U0000215D', - "frac78;": '\U0000215E', - "frasl;": '\U00002044', - "frown;": '\U00002322', - "fscr;": '\U0001D4BB', - "gE;": '\U00002267', - "gEl;": '\U00002A8C', - "gacute;": '\U000001F5', - "gamma;": '\U000003B3', - "gammad;": '\U000003DD', - "gap;": '\U00002A86', - "gbreve;": '\U0000011F', - "gcirc;": '\U0000011D', - "gcy;": '\U00000433', - "gdot;": '\U00000121', - "ge;": '\U00002265', - "gel;": '\U000022DB', - "geq;": '\U00002265', - "geqq;": '\U00002267', - "geqslant;": '\U00002A7E', - "ges;": '\U00002A7E', - "gescc;": '\U00002AA9', - "gesdot;": '\U00002A80', - "gesdoto;": '\U00002A82', - "gesdotol;": '\U00002A84', - "gesles;": '\U00002A94', - "gfr;": '\U0001D524', - "gg;": '\U0000226B', - "ggg;": '\U000022D9', - "gimel;": '\U00002137', - "gjcy;": '\U00000453', - "gl;": '\U00002277', - "glE;": '\U00002A92', - "gla;": '\U00002AA5', - "glj;": '\U00002AA4', - "gnE;": '\U00002269', - "gnap;": '\U00002A8A', - "gnapprox;": '\U00002A8A', - "gne;": '\U00002A88', - "gneq;": '\U00002A88', - "gneqq;": '\U00002269', - "gnsim;": '\U000022E7', - "gopf;": '\U0001D558', - "grave;": '\U00000060', - "gscr;": '\U0000210A', - "gsim;": '\U00002273', - "gsime;": '\U00002A8E', - "gsiml;": '\U00002A90', - "gt;": '\U0000003E', - "gtcc;": '\U00002AA7', - "gtcir;": '\U00002A7A', - "gtdot;": '\U000022D7', - "gtlPar;": '\U00002995', - "gtquest;": '\U00002A7C', - "gtrapprox;": '\U00002A86', - "gtrarr;": '\U00002978', - "gtrdot;": '\U000022D7', - "gtreqless;": '\U000022DB', - "gtreqqless;": '\U00002A8C', - "gtrless;": '\U00002277', - "gtrsim;": '\U00002273', - "hArr;": '\U000021D4', - "hairsp;": '\U0000200A', - "half;": '\U000000BD', - "hamilt;": '\U0000210B', - "hardcy;": '\U0000044A', - "harr;": '\U00002194', - "harrcir;": '\U00002948', - "harrw;": '\U000021AD', - "hbar;": '\U0000210F', - "hcirc;": '\U00000125', - "hearts;": '\U00002665', - "heartsuit;": '\U00002665', - "hellip;": '\U00002026', - "hercon;": '\U000022B9', - "hfr;": '\U0001D525', - "hksearow;": '\U00002925', - "hkswarow;": '\U00002926', - "hoarr;": '\U000021FF', - "homtht;": '\U0000223B', - "hookleftarrow;": '\U000021A9', - "hookrightarrow;": '\U000021AA', - "hopf;": '\U0001D559', - "horbar;": '\U00002015', - "hscr;": '\U0001D4BD', - "hslash;": '\U0000210F', - "hstrok;": '\U00000127', - "hybull;": '\U00002043', - "hyphen;": '\U00002010', - "iacute;": '\U000000ED', - "ic;": '\U00002063', - "icirc;": '\U000000EE', - "icy;": '\U00000438', - "iecy;": '\U00000435', - "iexcl;": '\U000000A1', - "iff;": '\U000021D4', - "ifr;": '\U0001D526', - "igrave;": '\U000000EC', - "ii;": '\U00002148', - "iiiint;": '\U00002A0C', - "iiint;": '\U0000222D', - "iinfin;": '\U000029DC', - "iiota;": '\U00002129', - "ijlig;": '\U00000133', - "imacr;": '\U0000012B', - "image;": '\U00002111', - "imagline;": '\U00002110', - "imagpart;": '\U00002111', - "imath;": '\U00000131', - "imof;": '\U000022B7', - "imped;": '\U000001B5', - "in;": '\U00002208', - "incare;": '\U00002105', - "infin;": '\U0000221E', - "infintie;": '\U000029DD', - "inodot;": '\U00000131', - "int;": '\U0000222B', - "intcal;": '\U000022BA', - "integers;": '\U00002124', - "intercal;": '\U000022BA', - "intlarhk;": '\U00002A17', - "intprod;": '\U00002A3C', - "iocy;": '\U00000451', - "iogon;": '\U0000012F', - "iopf;": '\U0001D55A', - "iota;": '\U000003B9', - "iprod;": '\U00002A3C', - "iquest;": '\U000000BF', - "iscr;": '\U0001D4BE', - "isin;": '\U00002208', - "isinE;": '\U000022F9', - "isindot;": '\U000022F5', - "isins;": '\U000022F4', - "isinsv;": '\U000022F3', - "isinv;": '\U00002208', - "it;": '\U00002062', - "itilde;": '\U00000129', - "iukcy;": '\U00000456', - "iuml;": '\U000000EF', - "jcirc;": '\U00000135', - "jcy;": '\U00000439', - "jfr;": '\U0001D527', - "jmath;": '\U00000237', - "jopf;": '\U0001D55B', - "jscr;": '\U0001D4BF', - "jsercy;": '\U00000458', - "jukcy;": '\U00000454', - "kappa;": '\U000003BA', - "kappav;": '\U000003F0', - "kcedil;": '\U00000137', - "kcy;": '\U0000043A', - "kfr;": '\U0001D528', - "kgreen;": '\U00000138', - "khcy;": '\U00000445', - "kjcy;": '\U0000045C', - "kopf;": '\U0001D55C', - "kscr;": '\U0001D4C0', - "lAarr;": '\U000021DA', - "lArr;": '\U000021D0', - "lAtail;": '\U0000291B', - "lBarr;": '\U0000290E', - "lE;": '\U00002266', - "lEg;": '\U00002A8B', - "lHar;": '\U00002962', - "lacute;": '\U0000013A', - "laemptyv;": '\U000029B4', - "lagran;": '\U00002112', - "lambda;": '\U000003BB', - "lang;": '\U000027E8', - "langd;": '\U00002991', - "langle;": '\U000027E8', - "lap;": '\U00002A85', - "laquo;": '\U000000AB', - "larr;": '\U00002190', - "larrb;": '\U000021E4', - "larrbfs;": '\U0000291F', - "larrfs;": '\U0000291D', - "larrhk;": '\U000021A9', - "larrlp;": '\U000021AB', - "larrpl;": '\U00002939', - "larrsim;": '\U00002973', - "larrtl;": '\U000021A2', - "lat;": '\U00002AAB', - "latail;": '\U00002919', - "late;": '\U00002AAD', - "lbarr;": '\U0000290C', - "lbbrk;": '\U00002772', - "lbrace;": '\U0000007B', - "lbrack;": '\U0000005B', - "lbrke;": '\U0000298B', - "lbrksld;": '\U0000298F', - "lbrkslu;": '\U0000298D', - "lcaron;": '\U0000013E', - "lcedil;": '\U0000013C', - "lceil;": '\U00002308', - "lcub;": '\U0000007B', - "lcy;": '\U0000043B', - "ldca;": '\U00002936', - "ldquo;": '\U0000201C', - "ldquor;": '\U0000201E', - "ldrdhar;": '\U00002967', - "ldrushar;": '\U0000294B', - "ldsh;": '\U000021B2', - "le;": '\U00002264', - "leftarrow;": '\U00002190', - "leftarrowtail;": '\U000021A2', - "leftharpoondown;": '\U000021BD', - "leftharpoonup;": '\U000021BC', - "leftleftarrows;": '\U000021C7', - "leftrightarrow;": '\U00002194', - "leftrightarrows;": '\U000021C6', - "leftrightharpoons;": '\U000021CB', - "leftrightsquigarrow;": '\U000021AD', - "leftthreetimes;": '\U000022CB', - "leg;": '\U000022DA', - "leq;": '\U00002264', - "leqq;": '\U00002266', - "leqslant;": '\U00002A7D', - "les;": '\U00002A7D', - "lescc;": '\U00002AA8', - "lesdot;": '\U00002A7F', - "lesdoto;": '\U00002A81', - "lesdotor;": '\U00002A83', - "lesges;": '\U00002A93', - "lessapprox;": '\U00002A85', - "lessdot;": '\U000022D6', - "lesseqgtr;": '\U000022DA', - "lesseqqgtr;": '\U00002A8B', - "lessgtr;": '\U00002276', - "lesssim;": '\U00002272', - "lfisht;": '\U0000297C', - "lfloor;": '\U0000230A', - "lfr;": '\U0001D529', - "lg;": '\U00002276', - "lgE;": '\U00002A91', - "lhard;": '\U000021BD', - "lharu;": '\U000021BC', - "lharul;": '\U0000296A', - "lhblk;": '\U00002584', - "ljcy;": '\U00000459', - "ll;": '\U0000226A', - "llarr;": '\U000021C7', - "llcorner;": '\U0000231E', - "llhard;": '\U0000296B', - "lltri;": '\U000025FA', - "lmidot;": '\U00000140', - "lmoust;": '\U000023B0', - "lmoustache;": '\U000023B0', - "lnE;": '\U00002268', - "lnap;": '\U00002A89', - "lnapprox;": '\U00002A89', - "lne;": '\U00002A87', - "lneq;": '\U00002A87', - "lneqq;": '\U00002268', - "lnsim;": '\U000022E6', - "loang;": '\U000027EC', - "loarr;": '\U000021FD', - "lobrk;": '\U000027E6', - "longleftarrow;": '\U000027F5', - "longleftrightarrow;": '\U000027F7', - "longmapsto;": '\U000027FC', - "longrightarrow;": '\U000027F6', - "looparrowleft;": '\U000021AB', - "looparrowright;": '\U000021AC', - "lopar;": '\U00002985', - "lopf;": '\U0001D55D', - "loplus;": '\U00002A2D', - "lotimes;": '\U00002A34', - "lowast;": '\U00002217', - "lowbar;": '\U0000005F', - "loz;": '\U000025CA', - "lozenge;": '\U000025CA', - "lozf;": '\U000029EB', - "lpar;": '\U00000028', - "lparlt;": '\U00002993', - "lrarr;": '\U000021C6', - "lrcorner;": '\U0000231F', - "lrhar;": '\U000021CB', - "lrhard;": '\U0000296D', - "lrm;": '\U0000200E', - "lrtri;": '\U000022BF', - "lsaquo;": '\U00002039', - "lscr;": '\U0001D4C1', - "lsh;": '\U000021B0', - "lsim;": '\U00002272', - "lsime;": '\U00002A8D', - "lsimg;": '\U00002A8F', - "lsqb;": '\U0000005B', - "lsquo;": '\U00002018', - "lsquor;": '\U0000201A', - "lstrok;": '\U00000142', - "lt;": '\U0000003C', - "ltcc;": '\U00002AA6', - "ltcir;": '\U00002A79', - "ltdot;": '\U000022D6', - "lthree;": '\U000022CB', - "ltimes;": '\U000022C9', - "ltlarr;": '\U00002976', - "ltquest;": '\U00002A7B', - "ltrPar;": '\U00002996', - "ltri;": '\U000025C3', - "ltrie;": '\U000022B4', - "ltrif;": '\U000025C2', - "lurdshar;": '\U0000294A', - "luruhar;": '\U00002966', - "mDDot;": '\U0000223A', - "macr;": '\U000000AF', - "male;": '\U00002642', - "malt;": '\U00002720', - "maltese;": '\U00002720', - "map;": '\U000021A6', - "mapsto;": '\U000021A6', - "mapstodown;": '\U000021A7', - "mapstoleft;": '\U000021A4', - "mapstoup;": '\U000021A5', - "marker;": '\U000025AE', - "mcomma;": '\U00002A29', - "mcy;": '\U0000043C', - "mdash;": '\U00002014', - "measuredangle;": '\U00002221', - "mfr;": '\U0001D52A', - "mho;": '\U00002127', - "micro;": '\U000000B5', - "mid;": '\U00002223', - "midast;": '\U0000002A', - "midcir;": '\U00002AF0', - "middot;": '\U000000B7', - "minus;": '\U00002212', - "minusb;": '\U0000229F', - "minusd;": '\U00002238', - "minusdu;": '\U00002A2A', - "mlcp;": '\U00002ADB', - "mldr;": '\U00002026', - "mnplus;": '\U00002213', - "models;": '\U000022A7', - "mopf;": '\U0001D55E', - "mp;": '\U00002213', - "mscr;": '\U0001D4C2', - "mstpos;": '\U0000223E', - "mu;": '\U000003BC', - "multimap;": '\U000022B8', - "mumap;": '\U000022B8', - "nLeftarrow;": '\U000021CD', - "nLeftrightarrow;": '\U000021CE', - "nRightarrow;": '\U000021CF', - "nVDash;": '\U000022AF', - "nVdash;": '\U000022AE', - "nabla;": '\U00002207', - "nacute;": '\U00000144', - "nap;": '\U00002249', - "napos;": '\U00000149', - "napprox;": '\U00002249', - "natur;": '\U0000266E', - "natural;": '\U0000266E', - "naturals;": '\U00002115', - "nbsp;": '\U000000A0', - "ncap;": '\U00002A43', - "ncaron;": '\U00000148', - "ncedil;": '\U00000146', - "ncong;": '\U00002247', - "ncup;": '\U00002A42', - "ncy;": '\U0000043D', - "ndash;": '\U00002013', - "ne;": '\U00002260', - "neArr;": '\U000021D7', - "nearhk;": '\U00002924', - "nearr;": '\U00002197', - "nearrow;": '\U00002197', - "nequiv;": '\U00002262', - "nesear;": '\U00002928', - "nexist;": '\U00002204', - "nexists;": '\U00002204', - "nfr;": '\U0001D52B', - "nge;": '\U00002271', - "ngeq;": '\U00002271', - "ngsim;": '\U00002275', - "ngt;": '\U0000226F', - "ngtr;": '\U0000226F', - "nhArr;": '\U000021CE', - "nharr;": '\U000021AE', - "nhpar;": '\U00002AF2', - "ni;": '\U0000220B', - "nis;": '\U000022FC', - "nisd;": '\U000022FA', - "niv;": '\U0000220B', - "njcy;": '\U0000045A', - "nlArr;": '\U000021CD', - "nlarr;": '\U0000219A', - "nldr;": '\U00002025', - "nle;": '\U00002270', - "nleftarrow;": '\U0000219A', - "nleftrightarrow;": '\U000021AE', - "nleq;": '\U00002270', - "nless;": '\U0000226E', - "nlsim;": '\U00002274', - "nlt;": '\U0000226E', - "nltri;": '\U000022EA', - "nltrie;": '\U000022EC', - "nmid;": '\U00002224', - "nopf;": '\U0001D55F', - "not;": '\U000000AC', - "notin;": '\U00002209', - "notinva;": '\U00002209', - "notinvb;": '\U000022F7', - "notinvc;": '\U000022F6', - "notni;": '\U0000220C', - "notniva;": '\U0000220C', - "notnivb;": '\U000022FE', - "notnivc;": '\U000022FD', - "npar;": '\U00002226', - "nparallel;": '\U00002226', - "npolint;": '\U00002A14', - "npr;": '\U00002280', - "nprcue;": '\U000022E0', - "nprec;": '\U00002280', - "nrArr;": '\U000021CF', - "nrarr;": '\U0000219B', - "nrightarrow;": '\U0000219B', - "nrtri;": '\U000022EB', - "nrtrie;": '\U000022ED', - "nsc;": '\U00002281', - "nsccue;": '\U000022E1', - "nscr;": '\U0001D4C3', - "nshortmid;": '\U00002224', - "nshortparallel;": '\U00002226', - "nsim;": '\U00002241', - "nsime;": '\U00002244', - "nsimeq;": '\U00002244', - "nsmid;": '\U00002224', - "nspar;": '\U00002226', - "nsqsube;": '\U000022E2', - "nsqsupe;": '\U000022E3', - "nsub;": '\U00002284', - "nsube;": '\U00002288', - "nsubseteq;": '\U00002288', - "nsucc;": '\U00002281', - "nsup;": '\U00002285', - "nsupe;": '\U00002289', - "nsupseteq;": '\U00002289', - "ntgl;": '\U00002279', - "ntilde;": '\U000000F1', - "ntlg;": '\U00002278', - "ntriangleleft;": '\U000022EA', - "ntrianglelefteq;": '\U000022EC', - "ntriangleright;": '\U000022EB', - "ntrianglerighteq;": '\U000022ED', - "nu;": '\U000003BD', - "num;": '\U00000023', - "numero;": '\U00002116', - "numsp;": '\U00002007', - "nvDash;": '\U000022AD', - "nvHarr;": '\U00002904', - "nvdash;": '\U000022AC', - "nvinfin;": '\U000029DE', - "nvlArr;": '\U00002902', - "nvrArr;": '\U00002903', - "nwArr;": '\U000021D6', - "nwarhk;": '\U00002923', - "nwarr;": '\U00002196', - "nwarrow;": '\U00002196', - "nwnear;": '\U00002927', - "oS;": '\U000024C8', - "oacute;": '\U000000F3', - "oast;": '\U0000229B', - "ocir;": '\U0000229A', - "ocirc;": '\U000000F4', - "ocy;": '\U0000043E', - "odash;": '\U0000229D', - "odblac;": '\U00000151', - "odiv;": '\U00002A38', - "odot;": '\U00002299', - "odsold;": '\U000029BC', - "oelig;": '\U00000153', - "ofcir;": '\U000029BF', - "ofr;": '\U0001D52C', - "ogon;": '\U000002DB', - "ograve;": '\U000000F2', - "ogt;": '\U000029C1', - "ohbar;": '\U000029B5', - "ohm;": '\U000003A9', - "oint;": '\U0000222E', - "olarr;": '\U000021BA', - "olcir;": '\U000029BE', - "olcross;": '\U000029BB', - "oline;": '\U0000203E', - "olt;": '\U000029C0', - "omacr;": '\U0000014D', - "omega;": '\U000003C9', - "omicron;": '\U000003BF', - "omid;": '\U000029B6', - "ominus;": '\U00002296', - "oopf;": '\U0001D560', - "opar;": '\U000029B7', - "operp;": '\U000029B9', - "oplus;": '\U00002295', - "or;": '\U00002228', - "orarr;": '\U000021BB', - "ord;": '\U00002A5D', - "order;": '\U00002134', - "orderof;": '\U00002134', - "ordf;": '\U000000AA', - "ordm;": '\U000000BA', - "origof;": '\U000022B6', - "oror;": '\U00002A56', - "orslope;": '\U00002A57', - "orv;": '\U00002A5B', - "oscr;": '\U00002134', - "oslash;": '\U000000F8', - "osol;": '\U00002298', - "otilde;": '\U000000F5', - "otimes;": '\U00002297', - "otimesas;": '\U00002A36', - "ouml;": '\U000000F6', - "ovbar;": '\U0000233D', - "par;": '\U00002225', - "para;": '\U000000B6', - "parallel;": '\U00002225', - "parsim;": '\U00002AF3', - "parsl;": '\U00002AFD', - "part;": '\U00002202', - "pcy;": '\U0000043F', - "percnt;": '\U00000025', - "period;": '\U0000002E', - "permil;": '\U00002030', - "perp;": '\U000022A5', - "pertenk;": '\U00002031', - "pfr;": '\U0001D52D', - "phi;": '\U000003C6', - "phiv;": '\U000003D5', - "phmmat;": '\U00002133', - "phone;": '\U0000260E', - "pi;": '\U000003C0', - "pitchfork;": '\U000022D4', - "piv;": '\U000003D6', - "planck;": '\U0000210F', - "planckh;": '\U0000210E', - "plankv;": '\U0000210F', - "plus;": '\U0000002B', - "plusacir;": '\U00002A23', - "plusb;": '\U0000229E', - "pluscir;": '\U00002A22', - "plusdo;": '\U00002214', - "plusdu;": '\U00002A25', - "pluse;": '\U00002A72', - "plusmn;": '\U000000B1', - "plussim;": '\U00002A26', - "plustwo;": '\U00002A27', - "pm;": '\U000000B1', - "pointint;": '\U00002A15', - "popf;": '\U0001D561', - "pound;": '\U000000A3', - "pr;": '\U0000227A', - "prE;": '\U00002AB3', - "prap;": '\U00002AB7', - "prcue;": '\U0000227C', - "pre;": '\U00002AAF', - "prec;": '\U0000227A', - "precapprox;": '\U00002AB7', - "preccurlyeq;": '\U0000227C', - "preceq;": '\U00002AAF', - "precnapprox;": '\U00002AB9', - "precneqq;": '\U00002AB5', - "precnsim;": '\U000022E8', - "precsim;": '\U0000227E', - "prime;": '\U00002032', - "primes;": '\U00002119', - "prnE;": '\U00002AB5', - "prnap;": '\U00002AB9', - "prnsim;": '\U000022E8', - "prod;": '\U0000220F', - "profalar;": '\U0000232E', - "profline;": '\U00002312', - "profsurf;": '\U00002313', - "prop;": '\U0000221D', - "propto;": '\U0000221D', - "prsim;": '\U0000227E', - "prurel;": '\U000022B0', - "pscr;": '\U0001D4C5', - "psi;": '\U000003C8', - "puncsp;": '\U00002008', - "qfr;": '\U0001D52E', - "qint;": '\U00002A0C', - "qopf;": '\U0001D562', - "qprime;": '\U00002057', - "qscr;": '\U0001D4C6', - "quaternions;": '\U0000210D', - "quatint;": '\U00002A16', - "quest;": '\U0000003F', - "questeq;": '\U0000225F', - "quot;": '\U00000022', - "rAarr;": '\U000021DB', - "rArr;": '\U000021D2', - "rAtail;": '\U0000291C', - "rBarr;": '\U0000290F', - "rHar;": '\U00002964', - "racute;": '\U00000155', - "radic;": '\U0000221A', - "raemptyv;": '\U000029B3', - "rang;": '\U000027E9', - "rangd;": '\U00002992', - "range;": '\U000029A5', - "rangle;": '\U000027E9', - "raquo;": '\U000000BB', - "rarr;": '\U00002192', - "rarrap;": '\U00002975', - "rarrb;": '\U000021E5', - "rarrbfs;": '\U00002920', - "rarrc;": '\U00002933', - "rarrfs;": '\U0000291E', - "rarrhk;": '\U000021AA', - "rarrlp;": '\U000021AC', - "rarrpl;": '\U00002945', - "rarrsim;": '\U00002974', - "rarrtl;": '\U000021A3', - "rarrw;": '\U0000219D', - "ratail;": '\U0000291A', - "ratio;": '\U00002236', - "rationals;": '\U0000211A', - "rbarr;": '\U0000290D', - "rbbrk;": '\U00002773', - "rbrace;": '\U0000007D', - "rbrack;": '\U0000005D', - "rbrke;": '\U0000298C', - "rbrksld;": '\U0000298E', - "rbrkslu;": '\U00002990', - "rcaron;": '\U00000159', - "rcedil;": '\U00000157', - "rceil;": '\U00002309', - "rcub;": '\U0000007D', - "rcy;": '\U00000440', - "rdca;": '\U00002937', - "rdldhar;": '\U00002969', - "rdquo;": '\U0000201D', - "rdquor;": '\U0000201D', - "rdsh;": '\U000021B3', - "real;": '\U0000211C', - "realine;": '\U0000211B', - "realpart;": '\U0000211C', - "reals;": '\U0000211D', - "rect;": '\U000025AD', - "reg;": '\U000000AE', - "rfisht;": '\U0000297D', - "rfloor;": '\U0000230B', - "rfr;": '\U0001D52F', - "rhard;": '\U000021C1', - "rharu;": '\U000021C0', - "rharul;": '\U0000296C', - "rho;": '\U000003C1', - "rhov;": '\U000003F1', - "rightarrow;": '\U00002192', - "rightarrowtail;": '\U000021A3', - "rightharpoondown;": '\U000021C1', - "rightharpoonup;": '\U000021C0', - "rightleftarrows;": '\U000021C4', - "rightleftharpoons;": '\U000021CC', - "rightrightarrows;": '\U000021C9', - "rightsquigarrow;": '\U0000219D', - "rightthreetimes;": '\U000022CC', - "ring;": '\U000002DA', - "risingdotseq;": '\U00002253', - "rlarr;": '\U000021C4', - "rlhar;": '\U000021CC', - "rlm;": '\U0000200F', - "rmoust;": '\U000023B1', - "rmoustache;": '\U000023B1', - "rnmid;": '\U00002AEE', - "roang;": '\U000027ED', - "roarr;": '\U000021FE', - "robrk;": '\U000027E7', - "ropar;": '\U00002986', - "ropf;": '\U0001D563', - "roplus;": '\U00002A2E', - "rotimes;": '\U00002A35', - "rpar;": '\U00000029', - "rpargt;": '\U00002994', - "rppolint;": '\U00002A12', - "rrarr;": '\U000021C9', - "rsaquo;": '\U0000203A', - "rscr;": '\U0001D4C7', - "rsh;": '\U000021B1', - "rsqb;": '\U0000005D', - "rsquo;": '\U00002019', - "rsquor;": '\U00002019', - "rthree;": '\U000022CC', - "rtimes;": '\U000022CA', - "rtri;": '\U000025B9', - "rtrie;": '\U000022B5', - "rtrif;": '\U000025B8', - "rtriltri;": '\U000029CE', - "ruluhar;": '\U00002968', - "rx;": '\U0000211E', - "sacute;": '\U0000015B', - "sbquo;": '\U0000201A', - "sc;": '\U0000227B', - "scE;": '\U00002AB4', - "scap;": '\U00002AB8', - "scaron;": '\U00000161', - "sccue;": '\U0000227D', - "sce;": '\U00002AB0', - "scedil;": '\U0000015F', - "scirc;": '\U0000015D', - "scnE;": '\U00002AB6', - "scnap;": '\U00002ABA', - "scnsim;": '\U000022E9', - "scpolint;": '\U00002A13', - "scsim;": '\U0000227F', - "scy;": '\U00000441', - "sdot;": '\U000022C5', - "sdotb;": '\U000022A1', - "sdote;": '\U00002A66', - "seArr;": '\U000021D8', - "searhk;": '\U00002925', - "searr;": '\U00002198', - "searrow;": '\U00002198', - "sect;": '\U000000A7', - "semi;": '\U0000003B', - "seswar;": '\U00002929', - "setminus;": '\U00002216', - "setmn;": '\U00002216', - "sext;": '\U00002736', - "sfr;": '\U0001D530', - "sfrown;": '\U00002322', - "sharp;": '\U0000266F', - "shchcy;": '\U00000449', - "shcy;": '\U00000448', - "shortmid;": '\U00002223', - "shortparallel;": '\U00002225', - "shy;": '\U000000AD', - "sigma;": '\U000003C3', - "sigmaf;": '\U000003C2', - "sigmav;": '\U000003C2', - "sim;": '\U0000223C', - "simdot;": '\U00002A6A', - "sime;": '\U00002243', - "simeq;": '\U00002243', - "simg;": '\U00002A9E', - "simgE;": '\U00002AA0', - "siml;": '\U00002A9D', - "simlE;": '\U00002A9F', - "simne;": '\U00002246', - "simplus;": '\U00002A24', - "simrarr;": '\U00002972', - "slarr;": '\U00002190', - "smallsetminus;": '\U00002216', - "smashp;": '\U00002A33', - "smeparsl;": '\U000029E4', - "smid;": '\U00002223', - "smile;": '\U00002323', - "smt;": '\U00002AAA', - "smte;": '\U00002AAC', - "softcy;": '\U0000044C', - "sol;": '\U0000002F', - "solb;": '\U000029C4', - "solbar;": '\U0000233F', - "sopf;": '\U0001D564', - "spades;": '\U00002660', - "spadesuit;": '\U00002660', - "spar;": '\U00002225', - "sqcap;": '\U00002293', - "sqcup;": '\U00002294', - "sqsub;": '\U0000228F', - "sqsube;": '\U00002291', - "sqsubset;": '\U0000228F', - "sqsubseteq;": '\U00002291', - "sqsup;": '\U00002290', - "sqsupe;": '\U00002292', - "sqsupset;": '\U00002290', - "sqsupseteq;": '\U00002292', - "squ;": '\U000025A1', - "square;": '\U000025A1', - "squarf;": '\U000025AA', - "squf;": '\U000025AA', - "srarr;": '\U00002192', - "sscr;": '\U0001D4C8', - "ssetmn;": '\U00002216', - "ssmile;": '\U00002323', - "sstarf;": '\U000022C6', - "star;": '\U00002606', - "starf;": '\U00002605', - "straightepsilon;": '\U000003F5', - "straightphi;": '\U000003D5', - "strns;": '\U000000AF', - "sub;": '\U00002282', - "subE;": '\U00002AC5', - "subdot;": '\U00002ABD', - "sube;": '\U00002286', - "subedot;": '\U00002AC3', - "submult;": '\U00002AC1', - "subnE;": '\U00002ACB', - "subne;": '\U0000228A', - "subplus;": '\U00002ABF', - "subrarr;": '\U00002979', - "subset;": '\U00002282', - "subseteq;": '\U00002286', - "subseteqq;": '\U00002AC5', - "subsetneq;": '\U0000228A', - "subsetneqq;": '\U00002ACB', - "subsim;": '\U00002AC7', - "subsub;": '\U00002AD5', - "subsup;": '\U00002AD3', - "succ;": '\U0000227B', - "succapprox;": '\U00002AB8', - "succcurlyeq;": '\U0000227D', - "succeq;": '\U00002AB0', - "succnapprox;": '\U00002ABA', - "succneqq;": '\U00002AB6', - "succnsim;": '\U000022E9', - "succsim;": '\U0000227F', - "sum;": '\U00002211', - "sung;": '\U0000266A', - "sup;": '\U00002283', - "sup1;": '\U000000B9', - "sup2;": '\U000000B2', - "sup3;": '\U000000B3', - "supE;": '\U00002AC6', - "supdot;": '\U00002ABE', - "supdsub;": '\U00002AD8', - "supe;": '\U00002287', - "supedot;": '\U00002AC4', - "suphsol;": '\U000027C9', - "suphsub;": '\U00002AD7', - "suplarr;": '\U0000297B', - "supmult;": '\U00002AC2', - "supnE;": '\U00002ACC', - "supne;": '\U0000228B', - "supplus;": '\U00002AC0', - "supset;": '\U00002283', - "supseteq;": '\U00002287', - "supseteqq;": '\U00002AC6', - "supsetneq;": '\U0000228B', - "supsetneqq;": '\U00002ACC', - "supsim;": '\U00002AC8', - "supsub;": '\U00002AD4', - "supsup;": '\U00002AD6', - "swArr;": '\U000021D9', - "swarhk;": '\U00002926', - "swarr;": '\U00002199', - "swarrow;": '\U00002199', - "swnwar;": '\U0000292A', - "szlig;": '\U000000DF', - "target;": '\U00002316', - "tau;": '\U000003C4', - "tbrk;": '\U000023B4', - "tcaron;": '\U00000165', - "tcedil;": '\U00000163', - "tcy;": '\U00000442', - "tdot;": '\U000020DB', - "telrec;": '\U00002315', - "tfr;": '\U0001D531', - "there4;": '\U00002234', - "therefore;": '\U00002234', - "theta;": '\U000003B8', - "thetasym;": '\U000003D1', - "thetav;": '\U000003D1', - "thickapprox;": '\U00002248', - "thicksim;": '\U0000223C', - "thinsp;": '\U00002009', - "thkap;": '\U00002248', - "thksim;": '\U0000223C', - "thorn;": '\U000000FE', - "tilde;": '\U000002DC', - "times;": '\U000000D7', - "timesb;": '\U000022A0', - "timesbar;": '\U00002A31', - "timesd;": '\U00002A30', - "tint;": '\U0000222D', - "toea;": '\U00002928', - "top;": '\U000022A4', - "topbot;": '\U00002336', - "topcir;": '\U00002AF1', - "topf;": '\U0001D565', - "topfork;": '\U00002ADA', - "tosa;": '\U00002929', - "tprime;": '\U00002034', - "trade;": '\U00002122', - "triangle;": '\U000025B5', - "triangledown;": '\U000025BF', - "triangleleft;": '\U000025C3', - "trianglelefteq;": '\U000022B4', - "triangleq;": '\U0000225C', - "triangleright;": '\U000025B9', - "trianglerighteq;": '\U000022B5', - "tridot;": '\U000025EC', - "trie;": '\U0000225C', - "triminus;": '\U00002A3A', - "triplus;": '\U00002A39', - "trisb;": '\U000029CD', - "tritime;": '\U00002A3B', - "trpezium;": '\U000023E2', - "tscr;": '\U0001D4C9', - "tscy;": '\U00000446', - "tshcy;": '\U0000045B', - "tstrok;": '\U00000167', - "twixt;": '\U0000226C', - "twoheadleftarrow;": '\U0000219E', - "twoheadrightarrow;": '\U000021A0', - "uArr;": '\U000021D1', - "uHar;": '\U00002963', - "uacute;": '\U000000FA', - "uarr;": '\U00002191', - "ubrcy;": '\U0000045E', - "ubreve;": '\U0000016D', - "ucirc;": '\U000000FB', - "ucy;": '\U00000443', - "udarr;": '\U000021C5', - "udblac;": '\U00000171', - "udhar;": '\U0000296E', - "ufisht;": '\U0000297E', - "ufr;": '\U0001D532', - "ugrave;": '\U000000F9', - "uharl;": '\U000021BF', - "uharr;": '\U000021BE', - "uhblk;": '\U00002580', - "ulcorn;": '\U0000231C', - "ulcorner;": '\U0000231C', - "ulcrop;": '\U0000230F', - "ultri;": '\U000025F8', - "umacr;": '\U0000016B', - "uml;": '\U000000A8', - "uogon;": '\U00000173', - "uopf;": '\U0001D566', - "uparrow;": '\U00002191', - "updownarrow;": '\U00002195', - "upharpoonleft;": '\U000021BF', - "upharpoonright;": '\U000021BE', - "uplus;": '\U0000228E', - "upsi;": '\U000003C5', - "upsih;": '\U000003D2', - "upsilon;": '\U000003C5', - "upuparrows;": '\U000021C8', - "urcorn;": '\U0000231D', - "urcorner;": '\U0000231D', - "urcrop;": '\U0000230E', - "uring;": '\U0000016F', - "urtri;": '\U000025F9', - "uscr;": '\U0001D4CA', - "utdot;": '\U000022F0', - "utilde;": '\U00000169', - "utri;": '\U000025B5', - "utrif;": '\U000025B4', - "uuarr;": '\U000021C8', - "uuml;": '\U000000FC', - "uwangle;": '\U000029A7', - "vArr;": '\U000021D5', - "vBar;": '\U00002AE8', - "vBarv;": '\U00002AE9', - "vDash;": '\U000022A8', - "vangrt;": '\U0000299C', - "varepsilon;": '\U000003F5', - "varkappa;": '\U000003F0', - "varnothing;": '\U00002205', - "varphi;": '\U000003D5', - "varpi;": '\U000003D6', - "varpropto;": '\U0000221D', - "varr;": '\U00002195', - "varrho;": '\U000003F1', - "varsigma;": '\U000003C2', - "vartheta;": '\U000003D1', - "vartriangleleft;": '\U000022B2', - "vartriangleright;": '\U000022B3', - "vcy;": '\U00000432', - "vdash;": '\U000022A2', - "vee;": '\U00002228', - "veebar;": '\U000022BB', - "veeeq;": '\U0000225A', - "vellip;": '\U000022EE', - "verbar;": '\U0000007C', - "vert;": '\U0000007C', - "vfr;": '\U0001D533', - "vltri;": '\U000022B2', - "vopf;": '\U0001D567', - "vprop;": '\U0000221D', - "vrtri;": '\U000022B3', - "vscr;": '\U0001D4CB', - "vzigzag;": '\U0000299A', - "wcirc;": '\U00000175', - "wedbar;": '\U00002A5F', - "wedge;": '\U00002227', - "wedgeq;": '\U00002259', - "weierp;": '\U00002118', - "wfr;": '\U0001D534', - "wopf;": '\U0001D568', - "wp;": '\U00002118', - "wr;": '\U00002240', - "wreath;": '\U00002240', - "wscr;": '\U0001D4CC', - "xcap;": '\U000022C2', - "xcirc;": '\U000025EF', - "xcup;": '\U000022C3', - "xdtri;": '\U000025BD', - "xfr;": '\U0001D535', - "xhArr;": '\U000027FA', - "xharr;": '\U000027F7', - "xi;": '\U000003BE', - "xlArr;": '\U000027F8', - "xlarr;": '\U000027F5', - "xmap;": '\U000027FC', - "xnis;": '\U000022FB', - "xodot;": '\U00002A00', - "xopf;": '\U0001D569', - "xoplus;": '\U00002A01', - "xotime;": '\U00002A02', - "xrArr;": '\U000027F9', - "xrarr;": '\U000027F6', - "xscr;": '\U0001D4CD', - "xsqcup;": '\U00002A06', - "xuplus;": '\U00002A04', - "xutri;": '\U000025B3', - "xvee;": '\U000022C1', - "xwedge;": '\U000022C0', - "yacute;": '\U000000FD', - "yacy;": '\U0000044F', - "ycirc;": '\U00000177', - "ycy;": '\U0000044B', - "yen;": '\U000000A5', - "yfr;": '\U0001D536', - "yicy;": '\U00000457', - "yopf;": '\U0001D56A', - "yscr;": '\U0001D4CE', - "yucy;": '\U0000044E', - "yuml;": '\U000000FF', - "zacute;": '\U0000017A', - "zcaron;": '\U0000017E', - "zcy;": '\U00000437', - "zdot;": '\U0000017C', - "zeetrf;": '\U00002128', - "zeta;": '\U000003B6', - "zfr;": '\U0001D537', - "zhcy;": '\U00000436', - "zigrarr;": '\U000021DD', - "zopf;": '\U0001D56B', - "zscr;": '\U0001D4CF', - "zwj;": '\U0000200D', - "zwnj;": '\U0000200C', - "AElig": '\U000000C6', - "AMP": '\U00000026', - "Aacute": '\U000000C1', - "Acirc": '\U000000C2', - "Agrave": '\U000000C0', - "Aring": '\U000000C5', - "Atilde": '\U000000C3', - "Auml": '\U000000C4', - "COPY": '\U000000A9', - "Ccedil": '\U000000C7', - "ETH": '\U000000D0', - "Eacute": '\U000000C9', - "Ecirc": '\U000000CA', - "Egrave": '\U000000C8', - "Euml": '\U000000CB', - "GT": '\U0000003E', - "Iacute": '\U000000CD', - "Icirc": '\U000000CE', - "Igrave": '\U000000CC', - "Iuml": '\U000000CF', - "LT": '\U0000003C', - "Ntilde": '\U000000D1', - "Oacute": '\U000000D3', - "Ocirc": '\U000000D4', - "Ograve": '\U000000D2', - "Oslash": '\U000000D8', - "Otilde": '\U000000D5', - "Ouml": '\U000000D6', - "QUOT": '\U00000022', - "REG": '\U000000AE', - "THORN": '\U000000DE', - "Uacute": '\U000000DA', - "Ucirc": '\U000000DB', - "Ugrave": '\U000000D9', - "Uuml": '\U000000DC', - "Yacute": '\U000000DD', - "aacute": '\U000000E1', - "acirc": '\U000000E2', - "acute": '\U000000B4', - "aelig": '\U000000E6', - "agrave": '\U000000E0', - "amp": '\U00000026', - "aring": '\U000000E5', - "atilde": '\U000000E3', - "auml": '\U000000E4', - "brvbar": '\U000000A6', - "ccedil": '\U000000E7', - "cedil": '\U000000B8', - "cent": '\U000000A2', - "copy": '\U000000A9', - "curren": '\U000000A4', - "deg": '\U000000B0', - "divide": '\U000000F7', - "eacute": '\U000000E9', - "ecirc": '\U000000EA', - "egrave": '\U000000E8', - "eth": '\U000000F0', - "euml": '\U000000EB', - "frac12": '\U000000BD', - "frac14": '\U000000BC', - "frac34": '\U000000BE', - "gt": '\U0000003E', - "iacute": '\U000000ED', - "icirc": '\U000000EE', - "iexcl": '\U000000A1', - "igrave": '\U000000EC', - "iquest": '\U000000BF', - "iuml": '\U000000EF', - "laquo": '\U000000AB', - "lt": '\U0000003C', - "macr": '\U000000AF', - "micro": '\U000000B5', - "middot": '\U000000B7', - "nbsp": '\U000000A0', - "not": '\U000000AC', - "ntilde": '\U000000F1', - "oacute": '\U000000F3', - "ocirc": '\U000000F4', - "ograve": '\U000000F2', - "ordf": '\U000000AA', - "ordm": '\U000000BA', - "oslash": '\U000000F8', - "otilde": '\U000000F5', - "ouml": '\U000000F6', - "para": '\U000000B6', - "plusmn": '\U000000B1', - "pound": '\U000000A3', - "quot": '\U00000022', - "raquo": '\U000000BB', - "reg": '\U000000AE', - "sect": '\U000000A7', - "shy": '\U000000AD', - "sup1": '\U000000B9', - "sup2": '\U000000B2', - "sup3": '\U000000B3', - "szlig": '\U000000DF', - "thorn": '\U000000FE', - "times": '\U000000D7', - "uacute": '\U000000FA', - "ucirc": '\U000000FB', - "ugrave": '\U000000F9', - "uml": '\U000000A8', - "uuml": '\U000000FC', - "yacute": '\U000000FD', - "yen": '\U000000A5', - "yuml": '\U000000FF', -} - -// HTML entities that are two unicode codepoints. -var entity2 = map[string][2]rune{ - // TODO(nigeltao): Handle replacements that are wider than their names. - // "nLt;": {'\u226A', '\u20D2'}, - // "nGt;": {'\u226B', '\u20D2'}, - "NotEqualTilde;": {'\u2242', '\u0338'}, - "NotGreaterFullEqual;": {'\u2267', '\u0338'}, - "NotGreaterGreater;": {'\u226B', '\u0338'}, - "NotGreaterSlantEqual;": {'\u2A7E', '\u0338'}, - "NotHumpDownHump;": {'\u224E', '\u0338'}, - "NotHumpEqual;": {'\u224F', '\u0338'}, - "NotLeftTriangleBar;": {'\u29CF', '\u0338'}, - "NotLessLess;": {'\u226A', '\u0338'}, - "NotLessSlantEqual;": {'\u2A7D', '\u0338'}, - "NotNestedGreaterGreater;": {'\u2AA2', '\u0338'}, - "NotNestedLessLess;": {'\u2AA1', '\u0338'}, - "NotPrecedesEqual;": {'\u2AAF', '\u0338'}, - "NotRightTriangleBar;": {'\u29D0', '\u0338'}, - "NotSquareSubset;": {'\u228F', '\u0338'}, - "NotSquareSuperset;": {'\u2290', '\u0338'}, - "NotSubset;": {'\u2282', '\u20D2'}, - "NotSucceedsEqual;": {'\u2AB0', '\u0338'}, - "NotSucceedsTilde;": {'\u227F', '\u0338'}, - "NotSuperset;": {'\u2283', '\u20D2'}, - "ThickSpace;": {'\u205F', '\u200A'}, - "acE;": {'\u223E', '\u0333'}, - "bne;": {'\u003D', '\u20E5'}, - "bnequiv;": {'\u2261', '\u20E5'}, - "caps;": {'\u2229', '\uFE00'}, - "cups;": {'\u222A', '\uFE00'}, - "fjlig;": {'\u0066', '\u006A'}, - "gesl;": {'\u22DB', '\uFE00'}, - "gvertneqq;": {'\u2269', '\uFE00'}, - "gvnE;": {'\u2269', '\uFE00'}, - "lates;": {'\u2AAD', '\uFE00'}, - "lesg;": {'\u22DA', '\uFE00'}, - "lvertneqq;": {'\u2268', '\uFE00'}, - "lvnE;": {'\u2268', '\uFE00'}, - "nGg;": {'\u22D9', '\u0338'}, - "nGtv;": {'\u226B', '\u0338'}, - "nLl;": {'\u22D8', '\u0338'}, - "nLtv;": {'\u226A', '\u0338'}, - "nang;": {'\u2220', '\u20D2'}, - "napE;": {'\u2A70', '\u0338'}, - "napid;": {'\u224B', '\u0338'}, - "nbump;": {'\u224E', '\u0338'}, - "nbumpe;": {'\u224F', '\u0338'}, - "ncongdot;": {'\u2A6D', '\u0338'}, - "nedot;": {'\u2250', '\u0338'}, - "nesim;": {'\u2242', '\u0338'}, - "ngE;": {'\u2267', '\u0338'}, - "ngeqq;": {'\u2267', '\u0338'}, - "ngeqslant;": {'\u2A7E', '\u0338'}, - "nges;": {'\u2A7E', '\u0338'}, - "nlE;": {'\u2266', '\u0338'}, - "nleqq;": {'\u2266', '\u0338'}, - "nleqslant;": {'\u2A7D', '\u0338'}, - "nles;": {'\u2A7D', '\u0338'}, - "notinE;": {'\u22F9', '\u0338'}, - "notindot;": {'\u22F5', '\u0338'}, - "nparsl;": {'\u2AFD', '\u20E5'}, - "npart;": {'\u2202', '\u0338'}, - "npre;": {'\u2AAF', '\u0338'}, - "npreceq;": {'\u2AAF', '\u0338'}, - "nrarrc;": {'\u2933', '\u0338'}, - "nrarrw;": {'\u219D', '\u0338'}, - "nsce;": {'\u2AB0', '\u0338'}, - "nsubE;": {'\u2AC5', '\u0338'}, - "nsubset;": {'\u2282', '\u20D2'}, - "nsubseteqq;": {'\u2AC5', '\u0338'}, - "nsucceq;": {'\u2AB0', '\u0338'}, - "nsupE;": {'\u2AC6', '\u0338'}, - "nsupset;": {'\u2283', '\u20D2'}, - "nsupseteqq;": {'\u2AC6', '\u0338'}, - "nvap;": {'\u224D', '\u20D2'}, - "nvge;": {'\u2265', '\u20D2'}, - "nvgt;": {'\u003E', '\u20D2'}, - "nvle;": {'\u2264', '\u20D2'}, - "nvlt;": {'\u003C', '\u20D2'}, - "nvltrie;": {'\u22B4', '\u20D2'}, - "nvrtrie;": {'\u22B5', '\u20D2'}, - "nvsim;": {'\u223C', '\u20D2'}, - "race;": {'\u223D', '\u0331'}, - "smtes;": {'\u2AAC', '\uFE00'}, - "sqcaps;": {'\u2293', '\uFE00'}, - "sqcups;": {'\u2294', '\uFE00'}, - "varsubsetneq;": {'\u228A', '\uFE00'}, - "varsubsetneqq;": {'\u2ACB', '\uFE00'}, - "varsupsetneq;": {'\u228B', '\uFE00'}, - "varsupsetneqq;": {'\u2ACC', '\uFE00'}, - "vnsub;": {'\u2282', '\u20D2'}, - "vnsup;": {'\u2283', '\u20D2'}, - "vsubnE;": {'\u2ACB', '\uFE00'}, - "vsubne;": {'\u228A', '\uFE00'}, - "vsupnE;": {'\u2ACC', '\uFE00'}, - "vsupne;": {'\u228B', '\uFE00'}, -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/entity_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/entity_test.go deleted file mode 100644 index b53f866f..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/entity_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "testing" - "unicode/utf8" -) - -func TestEntityLength(t *testing.T) { - // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). - // The +1 comes from the leading "&". This property implies that the length of - // unescaped text is <= the length of escaped text. - for k, v := range entity { - if 1+len(k) < utf8.RuneLen(v) { - t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) - } - if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { - t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) - } - } - for k, v := range entity2 { - if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { - t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) - } - } -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/escape.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/escape.go deleted file mode 100644 index d8561396..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/escape.go +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "strings" - "unicode/utf8" -) - -// These replacements permit compatibility with old numeric entities that -// assumed Windows-1252 encoding. -// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference -var replacementTable = [...]rune{ - '\u20AC', // First entry is what 0x80 should be replaced with. - '\u0081', - '\u201A', - '\u0192', - '\u201E', - '\u2026', - '\u2020', - '\u2021', - '\u02C6', - '\u2030', - '\u0160', - '\u2039', - '\u0152', - '\u008D', - '\u017D', - '\u008F', - '\u0090', - '\u2018', - '\u2019', - '\u201C', - '\u201D', - '\u2022', - '\u2013', - '\u2014', - '\u02DC', - '\u2122', - '\u0161', - '\u203A', - '\u0153', - '\u009D', - '\u017E', - '\u0178', // Last entry is 0x9F. - // 0x00->'\uFFFD' is handled programmatically. - // 0x0D->'\u000D' is a no-op. -} - -// unescapeEntity reads an entity like "<" from b[src:] and writes the -// corresponding "<" to b[dst:], returning the incremented dst and src cursors. -// Precondition: b[src] == '&' && dst <= src. -// attribute should be true if parsing an attribute value. -func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { - // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference - - // i starts at 1 because we already know that s[0] == '&'. - i, s := 1, b[src:] - - if len(s) <= 1 { - b[dst] = b[src] - return dst + 1, src + 1 - } - - if s[i] == '#' { - if len(s) <= 3 { // We need to have at least "&#.". - b[dst] = b[src] - return dst + 1, src + 1 - } - i++ - c := s[i] - hex := false - if c == 'x' || c == 'X' { - hex = true - i++ - } - - x := '\x00' - for i < len(s) { - c = s[i] - i++ - if hex { - if '0' <= c && c <= '9' { - x = 16*x + rune(c) - '0' - continue - } else if 'a' <= c && c <= 'f' { - x = 16*x + rune(c) - 'a' + 10 - continue - } else if 'A' <= c && c <= 'F' { - x = 16*x + rune(c) - 'A' + 10 - continue - } - } else if '0' <= c && c <= '9' { - x = 10*x + rune(c) - '0' - continue - } - if c != ';' { - i-- - } - break - } - - if i <= 3 { // No characters matched. - b[dst] = b[src] - return dst + 1, src + 1 - } - - if 0x80 <= x && x <= 0x9F { - // Replace characters from Windows-1252 with UTF-8 equivalents. - x = replacementTable[x-0x80] - } else if x == 0 || (0xD800 <= x && x <= 0xDFFF) || x > 0x10FFFF { - // Replace invalid characters with the replacement character. - x = '\uFFFD' - } - - return dst + utf8.EncodeRune(b[dst:], x), src + i - } - - // Consume the maximum number of characters possible, with the - // consumed characters matching one of the named references. - - for i < len(s) { - c := s[i] - i++ - // Lower-cased characters are more common in entities, so we check for them first. - if 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' || '0' <= c && c <= '9' { - continue - } - if c != ';' { - i-- - } - break - } - - entityName := string(s[1:i]) - if entityName == "" { - // No-op. - } else if attribute && entityName[len(entityName)-1] != ';' && len(s) > i && s[i] == '=' { - // No-op. - } else if x := entity[entityName]; x != 0 { - return dst + utf8.EncodeRune(b[dst:], x), src + i - } else if x := entity2[entityName]; x[0] != 0 { - dst1 := dst + utf8.EncodeRune(b[dst:], x[0]) - return dst1 + utf8.EncodeRune(b[dst1:], x[1]), src + i - } else if !attribute { - maxLen := len(entityName) - 1 - if maxLen > longestEntityWithoutSemicolon { - maxLen = longestEntityWithoutSemicolon - } - for j := maxLen; j > 1; j-- { - if x := entity[entityName[:j]]; x != 0 { - return dst + utf8.EncodeRune(b[dst:], x), src + j + 1 - } - } - } - - dst1, src1 = dst+i, src+i - copy(b[dst:dst1], b[src:src1]) - return dst1, src1 -} - -// unescape unescapes b's entities in-place, so that "a<b" becomes "a': - esc = ">" - case '"': - // """ is shorter than """. - esc = """ - case '\r': - esc = " " - default: - panic("unrecognized escape character") - } - s = s[i+1:] - if _, err := w.WriteString(esc); err != nil { - return err - } - i = strings.IndexAny(s, escapedChars) - } - _, err := w.WriteString(s) - return err -} - -// EscapeString escapes special characters like "<" to become "<". It -// escapes only five such characters: <, >, &, ' and ". -// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't -// always true. -func EscapeString(s string) string { - if strings.IndexAny(s, escapedChars) == -1 { - return s - } - var buf bytes.Buffer - escape(&buf, s) - return buf.String() -} - -// UnescapeString unescapes entities like "<" to become "<". It unescapes a -// larger range of entities than EscapeString escapes. For example, "á" -// unescapes to "á", as does "á" and "&xE1;". -// UnescapeString(EscapeString(s)) == s always holds, but the converse isn't -// always true. -func UnescapeString(s string) string { - for _, c := range s { - if c == '&' { - return string(unescape([]byte(s), false)) - } - } - return s -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/escape_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/escape_test.go deleted file mode 100644 index b405d4b4..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/escape_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import "testing" - -type unescapeTest struct { - // A short description of the test case. - desc string - // The HTML text. - html string - // The unescaped text. - unescaped string -} - -var unescapeTests = []unescapeTest{ - // Handle no entities. - { - "copy", - "A\ttext\nstring", - "A\ttext\nstring", - }, - // Handle simple named entities. - { - "simple", - "& > <", - "& > <", - }, - // Handle hitting the end of the string. - { - "stringEnd", - "& &", - "& &", - }, - // Handle entities with two codepoints. - { - "multiCodepoint", - "text ⋛︀ blah", - "text \u22db\ufe00 blah", - }, - // Handle decimal numeric entities. - { - "decimalEntity", - "Delta = Δ ", - "Delta = Δ ", - }, - // Handle hexadecimal numeric entities. - { - "hexadecimalEntity", - "Lambda = λ = λ ", - "Lambda = λ = λ ", - }, - // Handle numeric early termination. - { - "numericEnds", - "&# &#x €43 © = ©f = ©", - "&# &#x €43 © = ©f = ©", - }, - // Handle numeric ISO-8859-1 entity replacements. - { - "numericReplacements", - "Footnote‡", - "Footnote‡", - }, -} - -func TestUnescape(t *testing.T) { - for _, tt := range unescapeTests { - unescaped := UnescapeString(tt.html) - if unescaped != tt.unescaped { - t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) - } - } -} - -func TestUnescapeEscape(t *testing.T) { - ss := []string{ - ``, - `abc def`, - `a & b`, - `a&b`, - `a & b`, - `"`, - `"`, - `"<&>"`, - `"<&>"`, - `3&5==1 && 0<1, "0<1", a+acute=á`, - `The special characters are: <, >, &, ' and "`, - } - for _, s := range ss { - if got := UnescapeString(EscapeString(s)); got != s { - t.Errorf("got %q want %q", got, s) - } - } -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/example_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/example_test.go deleted file mode 100644 index 0b06ed77..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/example_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This example demonstrates parsing HTML data and walking the resulting tree. -package html_test - -import ( - "fmt" - "log" - "strings" - - "golang.org/x/net/html" -) - -func ExampleParse() { - s := `

    Links:

    ` - doc, err := html.Parse(strings.NewReader(s)) - if err != nil { - log.Fatal(err) - } - var f func(*html.Node) - f = func(n *html.Node) { - if n.Type == html.ElementNode && n.Data == "a" { - for _, a := range n.Attr { - if a.Key == "href" { - fmt.Println(a.Val) - break - } - } - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - f(c) - } - } - f(doc) - // Output: - // foo - // /bar/baz -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/foreign.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/foreign.go deleted file mode 100644 index d3b38440..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/foreign.go +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "strings" -) - -func adjustAttributeNames(aa []Attribute, nameMap map[string]string) { - for i := range aa { - if newName, ok := nameMap[aa[i].Key]; ok { - aa[i].Key = newName - } - } -} - -func adjustForeignAttributes(aa []Attribute) { - for i, a := range aa { - if a.Key == "" || a.Key[0] != 'x' { - continue - } - switch a.Key { - case "xlink:actuate", "xlink:arcrole", "xlink:href", "xlink:role", "xlink:show", - "xlink:title", "xlink:type", "xml:base", "xml:lang", "xml:space", "xmlns:xlink": - j := strings.Index(a.Key, ":") - aa[i].Namespace = a.Key[:j] - aa[i].Key = a.Key[j+1:] - } - } -} - -func htmlIntegrationPoint(n *Node) bool { - if n.Type != ElementNode { - return false - } - switch n.Namespace { - case "math": - if n.Data == "annotation-xml" { - for _, a := range n.Attr { - if a.Key == "encoding" { - val := strings.ToLower(a.Val) - if val == "text/html" || val == "application/xhtml+xml" { - return true - } - } - } - } - case "svg": - switch n.Data { - case "desc", "foreignObject", "title": - return true - } - } - return false -} - -func mathMLTextIntegrationPoint(n *Node) bool { - if n.Namespace != "math" { - return false - } - switch n.Data { - case "mi", "mo", "mn", "ms", "mtext": - return true - } - return false -} - -// Section 12.2.5.5. -var breakout = map[string]bool{ - "b": true, - "big": true, - "blockquote": true, - "body": true, - "br": true, - "center": true, - "code": true, - "dd": true, - "div": true, - "dl": true, - "dt": true, - "em": true, - "embed": true, - "h1": true, - "h2": true, - "h3": true, - "h4": true, - "h5": true, - "h6": true, - "head": true, - "hr": true, - "i": true, - "img": true, - "li": true, - "listing": true, - "menu": true, - "meta": true, - "nobr": true, - "ol": true, - "p": true, - "pre": true, - "ruby": true, - "s": true, - "small": true, - "span": true, - "strong": true, - "strike": true, - "sub": true, - "sup": true, - "table": true, - "tt": true, - "u": true, - "ul": true, - "var": true, -} - -// Section 12.2.5.5. -var svgTagNameAdjustments = map[string]string{ - "altglyph": "altGlyph", - "altglyphdef": "altGlyphDef", - "altglyphitem": "altGlyphItem", - "animatecolor": "animateColor", - "animatemotion": "animateMotion", - "animatetransform": "animateTransform", - "clippath": "clipPath", - "feblend": "feBlend", - "fecolormatrix": "feColorMatrix", - "fecomponenttransfer": "feComponentTransfer", - "fecomposite": "feComposite", - "feconvolvematrix": "feConvolveMatrix", - "fediffuselighting": "feDiffuseLighting", - "fedisplacementmap": "feDisplacementMap", - "fedistantlight": "feDistantLight", - "feflood": "feFlood", - "fefunca": "feFuncA", - "fefuncb": "feFuncB", - "fefuncg": "feFuncG", - "fefuncr": "feFuncR", - "fegaussianblur": "feGaussianBlur", - "feimage": "feImage", - "femerge": "feMerge", - "femergenode": "feMergeNode", - "femorphology": "feMorphology", - "feoffset": "feOffset", - "fepointlight": "fePointLight", - "fespecularlighting": "feSpecularLighting", - "fespotlight": "feSpotLight", - "fetile": "feTile", - "feturbulence": "feTurbulence", - "foreignobject": "foreignObject", - "glyphref": "glyphRef", - "lineargradient": "linearGradient", - "radialgradient": "radialGradient", - "textpath": "textPath", -} - -// Section 12.2.5.1 -var mathMLAttributeAdjustments = map[string]string{ - "definitionurl": "definitionURL", -} - -var svgAttributeAdjustments = map[string]string{ - "attributename": "attributeName", - "attributetype": "attributeType", - "basefrequency": "baseFrequency", - "baseprofile": "baseProfile", - "calcmode": "calcMode", - "clippathunits": "clipPathUnits", - "contentscripttype": "contentScriptType", - "contentstyletype": "contentStyleType", - "diffuseconstant": "diffuseConstant", - "edgemode": "edgeMode", - "externalresourcesrequired": "externalResourcesRequired", - "filterres": "filterRes", - "filterunits": "filterUnits", - "glyphref": "glyphRef", - "gradienttransform": "gradientTransform", - "gradientunits": "gradientUnits", - "kernelmatrix": "kernelMatrix", - "kernelunitlength": "kernelUnitLength", - "keypoints": "keyPoints", - "keysplines": "keySplines", - "keytimes": "keyTimes", - "lengthadjust": "lengthAdjust", - "limitingconeangle": "limitingConeAngle", - "markerheight": "markerHeight", - "markerunits": "markerUnits", - "markerwidth": "markerWidth", - "maskcontentunits": "maskContentUnits", - "maskunits": "maskUnits", - "numoctaves": "numOctaves", - "pathlength": "pathLength", - "patterncontentunits": "patternContentUnits", - "patterntransform": "patternTransform", - "patternunits": "patternUnits", - "pointsatx": "pointsAtX", - "pointsaty": "pointsAtY", - "pointsatz": "pointsAtZ", - "preservealpha": "preserveAlpha", - "preserveaspectratio": "preserveAspectRatio", - "primitiveunits": "primitiveUnits", - "refx": "refX", - "refy": "refY", - "repeatcount": "repeatCount", - "repeatdur": "repeatDur", - "requiredextensions": "requiredExtensions", - "requiredfeatures": "requiredFeatures", - "specularconstant": "specularConstant", - "specularexponent": "specularExponent", - "spreadmethod": "spreadMethod", - "startoffset": "startOffset", - "stddeviation": "stdDeviation", - "stitchtiles": "stitchTiles", - "surfacescale": "surfaceScale", - "systemlanguage": "systemLanguage", - "tablevalues": "tableValues", - "targetx": "targetX", - "targety": "targetY", - "textlength": "textLength", - "viewbox": "viewBox", - "viewtarget": "viewTarget", - "xchannelselector": "xChannelSelector", - "ychannelselector": "yChannelSelector", - "zoomandpan": "zoomAndPan", -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/node.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/node.go deleted file mode 100644 index 26b657ae..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/node.go +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "golang.org/x/net/html/atom" -) - -// A NodeType is the type of a Node. -type NodeType uint32 - -const ( - ErrorNode NodeType = iota - TextNode - DocumentNode - ElementNode - CommentNode - DoctypeNode - scopeMarkerNode -) - -// Section 12.2.3.3 says "scope markers are inserted when entering applet -// elements, buttons, object elements, marquees, table cells, and table -// captions, and are used to prevent formatting from 'leaking'". -var scopeMarker = Node{Type: scopeMarkerNode} - -// A Node consists of a NodeType and some Data (tag name for element nodes, -// content for text) and are part of a tree of Nodes. Element nodes may also -// have a Namespace and contain a slice of Attributes. Data is unescaped, so -// that it looks like "a 0 { - return (*s)[i-1] - } - return nil -} - -// index returns the index of the top-most occurrence of n in the stack, or -1 -// if n is not present. -func (s *nodeStack) index(n *Node) int { - for i := len(*s) - 1; i >= 0; i-- { - if (*s)[i] == n { - return i - } - } - return -1 -} - -// insert inserts a node at the given index. -func (s *nodeStack) insert(i int, n *Node) { - (*s) = append(*s, nil) - copy((*s)[i+1:], (*s)[i:]) - (*s)[i] = n -} - -// remove removes a node from the stack. It is a no-op if n is not present. -func (s *nodeStack) remove(n *Node) { - i := s.index(n) - if i == -1 { - return - } - copy((*s)[i:], (*s)[i+1:]) - j := len(*s) - 1 - (*s)[j] = nil - *s = (*s)[:j] -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/node_test.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/node_test.go deleted file mode 100644 index 471102f3..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/node_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "fmt" -) - -// checkTreeConsistency checks that a node and its descendants are all -// consistent in their parent/child/sibling relationships. -func checkTreeConsistency(n *Node) error { - return checkTreeConsistency1(n, 0) -} - -func checkTreeConsistency1(n *Node, depth int) error { - if depth == 1e4 { - return fmt.Errorf("html: tree looks like it contains a cycle") - } - if err := checkNodeConsistency(n); err != nil { - return err - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - if err := checkTreeConsistency1(c, depth+1); err != nil { - return err - } - } - return nil -} - -// checkNodeConsistency checks that a node's parent/child/sibling relationships -// are consistent. -func checkNodeConsistency(n *Node) error { - if n == nil { - return nil - } - - nParent := 0 - for p := n.Parent; p != nil; p = p.Parent { - nParent++ - if nParent == 1e4 { - return fmt.Errorf("html: parent list looks like an infinite loop") - } - } - - nForward := 0 - for c := n.FirstChild; c != nil; c = c.NextSibling { - nForward++ - if nForward == 1e6 { - return fmt.Errorf("html: forward list of children looks like an infinite loop") - } - if c.Parent != n { - return fmt.Errorf("html: inconsistent child/parent relationship") - } - } - - nBackward := 0 - for c := n.LastChild; c != nil; c = c.PrevSibling { - nBackward++ - if nBackward == 1e6 { - return fmt.Errorf("html: backward list of children looks like an infinite loop") - } - if c.Parent != n { - return fmt.Errorf("html: inconsistent child/parent relationship") - } - } - - if n.Parent != nil { - if n.Parent == n { - return fmt.Errorf("html: inconsistent parent relationship") - } - if n.Parent == n.FirstChild { - return fmt.Errorf("html: inconsistent parent/first relationship") - } - if n.Parent == n.LastChild { - return fmt.Errorf("html: inconsistent parent/last relationship") - } - if n.Parent == n.PrevSibling { - return fmt.Errorf("html: inconsistent parent/prev relationship") - } - if n.Parent == n.NextSibling { - return fmt.Errorf("html: inconsistent parent/next relationship") - } - - parentHasNAsAChild := false - for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { - if c == n { - parentHasNAsAChild = true - break - } - } - if !parentHasNAsAChild { - return fmt.Errorf("html: inconsistent parent/child relationship") - } - } - - if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { - return fmt.Errorf("html: inconsistent prev/next relationship") - } - if n.NextSibling != nil && n.NextSibling.PrevSibling != n { - return fmt.Errorf("html: inconsistent next/prev relationship") - } - - if (n.FirstChild == nil) != (n.LastChild == nil) { - return fmt.Errorf("html: inconsistent first/last relationship") - } - if n.FirstChild != nil && n.FirstChild == n.LastChild { - // We have a sole child. - if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { - return fmt.Errorf("html: inconsistent sole child's sibling relationship") - } - } - - seen := map[*Node]bool{} - - var last *Node - for c := n.FirstChild; c != nil; c = c.NextSibling { - if seen[c] { - return fmt.Errorf("html: inconsistent repeated child") - } - seen[c] = true - last = c - } - if last != n.LastChild { - return fmt.Errorf("html: inconsistent last relationship") - } - - var first *Node - for c := n.LastChild; c != nil; c = c.PrevSibling { - if !seen[c] { - return fmt.Errorf("html: inconsistent missing child") - } - delete(seen, c) - first = c - } - if first != n.FirstChild { - return fmt.Errorf("html: inconsistent first relationship") - } - - if len(seen) != 0 { - return fmt.Errorf("html: inconsistent forwards/backwards child list") - } - - return nil -} diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/parse.go b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/parse.go deleted file mode 100644 index be4b2bf5..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/parse.go +++ /dev/null @@ -1,2094 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "errors" - "fmt" - "io" - "strings" - - a "golang.org/x/net/html/atom" -) - -// A parser implements the HTML5 parsing algorithm: -// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction -type parser struct { - // tokenizer provides the tokens for the parser. - tokenizer *Tokenizer - // tok is the most recently read token. - tok Token - // Self-closing tags like
    are treated as start tags, except that - // hasSelfClosingToken is set while they are being processed. - hasSelfClosingToken bool - // doc is the document root element. - doc *Node - // The stack of open elements (section 12.2.3.2) and active formatting - // elements (section 12.2.3.3). - oe, afe nodeStack - // Element pointers (section 12.2.3.4). - head, form *Node - // Other parsing state flags (section 12.2.3.5). - scripting, framesetOK bool - // im is the current insertion mode. - im insertionMode - // originalIM is the insertion mode to go back to after completing a text - // or inTableText insertion mode. - originalIM insertionMode - // fosterParenting is whether new elements should be inserted according to - // the foster parenting rules (section 12.2.5.3). - fosterParenting bool - // quirks is whether the parser is operating in "quirks mode." - quirks bool - // fragment is whether the parser is parsing an HTML fragment. - fragment bool - // context is the context element when parsing an HTML fragment - // (section 12.4). - context *Node -} - -func (p *parser) top() *Node { - if n := p.oe.top(); n != nil { - return n - } - return p.doc -} - -// Stop tags for use in popUntil. These come from section 12.2.3.2. -var ( - defaultScopeStopTags = map[string][]a.Atom{ - "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, - "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, - "svg": {a.Desc, a.ForeignObject, a.Title}, - } -) - -type scope int - -const ( - defaultScope scope = iota - listItemScope - buttonScope - tableScope - tableRowScope - tableBodyScope - selectScope -) - -// popUntil pops the stack of open elements at the highest element whose tag -// is in matchTags, provided there is no higher element in the scope's stop -// tags (as defined in section 12.2.3.2). It returns whether or not there was -// such an element. If there was not, popUntil leaves the stack unchanged. -// -// For example, the set of stop tags for table scope is: "html", "table". If -// the stack was: -// ["html", "body", "font", "table", "b", "i", "u"] -// then popUntil(tableScope, "font") would return false, but -// popUntil(tableScope, "i") would return true and the stack would become: -// ["html", "body", "font", "table", "b"] -// -// If an element's tag is in both the stop tags and matchTags, then the stack -// will be popped and the function returns true (provided, of course, there was -// no higher element in the stack that was also in the stop tags). For example, -// popUntil(tableScope, "table") returns true and leaves: -// ["html", "body", "font"] -func (p *parser) popUntil(s scope, matchTags ...a.Atom) bool { - if i := p.indexOfElementInScope(s, matchTags...); i != -1 { - p.oe = p.oe[:i] - return true - } - return false -} - -// indexOfElementInScope returns the index in p.oe of the highest element whose -// tag is in matchTags that is in scope. If no matching element is in scope, it -// returns -1. -func (p *parser) indexOfElementInScope(s scope, matchTags ...a.Atom) int { - for i := len(p.oe) - 1; i >= 0; i-- { - tagAtom := p.oe[i].DataAtom - if p.oe[i].Namespace == "" { - for _, t := range matchTags { - if t == tagAtom { - return i - } - } - switch s { - case defaultScope: - // No-op. - case listItemScope: - if tagAtom == a.Ol || tagAtom == a.Ul { - return -1 - } - case buttonScope: - if tagAtom == a.Button { - return -1 - } - case tableScope: - if tagAtom == a.Html || tagAtom == a.Table { - return -1 - } - case selectScope: - if tagAtom != a.Optgroup && tagAtom != a.Option { - return -1 - } - default: - panic("unreachable") - } - } - switch s { - case defaultScope, listItemScope, buttonScope: - for _, t := range defaultScopeStopTags[p.oe[i].Namespace] { - if t == tagAtom { - return -1 - } - } - } - } - return -1 -} - -// elementInScope is like popUntil, except that it doesn't modify the stack of -// open elements. -func (p *parser) elementInScope(s scope, matchTags ...a.Atom) bool { - return p.indexOfElementInScope(s, matchTags...) != -1 -} - -// clearStackToContext pops elements off the stack of open elements until a -// scope-defined element is found. -func (p *parser) clearStackToContext(s scope) { - for i := len(p.oe) - 1; i >= 0; i-- { - tagAtom := p.oe[i].DataAtom - switch s { - case tableScope: - if tagAtom == a.Html || tagAtom == a.Table { - p.oe = p.oe[:i+1] - return - } - case tableRowScope: - if tagAtom == a.Html || tagAtom == a.Tr { - p.oe = p.oe[:i+1] - return - } - case tableBodyScope: - if tagAtom == a.Html || tagAtom == a.Tbody || tagAtom == a.Tfoot || tagAtom == a.Thead { - p.oe = p.oe[:i+1] - return - } - default: - panic("unreachable") - } - } -} - -// generateImpliedEndTags pops nodes off the stack of open elements as long as -// the top node has a tag name of dd, dt, li, option, optgroup, p, rp, or rt. -// If exceptions are specified, nodes with that name will not be popped off. -func (p *parser) generateImpliedEndTags(exceptions ...string) { - var i int -loop: - for i = len(p.oe) - 1; i >= 0; i-- { - n := p.oe[i] - if n.Type == ElementNode { - switch n.DataAtom { - case a.Dd, a.Dt, a.Li, a.Option, a.Optgroup, a.P, a.Rp, a.Rt: - for _, except := range exceptions { - if n.Data == except { - break loop - } - } - continue - } - } - break - } - - p.oe = p.oe[:i+1] -} - -// addChild adds a child node n to the top element, and pushes n onto the stack -// of open elements if it is an element node. -func (p *parser) addChild(n *Node) { - if p.shouldFosterParent() { - p.fosterParent(n) - } else { - p.top().AppendChild(n) - } - - if n.Type == ElementNode { - p.oe = append(p.oe, n) - } -} - -// shouldFosterParent returns whether the next node to be added should be -// foster parented. -func (p *parser) shouldFosterParent() bool { - if p.fosterParenting { - switch p.top().DataAtom { - case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr: - return true - } - } - return false -} - -// fosterParent adds a child node according to the foster parenting rules. -// Section 12.2.5.3, "foster parenting". -func (p *parser) fosterParent(n *Node) { - var table, parent, prev *Node - var i int - for i = len(p.oe) - 1; i >= 0; i-- { - if p.oe[i].DataAtom == a.Table { - table = p.oe[i] - break - } - } - - if table == nil { - // The foster parent is the html element. - parent = p.oe[0] - } else { - parent = table.Parent - } - if parent == nil { - parent = p.oe[i-1] - } - - if table != nil { - prev = table.PrevSibling - } else { - prev = parent.LastChild - } - if prev != nil && prev.Type == TextNode && n.Type == TextNode { - prev.Data += n.Data - return - } - - parent.InsertBefore(n, table) -} - -// addText adds text to the preceding node if it is a text node, or else it -// calls addChild with a new text node. -func (p *parser) addText(text string) { - if text == "" { - return - } - - if p.shouldFosterParent() { - p.fosterParent(&Node{ - Type: TextNode, - Data: text, - }) - return - } - - t := p.top() - if n := t.LastChild; n != nil && n.Type == TextNode { - n.Data += text - return - } - p.addChild(&Node{ - Type: TextNode, - Data: text, - }) -} - -// addElement adds a child element based on the current token. -func (p *parser) addElement() { - p.addChild(&Node{ - Type: ElementNode, - DataAtom: p.tok.DataAtom, - Data: p.tok.Data, - Attr: p.tok.Attr, - }) -} - -// Section 12.2.3.3. -func (p *parser) addFormattingElement() { - tagAtom, attr := p.tok.DataAtom, p.tok.Attr - p.addElement() - - // Implement the Noah's Ark clause, but with three per family instead of two. - identicalElements := 0 -findIdenticalElements: - for i := len(p.afe) - 1; i >= 0; i-- { - n := p.afe[i] - if n.Type == scopeMarkerNode { - break - } - if n.Type != ElementNode { - continue - } - if n.Namespace != "" { - continue - } - if n.DataAtom != tagAtom { - continue - } - if len(n.Attr) != len(attr) { - continue - } - compareAttributes: - for _, t0 := range n.Attr { - for _, t1 := range attr { - if t0.Key == t1.Key && t0.Namespace == t1.Namespace && t0.Val == t1.Val { - // Found a match for this attribute, continue with the next attribute. - continue compareAttributes - } - } - // If we get here, there is no attribute that matches a. - // Therefore the element is not identical to the new one. - continue findIdenticalElements - } - - identicalElements++ - if identicalElements >= 3 { - p.afe.remove(n) - } - } - - p.afe = append(p.afe, p.top()) -} - -// Section 12.2.3.3. -func (p *parser) clearActiveFormattingElements() { - for { - n := p.afe.pop() - if len(p.afe) == 0 || n.Type == scopeMarkerNode { - return - } - } -} - -// Section 12.2.3.3. -func (p *parser) reconstructActiveFormattingElements() { - n := p.afe.top() - if n == nil { - return - } - if n.Type == scopeMarkerNode || p.oe.index(n) != -1 { - return - } - i := len(p.afe) - 1 - for n.Type != scopeMarkerNode && p.oe.index(n) == -1 { - if i == 0 { - i = -1 - break - } - i-- - n = p.afe[i] - } - for { - i++ - clone := p.afe[i].clone() - p.addChild(clone) - p.afe[i] = clone - if i == len(p.afe)-1 { - break - } - } -} - -// Section 12.2.4. -func (p *parser) acknowledgeSelfClosingTag() { - p.hasSelfClosingToken = false -} - -// An insertion mode (section 12.2.3.1) is the state transition function from -// a particular state in the HTML5 parser's state machine. It updates the -// parser's fields depending on parser.tok (where ErrorToken means EOF). -// It returns whether the token was consumed. -type insertionMode func(*parser) bool - -// setOriginalIM sets the insertion mode to return to after completing a text or -// inTableText insertion mode. -// Section 12.2.3.1, "using the rules for". -func (p *parser) setOriginalIM() { - if p.originalIM != nil { - panic("html: bad parser state: originalIM was set twice") - } - p.originalIM = p.im -} - -// Section 12.2.3.1, "reset the insertion mode". -func (p *parser) resetInsertionMode() { - for i := len(p.oe) - 1; i >= 0; i-- { - n := p.oe[i] - if i == 0 && p.context != nil { - n = p.context - } - - switch n.DataAtom { - case a.Select: - p.im = inSelectIM - case a.Td, a.Th: - p.im = inCellIM - case a.Tr: - p.im = inRowIM - case a.Tbody, a.Thead, a.Tfoot: - p.im = inTableBodyIM - case a.Caption: - p.im = inCaptionIM - case a.Colgroup: - p.im = inColumnGroupIM - case a.Table: - p.im = inTableIM - case a.Head: - p.im = inBodyIM - case a.Body: - p.im = inBodyIM - case a.Frameset: - p.im = inFramesetIM - case a.Html: - p.im = beforeHeadIM - default: - continue - } - return - } - p.im = inBodyIM -} - -const whitespace = " \t\r\n\f" - -// Section 12.2.5.4.1. -func initialIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case CommentToken: - p.doc.AppendChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - n, quirks := parseDoctype(p.tok.Data) - p.doc.AppendChild(n) - p.quirks = quirks - p.im = beforeHTMLIM - return true - } - p.quirks = true - p.im = beforeHTMLIM - return false -} - -// Section 12.2.5.4.2. -func beforeHTMLIM(p *parser) bool { - switch p.tok.Type { - case DoctypeToken: - // Ignore the token. - return true - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case StartTagToken: - if p.tok.DataAtom == a.Html { - p.addElement() - p.im = beforeHeadIM - return true - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Head, a.Body, a.Html, a.Br: - p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) - return false - default: - // Ignore the token. - return true - } - case CommentToken: - p.doc.AppendChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - } - p.parseImpliedToken(StartTagToken, a.Html, a.Html.String()) - return false -} - -// Section 12.2.5.4.3. -func beforeHeadIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - p.tok.Data = strings.TrimLeft(p.tok.Data, whitespace) - if len(p.tok.Data) == 0 { - // It was all whitespace, so ignore it. - return true - } - case StartTagToken: - switch p.tok.DataAtom { - case a.Head: - p.addElement() - p.head = p.top() - p.im = inHeadIM - return true - case a.Html: - return inBodyIM(p) - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Head, a.Body, a.Html, a.Br: - p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) - return false - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - } - - p.parseImpliedToken(StartTagToken, a.Head, a.Head.String()) - return false -} - -// Section 12.2.5.4.4. -func inHeadIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - s := strings.TrimLeft(p.tok.Data, whitespace) - if len(s) < len(p.tok.Data) { - // Add the initial whitespace to the current node. - p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) - if s == "" { - return true - } - p.tok.Data = s - } - case StartTagToken: - switch p.tok.DataAtom { - case a.Html: - return inBodyIM(p) - case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta: - p.addElement() - p.oe.pop() - p.acknowledgeSelfClosingTag() - return true - case a.Script, a.Title, a.Noscript, a.Noframes, a.Style: - p.addElement() - p.setOriginalIM() - p.im = textIM - return true - case a.Head: - // Ignore the token. - return true - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Head: - n := p.oe.pop() - if n.DataAtom != a.Head { - panic("html: bad parser state: element not found, in the in-head insertion mode") - } - p.im = afterHeadIM - return true - case a.Body, a.Html, a.Br: - p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) - return false - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - } - - p.parseImpliedToken(EndTagToken, a.Head, a.Head.String()) - return false -} - -// Section 12.2.5.4.6. -func afterHeadIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - s := strings.TrimLeft(p.tok.Data, whitespace) - if len(s) < len(p.tok.Data) { - // Add the initial whitespace to the current node. - p.addText(p.tok.Data[:len(p.tok.Data)-len(s)]) - if s == "" { - return true - } - p.tok.Data = s - } - case StartTagToken: - switch p.tok.DataAtom { - case a.Html: - return inBodyIM(p) - case a.Body: - p.addElement() - p.framesetOK = false - p.im = inBodyIM - return true - case a.Frameset: - p.addElement() - p.im = inFramesetIM - return true - case a.Base, a.Basefont, a.Bgsound, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title: - p.oe = append(p.oe, p.head) - defer p.oe.remove(p.head) - return inHeadIM(p) - case a.Head: - // Ignore the token. - return true - } - case EndTagToken: - switch p.tok.DataAtom { - case a.Body, a.Html, a.Br: - // Drop down to creating an implied tag. - default: - // Ignore the token. - return true - } - case CommentToken: - p.addChild(&Node{ - Type: CommentNode, - Data: p.tok.Data, - }) - return true - case DoctypeToken: - // Ignore the token. - return true - } - - p.parseImpliedToken(StartTagToken, a.Body, a.Body.String()) - p.framesetOK = true - return false -} - -// copyAttributes copies attributes of src not found on dst to dst. -func copyAttributes(dst *Node, src Token) { - if len(src.Attr) == 0 { - return - } - attr := map[string]string{} - for _, t := range dst.Attr { - attr[t.Key] = t.Val - } - for _, t := range src.Attr { - if _, ok := attr[t.Key]; !ok { - dst.Attr = append(dst.Attr, t) - attr[t.Key] = t.Val - } - } -} - -// Section 12.2.5.4.7. -func inBodyIM(p *parser) bool { - switch p.tok.Type { - case TextToken: - d := p.tok.Data - switch n := p.oe.top(); n.DataAtom { - case a.Pre, a.Listing: - if n.FirstChild == nil { - // Ignore a newline at the start of a
     block.
    -				if d != "" && d[0] == '\r' {
    -					d = d[1:]
    -				}
    -				if d != "" && d[0] == '\n' {
    -					d = d[1:]
    -				}
    -			}
    -		}
    -		d = strings.Replace(d, "\x00", "", -1)
    -		if d == "" {
    -			return true
    -		}
    -		p.reconstructActiveFormattingElements()
    -		p.addText(d)
    -		if p.framesetOK && strings.TrimLeft(d, whitespace) != "" {
    -			// There were non-whitespace characters inserted.
    -			p.framesetOK = false
    -		}
    -	case StartTagToken:
    -		switch p.tok.DataAtom {
    -		case a.Html:
    -			copyAttributes(p.oe[0], p.tok)
    -		case a.Base, a.Basefont, a.Bgsound, a.Command, a.Link, a.Meta, a.Noframes, a.Script, a.Style, a.Title:
    -			return inHeadIM(p)
    -		case a.Body:
    -			if len(p.oe) >= 2 {
    -				body := p.oe[1]
    -				if body.Type == ElementNode && body.DataAtom == a.Body {
    -					p.framesetOK = false
    -					copyAttributes(body, p.tok)
    -				}
    -			}
    -		case a.Frameset:
    -			if !p.framesetOK || len(p.oe) < 2 || p.oe[1].DataAtom != a.Body {
    -				// Ignore the token.
    -				return true
    -			}
    -			body := p.oe[1]
    -			if body.Parent != nil {
    -				body.Parent.RemoveChild(body)
    -			}
    -			p.oe = p.oe[:1]
    -			p.addElement()
    -			p.im = inFramesetIM
    -			return true
    -		case a.Address, a.Article, a.Aside, a.Blockquote, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Menu, a.Nav, a.Ol, a.P, a.Section, a.Summary, a.Ul:
    -			p.popUntil(buttonScope, a.P)
    -			p.addElement()
    -		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
    -			p.popUntil(buttonScope, a.P)
    -			switch n := p.top(); n.DataAtom {
    -			case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
    -				p.oe.pop()
    -			}
    -			p.addElement()
    -		case a.Pre, a.Listing:
    -			p.popUntil(buttonScope, a.P)
    -			p.addElement()
    -			// The newline, if any, will be dealt with by the TextToken case.
    -			p.framesetOK = false
    -		case a.Form:
    -			if p.form == nil {
    -				p.popUntil(buttonScope, a.P)
    -				p.addElement()
    -				p.form = p.top()
    -			}
    -		case a.Li:
    -			p.framesetOK = false
    -			for i := len(p.oe) - 1; i >= 0; i-- {
    -				node := p.oe[i]
    -				switch node.DataAtom {
    -				case a.Li:
    -					p.oe = p.oe[:i]
    -				case a.Address, a.Div, a.P:
    -					continue
    -				default:
    -					if !isSpecialElement(node) {
    -						continue
    -					}
    -				}
    -				break
    -			}
    -			p.popUntil(buttonScope, a.P)
    -			p.addElement()
    -		case a.Dd, a.Dt:
    -			p.framesetOK = false
    -			for i := len(p.oe) - 1; i >= 0; i-- {
    -				node := p.oe[i]
    -				switch node.DataAtom {
    -				case a.Dd, a.Dt:
    -					p.oe = p.oe[:i]
    -				case a.Address, a.Div, a.P:
    -					continue
    -				default:
    -					if !isSpecialElement(node) {
    -						continue
    -					}
    -				}
    -				break
    -			}
    -			p.popUntil(buttonScope, a.P)
    -			p.addElement()
    -		case a.Plaintext:
    -			p.popUntil(buttonScope, a.P)
    -			p.addElement()
    -		case a.Button:
    -			p.popUntil(defaultScope, a.Button)
    -			p.reconstructActiveFormattingElements()
    -			p.addElement()
    -			p.framesetOK = false
    -		case a.A:
    -			for i := len(p.afe) - 1; i >= 0 && p.afe[i].Type != scopeMarkerNode; i-- {
    -				if n := p.afe[i]; n.Type == ElementNode && n.DataAtom == a.A {
    -					p.inBodyEndTagFormatting(a.A)
    -					p.oe.remove(n)
    -					p.afe.remove(n)
    -					break
    -				}
    -			}
    -			p.reconstructActiveFormattingElements()
    -			p.addFormattingElement()
    -		case a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
    -			p.reconstructActiveFormattingElements()
    -			p.addFormattingElement()
    -		case a.Nobr:
    -			p.reconstructActiveFormattingElements()
    -			if p.elementInScope(defaultScope, a.Nobr) {
    -				p.inBodyEndTagFormatting(a.Nobr)
    -				p.reconstructActiveFormattingElements()
    -			}
    -			p.addFormattingElement()
    -		case a.Applet, a.Marquee, a.Object:
    -			p.reconstructActiveFormattingElements()
    -			p.addElement()
    -			p.afe = append(p.afe, &scopeMarker)
    -			p.framesetOK = false
    -		case a.Table:
    -			if !p.quirks {
    -				p.popUntil(buttonScope, a.P)
    -			}
    -			p.addElement()
    -			p.framesetOK = false
    -			p.im = inTableIM
    -			return true
    -		case a.Area, a.Br, a.Embed, a.Img, a.Input, a.Keygen, a.Wbr:
    -			p.reconstructActiveFormattingElements()
    -			p.addElement()
    -			p.oe.pop()
    -			p.acknowledgeSelfClosingTag()
    -			if p.tok.DataAtom == a.Input {
    -				for _, t := range p.tok.Attr {
    -					if t.Key == "type" {
    -						if strings.ToLower(t.Val) == "hidden" {
    -							// Skip setting framesetOK = false
    -							return true
    -						}
    -					}
    -				}
    -			}
    -			p.framesetOK = false
    -		case a.Param, a.Source, a.Track:
    -			p.addElement()
    -			p.oe.pop()
    -			p.acknowledgeSelfClosingTag()
    -		case a.Hr:
    -			p.popUntil(buttonScope, a.P)
    -			p.addElement()
    -			p.oe.pop()
    -			p.acknowledgeSelfClosingTag()
    -			p.framesetOK = false
    -		case a.Image:
    -			p.tok.DataAtom = a.Img
    -			p.tok.Data = a.Img.String()
    -			return false
    -		case a.Isindex:
    -			if p.form != nil {
    -				// Ignore the token.
    -				return true
    -			}
    -			action := ""
    -			prompt := "This is a searchable index. Enter search keywords: "
    -			attr := []Attribute{{Key: "name", Val: "isindex"}}
    -			for _, t := range p.tok.Attr {
    -				switch t.Key {
    -				case "action":
    -					action = t.Val
    -				case "name":
    -					// Ignore the attribute.
    -				case "prompt":
    -					prompt = t.Val
    -				default:
    -					attr = append(attr, t)
    -				}
    -			}
    -			p.acknowledgeSelfClosingTag()
    -			p.popUntil(buttonScope, a.P)
    -			p.parseImpliedToken(StartTagToken, a.Form, a.Form.String())
    -			if action != "" {
    -				p.form.Attr = []Attribute{{Key: "action", Val: action}}
    -			}
    -			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
    -			p.parseImpliedToken(StartTagToken, a.Label, a.Label.String())
    -			p.addText(prompt)
    -			p.addChild(&Node{
    -				Type:     ElementNode,
    -				DataAtom: a.Input,
    -				Data:     a.Input.String(),
    -				Attr:     attr,
    -			})
    -			p.oe.pop()
    -			p.parseImpliedToken(EndTagToken, a.Label, a.Label.String())
    -			p.parseImpliedToken(StartTagToken, a.Hr, a.Hr.String())
    -			p.parseImpliedToken(EndTagToken, a.Form, a.Form.String())
    -		case a.Textarea:
    -			p.addElement()
    -			p.setOriginalIM()
    -			p.framesetOK = false
    -			p.im = textIM
    -		case a.Xmp:
    -			p.popUntil(buttonScope, a.P)
    -			p.reconstructActiveFormattingElements()
    -			p.framesetOK = false
    -			p.addElement()
    -			p.setOriginalIM()
    -			p.im = textIM
    -		case a.Iframe:
    -			p.framesetOK = false
    -			p.addElement()
    -			p.setOriginalIM()
    -			p.im = textIM
    -		case a.Noembed, a.Noscript:
    -			p.addElement()
    -			p.setOriginalIM()
    -			p.im = textIM
    -		case a.Select:
    -			p.reconstructActiveFormattingElements()
    -			p.addElement()
    -			p.framesetOK = false
    -			p.im = inSelectIM
    -			return true
    -		case a.Optgroup, a.Option:
    -			if p.top().DataAtom == a.Option {
    -				p.oe.pop()
    -			}
    -			p.reconstructActiveFormattingElements()
    -			p.addElement()
    -		case a.Rp, a.Rt:
    -			if p.elementInScope(defaultScope, a.Ruby) {
    -				p.generateImpliedEndTags()
    -			}
    -			p.addElement()
    -		case a.Math, a.Svg:
    -			p.reconstructActiveFormattingElements()
    -			if p.tok.DataAtom == a.Math {
    -				adjustAttributeNames(p.tok.Attr, mathMLAttributeAdjustments)
    -			} else {
    -				adjustAttributeNames(p.tok.Attr, svgAttributeAdjustments)
    -			}
    -			adjustForeignAttributes(p.tok.Attr)
    -			p.addElement()
    -			p.top().Namespace = p.tok.Data
    -			if p.hasSelfClosingToken {
    -				p.oe.pop()
    -				p.acknowledgeSelfClosingTag()
    -			}
    -			return true
    -		case a.Caption, a.Col, a.Colgroup, a.Frame, a.Head, a.Tbody, a.Td, a.Tfoot, a.Th, a.Thead, a.Tr:
    -			// Ignore the token.
    -		default:
    -			p.reconstructActiveFormattingElements()
    -			p.addElement()
    -		}
    -	case EndTagToken:
    -		switch p.tok.DataAtom {
    -		case a.Body:
    -			if p.elementInScope(defaultScope, a.Body) {
    -				p.im = afterBodyIM
    -			}
    -		case a.Html:
    -			if p.elementInScope(defaultScope, a.Body) {
    -				p.parseImpliedToken(EndTagToken, a.Body, a.Body.String())
    -				return false
    -			}
    -			return true
    -		case a.Address, a.Article, a.Aside, a.Blockquote, a.Button, a.Center, a.Details, a.Dir, a.Div, a.Dl, a.Fieldset, a.Figcaption, a.Figure, a.Footer, a.Header, a.Hgroup, a.Listing, a.Menu, a.Nav, a.Ol, a.Pre, a.Section, a.Summary, a.Ul:
    -			p.popUntil(defaultScope, p.tok.DataAtom)
    -		case a.Form:
    -			node := p.form
    -			p.form = nil
    -			i := p.indexOfElementInScope(defaultScope, a.Form)
    -			if node == nil || i == -1 || p.oe[i] != node {
    -				// Ignore the token.
    -				return true
    -			}
    -			p.generateImpliedEndTags()
    -			p.oe.remove(node)
    -		case a.P:
    -			if !p.elementInScope(buttonScope, a.P) {
    -				p.parseImpliedToken(StartTagToken, a.P, a.P.String())
    -			}
    -			p.popUntil(buttonScope, a.P)
    -		case a.Li:
    -			p.popUntil(listItemScope, a.Li)
    -		case a.Dd, a.Dt:
    -			p.popUntil(defaultScope, p.tok.DataAtom)
    -		case a.H1, a.H2, a.H3, a.H4, a.H5, a.H6:
    -			p.popUntil(defaultScope, a.H1, a.H2, a.H3, a.H4, a.H5, a.H6)
    -		case a.A, a.B, a.Big, a.Code, a.Em, a.Font, a.I, a.Nobr, a.S, a.Small, a.Strike, a.Strong, a.Tt, a.U:
    -			p.inBodyEndTagFormatting(p.tok.DataAtom)
    -		case a.Applet, a.Marquee, a.Object:
    -			if p.popUntil(defaultScope, p.tok.DataAtom) {
    -				p.clearActiveFormattingElements()
    -			}
    -		case a.Br:
    -			p.tok.Type = StartTagToken
    -			return false
    -		default:
    -			p.inBodyEndTagOther(p.tok.DataAtom)
    -		}
    -	case CommentToken:
    -		p.addChild(&Node{
    -			Type: CommentNode,
    -			Data: p.tok.Data,
    -		})
    -	}
    -
    -	return true
    -}
    -
    -func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) {
    -	// This is the "adoption agency" algorithm, described at
    -	// https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency
    -
    -	// TODO: this is a fairly literal line-by-line translation of that algorithm.
    -	// Once the code successfully parses the comprehensive test suite, we should
    -	// refactor this code to be more idiomatic.
    -
    -	// Steps 1-4. The outer loop.
    -	for i := 0; i < 8; i++ {
    -		// Step 5. Find the formatting element.
    -		var formattingElement *Node
    -		for j := len(p.afe) - 1; j >= 0; j-- {
    -			if p.afe[j].Type == scopeMarkerNode {
    -				break
    -			}
    -			if p.afe[j].DataAtom == tagAtom {
    -				formattingElement = p.afe[j]
    -				break
    -			}
    -		}
    -		if formattingElement == nil {
    -			p.inBodyEndTagOther(tagAtom)
    -			return
    -		}
    -		feIndex := p.oe.index(formattingElement)
    -		if feIndex == -1 {
    -			p.afe.remove(formattingElement)
    -			return
    -		}
    -		if !p.elementInScope(defaultScope, tagAtom) {
    -			// Ignore the tag.
    -			return
    -		}
    -
    -		// Steps 9-10. Find the furthest block.
    -		var furthestBlock *Node
    -		for _, e := range p.oe[feIndex:] {
    -			if isSpecialElement(e) {
    -				furthestBlock = e
    -				break
    -			}
    -		}
    -		if furthestBlock == nil {
    -			e := p.oe.pop()
    -			for e != formattingElement {
    -				e = p.oe.pop()
    -			}
    -			p.afe.remove(e)
    -			return
    -		}
    -
    -		// Steps 11-12. Find the common ancestor and bookmark node.
    -		commonAncestor := p.oe[feIndex-1]
    -		bookmark := p.afe.index(formattingElement)
    -
    -		// Step 13. The inner loop. Find the lastNode to reparent.
    -		lastNode := furthestBlock
    -		node := furthestBlock
    -		x := p.oe.index(node)
    -		// Steps 13.1-13.2
    -		for j := 0; j < 3; j++ {
    -			// Step 13.3.
    -			x--
    -			node = p.oe[x]
    -			// Step 13.4 - 13.5.
    -			if p.afe.index(node) == -1 {
    -				p.oe.remove(node)
    -				continue
    -			}
    -			// Step 13.6.
    -			if node == formattingElement {
    -				break
    -			}
    -			// Step 13.7.
    -			clone := node.clone()
    -			p.afe[p.afe.index(node)] = clone
    -			p.oe[p.oe.index(node)] = clone
    -			node = clone
    -			// Step 13.8.
    -			if lastNode == furthestBlock {
    -				bookmark = p.afe.index(node) + 1
    -			}
    -			// Step 13.9.
    -			if lastNode.Parent != nil {
    -				lastNode.Parent.RemoveChild(lastNode)
    -			}
    -			node.AppendChild(lastNode)
    -			// Step 13.10.
    -			lastNode = node
    -		}
    -
    -		// Step 14. Reparent lastNode to the common ancestor,
    -		// or for misnested table nodes, to the foster parent.
    -		if lastNode.Parent != nil {
    -			lastNode.Parent.RemoveChild(lastNode)
    -		}
    -		switch commonAncestor.DataAtom {
    -		case a.Table, a.Tbody, a.Tfoot, a.Thead, a.Tr:
    -			p.fosterParent(lastNode)
    -		default:
    -			commonAncestor.AppendChild(lastNode)
    -		}
    -
    -		// Steps 15-17. Reparent nodes from the furthest block's children
    -		// to a clone of the formatting element.
    -		clone := formattingElement.clone()
    -		reparentChildren(clone, furthestBlock)
    -		furthestBlock.AppendChild(clone)
    -
    -		// Step 18. Fix up the list of active formatting elements.
    -		if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark {
    -			// Move the bookmark with the rest of the list.
    -			bookmark--
    -		}
    -		p.afe.remove(formattingElement)
    -		p.afe.insert(bookmark, clone)
    -
    -		// Step 19. Fix up the stack of open elements.
    -		p.oe.remove(formattingElement)
    -		p.oe.insert(p.oe.index(furthestBlock)+1, clone)
    -	}
    -}
    -
    -// inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM.
    -// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content
    -// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign
    -func (p *parser) inBodyEndTagOther(tagAtom a.Atom) {
    -	for i := len(p.oe) - 1; i >= 0; i-- {
    -		if p.oe[i].DataAtom == tagAtom {
    -			p.oe = p.oe[:i]
    -			break
    -		}
    -		if isSpecialElement(p.oe[i]) {
    -			break
    -		}
    -	}
    -}
    -
    -// Section 12.2.5.4.8.
    -func textIM(p *parser) bool {
    -	switch p.tok.Type {
    -	case ErrorToken:
    -		p.oe.pop()
    -	case TextToken:
    -		d := p.tok.Data
    -		if n := p.oe.top(); n.DataAtom == a.Textarea && n.FirstChild == nil {
    -			// Ignore a newline at the start of a -->
    -#errors
    -#document
    -| 
    -|   
    -|   
    -|     -->
    -#errors
    -#document
    -| 
    -|   
    -|   
    -|     
    -#errors
    -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE.
    -#document
    -| 
    -|   
    -|   
    -|     
    -#errors
    -Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE.
    -Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element.
    -Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element.
    -Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element.
    -Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element.
    -Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element.
    -Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element.
    -Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element.
    -Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element.
    -Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element.
    -Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element.
    -Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element.
    -Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element.
    -Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element.
    -Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element.
    -Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element.
    -Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element.
    -Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element.
    -Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element.
    -Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element.
    -Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element.
    -Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element.
    -Line: 1 Col: 130 Unexpected end tag (br). Treated as br element.
    -Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm.
    -Line: 1 Col: 140 This element (img) has no end tag.
    -Line: 1 Col: 148 Unexpected end tag (title). Ignored.
    -Line: 1 Col: 155 Unexpected end tag (span). Ignored.
    -Line: 1 Col: 163 Unexpected end tag (style). Ignored.
    -Line: 1 Col: 172 Unexpected end tag (script). Ignored.
    -Line: 1 Col: 180 Unexpected end tag (table). Ignored.
    -Line: 1 Col: 185 Unexpected end tag (th). Ignored.
    -Line: 1 Col: 190 Unexpected end tag (td). Ignored.
    -Line: 1 Col: 195 Unexpected end tag (tr). Ignored.
    -Line: 1 Col: 203 This element (frame) has no end tag.
    -Line: 1 Col: 210 This element (area) has no end tag.
    -Line: 1 Col: 217 Unexpected end tag (link). Ignored.
    -Line: 1 Col: 225 This element (param) has no end tag.
    -Line: 1 Col: 230 This element (hr) has no end tag.
    -Line: 1 Col: 238 This element (input) has no end tag.
    -Line: 1 Col: 244 Unexpected end tag (col). Ignored.
    -Line: 1 Col: 251 Unexpected end tag (base). Ignored.
    -Line: 1 Col: 258 Unexpected end tag (meta). Ignored.
    -Line: 1 Col: 269 This element (basefont) has no end tag.
    -Line: 1 Col: 279 This element (bgsound) has no end tag.
    -Line: 1 Col: 287 This element (embed) has no end tag.
    -Line: 1 Col: 296 This element (spacer) has no end tag.
    -Line: 1 Col: 300 Unexpected end tag (p). Ignored.
    -Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag.
    -Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag.
    -Line: 1 Col: 320 Unexpected end tag (caption). Ignored.
    -Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored.
    -Line: 1 Col: 339 Unexpected end tag (tbody). Ignored.
    -Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored.
    -Line: 1 Col: 355 Unexpected end tag (thead). Ignored.
    -Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag.
    -Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag.
    -Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag.
    -Line: 1 Col: 393 Unexpected end tag (dir). Ignored.
    -Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag.
    -Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag.
    -Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag.
    -Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag.
    -Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag.
    -Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag.
    -Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag.
    -Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag.
    -Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm.
    -Line: 1 Col: 460 This element (wbr) has no end tag.
    -Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag.
    -Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag.
    -Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag.
    -Line: 1 Col: 513 Unexpected end tag (html). Ignored.
    -Line: 1 Col: 513 Unexpected end tag (frameset). Ignored.
    -Line: 1 Col: 520 Unexpected end tag (head). Ignored.
    -Line: 1 Col: 529 Unexpected end tag (iframe). Ignored.
    -Line: 1 Col: 537 This element (image) has no end tag.
    -Line: 1 Col: 547 This element (isindex) has no end tag.
    -Line: 1 Col: 557 Unexpected end tag (noembed). Ignored.
    -Line: 1 Col: 568 Unexpected end tag (noframes). Ignored.
    -Line: 1 Col: 579 Unexpected end tag (noscript). Ignored.
    -Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored.
    -Line: 1 Col: 599 Unexpected end tag (option). Ignored.
    -Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored.
    -Line: 1 Col: 622 Unexpected end tag (textarea). Ignored.
    -#document
    -| 
    -|   
    -|   
    -|     
    -|

    - -#data -

    -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. -Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. -Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. -Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. -Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. -Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. -Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. -Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. -Line: 1 Col: 58 Unexpected end tag (blink). Ignored. -Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. -Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. -Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. -Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. -Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. -Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. -Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. -Line: 1 Col: 99 Unexpected end tag (select). Ignored. -Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. -Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. -Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. -Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. -Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. -Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. -Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. -Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. -Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. -Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. -Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. -Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. -Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. -Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. -Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. -Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. -Line: 1 Col: 151 This element (img) has no end tag. -Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. -Line: 1 Col: 159 Unexpected end tag (title). Ignored. -Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. -Line: 1 Col: 166 Unexpected end tag (span). Ignored. -Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. -Line: 1 Col: 174 Unexpected end tag (style). Ignored. -Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. -Line: 1 Col: 183 Unexpected end tag (script). Ignored. -Line: 1 Col: 196 Unexpected end tag (th). Ignored. -Line: 1 Col: 201 Unexpected end tag (td). Ignored. -Line: 1 Col: 206 Unexpected end tag (tr). Ignored. -Line: 1 Col: 214 This element (frame) has no end tag. -Line: 1 Col: 221 This element (area) has no end tag. -Line: 1 Col: 228 Unexpected end tag (link). Ignored. -Line: 1 Col: 236 This element (param) has no end tag. -Line: 1 Col: 241 This element (hr) has no end tag. -Line: 1 Col: 249 This element (input) has no end tag. -Line: 1 Col: 255 Unexpected end tag (col). Ignored. -Line: 1 Col: 262 Unexpected end tag (base). Ignored. -Line: 1 Col: 269 Unexpected end tag (meta). Ignored. -Line: 1 Col: 280 This element (basefont) has no end tag. -Line: 1 Col: 290 This element (bgsound) has no end tag. -Line: 1 Col: 298 This element (embed) has no end tag. -Line: 1 Col: 307 This element (spacer) has no end tag. -Line: 1 Col: 311 Unexpected end tag (p). Ignored. -Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 331 Unexpected end tag (caption). Ignored. -Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 366 Unexpected end tag (thead). Ignored. -Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 404 Unexpected end tag (dir). Ignored. -Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 471 This element (wbr) has no end tag. -Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 524 Unexpected end tag (html). Ignored. -Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 531 Unexpected end tag (head). Ignored. -Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 548 This element (image) has no end tag. -Line: 1 Col: 558 This element (isindex) has no end tag. -Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 610 Unexpected end tag (option). Ignored. -Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. -#document -| -| -| -|
    -| -| -| -|

    - -#data - -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 10 Expected closing tag. Unexpected end of file. -#document -| -| -| diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat deleted file mode 100644 index 4f8df86f..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat +++ /dev/null @@ -1,799 +0,0 @@ -#data - -#errors -#document -| -| -| -| -| - -#data -a -#errors -29: Bogus comment -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| - -#data - -#errors -35: Stray “svg†start tag. -42: Stray end tag “svg†-#document -| -| -| -| -| -#errors -43: Stray “svg†start tag. -50: Stray end tag “svg†-#document -| -| -| -| -|

    -#errors -34: Start tag “svg†seen in “tableâ€. -41: Stray end tag “svgâ€. -#document -| -| -| -| -| -| - -#data -
    foo
    -#errors -34: Start tag “svg†seen in “tableâ€. -46: Stray end tag “gâ€. -53: Stray end tag “svgâ€. -#document -| -| -| -| -| -| -| "foo" -| - -#data -
    foobar
    -#errors -34: Start tag “svg†seen in “tableâ€. -46: Stray end tag “gâ€. -58: Stray end tag “gâ€. -65: Stray end tag “svgâ€. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -| - -#data -
    foobar
    -#errors -41: Start tag “svg†seen in “tableâ€. -53: Stray end tag “gâ€. -65: Stray end tag “gâ€. -72: Stray end tag “svgâ€. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -| -| - -#data -
    foobar
    -#errors -45: Start tag “svg†seen in “tableâ€. -57: Stray end tag “gâ€. -69: Stray end tag “gâ€. -76: Stray end tag “svgâ€. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -| -| -| - -#data -
    foobar
    -#errors -#document -| -| -| -| -| -| -| -|
    -| -| -| "foo" -| -| "bar" - -#data -
    foobar

    baz

    -#errors -#document -| -| -| -| -| -| -| -|
    -| -| -| "foo" -| -| "bar" -|

    -| "baz" - -#data -
    foobar

    baz

    -#errors -#document -| -| -| -| -| -|
    -| -| -| "foo" -| -| "bar" -|

    -| "baz" - -#data -
    foobar

    baz

    quux -#errors -70: HTML start tag “p†in a foreign namespace context. -81: “table†closed but “caption†was still open. -#document -| -| -| -| -| -|
    -| -| -| "foo" -| -| "bar" -|

    -| "baz" -|

    -| "quux" - -#data -
    foobarbaz

    quux -#errors -78: “table†closed but “caption†was still open. -78: Unclosed elements on stack. -#document -| -| -| -| -| -|
    -| -| -| "foo" -| -| "bar" -| "baz" -|

    -| "quux" - -#data -foobar

    baz

    quux -#errors -44: Start tag “svg†seen in “tableâ€. -56: Stray end tag “gâ€. -68: Stray end tag “gâ€. -71: HTML start tag “p†in a foreign namespace context. -71: Start tag “p†seen in “tableâ€. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -|

    -| "baz" -| -| -|

    -| "quux" - -#data -

    quux -#errors -50: Stray “svg†start tag. -54: Stray “g†start tag. -62: Stray end tag “g†-66: Stray “g†start tag. -74: Stray end tag “g†-77: Stray “p†start tag. -88: “table†end tag with “select†open. -#document -| -| -| -| -| -| -| -|
    -|

    quux -#errors -36: Start tag “select†seen in “tableâ€. -42: Stray “svg†start tag. -46: Stray “g†start tag. -54: Stray end tag “g†-58: Stray “g†start tag. -66: Stray end tag “g†-69: Stray “p†start tag. -80: “table†end tag with “select†open. -#document -| -| -| -| -| -|

    -| "quux" - -#data -foobar

    baz -#errors -41: Stray “svg†start tag. -68: HTML start tag “p†in a foreign namespace context. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -|

    -| "baz" - -#data -foobar

    baz -#errors -34: Stray “svg†start tag. -61: HTML start tag “p†in a foreign namespace context. -#document -| -| -| -| -| -| -| "foo" -| -| "bar" -|

    -| "baz" - -#data -

    -#errors -31: Stray “svg†start tag. -35: Stray “g†start tag. -40: Stray end tag “g†-44: Stray “g†start tag. -49: Stray end tag “g†-52: Stray “p†start tag. -58: Stray “span†start tag. -58: End of file seen and there were open elements. -#document -| -| -| -| - -#data -

    -#errors -42: Stray “svg†start tag. -46: Stray “g†start tag. -51: Stray end tag “g†-55: Stray “g†start tag. -60: Stray end tag “g†-63: Stray “p†start tag. -69: Stray “span†start tag. -#document -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| xlink:href="foo" -| -| xlink href="foo" - -#data - -#errors -#document -| -| -| -| -| xlink:href="foo" -| xml:lang="en" -| -| -| xlink href="foo" -| xml lang="en" - -#data - -#errors -#document -| -| -| -| -| xlink:href="foo" -| xml:lang="en" -| -| -| xlink href="foo" -| xml lang="en" - -#data -bar -#errors -#document -| -| -| -| -| xlink:href="foo" -| xml:lang="en" -| -| -| xlink href="foo" -| xml lang="en" -| "bar" - -#data - -#errors -#document -| -| -| -| - -#data -

    a -#errors -#document -| -| -| -|
    -| -| "a" - -#data -
    a -#errors -#document -| -| -| -|
    -| -| -| "a" - -#data -
    -#errors -#document -| -| -| -|
    -| -| -| - -#data -
    a -#errors -#document -| -| -| -|
    -| -| -| -| -| "a" - -#data -

    a -#errors -#document -| -| -| -|

    -| -| -| -|

    -| "a" - -#data -
      a -#errors -40: HTML start tag “ul†in a foreign namespace context. -41: End of file in a foreign namespace context. -#document -| -| -| -| -| -| -|
      -| -|
        -| "a" - -#data -
          a -#errors -35: HTML start tag “ul†in a foreign namespace context. -36: End of file in a foreign namespace context. -#document -| -| -| -| -| -| -| -|
            -| "a" - -#data -

            -#errors -#document -| -| -| -| -|

            -| -| -|

            - -#data -

            -#errors -#document -| -| -| -| -|

            -| -| -|

            - -#data -

            -#errors -#document -| -| -| -|

            -| -| -| -|

            -|

            - -#data -
            -#errors -#document -| -| -| -| -| -|
            -| -|
            -| -| - -#data -
            -#errors -#document -| -| -| -| -| -| -| -|
            -|
            -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data -

    -#errors -#document -| -| -| -| -|
    -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| - -#data -
    -#errors -#document -| -| -| -| -| -| -| -|
    -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat deleted file mode 100644 index 638cde47..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat +++ /dev/null @@ -1,482 +0,0 @@ -#data - -#errors -#document -| -| -| -| -| -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data - -#errors -#document -| -| -| -| -| -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data - -#errors -#document -| -| -| -| -| -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data - -#errors -#document -| -| -| -| -| -| attributename="" -| attributetype="" -| basefrequency="" -| baseprofile="" -| calcmode="" -| clippathunits="" -| contentscripttype="" -| contentstyletype="" -| diffuseconstant="" -| edgemode="" -| externalresourcesrequired="" -| filterres="" -| filterunits="" -| glyphref="" -| gradienttransform="" -| gradientunits="" -| kernelmatrix="" -| kernelunitlength="" -| keypoints="" -| keysplines="" -| keytimes="" -| lengthadjust="" -| limitingconeangle="" -| markerheight="" -| markerunits="" -| markerwidth="" -| maskcontentunits="" -| maskunits="" -| numoctaves="" -| pathlength="" -| patterncontentunits="" -| patterntransform="" -| patternunits="" -| pointsatx="" -| pointsaty="" -| pointsatz="" -| preservealpha="" -| preserveaspectratio="" -| primitiveunits="" -| refx="" -| refy="" -| repeatcount="" -| repeatdur="" -| requiredextensions="" -| requiredfeatures="" -| specularconstant="" -| specularexponent="" -| spreadmethod="" -| startoffset="" -| stddeviation="" -| stitchtiles="" -| surfacescale="" -| systemlanguage="" -| tablevalues="" -| targetx="" -| targety="" -| textlength="" -| viewbox="" -| viewtarget="" -| xchannelselector="" -| ychannelselector="" -| zoomandpan="" - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat deleted file mode 100644 index 63107d27..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat +++ /dev/null @@ -1,62 +0,0 @@ -#data -

    foobazeggs

    spam

    quuxbar -#errors -#document -| -| -| -| -|

    -| "foo" -| -| -| -| "baz" -| -| -| -| -| "eggs" -| -| -|

    -| "spam" -| -| -| -|
    -| -| -| "quux" -| "bar" - -#data -foobazeggs

    spam
    quuxbar -#errors -#document -| -| -| -| -| "foo" -| -| -| -| "baz" -| -| -| -| -| "eggs" -| -| -|

    -| "spam" -| -| -| -|
    -| -| -| "quux" -| "bar" diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat deleted file mode 100644 index b8713f88..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat +++ /dev/null @@ -1,74 +0,0 @@ -#data - -#errors -#document -| -| -| -| -| - -#data - -#errors -#document -| -| -| -| -| -| - -#data - -#errors -15: Unexpected start tag html -#document -| -| -| abc:def="gh" -| -| -| - -#data - -#errors -15: Unexpected start tag html -#document -| -| -| xml:lang="bar" -| -| - -#data - -#errors -#document -| -| -| 123="456" -| -| - -#data - -#errors -#document -| -| -| 123="456" -| 789="012" -| -| - -#data - -#errors -#document -| -| -| -| -| 789="012" diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat deleted file mode 100644 index 6ce1c0d1..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat +++ /dev/null @@ -1,208 +0,0 @@ -#data -

    X -#errors -Line: 1 Col: 31 Unexpected end tag (p). Ignored. -Line: 1 Col: 36 Expected closing tag. Unexpected end of file. -#document -| -| -| -| -|

    -| -| -| -| -| -| -| " " -|

    -| "X" - -#data -

    -

    X -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end tag (p). Ignored. -Line: 2 Col: 4 Expected closing tag. Unexpected end of file. -#document -| -| -| -|

    -| -| -| -| -| -| -| " -" -|

    -| "X" - -#data - -#errors -Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. -#document -| -| -| -| -| " " - -#data - -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| -| -| -| -| - -#data - -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. -#document -| -| -| -| - -#data -X -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| -| -| -| -| -| "X" - -#data -<!doctype html><table> X<meta></table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " X" -| <meta> -| <table> - -#data -<!doctype html><table> x</table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> - -#data -<!doctype html><table> x </table> -#errors -Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x " -| <table> - -#data -<!doctype html><table><tr> x</table> -#errors -Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table>X<style> <tr>x </style> </table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <style> -| " <tr>x " -| " " - -#data -<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> -#errors -Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <a> -| "foo" -| <table> -| " " -| <tbody> -| <tr> -| <td> -| "bar" -| " " - -#data -<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> -#errors -6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -13: Stray start tag “frameâ€. -21: Stray end tag “frameâ€. -29: Stray end tag “frameâ€. -39: “frameset†start tag after “body†already open. -105: End of file seen inside an [R]CDATA element. -105: End of file seen and there were open elements. -XXX: These errors are wrong, please fix me! -#document -| <html> -| <head> -| <frameset> -| <frame> -| <frameset> -| <frame> -| <noframes> -| "</frameset><noframes>" - -#data -<!DOCTYPE html><object></html> -#errors -1: Expected closing tag. Unexpected end of file -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat deleted file mode 100644 index c8ef66f0..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat +++ /dev/null @@ -1,2299 +0,0 @@ -#data -<!doctype html><script> -#errors -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script>a -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<!doctype html><script>< -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<!doctype html><script></ -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<!doctype html><script></S -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<!doctype html><script></SC -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<!doctype html><script></SCR -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<!doctype html><script></SCRI -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<!doctype html><script></SCRIP -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script></s -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<!doctype html><script></sc -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<!doctype html><script></scr -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<!doctype html><script></scri -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<!doctype html><script></scrip -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script><! -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<!doctype html><script><!a -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<!doctype html><script><!- -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<!doctype html><script><!-a -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<!doctype html><script><!-- -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--a -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<!doctype html><script><!--< -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<!doctype html><script><!--<a -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<!doctype html><script><!--</ -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--<s -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<!doctype html><script><!--<script < -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<!doctype html><script><!--<script <a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<!doctype html><script><!--<script </ -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<!doctype html><script><!--<script </s -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<!doctype html><script><!--<script </scripta -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script> -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<!doctype html><script><!--<script </script/ -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<!doctype html><script><!--<script </script < -#errors -Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<!doctype html><script><!--<script </script <a -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<!doctype html><script><!--<script </script </ -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script/ -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script - -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<!doctype html><script><!--<script -a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<!doctype html><script><!--<script -< -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -<" -| <body> - -#data -<!doctype html><script><!--<script -- -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<!doctype html><script><!--<script --a -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<!doctype html><script><!--<script --< -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --<" -| <body> - -#data -<!doctype html><script><!--<script --> -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script -->< -#errors -Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<!doctype html><script><!--<script --></ -#errors -Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script/ -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script><\/script>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<!doctype html><script><!--<script></scr'+'ipt>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>--><!--</script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-- ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- -></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- - ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<!doctype html><script><!--<script>--!></script>X -#errors -Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<!doctype html><script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 59 Unexpected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<!doctype html><script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<!doctype html><style><!--<style></style>--></style> -#errors -Line: 1 Col: 52 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<!doctype html><style><!--</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<!doctype html><style><!--...</style>...--></style> -#errors -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<!doctype html><style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 66 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<!doctype html><style><!--...</style><!-- --><style>@import ...</style> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<!doctype html><style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 63 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<!doctype html><style>...<!--[if IE]><style>...</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<!doctype html><title><!--<title>--> -#errors -Line: 1 Col: 52 Unexpected end tag (title). -#document -| -| -| -| -| "<!--<title>" -| <body> -| "-->" - -#data -<!doctype html><title></title> -#errors -#document -| -| -| -| -| "" -| - -#data -foo/title><link></head><body>X -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<!doctype html><noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 64 Unexpected end tag (noscript). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<!doctype html><noscript><iframe></noscript>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<!doctype html><noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 64 Unexpected end tag (noframes). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<!doctype html><noframes><body><script><!--...</script></body></noframes></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<!doctype html><textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 64 Unexpected end tag (textarea). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<!doctype html><textarea></textarea></textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<!doctype html><textarea><</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<" - -#data -<!doctype html><textarea>a<b</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "a<b" - -#data -<!doctype html><iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 56 Unexpected end tag (iframe). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<!doctype html><xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 44 Unexpected end tag (xmp). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<!doctype html><noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 60 Unexpected end tag (noembed). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script>a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<script>< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<script></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<script></S -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<script></SC -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<script></SCR -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<script></SCRI -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<script></SCRIP -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script></s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<script></sc -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<script></scr -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<script></scri -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<script></scrip -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script><! -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<script><!a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<script><!- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<script><!-a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<script><!-- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<script><!--< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<script><!--<a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<script><!--</ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--<s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<script><!--<script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<script><!--<script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<script><!--<script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<script><!--<script </s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<script><!--<script </scripta -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<script><!--<script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<script><!--<script </script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<script><!--<script </script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<script><!--<script </script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script - -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<script><!--<script -a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<script><!--<script -- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<script><!--<script --a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<script><!--<script --> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script -->< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<script><!--<script --></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script><\/script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<script><!--<script></scr'+'ipt>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<script><!--<script></script><script></script></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<script><!--<script></script><script></script>--><!--</script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<script><!--<script></script><script></script>-- ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<script><!--<script></script><script></script>- -></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<script><!--<script></script><script></script>- - ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<script><!--<script></script><script></script>-></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<script><!--<script>--!></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 44 Unexpected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<style><!--<style></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<style><!--</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<style><!--...</style>...--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 36 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<style><!--...</style><!-- --><style>@import ...</style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 48 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<style>...<!--[if IE]><style>...</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<title><!--<title>--> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (title). -#document -| -| -| -| "<!--<title>" -| <body> -| "-->" - -#data -<title></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| -| -| -| "" -| - -#data -foo/title><link></head><body>X -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noscript). -#document -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<noscript><!--</noscript>X<noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<noscript><iframe></noscript>X -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noframes). -#document -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<noframes><body><script><!--...</script></body></noframes></html> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -#document -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (textarea). -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<textarea></textarea></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -Line: 1 Col: 41 Unexpected end tag (iframe). -#document -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<iframe>...<!--X->...<!--/X->...</iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end tag (xmp). -#document -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. -Line: 1 Col: 45 Unexpected end tag (noembed). -#document -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<!doctype html><table> - -#errors -Line 2 Col 0 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " -" - -#data -<!doctype html><table><td><span><font></span><span> -#errors -Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. -Line 1 Col 45 Unexpected end tag (span). -Line 1 Col 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <span> -| <font> -| <font> -| <span> - -#data -<!doctype html><form><table></form><form></table></form> -#errors -35: Stray end tag “formâ€. -41: Start tag “form†seen in “tableâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <table> -| <form> diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat deleted file mode 100644 index 7b555f88..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat +++ /dev/null @@ -1,153 +0,0 @@ -#data -<!doctype html><table><tbody><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tr><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<!doctype html><table><tr><td><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| <td> - -#data -<!doctype html><table><tr><th><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <th> -| <select> -| <td> - -#data -<!doctype html><table><caption><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <select> -| <tbody> -| <tr> - -#data -<!doctype html><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><th> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tbody> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><thead> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><caption> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><table><tr></table>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| "a" diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat deleted file mode 100644 index 680e1f06..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat +++ /dev/null @@ -1,269 +0,0 @@ -#data -<!doctype html><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> - -#data -<!doctype html><table><tbody><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><caption><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><tr><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <style> -| "</script>" - -#data -<!doctype html><table><tr><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <script> -| "</style>" - -#data -<!doctype html><table><caption><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><table><td><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" - -#data -<!doctype html><table><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> - -#data -<!doctype html><table><tr><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><frameset></frameset><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><frameset></frameset></html><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><table><tr></tbody><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <tfoot> - -#data -<!doctype html><table><td><svg></svg>abc<td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| "abc" -| <td> diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat deleted file mode 100644 index 0d62f5a5..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat +++ /dev/null @@ -1,1237 +0,0 @@ -#data -<!doctype html><math><mn DefinitionUrl="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| definitionURL="foo" - -#data -<!doctype html><html></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <!-- foo --> -| <head> -| <body> - -#data -<!doctype html><head></head></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- foo --> -| <body> - -#data -<!doctype html><body><p><pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <pre> - -#data -<!doctype html><body><p><listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <listing> - -#data -<!doctype html><p><plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <plaintext> - -#data -<!doctype html><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <h1> - -#data -<!doctype html><form><isindex> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> - -#data -<!doctype html><isindex action="POST"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| action="POST" -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex prompt="this is isindex"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "this is isindex" -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex type="hidden"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| type="hidden" -| <hr> - -#data -<!doctype html><isindex name="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><ruby><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rp> - -#data -<!doctype html><ruby><div><span><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rp> - -#data -<!doctype html><ruby><div><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rp> - -#data -<!doctype html><ruby><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rt> - -#data -<!doctype html><ruby><div><span><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rt> - -#data -<!doctype html><ruby><div><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rt> - -#data -<!doctype html><math/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <foo> - -#data -<!doctype html><svg/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <foo> - -#data -<!doctype html><div></body><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <!-- foo --> - -#data -<!doctype html><h1><div><h3><span></h1>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h1> -| <div> -| <h3> -| <span> -| "foo" - -#data -<!doctype html><p></h3>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "foo" - -#data -<!doctype html><h3><li>abc</h2>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h3> -| <li> -| "abc" -| "foo" - -#data -<!doctype html><table>abc<!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <!-- foo --> - -#data -<!doctype html><table> <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <!-- foo --> - -#data -<!doctype html><table> b <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " b " -| <table> -| <!-- foo --> - -#data -<!doctype html><select><option><option> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><p><math><mi><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mi> -| <p> -| <h1> - -#data -<!doctype html><p><math><mo><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mo> -| <p> -| <h1> - -#data -<!doctype html><p><math><mn><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <p> -| <h1> - -#data -<!doctype html><p><math><ms><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math ms> -| <p> -| <h1> - -#data -<!doctype html><p><math><mtext><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mtext> -| <p> -| <h1> - -#data -<!doctype html><frameset></noframes> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html c=d><body></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><html c=d><frameset></frameset></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <!-- foo --> - -#data -<!doctype html><html><frameset></frameset></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| " " - -#data -<!doctype html><html><frameset></frameset></html>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html></p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<html><frameset></frameset></html><!doctype html> -#errors -#document -| <html> -| <head> -| <frameset> - -#data -<!doctype html><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html><p><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><p>a<frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "a" - -#data -<!doctype html><p> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><pre><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> - -#data -<!doctype html><listing><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <listing> - -#data -<!doctype html><li><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <li> - -#data -<!doctype html><dd><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dd> - -#data -<!doctype html><dt><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> - -#data -<!doctype html><button><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <button> - -#data -<!doctype html><applet><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <applet> - -#data -<!doctype html><marquee><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <marquee> - -#data -<!doctype html><object><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> - -#data -<!doctype html><table><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> - -#data -<!doctype html><area><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <area> - -#data -<!doctype html><basefont><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <basefont> -| <frameset> - -#data -<!doctype html><bgsound><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <bgsound> -| <frameset> - -#data -<!doctype html><br><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <br> - -#data -<!doctype html><embed><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <embed> - -#data -<!doctype html><img><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html><input><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> - -#data -<!doctype html><keygen><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <keygen> - -#data -<!doctype html><wbr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <wbr> - -#data -<!doctype html><hr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <hr> - -#data -<!doctype html><textarea></textarea><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> - -#data -<!doctype html><xmp></xmp><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> - -#data -<!doctype html><iframe></iframe><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> - -#data -<!doctype html><select></select><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><svg></svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><math></math><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg><foreignObject><div> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg>a</svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| "a" - -#data -<!doctype html><svg> </svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<html>aaa<frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "aaa" - -#data -<html> a <frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "a " - -#data -<!doctype html><div><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><div><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> - -#data -<!doctype html><p><math></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| "a" - -#data -<!doctype html><p><math><mn><span></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <span> -| <p> -| "a" - -#data -<!doctype html><math></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!doctype html><meta charset="ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| charset="ascii" -| <body> - -#data -<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| content="text/html;charset=ascii" -| http-equiv="content-type" -| <body> - -#data -<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> -| <meta> -| charset="utf8" -| <body> - -#data -<!doctype html><html a=b><head></head><html c=d> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><image/> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html>a<i>b<table>c<b>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "a" -| <i> -| "bc" -| <b> -| "de" -| "f" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" - -#data -<!doctype html><table><i>a<b>b<div>c</i> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <i> -| "c" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><table><i>a<div>b<tr>c<b>d</i>e -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <div> -| "b" -| <i> -| "c" -| <b> -| "d" -| <b> -| "e" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><table><i>a<div>b<b>c</i>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <i> -| "a" -| <div> -| <i> -| "b" -| <b> -| "c" -| <b> -| "d" -| <table> - -#data -<!doctype html><body><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <bgsound> - -#data -<!doctype html><body><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <basefont> - -#data -<!doctype html><a><b></a><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <basefont> - -#data -<!doctype html><a><b></a><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <bgsound> - -#data -<!doctype html><figcaption><article></figcaption>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <figcaption> -| <article> -| "a" - -#data -<!doctype html><summary><article></summary>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <summary> -| <article> -| "a" - -#data -<!doctype html><p><a><plaintext>b -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <a> -| <plaintext> -| <a> -| "b" - -#data -<!DOCTYPE html><div>a<a></div>b<p>c</p>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| "a" -| <a> -| <a> -| "b" -| <p> -| "c" -| "d" diff --git a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat deleted file mode 100644 index 60d85922..00000000 --- a/vendor/github.com/documize/html-diff/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat +++ /dev/null @@ -1,763 +0,0 @@ -#data -<!DOCTYPE html>Test -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Test" - -#data -<textarea>test</div>test -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 24 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <textarea> -| "test</div>test" - -#data -<table><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 11 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><td>test</tbody></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "test" - -#data -<frame>test -#errors -Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected start tag frame. Ignored. -#document -| <html> -| <head> -| <body> -| "test" - -#data -<!DOCTYPE html><frameset>test -#errors -Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset><!DOCTYPE html> -#errors -Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. -Line: 1 Col: 40 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><font><p><b>test</font> -#errors -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <p> -| <font> -| <b> -| "test" - -#data -<!DOCTYPE html><dt><div><dd> -#errors -Line: 1 Col: 28 Missing end tag (div, dt). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> -| <div> -| <dd> - -#data -<script></x -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</x" -| <body> - -#data -<table><plaintext><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. -Line: 1 Col: 22 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "<td>" -| <table> - -#data -<plaintext></plaintext> -#errors -Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!DOCTYPE html><table><tr>TEST -#errors -Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "TEST" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> -#errors -Line: 1 Col: 37 Unexpected start tag (body). -Line: 1 Col: 53 Unexpected start tag (body). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| t1="1" -| t2="2" -| t3="3" -| t4="4" - -#data -</b test -#errors -Line: 1 Col: 8 Unexpected end of file in attribute name. -Line: 1 Col: 8 End tag contains unexpected attributes. -Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html></b test<b &=&>X -#errors -Line: 1 Col: 32 Named entity didn't end with ';'. -Line: 1 Col: 33 End tag contains unexpected attributes. -Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" - -#data -<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 54 Unexpected end of file in the tag name. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| type="text/x-foobar;baz" -| "X</SCRipt" -| <body> - -#data -& -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&# -#errors -Line: 1 Col: 1 Numeric entity expected. Got end of file instead. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#" - -#data -&#X -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#X" - -#data -&#x -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#x" - -#data -- -#errors -Line: 1 Col: 4 Numeric entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "-" - -#data -&x-test -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&x-test" - -#data -<!doctypehtml><p><li> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <li> - -#data -<!doctypehtml><p><dt> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dt> - -#data -<!doctypehtml><p><dd> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dd> - -#data -<!doctypehtml><p><form> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <form> - -#data -<!DOCTYPE html><p></P>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "X" - -#data -& -#errors -Line: 1 Col: 4 Named entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&AMp; -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&AMp;" - -#data -<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> -#errors -Line: 1 Col: 110 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> - -#data -<!DOCTYPE html>X</body>X -#errors -Line: 1 Col: 24 Unexpected non-space characters in the after body phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "XX" - -#data -<!DOCTYPE html><!-- X -#errors -Line: 1 Col: 21 Unexpected end of file in comment. -#document -| <!DOCTYPE html> -| <!-- X --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><table><caption>test TEST</caption><td>test -#errors -Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 58 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| "test TEST" -| <tbody> -| <tr> -| <td> -| "test" - -#data -<!DOCTYPE html><select><option><optgroup> -#errors -Line: 1 Col: 41 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> -#errors -Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 76 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <option> -| <option> - -#data -<!DOCTYPE html><select><optgroup><option><optgroup> -#errors -Line: 1 Col: 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><datalist><option>foo</datalist>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <datalist> -| <option> -| "foo" -| "bar" - -#data -<!DOCTYPE html><font><input><input></font> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <input> -| <input> - -#data -<!DOCTYPE html><!-- XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX -#errors -Line: 1 Col: 29 Unexpected end of file in comment (-) -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<isindex test=x name=x> -#errors -Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! -#document -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| test="x" -| <hr> - -#data -test -test -#errors -Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "test -test" - -#data -<!DOCTYPE html><body><title>test</body> -#errors -#document -| -| -| -| -| -| "test</body>" - -#data -<!DOCTYPE html><body><title>X -#errors -#document -| -| -| -| -| -| "X" -| <meta> -| name="z" -| <link> -| rel="foo" -| <style> -| " -x { content:"</style" } " - -#data -<!DOCTYPE html><select><optgroup></optgroup></select> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> - -#data - - -#errors -Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html> <html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><script> -</script> <title>x -#errors -#document -| -| -| -| -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. -#document -| -| -| -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. -#document -| -| -| -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -#document -| -| -| -| -| "x" -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). -#document -| -| -| --> x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -| x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| -| -|

    -#errors -#document -| -| -| -| -| -| ddd -#errors -#document -| -| -| -#errors -#document -| -| -| -| -|
  • -| -| ", - " - - - - - - - -

    HTTP charset

    - - -
    - - -
     
    - - - - - -
    -

    The character encoding of a page can be set using the HTTP header charset declaration.

    -

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    The only character encoding declaration for this HTML file is in the HTTP header, which sets the encoding to ISO 8859-15.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-001
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html deleted file mode 100644 index 26e5d8b4..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-UTF-8-BOM.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - HTTP vs UTF-8 BOM - - - - - - - - - - - -

    HTTP vs UTF-8 BOM

    - - -
    - - -
     
    - - - - - -
    -

    A character encoding set in the HTTP header has lower precedence than the UTF-8 signature.

    -

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    If the test is unsuccessful, the characters  should appear at the top of the page. These represent the bytes that make up the UTF-8 signature when encountered in the ISO 8859-15 encoding.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-034
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html deleted file mode 100644 index 2f07e951..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-charset.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - HTTP vs meta charset - - - - - - - - - - - -

    HTTP vs meta charset

    - - -
    - - -
     
    - - - - - -
    -

    The HTTP header has a higher precedence than an encoding declaration in a meta charset attribute.

    -

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-1.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-018
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html b/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html deleted file mode 100644 index 6853cdde..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/HTTP-vs-meta-content.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - HTTP vs meta content - - - - - - - - - - - -

    HTTP vs meta content

    - - -
    - - -
     
    - - - - - -
    -

    The HTTP header has a higher precedence than an encoding declaration in a meta content attribute.

    -

    The HTTP header attempts to set the character encoding to ISO 8859-15. The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-1.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-016
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html b/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html deleted file mode 100644 index 612e26c6..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/No-encoding-declaration.html +++ /dev/null @@ -1,47 +0,0 @@ - - - - No encoding declaration - - - - - - - - - - - -

    No encoding declaration

    - - -
    - - -
     
    - - - - - -
    -

    A page with no encoding information in HTTP, BOM, XML declaration or meta element will be treated as UTF-8.

    -

    The test on this page contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-015
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/README b/vendor/golang.org/x/net/html/charset/testdata/README deleted file mode 100644 index a8e1fa47..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/README +++ /dev/null @@ -1 +0,0 @@ -These test cases come from http://www.w3.org/International/tests/html5/the-input-byte-stream/results-basics diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html deleted file mode 100644 index 3abf7a93..00000000 Binary files a/vendor/golang.org/x/net/html/charset/testdata/UTF-16BE-BOM.html and /dev/null differ diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html deleted file mode 100644 index 76254c98..00000000 Binary files a/vendor/golang.org/x/net/html/charset/testdata/UTF-16LE-BOM.html and /dev/null differ diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html deleted file mode 100644 index 83de4333..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-charset.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - UTF-8 BOM vs meta charset - - - - - - - - - - - -

    UTF-8 BOM vs meta charset

    - - -
    - - -
     
    - - - - - -
    -

    A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta charset attribute declares a different encoding.

    -

    The page contains an encoding declaration in a meta charset attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-038
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html b/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html deleted file mode 100644 index 501aac2d..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/UTF-8-BOM-vs-meta-content.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - UTF-8 BOM vs meta content - - - - - - - - - - - -

    UTF-8 BOM vs meta content

    - - -
    - - -
     
    - - - - - -
    -

    A page with a UTF-8 BOM will be recognized as UTF-8 even if the meta content attribute declares a different encoding.

    -

    The page contains an encoding declaration in a meta content attribute that attempts to set the character encoding to ISO 8859-15, but the file starts with a UTF-8 signature.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ýäè. This matches the sequence of bytes above when they are interpreted as UTF-8. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-037
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html b/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html deleted file mode 100644 index 2d7d25ab..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/meta-charset-attribute.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - meta charset attribute - - - - - - - - - - - -

    meta charset attribute

    - - -
    - - -
     
    - - - - - -
    -

    The character encoding of the page can be set by a meta element with charset attribute.

    -

    The only character encoding declaration for this HTML file is in the charset attribute of the meta element, which declares the encoding to be ISO 8859-15.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-009
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html b/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html deleted file mode 100644 index 1c3f228e..00000000 --- a/vendor/golang.org/x/net/html/charset/testdata/meta-content-attribute.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - meta content attribute - - - - - - - - - - - -

    meta content attribute

    - - -
    - - -
     
    - - - - - -
    -

    The character encoding of the page can be set by a meta element with http-equiv and content attributes.

    -

    The only character encoding declaration for this HTML file is in the content attribute of the meta element, which declares the encoding to be ISO 8859-15.

    The test contains a div with a class name that contains the following sequence of bytes: 0xC3 0xBD 0xC3 0xA4 0xC3 0xA8. These represent different sequences of characters in ISO 8859-15, ISO 8859-1 and UTF-8. The external, UTF-8-encoded stylesheet contains a selector .test div.ÜÀÚ. This matches the sequence of bytes above when they are interpreted as ISO 8859-15. If the class name matches the selector then the test will pass.

    -
    -
    -
    HTML5
    -

    the-input-byte-stream-007
    Result summary & related tests
    Detailed results for this test
    Link to spec

    -
    Assumptions:
    • The default encoding for the browser you are testing is not set to ISO 8859-15.
    • -
    • The test is read from a server that supports HTTP.
    -
    - - - - - - diff --git a/vendor/golang.org/x/net/html/const.go b/vendor/golang.org/x/net/html/const.go index d7cc8bb9..b37e6212 100644 --- a/vendor/golang.org/x/net/html/const.go +++ b/vendor/golang.org/x/net/html/const.go @@ -6,7 +6,7 @@ package html // Section 12.2.3.2 of the HTML5 specification says "The following elements // have varying levels of special parsing rules". -// http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#the-stack-of-open-elements +// https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements var isSpecialElementMap = map[string]bool{ "address": true, "applet": true, @@ -24,7 +24,6 @@ var isSpecialElementMap = map[string]bool{ "center": true, "col": true, "colgroup": true, - "command": true, "dd": true, "details": true, "dir": true, @@ -53,10 +52,12 @@ var isSpecialElementMap = map[string]bool{ "iframe": true, "img": true, "input": true, - "isindex": true, + "isindex": true, // The 'isindex' element has been removed, but keep it for backwards compatibility. + "keygen": true, "li": true, "link": true, "listing": true, + "main": true, "marquee": true, "menu": true, "meta": true, @@ -73,17 +74,20 @@ var isSpecialElementMap = map[string]bool{ "script": true, "section": true, "select": true, + "source": true, "style": true, "summary": true, "table": true, "tbody": true, "td": true, + "template": true, "textarea": true, "tfoot": true, "th": true, "thead": true, "title": true, "tr": true, + "track": true, "ul": true, "wbr": true, "xmp": true, diff --git a/vendor/golang.org/x/net/html/doc.go b/vendor/golang.org/x/net/html/doc.go index fac0f54e..822ed42a 100644 --- a/vendor/golang.org/x/net/html/doc.go +++ b/vendor/golang.org/x/net/html/doc.go @@ -49,18 +49,18 @@ call to Next. For example, to extract an HTML page's anchor text: for { tt := z.Next() switch tt { - case ErrorToken: + case html.ErrorToken: return z.Err() - case TextToken: + case html.TextToken: if depth > 0 { // emitBytes should copy the []byte it receives, // if it doesn't process it immediately. emitBytes(z.Text()) } - case StartTagToken, EndTagToken: + case html.StartTagToken, html.EndTagToken: tn, _ := z.TagName() if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { + if tt == html.StartTagToken { depth++ } else { depth-- @@ -90,10 +90,10 @@ example, to process each anchor node in depth-first order: f(doc) The relevant specifications include: -http://www.whatwg.org/specs/web-apps/current-work/multipage/syntax.html and -http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html +https://html.spec.whatwg.org/multipage/syntax.html and +https://html.spec.whatwg.org/multipage/syntax.html#tokenization */ -package html +package html // import "golang.org/x/net/html" // The tokenization algorithm implemented by this package is not a line-by-line // transliteration of the relatively verbose state-machine in the WHATWG diff --git a/vendor/golang.org/x/net/html/entity.go b/vendor/golang.org/x/net/html/entity.go index af8a007e..a50c04c6 100644 --- a/vendor/golang.org/x/net/html/entity.go +++ b/vendor/golang.org/x/net/html/entity.go @@ -8,7 +8,7 @@ package html const longestEntityWithoutSemicolon = 6 // entity is a map from HTML entity names to their values. The semicolon matters: -// http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html +// https://html.spec.whatwg.org/multipage/syntax.html#named-character-references // lists both "amp" and "amp;" as two separate entries. // // Note that the HTML5 list is larger than the HTML4 list at diff --git a/vendor/golang.org/x/net/html/entity_test.go b/vendor/golang.org/x/net/html/entity_test.go deleted file mode 100644 index b53f866f..00000000 --- a/vendor/golang.org/x/net/html/entity_test.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "testing" - "unicode/utf8" -) - -func TestEntityLength(t *testing.T) { - // We verify that the length of UTF-8 encoding of each value is <= 1 + len(key). - // The +1 comes from the leading "&". This property implies that the length of - // unescaped text is <= the length of escaped text. - for k, v := range entity { - if 1+len(k) < utf8.RuneLen(v) { - t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v)) - } - if len(k) > longestEntityWithoutSemicolon && k[len(k)-1] != ';' { - t.Errorf("entity name %s is %d characters, but longestEntityWithoutSemicolon=%d", k, len(k), longestEntityWithoutSemicolon) - } - } - for k, v := range entity2 { - if 1+len(k) < utf8.RuneLen(v[0])+utf8.RuneLen(v[1]) { - t.Error("escaped entity &" + k + " is shorter than its UTF-8 encoding " + string(v[0]) + string(v[1])) - } - } -} diff --git a/vendor/golang.org/x/net/html/escape.go b/vendor/golang.org/x/net/html/escape.go index 75bddff0..d8561396 100644 --- a/vendor/golang.org/x/net/html/escape.go +++ b/vendor/golang.org/x/net/html/escape.go @@ -12,7 +12,7 @@ import ( // These replacements permit compatibility with old numeric entities that // assumed Windows-1252 encoding. -// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference +// https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference var replacementTable = [...]rune{ '\u20AC', // First entry is what 0x80 should be replaced with. '\u0081', @@ -55,7 +55,7 @@ var replacementTable = [...]rune{ // Precondition: b[src] == '&' && dst <= src. // attribute should be true if parsing an attribute value. func unescapeEntity(b []byte, dst, src int, attribute bool) (dst1, src1 int) { - // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#consume-a-character-reference + // https://html.spec.whatwg.org/multipage/syntax.html#consume-a-character-reference // i starts at 1 because we already know that s[0] == '&'. i, s := 1, b[src:] diff --git a/vendor/golang.org/x/net/html/escape_test.go b/vendor/golang.org/x/net/html/escape_test.go deleted file mode 100644 index b405d4b4..00000000 --- a/vendor/golang.org/x/net/html/escape_test.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import "testing" - -type unescapeTest struct { - // A short description of the test case. - desc string - // The HTML text. - html string - // The unescaped text. - unescaped string -} - -var unescapeTests = []unescapeTest{ - // Handle no entities. - { - "copy", - "A\ttext\nstring", - "A\ttext\nstring", - }, - // Handle simple named entities. - { - "simple", - "& > <", - "& > <", - }, - // Handle hitting the end of the string. - { - "stringEnd", - "& &", - "& &", - }, - // Handle entities with two codepoints. - { - "multiCodepoint", - "text ⋛︀ blah", - "text \u22db\ufe00 blah", - }, - // Handle decimal numeric entities. - { - "decimalEntity", - "Delta = Δ ", - "Delta = Δ ", - }, - // Handle hexadecimal numeric entities. - { - "hexadecimalEntity", - "Lambda = λ = λ ", - "Lambda = λ = λ ", - }, - // Handle numeric early termination. - { - "numericEnds", - "&# &#x €43 © = ©f = ©", - "&# &#x €43 © = ©f = ©", - }, - // Handle numeric ISO-8859-1 entity replacements. - { - "numericReplacements", - "Footnote‡", - "Footnote‡", - }, -} - -func TestUnescape(t *testing.T) { - for _, tt := range unescapeTests { - unescaped := UnescapeString(tt.html) - if unescaped != tt.unescaped { - t.Errorf("TestUnescape %s: want %q, got %q", tt.desc, tt.unescaped, unescaped) - } - } -} - -func TestUnescapeEscape(t *testing.T) { - ss := []string{ - ``, - `abc def`, - `a & b`, - `a&b`, - `a & b`, - `"`, - `"`, - `"<&>"`, - `"<&>"`, - `3&5==1 && 0<1, "0<1", a+acute=á`, - `The special characters are: <, >, &, ' and "`, - } - for _, s := range ss { - if got := UnescapeString(EscapeString(s)); got != s { - t.Errorf("got %q want %q", got, s) - } - } -} diff --git a/vendor/golang.org/x/net/html/example_test.go b/vendor/golang.org/x/net/html/example_test.go deleted file mode 100644 index 2db67668..00000000 --- a/vendor/golang.org/x/net/html/example_test.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This example demonstrates parsing HTML data and walking the resulting tree. -package html_test - -import ( - "fmt" - "log" - "strings" - - "github.com/documize/community/Godeps/_workspace/src/golang.org/x/net/html" -) - -func ExampleParse() { - s := `

    Links:

    ` - doc, err := html.Parse(strings.NewReader(s)) - if err != nil { - log.Fatal(err) - } - var f func(*html.Node) - f = func(n *html.Node) { - if n.Type == html.ElementNode && n.Data == "a" { - for _, a := range n.Attr { - if a.Key == "href" { - fmt.Println(a.Val) - break - } - } - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - f(c) - } - } - f(doc) - // Output: - // foo - // /bar/baz -} diff --git a/vendor/golang.org/x/net/html/node_test.go b/vendor/golang.org/x/net/html/node_test.go deleted file mode 100644 index 471102f3..00000000 --- a/vendor/golang.org/x/net/html/node_test.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "fmt" -) - -// checkTreeConsistency checks that a node and its descendants are all -// consistent in their parent/child/sibling relationships. -func checkTreeConsistency(n *Node) error { - return checkTreeConsistency1(n, 0) -} - -func checkTreeConsistency1(n *Node, depth int) error { - if depth == 1e4 { - return fmt.Errorf("html: tree looks like it contains a cycle") - } - if err := checkNodeConsistency(n); err != nil { - return err - } - for c := n.FirstChild; c != nil; c = c.NextSibling { - if err := checkTreeConsistency1(c, depth+1); err != nil { - return err - } - } - return nil -} - -// checkNodeConsistency checks that a node's parent/child/sibling relationships -// are consistent. -func checkNodeConsistency(n *Node) error { - if n == nil { - return nil - } - - nParent := 0 - for p := n.Parent; p != nil; p = p.Parent { - nParent++ - if nParent == 1e4 { - return fmt.Errorf("html: parent list looks like an infinite loop") - } - } - - nForward := 0 - for c := n.FirstChild; c != nil; c = c.NextSibling { - nForward++ - if nForward == 1e6 { - return fmt.Errorf("html: forward list of children looks like an infinite loop") - } - if c.Parent != n { - return fmt.Errorf("html: inconsistent child/parent relationship") - } - } - - nBackward := 0 - for c := n.LastChild; c != nil; c = c.PrevSibling { - nBackward++ - if nBackward == 1e6 { - return fmt.Errorf("html: backward list of children looks like an infinite loop") - } - if c.Parent != n { - return fmt.Errorf("html: inconsistent child/parent relationship") - } - } - - if n.Parent != nil { - if n.Parent == n { - return fmt.Errorf("html: inconsistent parent relationship") - } - if n.Parent == n.FirstChild { - return fmt.Errorf("html: inconsistent parent/first relationship") - } - if n.Parent == n.LastChild { - return fmt.Errorf("html: inconsistent parent/last relationship") - } - if n.Parent == n.PrevSibling { - return fmt.Errorf("html: inconsistent parent/prev relationship") - } - if n.Parent == n.NextSibling { - return fmt.Errorf("html: inconsistent parent/next relationship") - } - - parentHasNAsAChild := false - for c := n.Parent.FirstChild; c != nil; c = c.NextSibling { - if c == n { - parentHasNAsAChild = true - break - } - } - if !parentHasNAsAChild { - return fmt.Errorf("html: inconsistent parent/child relationship") - } - } - - if n.PrevSibling != nil && n.PrevSibling.NextSibling != n { - return fmt.Errorf("html: inconsistent prev/next relationship") - } - if n.NextSibling != nil && n.NextSibling.PrevSibling != n { - return fmt.Errorf("html: inconsistent next/prev relationship") - } - - if (n.FirstChild == nil) != (n.LastChild == nil) { - return fmt.Errorf("html: inconsistent first/last relationship") - } - if n.FirstChild != nil && n.FirstChild == n.LastChild { - // We have a sole child. - if n.FirstChild.PrevSibling != nil || n.FirstChild.NextSibling != nil { - return fmt.Errorf("html: inconsistent sole child's sibling relationship") - } - } - - seen := map[*Node]bool{} - - var last *Node - for c := n.FirstChild; c != nil; c = c.NextSibling { - if seen[c] { - return fmt.Errorf("html: inconsistent repeated child") - } - seen[c] = true - last = c - } - if last != n.LastChild { - return fmt.Errorf("html: inconsistent last relationship") - } - - var first *Node - for c := n.LastChild; c != nil; c = c.PrevSibling { - if !seen[c] { - return fmt.Errorf("html: inconsistent missing child") - } - delete(seen, c) - first = c - } - if first != n.FirstChild { - return fmt.Errorf("html: inconsistent first relationship") - } - - if len(seen) != 0 { - return fmt.Errorf("html: inconsistent forwards/backwards child list") - } - - return nil -} diff --git a/vendor/golang.org/x/net/html/parse.go b/vendor/golang.org/x/net/html/parse.go index b42a3238..be4b2bf5 100644 --- a/vendor/golang.org/x/net/html/parse.go +++ b/vendor/golang.org/x/net/html/parse.go @@ -14,7 +14,7 @@ import ( ) // A parser implements the HTML5 parsing algorithm: -// http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tree-construction +// https://html.spec.whatwg.org/multipage/syntax.html#tree-construction type parser struct { // tokenizer provides the tokens for the parser. tokenizer *Tokenizer @@ -59,7 +59,7 @@ func (p *parser) top() *Node { // Stop tags for use in popUntil. These come from section 12.2.3.2. var ( defaultScopeStopTags = map[string][]a.Atom{ - "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object}, + "": {a.Applet, a.Caption, a.Html, a.Table, a.Td, a.Th, a.Marquee, a.Object, a.Template}, "math": {a.AnnotationXml, a.Mi, a.Mn, a.Mo, a.Ms, a.Mtext}, "svg": {a.Desc, a.ForeignObject, a.Title}, } @@ -1037,15 +1037,15 @@ func inBodyIM(p *parser) bool { func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { // This is the "adoption agency" algorithm, described at - // http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#adoptionAgency + // https://html.spec.whatwg.org/multipage/syntax.html#adoptionAgency // TODO: this is a fairly literal line-by-line translation of that algorithm. // Once the code successfully parses the comprehensive test suite, we should // refactor this code to be more idiomatic. - // Steps 1-3. The outer loop. + // Steps 1-4. The outer loop. for i := 0; i < 8; i++ { - // Step 4. Find the formatting element. + // Step 5. Find the formatting element. var formattingElement *Node for j := len(p.afe) - 1; j >= 0; j-- { if p.afe[j].Type == scopeMarkerNode { @@ -1070,7 +1070,7 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { return } - // Steps 5-6. Find the furthest block. + // Steps 9-10. Find the furthest block. var furthestBlock *Node for _, e := range p.oe[feIndex:] { if isSpecialElement(e) { @@ -1087,47 +1087,47 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { return } - // Steps 7-8. Find the common ancestor and bookmark node. + // Steps 11-12. Find the common ancestor and bookmark node. commonAncestor := p.oe[feIndex-1] bookmark := p.afe.index(formattingElement) - // Step 9. The inner loop. Find the lastNode to reparent. + // Step 13. The inner loop. Find the lastNode to reparent. lastNode := furthestBlock node := furthestBlock x := p.oe.index(node) - // Steps 9.1-9.3. + // Steps 13.1-13.2 for j := 0; j < 3; j++ { - // Step 9.4. + // Step 13.3. x-- node = p.oe[x] - // Step 9.5. + // Step 13.4 - 13.5. if p.afe.index(node) == -1 { p.oe.remove(node) continue } - // Step 9.6. + // Step 13.6. if node == formattingElement { break } - // Step 9.7. + // Step 13.7. clone := node.clone() p.afe[p.afe.index(node)] = clone p.oe[p.oe.index(node)] = clone node = clone - // Step 9.8. + // Step 13.8. if lastNode == furthestBlock { bookmark = p.afe.index(node) + 1 } - // Step 9.9. + // Step 13.9. if lastNode.Parent != nil { lastNode.Parent.RemoveChild(lastNode) } node.AppendChild(lastNode) - // Step 9.10. + // Step 13.10. lastNode = node } - // Step 10. Reparent lastNode to the common ancestor, + // Step 14. Reparent lastNode to the common ancestor, // or for misnested table nodes, to the foster parent. if lastNode.Parent != nil { lastNode.Parent.RemoveChild(lastNode) @@ -1139,13 +1139,13 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { commonAncestor.AppendChild(lastNode) } - // Steps 11-13. Reparent nodes from the furthest block's children + // Steps 15-17. Reparent nodes from the furthest block's children // to a clone of the formatting element. clone := formattingElement.clone() reparentChildren(clone, furthestBlock) furthestBlock.AppendChild(clone) - // Step 14. Fix up the list of active formatting elements. + // Step 18. Fix up the list of active formatting elements. if oldLoc := p.afe.index(formattingElement); oldLoc != -1 && oldLoc < bookmark { // Move the bookmark with the rest of the list. bookmark-- @@ -1153,13 +1153,15 @@ func (p *parser) inBodyEndTagFormatting(tagAtom a.Atom) { p.afe.remove(formattingElement) p.afe.insert(bookmark, clone) - // Step 15. Fix up the stack of open elements. + // Step 19. Fix up the stack of open elements. p.oe.remove(formattingElement) p.oe.insert(p.oe.index(furthestBlock)+1, clone) } } // inBodyEndTagOther performs the "any other end tag" algorithm for inBodyIM. +// "Any other end tag" handling from 12.2.5.5 The rules for parsing tokens in foreign content +// https://html.spec.whatwg.org/multipage/syntax.html#parsing-main-inforeign func (p *parser) inBodyEndTagOther(tagAtom a.Atom) { for i := len(p.oe) - 1; i >= 0; i-- { if p.oe[i].DataAtom == tagAtom { diff --git a/vendor/golang.org/x/net/html/parse_test.go b/vendor/golang.org/x/net/html/parse_test.go deleted file mode 100644 index 8de3b365..00000000 --- a/vendor/golang.org/x/net/html/parse_test.go +++ /dev/null @@ -1,388 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "os" - "path/filepath" - "runtime" - "sort" - "strings" - "testing" - - "github.com/documize/community/Godeps/_workspace/src/golang.org/x/net/html/atom" -) - -// readParseTest reads a single test case from r. -func readParseTest(r *bufio.Reader) (text, want, context string, err error) { - line, err := r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - var b []byte - - // Read the HTML. - if string(line) != "#data\n" { - return "", "", "", fmt.Errorf(`got %q want "#data\n"`, line) - } - for { - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - if line[0] == '#' { - break - } - b = append(b, line...) - } - text = strings.TrimSuffix(string(b), "\n") - b = b[:0] - - // Skip the error list. - if string(line) != "#errors\n" { - return "", "", "", fmt.Errorf(`got %q want "#errors\n"`, line) - } - for { - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - if line[0] == '#' { - break - } - } - - if string(line) == "#document-fragment\n" { - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - context = strings.TrimSpace(string(line)) - line, err = r.ReadSlice('\n') - if err != nil { - return "", "", "", err - } - } - - // Read the dump of what the parse tree should be. - if string(line) != "#document\n" { - return "", "", "", fmt.Errorf(`got %q want "#document\n"`, line) - } - inQuote := false - for { - line, err = r.ReadSlice('\n') - if err != nil && err != io.EOF { - return "", "", "", err - } - trimmed := bytes.Trim(line, "| \n") - if len(trimmed) > 0 { - if line[0] == '|' && trimmed[0] == '"' { - inQuote = true - } - if trimmed[len(trimmed)-1] == '"' && !(line[0] == '|' && len(trimmed) == 1) { - inQuote = false - } - } - if len(line) == 0 || len(line) == 1 && line[0] == '\n' && !inQuote { - break - } - b = append(b, line...) - } - return text, string(b), context, nil -} - -func dumpIndent(w io.Writer, level int) { - io.WriteString(w, "| ") - for i := 0; i < level; i++ { - io.WriteString(w, " ") - } -} - -type sortedAttributes []Attribute - -func (a sortedAttributes) Len() int { - return len(a) -} - -func (a sortedAttributes) Less(i, j int) bool { - if a[i].Namespace != a[j].Namespace { - return a[i].Namespace < a[j].Namespace - } - return a[i].Key < a[j].Key -} - -func (a sortedAttributes) Swap(i, j int) { - a[i], a[j] = a[j], a[i] -} - -func dumpLevel(w io.Writer, n *Node, level int) error { - dumpIndent(w, level) - switch n.Type { - case ErrorNode: - return errors.New("unexpected ErrorNode") - case DocumentNode: - return errors.New("unexpected DocumentNode") - case ElementNode: - if n.Namespace != "" { - fmt.Fprintf(w, "<%s %s>", n.Namespace, n.Data) - } else { - fmt.Fprintf(w, "<%s>", n.Data) - } - attr := sortedAttributes(n.Attr) - sort.Sort(attr) - for _, a := range attr { - io.WriteString(w, "\n") - dumpIndent(w, level+1) - if a.Namespace != "" { - fmt.Fprintf(w, `%s %s="%s"`, a.Namespace, a.Key, a.Val) - } else { - fmt.Fprintf(w, `%s="%s"`, a.Key, a.Val) - } - } - case TextNode: - fmt.Fprintf(w, `"%s"`, n.Data) - case CommentNode: - fmt.Fprintf(w, "", n.Data) - case DoctypeNode: - fmt.Fprintf(w, "") - case scopeMarkerNode: - return errors.New("unexpected scopeMarkerNode") - default: - return errors.New("unknown node type") - } - io.WriteString(w, "\n") - for c := n.FirstChild; c != nil; c = c.NextSibling { - if err := dumpLevel(w, c, level+1); err != nil { - return err - } - } - return nil -} - -func dump(n *Node) (string, error) { - if n == nil || n.FirstChild == nil { - return "", nil - } - var b bytes.Buffer - for c := n.FirstChild; c != nil; c = c.NextSibling { - if err := dumpLevel(&b, c, 0); err != nil { - return "", err - } - } - return b.String(), nil -} - -const testDataDir = "testdata/webkit/" - -func TestParser(t *testing.T) { - testFiles, err := filepath.Glob(testDataDir + "*.dat") - if err != nil { - t.Fatal(err) - } - for _, tf := range testFiles { - f, err := os.Open(tf) - if err != nil { - t.Fatal(err) - } - defer f.Close() - r := bufio.NewReader(f) - - for i := 0; ; i++ { - text, want, context, err := readParseTest(r) - if err == io.EOF { - break - } - if err != nil { - t.Fatal(err) - } - - err = testParseCase(text, want, context) - - if err != nil { - t.Errorf("%s test #%d %q, %s", tf, i, text, err) - } - } - } -} - -// testParseCase tests one test case from the test files. If the test does not -// pass, it returns an error that explains the failure. -// text is the HTML to be parsed, want is a dump of the correct parse tree, -// and context is the name of the context node, if any. -func testParseCase(text, want, context string) (err error) { - defer func() { - if x := recover(); x != nil { - switch e := x.(type) { - case error: - err = e - default: - err = fmt.Errorf("%v", e) - } - } - }() - - var doc *Node - if context == "" { - doc, err = Parse(strings.NewReader(text)) - if err != nil { - return err - } - } else { - contextNode := &Node{ - Type: ElementNode, - DataAtom: atom.Lookup([]byte(context)), - Data: context, - } - nodes, err := ParseFragment(strings.NewReader(text), contextNode) - if err != nil { - return err - } - doc = &Node{ - Type: DocumentNode, - } - for _, n := range nodes { - doc.AppendChild(n) - } - } - - if err := checkTreeConsistency(doc); err != nil { - return err - } - - got, err := dump(doc) - if err != nil { - return err - } - // Compare the parsed tree to the #document section. - if got != want { - return fmt.Errorf("got vs want:\n----\n%s----\n%s----", got, want) - } - - if renderTestBlacklist[text] || context != "" { - return nil - } - - // Check that rendering and re-parsing results in an identical tree. - pr, pw := io.Pipe() - go func() { - pw.CloseWithError(Render(pw, doc)) - }() - doc1, err := Parse(pr) - if err != nil { - return err - } - got1, err := dump(doc1) - if err != nil { - return err - } - if got != got1 { - return fmt.Errorf("got vs got1:\n----\n%s----\n%s----", got, got1) - } - - return nil -} - -// Some test input result in parse trees are not 'well-formed' despite -// following the HTML5 recovery algorithms. Rendering and re-parsing such a -// tree will not result in an exact clone of that tree. We blacklist such -// inputs from the render test. -var renderTestBlacklist = map[string]bool{ - // The second will be reparented to the first
  • 's parent. This - // results in an whose parent is an , which is not 'well-formed'. - `
    XCY`: true, - // The same thing with a

    : - `

    `: true, - // More cases of being reparented: - `aba
    brx
    aoe`: true, - `

    `: true, - `
    `: true, - // A similar reparenting situation involving : - `123`: true, - // A element is reparented, putting it before a table. - // A <plaintext> element can't have anything after it in HTML. - `<table><plaintext><td>`: true, - `<!doctype html><table><plaintext></plaintext>`: true, - `<!doctype html><table><tbody><plaintext></plaintext>`: true, - `<!doctype html><table><tbody><tr><plaintext></plaintext>`: true, - // A form inside a table inside a form doesn't work either. - `<!doctype html><form><table></form><form></table></form>`: true, - // A script that ends at EOF may escape its own closing tag when rendered. - `<!doctype html><script><!--<script `: true, - `<!doctype html><script><!--<script <`: true, - `<!doctype html><script><!--<script <a`: true, - `<!doctype html><script><!--<script </`: true, - `<!doctype html><script><!--<script </s`: true, - `<!doctype html><script><!--<script </script`: true, - `<!doctype html><script><!--<script </scripta`: true, - `<!doctype html><script><!--<script -`: true, - `<!doctype html><script><!--<script -a`: true, - `<!doctype html><script><!--<script -<`: true, - `<!doctype html><script><!--<script --`: true, - `<!doctype html><script><!--<script --a`: true, - `<!doctype html><script><!--<script --<`: true, - `<script><!--<script `: true, - `<script><!--<script <a`: true, - `<script><!--<script </script`: true, - `<script><!--<script </scripta`: true, - `<script><!--<script -`: true, - `<script><!--<script -a`: true, - `<script><!--<script --`: true, - `<script><!--<script --a`: true, - `<script><!--<script <`: true, - `<script><!--<script </`: true, - `<script><!--<script </s`: true, - // Reconstructing the active formatting elements results in a <plaintext> - // element that contains an <a> element. - `<!doctype html><p><a><plaintext>b`: true, -} - -func TestNodeConsistency(t *testing.T) { - // inconsistentNode is a Node whose DataAtom and Data do not agree. - inconsistentNode := &Node{ - Type: ElementNode, - DataAtom: atom.Frameset, - Data: "table", - } - _, err := ParseFragment(strings.NewReader("<p>hello</p>"), inconsistentNode) - if err == nil { - t.Errorf("got nil error, want non-nil") - } -} - -func BenchmarkParser(b *testing.B) { - buf, err := ioutil.ReadFile("testdata/go1.html") - if err != nil { - b.Fatalf("could not read testdata/go1.html: %v", err) - } - b.SetBytes(int64(len(buf))) - runtime.GC() - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - Parse(bytes.NewBuffer(buf)) - } -} diff --git a/vendor/golang.org/x/net/html/render.go b/vendor/golang.org/x/net/html/render.go index 4a833b44..d34564f4 100644 --- a/vendor/golang.org/x/net/html/render.go +++ b/vendor/golang.org/x/net/html/render.go @@ -14,7 +14,7 @@ import ( type writer interface { io.Writer - WriteByte(c byte) error // in Go 1.1, use io.ByteWriter + io.ByteWriter WriteString(string) (int, error) } diff --git a/vendor/golang.org/x/net/html/render_test.go b/vendor/golang.org/x/net/html/render_test.go deleted file mode 100644 index 11da54b3..00000000 --- a/vendor/golang.org/x/net/html/render_test.go +++ /dev/null @@ -1,156 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "testing" -) - -func TestRenderer(t *testing.T) { - nodes := [...]*Node{ - 0: { - Type: ElementNode, - Data: "html", - }, - 1: { - Type: ElementNode, - Data: "head", - }, - 2: { - Type: ElementNode, - Data: "body", - }, - 3: { - Type: TextNode, - Data: "0<1", - }, - 4: { - Type: ElementNode, - Data: "p", - Attr: []Attribute{ - { - Key: "id", - Val: "A", - }, - { - Key: "foo", - Val: `abc"def`, - }, - }, - }, - 5: { - Type: TextNode, - Data: "2", - }, - 6: { - Type: ElementNode, - Data: "b", - Attr: []Attribute{ - { - Key: "empty", - Val: "", - }, - }, - }, - 7: { - Type: TextNode, - Data: "3", - }, - 8: { - Type: ElementNode, - Data: "i", - Attr: []Attribute{ - { - Key: "backslash", - Val: `\`, - }, - }, - }, - 9: { - Type: TextNode, - Data: "&4", - }, - 10: { - Type: TextNode, - Data: "5", - }, - 11: { - Type: ElementNode, - Data: "blockquote", - }, - 12: { - Type: ElementNode, - Data: "br", - }, - 13: { - Type: TextNode, - Data: "6", - }, - } - - // Build a tree out of those nodes, based on a textual representation. - // Only the ".\t"s are significant. The trailing HTML-like text is - // just commentary. The "0:" prefixes are for easy cross-reference with - // the nodes array. - treeAsText := [...]string{ - 0: `<html>`, - 1: `. <head>`, - 2: `. <body>`, - 3: `. . "0&lt;1"`, - 4: `. . <p id="A" foo="abc&#34;def">`, - 5: `. . . "2"`, - 6: `. . . <b empty="">`, - 7: `. . . . "3"`, - 8: `. . . <i backslash="\">`, - 9: `. . . . "&amp;4"`, - 10: `. . "5"`, - 11: `. . <blockquote>`, - 12: `. . <br>`, - 13: `. . "6"`, - } - if len(nodes) != len(treeAsText) { - t.Fatal("len(nodes) != len(treeAsText)") - } - var stack [8]*Node - for i, line := range treeAsText { - level := 0 - for line[0] == '.' { - // Strip a leading ".\t". - line = line[2:] - level++ - } - n := nodes[i] - if level == 0 { - if stack[0] != nil { - t.Fatal("multiple root nodes") - } - stack[0] = n - } else { - stack[level-1].AppendChild(n) - stack[level] = n - for i := level + 1; i < len(stack); i++ { - stack[i] = nil - } - } - // At each stage of tree construction, we check all nodes for consistency. - for j, m := range nodes { - if err := checkNodeConsistency(m); err != nil { - t.Fatalf("i=%d, j=%d: %v", i, j, err) - } - } - } - - want := `<html><head></head><body>0&lt;1<p id="A" foo="abc&#34;def">` + - `2<b empty="">3</b><i backslash="\">&amp;4</i></p>` + - `5<blockquote></blockquote><br/>6</body></html>` - b := new(bytes.Buffer) - if err := Render(b, nodes[0]); err != nil { - t.Fatal(err) - } - if got := b.String(); got != want { - t.Errorf("got vs want:\n%s\n%s\n", got, want) - } -} diff --git a/vendor/golang.org/x/net/html/testdata/go1.html b/vendor/golang.org/x/net/html/testdata/go1.html deleted file mode 100644 index a782cc71..00000000 --- a/vendor/golang.org/x/net/html/testdata/go1.html +++ /dev/null @@ -1,2237 +0,0 @@ -<!DOCTYPE html> -<html> -<head> -<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> - - <title>Go 1 Release Notes - The Go Programming Language</title> - -<link type="text/css" rel="stylesheet" href="/doc/style.css"> -<script type="text/javascript" src="/doc/godocs.js"></script> - -<link rel="search" type="application/opensearchdescription+xml" title="godoc" href="/opensearch.xml" /> - -<script type="text/javascript"> -var _gaq = _gaq || []; -_gaq.push(["_setAccount", "UA-11222381-2"]); -_gaq.push(["_trackPageview"]); -</script> -</head> -<body> - -<div id="topbar"><div class="container wide"> - -<form method="GET" action="/search"> -<div id="menu"> -<a href="/doc/">Documents</a> -<a href="/ref/">References</a> -<a href="/pkg/">Packages</a> -<a href="/project/">The Project</a> -<a href="/help/">Help</a> -<input type="text" id="search" name="q" class="inactive" value="Search"> -</div> -<div id="heading"><a href="/">The Go Programming Language</a></div> -</form> - -</div></div> - -<div id="page" class="wide"> - - - <div id="plusone"><g:plusone size="small" annotation="none"></g:plusone></div> - <h1>Go 1 Release Notes</h1> - - - - -<div id="nav"></div> - - - - -<h2 id="introduction">Introduction to Go 1</h2> - -<p> -Go version 1, Go 1 for short, defines a language and a set of core libraries -that provide a stable foundation for creating reliable products, projects, and -publications. -</p> - -<p> -The driving motivation for Go 1 is stability for its users. People should be able to -write Go programs and expect that they will continue to compile and run without -change, on a time scale of years, including in production environments such as -Google App Engine. Similarly, people should be able to write books about Go, be -able to say which version of Go the book is describing, and have that version -number still be meaningful much later. -</p> - -<p> -Code that compiles in Go 1 should, with few exceptions, continue to compile and -run throughout the lifetime of that version, even as we issue updates and bug -fixes such as Go version 1.1, 1.2, and so on. Other than critical fixes, changes -made to the language and library for subsequent releases of Go 1 may -add functionality but will not break existing Go 1 programs. -<a href="go1compat.html">The Go 1 compatibility document</a> -explains the compatibility guidelines in more detail. -</p> - -<p> -Go 1 is a representation of Go as it used today, not a wholesale rethinking of -the language. We avoided designing new features and instead focused on cleaning -up problems and inconsistencies and improving portability. There are a number -changes to the Go language and packages that we had considered for some time and -prototyped but not released primarily because they are significant and -backwards-incompatible. Go 1 was an opportunity to get them out, which is -helpful for the long term, but also means that Go 1 introduces incompatibilities -for old programs. Fortunately, the <code>go</code> <code>fix</code> tool can -automate much of the work needed to bring programs up to the Go 1 standard. -</p> - -<p> -This document outlines the major changes in Go 1 that will affect programmers -updating existing code; its reference point is the prior release, r60 (tagged as -r60.3). It also explains how to update code from r60 to run under Go 1. -</p> - -<h2 id="language">Changes to the language</h2> - -<h3 id="append">Append</h3> - -<p> -The <code>append</code> predeclared variadic function makes it easy to grow a slice -by adding elements to the end. -A common use is to add bytes to the end of a byte slice when generating output. -However, <code>append</code> did not provide a way to append a string to a <code>[]byte</code>, -which is another common case. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/greeting := ..byte/` `/append.*hello/`}} ---> greeting := []byte{} - greeting = append(greeting, []byte(&#34;hello &#34;)...)</pre> - -<p> -By analogy with the similar property of <code>copy</code>, Go 1 -permits a string to be appended (byte-wise) directly to a byte -slice, reducing the friction between strings and byte slices. -The conversion is no longer necessary: -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/append.*world/`}} ---> greeting = append(greeting, &#34;world&#34;...)</pre> - -<p> -<em>Updating</em>: -This is a new feature, so existing code needs no changes. -</p> - -<h3 id="close">Close</h3> - -<p> -The <code>close</code> predeclared function provides a mechanism -for a sender to signal that no more values will be sent. -It is important to the implementation of <code>for</code> <code>range</code> -loops over channels and is helpful in other situations. -Partly by design and partly because of race conditions that can occur otherwise, -it is intended for use only by the goroutine sending on the channel, -not by the goroutine receiving data. -However, before Go 1 there was no compile-time checking that <code>close</code> -was being used correctly. -</p> - -<p> -To close this gap, at least in part, Go 1 disallows <code>close</code> on receive-only channels. -Attempting to close such a channel is a compile-time error. -</p> - -<pre> - var c chan int - var csend chan&lt;- int = c - var crecv &lt;-chan int = c - close(c) // legal - close(csend) // legal - close(crecv) // illegal -</pre> - -<p> -<em>Updating</em>: -Existing code that attempts to close a receive-only channel was -erroneous even before Go 1 and should be fixed. The compiler will -now reject such code. -</p> - -<h3 id="literals">Composite literals</h3> - -<p> -In Go 1, a composite literal of array, slice, or map type can elide the -type specification for the elements' initializers if they are of pointer type. -All four of the initializations in this example are legal; the last one was illegal before Go 1. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/type Date struct/` `/STOP/`}} ---> type Date struct { - month string - day int - } - <span class="comment">// Struct values, fully qualified; always legal.</span> - holiday1 := []Date{ - Date{&#34;Feb&#34;, 14}, - Date{&#34;Nov&#34;, 11}, - Date{&#34;Dec&#34;, 25}, - } - <span class="comment">// Struct values, type name elided; always legal.</span> - holiday2 := []Date{ - {&#34;Feb&#34;, 14}, - {&#34;Nov&#34;, 11}, - {&#34;Dec&#34;, 25}, - } - <span class="comment">// Pointers, fully qualified, always legal.</span> - holiday3 := []*Date{ - &amp;Date{&#34;Feb&#34;, 14}, - &amp;Date{&#34;Nov&#34;, 11}, - &amp;Date{&#34;Dec&#34;, 25}, - } - <span class="comment">// Pointers, type name elided; legal in Go 1.</span> - holiday4 := []*Date{ - {&#34;Feb&#34;, 14}, - {&#34;Nov&#34;, 11}, - {&#34;Dec&#34;, 25}, - }</pre> - -<p> -<em>Updating</em>: -This change has no effect on existing code, but the command -<code>gofmt</code> <code>-s</code> applied to existing source -will, among other things, elide explicit element types wherever permitted. -</p> - - -<h3 id="init">Goroutines during init</h3> - -<p> -The old language defined that <code>go</code> statements executed during initialization created goroutines but that they did not begin to run until initialization of the entire program was complete. -This introduced clumsiness in many places and, in effect, limited the utility -of the <code>init</code> construct: -if it was possible for another package to use the library during initialization, the library -was forced to avoid goroutines. -This design was done for reasons of simplicity and safety but, -as our confidence in the language grew, it seemed unnecessary. -Running goroutines during initialization is no more complex or unsafe than running them during normal execution. -</p> - -<p> -In Go 1, code that uses goroutines can be called from -<code>init</code> routines and global initialization expressions -without introducing a deadlock. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/PackageGlobal/` `/^}/`}} --->var PackageGlobal int - -func init() { - c := make(chan int) - go initializationFunction(c) - PackageGlobal = &lt;-c -}</pre> - -<p> -<em>Updating</em>: -This is a new feature, so existing code needs no changes, -although it's possible that code that depends on goroutines not starting before <code>main</code> will break. -There was no such code in the standard repository. -</p> - -<h3 id="rune">The rune type</h3> - -<p> -The language spec allows the <code>int</code> type to be 32 or 64 bits wide, but current implementations set <code>int</code> to 32 bits even on 64-bit platforms. -It would be preferable to have <code>int</code> be 64 bits on 64-bit platforms. -(There are important consequences for indexing large slices.) -However, this change would waste space when processing Unicode characters with -the old language because the <code>int</code> type was also used to hold Unicode code points: each code point would waste an extra 32 bits of storage if <code>int</code> grew from 32 bits to 64. -</p> - -<p> -To make changing to 64-bit <code>int</code> feasible, -Go 1 introduces a new basic type, <code>rune</code>, to represent -individual Unicode code points. -It is an alias for <code>int32</code>, analogous to <code>byte</code> -as an alias for <code>uint8</code>. -</p> - -<p> -Character literals such as <code>'a'</code>, <code>'語'</code>, and <code>'\u0345'</code> -now have default type <code>rune</code>, -analogous to <code>1.0</code> having default type <code>float64</code>. -A variable initialized to a character constant will therefore -have type <code>rune</code> unless otherwise specified. -</p> - -<p> -Libraries have been updated to use <code>rune</code> rather than <code>int</code> -when appropriate. For instance, the functions <code>unicode.ToLower</code> and -relatives now take and return a <code>rune</code>. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/STARTRUNE/` `/ENDRUNE/`}} ---> delta := &#39;δ&#39; <span class="comment">// delta has type rune.</span> - var DELTA rune - DELTA = unicode.ToUpper(delta) - epsilon := unicode.ToLower(DELTA + 1) - if epsilon != &#39;δ&#39;+1 { - log.Fatal(&#34;inconsistent casing for Greek&#34;) - }</pre> - -<p> -<em>Updating</em>: -Most source code will be unaffected by this because the type inference from -<code>:=</code> initializers introduces the new type silently, and it propagates -from there. -Some code may get type errors that a trivial conversion will resolve. -</p> - -<h3 id="error">The error type</h3> - -<p> -Go 1 introduces a new built-in type, <code>error</code>, which has the following definition: -</p> - -<pre> - type error interface { - Error() string - } -</pre> - -<p> -Since the consequences of this type are all in the package library, -it is discussed <a href="#errors">below</a>. -</p> - -<h3 id="delete">Deleting from maps</h3> - -<p> -In the old language, to delete the entry with key <code>k</code> from map <code>m</code>, one wrote the statement, -</p> - -<pre> - m[k] = value, false -</pre> - -<p> -This syntax was a peculiar special case, the only two-to-one assignment. -It required passing a value (usually ignored) that is evaluated but discarded, -plus a boolean that was nearly always the constant <code>false</code>. -It did the job but was odd and a point of contention. -</p> - -<p> -In Go 1, that syntax has gone; instead there is a new built-in -function, <code>delete</code>. The call -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/delete\(m, k\)/`}} ---> delete(m, k)</pre> - -<p> -will delete the map entry retrieved by the expression <code>m[k]</code>. -There is no return value. Deleting a non-existent entry is a no-op. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will convert expressions of the form <code>m[k] = value, -false</code> into <code>delete(m, k)</code> when it is clear that -the ignored value can be safely discarded from the program and -<code>false</code> refers to the predefined boolean constant. -The fix tool -will flag other uses of the syntax for inspection by the programmer. -</p> - -<h3 id="iteration">Iterating in maps</h3> - -<p> -The old language specification did not define the order of iteration for maps, -and in practice it differed across hardware platforms. -This caused tests that iterated over maps to be fragile and non-portable, with the -unpleasant property that a test might always pass on one machine but break on another. -</p> - -<p> -In Go 1, the order in which elements are visited when iterating -over a map using a <code>for</code> <code>range</code> statement -is defined to be unpredictable, even if the same loop is run multiple -times with the same map. -Code should not assume that the elements are visited in any particular order. -</p> - -<p> -This change means that code that depends on iteration order is very likely to break early and be fixed long before it becomes a problem. -Just as important, it allows the map implementation to ensure better map balancing even when programs are using range loops to select an element from a map. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/Sunday/` `/^ }/`}} ---> m := map[string]int{&#34;Sunday&#34;: 0, &#34;Monday&#34;: 1} - for name, value := range m { - <span class="comment">// This loop should not assume Sunday will be visited first.</span> - f(name, value) - }</pre> - -<p> -<em>Updating</em>: -This is one change where tools cannot help. Most existing code -will be unaffected, but some programs may break or misbehave; we -recommend manual checking of all range statements over maps to -verify they do not depend on iteration order. There were a few such -examples in the standard repository; they have been fixed. -Note that it was already incorrect to depend on the iteration order, which -was unspecified. This change codifies the unpredictability. -</p> - -<h3 id="multiple_assignment">Multiple assignment</h3> - -<p> -The language specification has long guaranteed that in assignments -the right-hand-side expressions are all evaluated before any left-hand-side expressions are assigned. -To guarantee predictable behavior, -Go 1 refines the specification further. -</p> - -<p> -If the left-hand side of the assignment -statement contains expressions that require evaluation, such as -function calls or array indexing operations, these will all be done -using the usual left-to-right rule before any variables are assigned -their value. Once everything is evaluated, the actual assignments -proceed in left-to-right order. -</p> - -<p> -These examples illustrate the behavior. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/sa :=/` `/then sc.0. = 2/`}} ---> sa := []int{1, 2, 3} - i := 0 - i, sa[i] = 1, 2 <span class="comment">// sets i = 1, sa[0] = 2</span> - - sb := []int{1, 2, 3} - j := 0 - sb[j], j = 2, 1 <span class="comment">// sets sb[0] = 2, j = 1</span> - - sc := []int{1, 2, 3} - sc[0], sc[0] = 1, 2 <span class="comment">// sets sc[0] = 1, then sc[0] = 2 (so sc[0] = 2 at end)</span></pre> - -<p> -<em>Updating</em>: -This is one change where tools cannot help, but breakage is unlikely. -No code in the standard repository was broken by this change, and code -that depended on the previous unspecified behavior was already incorrect. -</p> - -<h3 id="shadowing">Returns and shadowed variables</h3> - -<p> -A common mistake is to use <code>return</code> (without arguments) after an assignment to a variable that has the same name as a result variable but is not the same variable. -This situation is called <em>shadowing</em>: the result variable has been shadowed by another variable with the same name declared in an inner scope. -</p> - -<p> -In functions with named return values, -the Go 1 compilers disallow return statements without arguments if any of the named return values is shadowed at the point of the return statement. -(It isn't part of the specification, because this is one area we are still exploring; -the situation is analogous to the compilers rejecting functions that do not end with an explicit return statement.) -</p> - -<p> -This function implicitly returns a shadowed return value and will be rejected by the compiler: -</p> - -<pre> - func Bug() (i, j, k int) { - for i = 0; i &lt; 5; i++ { - for j := 0; j &lt; 5; j++ { // Redeclares j. - k += i*j - if k > 100 { - return // Rejected: j is shadowed here. - } - } - } - return // OK: j is not shadowed here. - } -</pre> - -<p> -<em>Updating</em>: -Code that shadows return values in this way will be rejected by the compiler and will need to be fixed by hand. -The few cases that arose in the standard repository were mostly bugs. -</p> - -<h3 id="unexported">Copying structs with unexported fields</h3> - -<p> -The old language did not allow a package to make a copy of a struct value containing unexported fields belonging to a different package. -There was, however, a required exception for a method receiver; -also, the implementations of <code>copy</code> and <code>append</code> have never honored the restriction. -</p> - -<p> -Go 1 will allow packages to copy struct values containing unexported fields from other packages. -Besides resolving the inconsistency, -this change admits a new kind of API: a package can return an opaque value without resorting to a pointer or interface. -The new implementations of <code>time.Time</code> and -<code>reflect.Value</code> are examples of types taking advantage of this new property. -</p> - -<p> -As an example, if package <code>p</code> includes the definitions, -</p> - -<pre> - type Struct struct { - Public int - secret int - } - func NewStruct(a int) Struct { // Note: not a pointer. - return Struct{a, f(a)} - } - func (s Struct) String() string { - return fmt.Sprintf("{%d (secret %d)}", s.Public, s.secret) - } -</pre> - -<p> -a package that imports <code>p</code> can assign and copy values of type -<code>p.Struct</code> at will. -Behind the scenes the unexported fields will be assigned and copied just -as if they were exported, -but the client code will never be aware of them. The code -</p> - -<pre> - import "p" - - myStruct := p.NewStruct(23) - copyOfMyStruct := myStruct - fmt.Println(myStruct, copyOfMyStruct) -</pre> - -<p> -will show that the secret field of the struct has been copied to the new value. -</p> - -<p> -<em>Updating</em>: -This is a new feature, so existing code needs no changes. -</p> - -<h3 id="equality">Equality</h3> - -<p> -Before Go 1, the language did not define equality on struct and array values. -This meant, -among other things, that structs and arrays could not be used as map keys. -On the other hand, Go did define equality on function and map values. -Function equality was problematic in the presence of closures -(when are two closures equal?) -while map equality compared pointers, not the maps' content, which was usually -not what the user would want. -</p> - -<p> -Go 1 addressed these issues. -First, structs and arrays can be compared for equality and inequality -(<code>==</code> and <code>!=</code>), -and therefore be used as map keys, -provided they are composed from elements for which equality is also defined, -using element-wise comparison. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/type Day struct/` `/Printf/`}} ---> type Day struct { - long string - short string - } - Christmas := Day{&#34;Christmas&#34;, &#34;XMas&#34;} - Thanksgiving := Day{&#34;Thanksgiving&#34;, &#34;Turkey&#34;} - holiday := map[Day]bool{ - Christmas: true, - Thanksgiving: true, - } - fmt.Printf(&#34;Christmas is a holiday: %t\n&#34;, holiday[Christmas])</pre> - -<p> -Second, Go 1 removes the definition of equality for function values, -except for comparison with <code>nil</code>. -Finally, map equality is gone too, also except for comparison with <code>nil</code>. -</p> - -<p> -Note that equality is still undefined for slices, for which the -calculation is in general infeasible. Also note that the ordered -comparison operators (<code>&lt;</code> <code>&lt;=</code> -<code>&gt;</code> <code>&gt;=</code>) are still undefined for -structs and arrays. - -<p> -<em>Updating</em>: -Struct and array equality is a new feature, so existing code needs no changes. -Existing code that depends on function or map equality will be -rejected by the compiler and will need to be fixed by hand. -Few programs will be affected, but the fix may require some -redesign. -</p> - -<h2 id="packages">The package hierarchy</h2> - -<p> -Go 1 addresses many deficiencies in the old standard library and -cleans up a number of packages, making them more internally consistent -and portable. -</p> - -<p> -This section describes how the packages have been rearranged in Go 1. -Some have moved, some have been renamed, some have been deleted. -New packages are described in later sections. -</p> - -<h3 id="hierarchy">The package hierarchy</h3> - -<p> -Go 1 has a rearranged package hierarchy that groups related items -into subdirectories. For instance, <code>utf8</code> and -<code>utf16</code> now occupy subdirectories of <code>unicode</code>. -Also, <a href="#subrepo">some packages</a> have moved into -subrepositories of -<a href="http://code.google.com/p/go"><code>code.google.com/p/go</code></a> -while <a href="#deleted">others</a> have been deleted outright. -</p> - -<table class="codetable" frame="border" summary="Moved packages"> -<colgroup align="left" width="60%"></colgroup> -<colgroup align="left" width="40%"></colgroup> -<tr> -<th align="left">Old path</th> -<th align="left">New path</th> -</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>asn1</td> <td>encoding/asn1</td></tr> -<tr><td>csv</td> <td>encoding/csv</td></tr> -<tr><td>gob</td> <td>encoding/gob</td></tr> -<tr><td>json</td> <td>encoding/json</td></tr> -<tr><td>xml</td> <td>encoding/xml</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>exp/template/html</td> <td>html/template</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>big</td> <td>math/big</td></tr> -<tr><td>cmath</td> <td>math/cmplx</td></tr> -<tr><td>rand</td> <td>math/rand</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>http</td> <td>net/http</td></tr> -<tr><td>http/cgi</td> <td>net/http/cgi</td></tr> -<tr><td>http/fcgi</td> <td>net/http/fcgi</td></tr> -<tr><td>http/httptest</td> <td>net/http/httptest</td></tr> -<tr><td>http/pprof</td> <td>net/http/pprof</td></tr> -<tr><td>mail</td> <td>net/mail</td></tr> -<tr><td>rpc</td> <td>net/rpc</td></tr> -<tr><td>rpc/jsonrpc</td> <td>net/rpc/jsonrpc</td></tr> -<tr><td>smtp</td> <td>net/smtp</td></tr> -<tr><td>url</td> <td>net/url</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>exec</td> <td>os/exec</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>scanner</td> <td>text/scanner</td></tr> -<tr><td>tabwriter</td> <td>text/tabwriter</td></tr> -<tr><td>template</td> <td>text/template</td></tr> -<tr><td>template/parse</td> <td>text/template/parse</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>utf8</td> <td>unicode/utf8</td></tr> -<tr><td>utf16</td> <td>unicode/utf16</td></tr> -</table> - -<p> -Note that the package names for the old <code>cmath</code> and -<code>exp/template/html</code> packages have changed to <code>cmplx</code> -and <code>template</code>. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update all imports and package renames for packages that -remain inside the standard repository. Programs that import packages -that are no longer in the standard repository will need to be edited -by hand. -</p> - -<h3 id="exp">The package tree exp</h3> - -<p> -Because they are not standardized, the packages under the <code>exp</code> directory will not be available in the -standard Go 1 release distributions, although they will be available in source code form -in <a href="http://code.google.com/p/go/">the repository</a> for -developers who wish to use them. -</p> - -<p> -Several packages have moved under <code>exp</code> at the time of Go 1's release: -</p> - -<ul> -<li><code>ebnf</code></li> -<li><code>html</code><sup>&#8224;</sup></li> -<li><code>go/types</code></li> -</ul> - -<p> -(<sup>&#8224;</sup>The <code>EscapeString</code> and <code>UnescapeString</code> types remain -in package <code>html</code>.) -</p> - -<p> -All these packages are available under the same names, with the prefix <code>exp/</code>: <code>exp/ebnf</code> etc. -</p> - -<p> -Also, the <code>utf8.String</code> type has been moved to its own package, <code>exp/utf8string</code>. -</p> - -<p> -Finally, the <code>gotype</code> command now resides in <code>exp/gotype</code>, while -<code>ebnflint</code> is now in <code>exp/ebnflint</code>. -If they are installed, they now reside in <code>$GOROOT/bin/tool</code>. -</p> - -<p> -<em>Updating</em>: -Code that uses packages in <code>exp</code> will need to be updated by hand, -or else compiled from an installation that has <code>exp</code> available. -The <code>go</code> <code>fix</code> tool or the compiler will complain about such uses. -</p> - -<h3 id="old">The package tree old</h3> - -<p> -Because they are deprecated, the packages under the <code>old</code> directory will not be available in the -standard Go 1 release distributions, although they will be available in source code form for -developers who wish to use them. -</p> - -<p> -The packages in their new locations are: -</p> - -<ul> -<li><code>old/netchan</code></li> -<li><code>old/regexp</code></li> -<li><code>old/template</code></li> -</ul> - -<p> -<em>Updating</em>: -Code that uses packages now in <code>old</code> will need to be updated by hand, -or else compiled from an installation that has <code>old</code> available. -The <code>go</code> <code>fix</code> tool will warn about such uses. -</p> - -<h3 id="deleted">Deleted packages</h3> - -<p> -Go 1 deletes several packages outright: -</p> - -<ul> -<li><code>container/vector</code></li> -<li><code>exp/datafmt</code></li> -<li><code>go/typechecker</code></li> -<li><code>try</code></li> -</ul> - -<p> -and also the command <code>gotry</code>. -</p> - -<p> -<em>Updating</em>: -Code that uses <code>container/vector</code> should be updated to use -slices directly. See -<a href="http://code.google.com/p/go-wiki/wiki/SliceTricks">the Go -Language Community Wiki</a> for some suggestions. -Code that uses the other packages (there should be almost zero) will need to be rethought. -</p> - -<h3 id="subrepo">Packages moving to subrepositories</h3> - -<p> -Go 1 has moved a number of packages into other repositories, usually sub-repositories of -<a href="http://code.google.com/p/go/">the main Go repository</a>. -This table lists the old and new import paths: - -<table class="codetable" frame="border" summary="Sub-repositories"> -<colgroup align="left" width="40%"></colgroup> -<colgroup align="left" width="60%"></colgroup> -<tr> -<th align="left">Old</th> -<th align="left">New</th> -</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>crypto/bcrypt</td> <td>code.google.com/p/go.crypto/bcrypt</tr> -<tr><td>crypto/blowfish</td> <td>code.google.com/p/go.crypto/blowfish</tr> -<tr><td>crypto/cast5</td> <td>code.google.com/p/go.crypto/cast5</tr> -<tr><td>crypto/md4</td> <td>code.google.com/p/go.crypto/md4</tr> -<tr><td>crypto/ocsp</td> <td>code.google.com/p/go.crypto/ocsp</tr> -<tr><td>crypto/openpgp</td> <td>code.google.com/p/go.crypto/openpgp</tr> -<tr><td>crypto/openpgp/armor</td> <td>code.google.com/p/go.crypto/openpgp/armor</tr> -<tr><td>crypto/openpgp/elgamal</td> <td>code.google.com/p/go.crypto/openpgp/elgamal</tr> -<tr><td>crypto/openpgp/errors</td> <td>code.google.com/p/go.crypto/openpgp/errors</tr> -<tr><td>crypto/openpgp/packet</td> <td>code.google.com/p/go.crypto/openpgp/packet</tr> -<tr><td>crypto/openpgp/s2k</td> <td>code.google.com/p/go.crypto/openpgp/s2k</tr> -<tr><td>crypto/ripemd160</td> <td>code.google.com/p/go.crypto/ripemd160</tr> -<tr><td>crypto/twofish</td> <td>code.google.com/p/go.crypto/twofish</tr> -<tr><td>crypto/xtea</td> <td>code.google.com/p/go.crypto/xtea</tr> -<tr><td>exp/ssh</td> <td>code.google.com/p/go.crypto/ssh</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>image/bmp</td> <td>code.google.com/p/go.image/bmp</tr> -<tr><td>image/tiff</td> <td>code.google.com/p/go.image/tiff</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>net/dict</td> <td>code.google.com/p/go.net/dict</tr> -<tr><td>net/websocket</td> <td>code.google.com/p/go.net/websocket</tr> -<tr><td>exp/spdy</td> <td>code.google.com/p/go.net/spdy</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>encoding/git85</td> <td>code.google.com/p/go.codereview/git85</tr> -<tr><td>patch</td> <td>code.google.com/p/go.codereview/patch</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>exp/wingui</td> <td>code.google.com/p/gowingui</tr> -</table> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update imports of these packages to use the new import paths. -Installations that depend on these packages will need to install them using -a <code>go get</code> command. -</p> - -<h2 id="major">Major changes to the library</h2> - -<p> -This section describes significant changes to the core libraries, the ones that -affect the most programs. -</p> - -<h3 id="errors">The error type and errors package</h3> - -<p> -The placement of <code>os.Error</code> in package <code>os</code> is mostly historical: errors first came up when implementing package <code>os</code>, and they seemed system-related at the time. -Since then it has become clear that errors are more fundamental than the operating system. For example, it would be nice to use <code>Errors</code> in packages that <code>os</code> depends on, like <code>syscall</code>. -Also, having <code>Error</code> in <code>os</code> introduces many dependencies on <code>os</code> that would otherwise not exist. -</p> - -<p> -Go 1 solves these problems by introducing a built-in <code>error</code> interface type and a separate <code>errors</code> package (analogous to <code>bytes</code> and <code>strings</code>) that contains utility functions. -It replaces <code>os.NewError</code> with -<a href="/pkg/errors/#New"><code>errors.New</code></a>, -giving errors a more central place in the environment. -</p> - -<p> -So the widely-used <code>String</code> method does not cause accidental satisfaction -of the <code>error</code> interface, the <code>error</code> interface uses instead -the name <code>Error</code> for that method: -</p> - -<pre> - type error interface { - Error() string - } -</pre> - -<p> -The <code>fmt</code> library automatically invokes <code>Error</code>, as it already -does for <code>String</code>, for easy printing of error values. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/START ERROR EXAMPLE/` `/END ERROR EXAMPLE/`}} --->type SyntaxError struct { - File string - Line int - Message string -} - -func (se *SyntaxError) Error() string { - return fmt.Sprintf(&#34;%s:%d: %s&#34;, se.File, se.Line, se.Message) -}</pre> - -<p> -All standard packages have been updated to use the new interface; the old <code>os.Error</code> is gone. -</p> - -<p> -A new package, <a href="/pkg/errors/"><code>errors</code></a>, contains the function -</p> - -<pre> -func New(text string) error -</pre> - -<p> -to turn a string into an error. It replaces the old <code>os.NewError</code>. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/ErrSyntax/`}} ---> var ErrSyntax = errors.New(&#34;syntax error&#34;)</pre> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update almost all code affected by the change. -Code that defines error types with a <code>String</code> method will need to be updated -by hand to rename the methods to <code>Error</code>. -</p> - -<h3 id="errno">System call errors</h3> - -<p> -The old <code>syscall</code> package, which predated <code>os.Error</code> -(and just about everything else), -returned errors as <code>int</code> values. -In turn, the <code>os</code> package forwarded many of these errors, such -as <code>EINVAL</code>, but using a different set of errors on each platform. -This behavior was unpleasant and unportable. -</p> - -<p> -In Go 1, the -<a href="/pkg/syscall/"><code>syscall</code></a> -package instead returns an <code>error</code> for system call errors. -On Unix, the implementation is done by a -<a href="/pkg/syscall/#Errno"><code>syscall.Errno</code></a> type -that satisfies <code>error</code> and replaces the old <code>os.Errno</code>. -</p> - -<p> -The changes affecting <code>os.EINVAL</code> and relatives are -described <a href="#os">elsewhere</a>. - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update almost all code affected by the change. -Regardless, most code should use the <code>os</code> package -rather than <code>syscall</code> and so will be unaffected. -</p> - -<h3 id="time">Time</h3> - -<p> -Time is always a challenge to support well in a programming language. -The old Go <code>time</code> package had <code>int64</code> units, no -real type safety, -and no distinction between absolute times and durations. -</p> - -<p> -One of the most sweeping changes in the Go 1 library is therefore a -complete redesign of the -<a href="/pkg/time/"><code>time</code></a> package. -Instead of an integer number of nanoseconds as an <code>int64</code>, -and a separate <code>*time.Time</code> type to deal with human -units such as hours and years, -there are now two fundamental types: -<a href="/pkg/time/#Time"><code>time.Time</code></a> -(a value, so the <code>*</code> is gone), which represents a moment in time; -and <a href="/pkg/time/#Duration"><code>time.Duration</code></a>, -which represents an interval. -Both have nanosecond resolution. -A <code>Time</code> can represent any time into the ancient -past and remote future, while a <code>Duration</code> can -span plus or minus only about 290 years. -There are methods on these types, plus a number of helpful -predefined constant durations such as <code>time.Second</code>. -</p> - -<p> -Among the new methods are things like -<a href="/pkg/time/#Time.Add"><code>Time.Add</code></a>, -which adds a <code>Duration</code> to a <code>Time</code>, and -<a href="/pkg/time/#Time.Sub"><code>Time.Sub</code></a>, -which subtracts two <code>Times</code> to yield a <code>Duration</code>. -</p> - -<p> -The most important semantic change is that the Unix epoch (Jan 1, 1970) is now -relevant only for those functions and methods that mention Unix: -<a href="/pkg/time/#Unix"><code>time.Unix</code></a> -and the <a href="/pkg/time/#Time.Unix"><code>Unix</code></a> -and <a href="/pkg/time/#Time.UnixNano"><code>UnixNano</code></a> methods -of the <code>Time</code> type. -In particular, -<a href="/pkg/time/#Now"><code>time.Now</code></a> -returns a <code>time.Time</code> value rather than, in the old -API, an integer nanosecond count since the Unix epoch. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/sleepUntil/` `/^}/`}} ---><span class="comment">// sleepUntil sleeps until the specified time. It returns immediately if it&#39;s too late.</span> -func sleepUntil(wakeup time.Time) { - now := time.Now() <span class="comment">// A Time.</span> - if !wakeup.After(now) { - return - } - delta := wakeup.Sub(now) <span class="comment">// A Duration.</span> - fmt.Printf(&#34;Sleeping for %.3fs\n&#34;, delta.Seconds()) - time.Sleep(delta) -}</pre> - -<p> -The new types, methods, and constants have been propagated through -all the standard packages that use time, such as <code>os</code> and -its representation of file time stamps. -</p> - -<p> -<em>Updating</em>: -The <code>go</code> <code>fix</code> tool will update many uses of the old <code>time</code> package to use the new -types and methods, although it does not replace values such as <code>1e9</code> -representing nanoseconds per second. -Also, because of type changes in some of the values that arise, -some of the expressions rewritten by the fix tool may require -further hand editing; in such cases the rewrite will include -the correct function or method for the old functionality, but -may have the wrong type or require further analysis. -</p> - -<h2 id="minor">Minor changes to the library</h2> - -<p> -This section describes smaller changes, such as those to less commonly -used packages or that affect -few programs beyond the need to run <code>go</code> <code>fix</code>. -This category includes packages that are new in Go 1. -Collectively they improve portability, regularize behavior, and -make the interfaces more modern and Go-like. -</p> - -<h3 id="archive_zip">The archive/zip package</h3> - -<p> -In Go 1, <a href="/pkg/archive/zip/#Writer"><code>*zip.Writer</code></a> no -longer has a <code>Write</code> method. Its presence was a mistake. -</p> - -<p> -<em>Updating</em>: -What little code is affected will be caught by the compiler and must be updated by hand. -</p> - -<h3 id="bufio">The bufio package</h3> - -<p> -In Go 1, <a href="/pkg/bufio/#NewReaderSize"><code>bufio.NewReaderSize</code></a> -and -<a href="/pkg/bufio/#NewWriterSize"><code>bufio.NewWriterSize</code></a> -functions no longer return an error for invalid sizes. -If the argument size is too small or invalid, it is adjusted. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update calls that assign the error to _. -Calls that aren't fixed will be caught by the compiler and must be updated by hand. -</p> - -<h3 id="compress">The compress/flate, compress/gzip and compress/zlib packages</h3> - -<p> -In Go 1, the <code>NewWriterXxx</code> functions in -<a href="/pkg/compress/flate"><code>compress/flate</code></a>, -<a href="/pkg/compress/gzip"><code>compress/gzip</code></a> and -<a href="/pkg/compress/zlib"><code>compress/zlib</code></a> -all return <code>(*Writer, error)</code> if they take a compression level, -and <code>*Writer</code> otherwise. Package <code>gzip</code>'s -<code>Compressor</code> and <code>Decompressor</code> types have been renamed -to <code>Writer</code> and <code>Reader</code>. Package <code>flate</code>'s -<code>WrongValueError</code> type has been removed. -</p> - -<p> -<em>Updating</em> -Running <code>go</code> <code>fix</code> will update old names and calls that assign the error to _. -Calls that aren't fixed will be caught by the compiler and must be updated by hand. -</p> - -<h3 id="crypto_aes_des">The crypto/aes and crypto/des packages</h3> - -<p> -In Go 1, the <code>Reset</code> method has been removed. Go does not guarantee -that memory is not copied and therefore this method was misleading. -</p> - -<p> -The cipher-specific types <code>*aes.Cipher</code>, <code>*des.Cipher</code>, -and <code>*des.TripleDESCipher</code> have been removed in favor of -<code>cipher.Block</code>. -</p> - -<p> -<em>Updating</em>: -Remove the calls to Reset. Replace uses of the specific cipher types with -cipher.Block. -</p> - -<h3 id="crypto_elliptic">The crypto/elliptic package</h3> - -<p> -In Go 1, <a href="/pkg/crypto/elliptic/#Curve"><code>elliptic.Curve</code></a> -has been made an interface to permit alternative implementations. The curve -parameters have been moved to the -<a href="/pkg/crypto/elliptic/#CurveParams"><code>elliptic.CurveParams</code></a> -structure. -</p> - -<p> -<em>Updating</em>: -Existing users of <code>*elliptic.Curve</code> will need to change to -simply <code>elliptic.Curve</code>. Calls to <code>Marshal</code>, -<code>Unmarshal</code> and <code>GenerateKey</code> are now functions -in <code>crypto/elliptic</code> that take an <code>elliptic.Curve</code> -as their first argument. -</p> - -<h3 id="crypto_hmac">The crypto/hmac package</h3> - -<p> -In Go 1, the hash-specific functions, such as <code>hmac.NewMD5</code>, have -been removed from <code>crypto/hmac</code>. Instead, <code>hmac.New</code> takes -a function that returns a <code>hash.Hash</code>, such as <code>md5.New</code>. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will perform the needed changes. -</p> - -<h3 id="crypto_x509">The crypto/x509 package</h3> - -<p> -In Go 1, the -<a href="/pkg/crypto/x509/#CreateCertificate"><code>CreateCertificate</code></a> -and -<a href="/pkg/crypto/x509/#CreateCRL"><code>CreateCRL</code></a> -functions in <code>crypto/x509</code> have been altered to take an -<code>interface{}</code> where they previously took a <code>*rsa.PublicKey</code> -or <code>*rsa.PrivateKey</code>. This will allow other public key algorithms -to be implemented in the future. -</p> - -<p> -<em>Updating</em>: -No changes will be needed. -</p> - -<h3 id="encoding_binary">The encoding/binary package</h3> - -<p> -In Go 1, the <code>binary.TotalSize</code> function has been replaced by -<a href="/pkg/encoding/binary/#Size"><code>Size</code></a>, -which takes an <code>interface{}</code> argument rather than -a <code>reflect.Value</code>. -</p> - -<p> -<em>Updating</em>: -What little code is affected will be caught by the compiler and must be updated by hand. -</p> - -<h3 id="encoding_xml">The encoding/xml package</h3> - -<p> -In Go 1, the <a href="/pkg/encoding/xml/"><code>xml</code></a> package -has been brought closer in design to the other marshaling packages such -as <a href="/pkg/encoding/gob/"><code>encoding/gob</code></a>. -</p> - -<p> -The old <code>Parser</code> type is renamed -<a href="/pkg/encoding/xml/#Decoder"><code>Decoder</code></a> and has a new -<a href="/pkg/encoding/xml/#Decoder.Decode"><code>Decode</code></a> method. An -<a href="/pkg/encoding/xml/#Encoder"><code>Encoder</code></a> type was also introduced. -</p> - -<p> -The functions <a href="/pkg/encoding/xml/#Marshal"><code>Marshal</code></a> -and <a href="/pkg/encoding/xml/#Unmarshal"><code>Unmarshal</code></a> -work with <code>[]byte</code> values now. To work with streams, -use the new <a href="/pkg/encoding/xml/#Encoder"><code>Encoder</code></a> -and <a href="/pkg/encoding/xml/#Decoder"><code>Decoder</code></a> types. -</p> - -<p> -When marshaling or unmarshaling values, the format of supported flags in -field tags has changed to be closer to the -<a href="/pkg/encoding/json"><code>json</code></a> package -(<code>`xml:"name,flag"`</code>). The matching done between field tags, field -names, and the XML attribute and element names is now case-sensitive. -The <code>XMLName</code> field tag, if present, must also match the name -of the XML element being marshaled. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update most uses of the package except for some calls to -<code>Unmarshal</code>. Special care must be taken with field tags, -since the fix tool will not update them and if not fixed by hand they will -misbehave silently in some cases. For example, the old -<code>"attr"</code> is now written <code>",attr"</code> while plain -<code>"attr"</code> remains valid but with a different meaning. -</p> - -<h3 id="expvar">The expvar package</h3> - -<p> -In Go 1, the <code>RemoveAll</code> function has been removed. -The <code>Iter</code> function and Iter method on <code>*Map</code> have -been replaced by -<a href="/pkg/expvar/#Do"><code>Do</code></a> -and -<a href="/pkg/expvar/#Map.Do"><code>(*Map).Do</code></a>. -</p> - -<p> -<em>Updating</em>: -Most code using <code>expvar</code> will not need changing. The rare code that used -<code>Iter</code> can be updated to pass a closure to <code>Do</code> to achieve the same effect. -</p> - -<h3 id="flag">The flag package</h3> - -<p> -In Go 1, the interface <a href="/pkg/flag/#Value"><code>flag.Value</code></a> has changed slightly. -The <code>Set</code> method now returns an <code>error</code> instead of -a <code>bool</code> to indicate success or failure. -</p> - -<p> -There is also a new kind of flag, <code>Duration</code>, to support argument -values specifying time intervals. -Values for such flags must be given units, just as <code>time.Duration</code> -formats them: <code>10s</code>, <code>1h30m</code>, etc. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/timeout/`}} --->var timeout = flag.Duration(&#34;timeout&#34;, 30*time.Second, &#34;how long to wait for completion&#34;)</pre> - -<p> -<em>Updating</em>: -Programs that implement their own flags will need minor manual fixes to update their -<code>Set</code> methods. -The <code>Duration</code> flag is new and affects no existing code. -</p> - - -<h3 id="go">The go/* packages</h3> - -<p> -Several packages under <code>go</code> have slightly revised APIs. -</p> - -<p> -A concrete <code>Mode</code> type was introduced for configuration mode flags -in the packages -<a href="/pkg/go/scanner/"><code>go/scanner</code></a>, -<a href="/pkg/go/parser/"><code>go/parser</code></a>, -<a href="/pkg/go/printer/"><code>go/printer</code></a>, and -<a href="/pkg/go/doc/"><code>go/doc</code></a>. -</p> - -<p> -The modes <code>AllowIllegalChars</code> and <code>InsertSemis</code> have been removed -from the <a href="/pkg/go/scanner/"><code>go/scanner</code></a> package. They were mostly -useful for scanning text other then Go source files. Instead, the -<a href="/pkg/text/scanner/"><code>text/scanner</code></a> package should be used -for that purpose. -</p> - -<p> -The <a href="/pkg/go/scanner/#ErrorHandler"><code>ErrorHandler</code></a> provided -to the scanner's <a href="/pkg/go/scanner/#Scanner.Init"><code>Init</code></a> method is -now simply a function rather than an interface. The <code>ErrorVector</code> type has -been removed in favor of the (existing) <a href="/pkg/go/scanner/#ErrorList"><code>ErrorList</code></a> -type, and the <code>ErrorVector</code> methods have been migrated. Instead of embedding -an <code>ErrorVector</code> in a client of the scanner, now a client should maintain -an <code>ErrorList</code>. -</p> - -<p> -The set of parse functions provided by the <a href="/pkg/go/parser/"><code>go/parser</code></a> -package has been reduced to the primary parse function -<a href="/pkg/go/parser/#ParseFile"><code>ParseFile</code></a>, and a couple of -convenience functions <a href="/pkg/go/parser/#ParseDir"><code>ParseDir</code></a> -and <a href="/pkg/go/parser/#ParseExpr"><code>ParseExpr</code></a>. -</p> - -<p> -The <a href="/pkg/go/printer/"><code>go/printer</code></a> package supports an additional -configuration mode <a href="/pkg/go/printer/#Mode"><code>SourcePos</code></a>; -if set, the printer will emit <code>//line</code> comments such that the generated -output contains the original source code position information. The new type -<a href="/pkg/go/printer/#CommentedNode"><code>CommentedNode</code></a> can be -used to provide comments associated with an arbitrary -<a href="/pkg/go/ast/#Node"><code>ast.Node</code></a> (until now only -<a href="/pkg/go/ast/#File"><code>ast.File</code></a> carried comment information). -</p> - -<p> -The type names of the <a href="/pkg/go/doc/"><code>go/doc</code></a> package have been -streamlined by removing the <code>Doc</code> suffix: <code>PackageDoc</code> -is now <code>Package</code>, <code>ValueDoc</code> is <code>Value</code>, etc. -Also, all types now consistently have a <code>Name</code> field (or <code>Names</code>, -in the case of type <code>Value</code>) and <code>Type.Factories</code> has become -<code>Type.Funcs</code>. -Instead of calling <code>doc.NewPackageDoc(pkg, importpath)</code>, -documentation for a package is created with: -</p> - -<pre> - doc.New(pkg, importpath, mode) -</pre> - -<p> -where the new <code>mode</code> parameter specifies the operation mode: -if set to <a href="/pkg/go/doc/#AllDecls"><code>AllDecls</code></a>, all declarations -(not just exported ones) are considered. -The function <code>NewFileDoc</code> was removed, and the function -<code>CommentText</code> has become the method -<a href="/pkg/go/ast/#Text"><code>Text</code></a> of -<a href="/pkg/go/ast/#CommentGroup"><code>ast.CommentGroup</code></a>. -</p> - -<p> -In package <a href="/pkg/go/token/"><code>go/token</code></a>, the -<a href="/pkg/go/token/#FileSet"><code>token.FileSet</code></a> method <code>Files</code> -(which originally returned a channel of <code>*token.File</code>s) has been replaced -with the iterator <a href="/pkg/go/token/#FileSet.Iterate"><code>Iterate</code></a> that -accepts a function argument instead. -</p> - -<p> -In package <a href="/pkg/go/build/"><code>go/build</code></a>, the API -has been nearly completely replaced. -The package still computes Go package information -but it does not run the build: the <code>Cmd</code> and <code>Script</code> -types are gone. -(To build code, use the new -<a href="/cmd/go/"><code>go</code></a> command instead.) -The <code>DirInfo</code> type is now named -<a href="/pkg/go/build/#Package"><code>Package</code></a>. -<code>FindTree</code> and <code>ScanDir</code> are replaced by -<a href="/pkg/go/build/#Import"><code>Import</code></a> -and -<a href="/pkg/go/build/#ImportDir"><code>ImportDir</code></a>. -</p> - -<p> -<em>Updating</em>: -Code that uses packages in <code>go</code> will have to be updated by hand; the -compiler will reject incorrect uses. Templates used in conjunction with any of the -<code>go/doc</code> types may need manual fixes; the renamed fields will lead -to run-time errors. -</p> - -<h3 id="hash">The hash package</h3> - -<p> -In Go 1, the definition of <a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> includes -a new method, <code>BlockSize</code>. This new method is used primarily in the -cryptographic libraries. -</p> - -<p> -The <code>Sum</code> method of the -<a href="/pkg/hash/#Hash"><code>hash.Hash</code></a> interface now takes a -<code>[]byte</code> argument, to which the hash value will be appended. -The previous behavior can be recreated by adding a <code>nil</code> argument to the call. -</p> - -<p> -<em>Updating</em>: -Existing implementations of <code>hash.Hash</code> will need to add a -<code>BlockSize</code> method. Hashes that process the input one byte at -a time can implement <code>BlockSize</code> to return 1. -Running <code>go</code> <code>fix</code> will update calls to the <code>Sum</code> methods of the various -implementations of <code>hash.Hash</code>. -</p> - -<p> -<em>Updating</em>: -Since the package's functionality is new, no updating is necessary. -</p> - -<h3 id="http">The http package</h3> - -<p> -In Go 1 the <a href="/pkg/net/http/"><code>http</code></a> package is refactored, -putting some of the utilities into a -<a href="/pkg/net/http/httputil/"><code>httputil</code></a> subdirectory. -These pieces are only rarely needed by HTTP clients. -The affected items are: -</p> - -<ul> -<li>ClientConn</li> -<li>DumpRequest</li> -<li>DumpRequestOut</li> -<li>DumpResponse</li> -<li>NewChunkedReader</li> -<li>NewChunkedWriter</li> -<li>NewClientConn</li> -<li>NewProxyClientConn</li> -<li>NewServerConn</li> -<li>NewSingleHostReverseProxy</li> -<li>ReverseProxy</li> -<li>ServerConn</li> -</ul> - -<p> -The <code>Request.RawURL</code> field has been removed; it was a -historical artifact. -</p> - -<p> -The <code>Handle</code> and <code>HandleFunc</code> -functions, and the similarly-named methods of <code>ServeMux</code>, -now panic if an attempt is made to register the same pattern twice. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update the few programs that are affected except for -uses of <code>RawURL</code>, which must be fixed by hand. -</p> - -<h3 id="image">The image package</h3> - -<p> -The <a href="/pkg/image/"><code>image</code></a> package has had a number of -minor changes, rearrangements and renamings. -</p> - -<p> -Most of the color handling code has been moved into its own package, -<a href="/pkg/image/color/"><code>image/color</code></a>. -For the elements that moved, a symmetry arises; for instance, -each pixel of an -<a href="/pkg/image/#RGBA"><code>image.RGBA</code></a> -is a -<a href="/pkg/image/color/#RGBA"><code>color.RGBA</code></a>. -</p> - -<p> -The old <code>image/ycbcr</code> package has been folded, with some -renamings, into the -<a href="/pkg/image/"><code>image</code></a> -and -<a href="/pkg/image/color/"><code>image/color</code></a> -packages. -</p> - -<p> -The old <code>image.ColorImage</code> type is still in the <code>image</code> -package but has been renamed -<a href="/pkg/image/#Uniform"><code>image.Uniform</code></a>, -while <code>image.Tiled</code> has been removed. -</p> - -<p> -This table lists the renamings. -</p> - -<table class="codetable" frame="border" summary="image renames"> -<colgroup align="left" width="50%"></colgroup> -<colgroup align="left" width="50%"></colgroup> -<tr> -<th align="left">Old</th> -<th align="left">New</th> -</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>image.Color</td> <td>color.Color</td></tr> -<tr><td>image.ColorModel</td> <td>color.Model</td></tr> -<tr><td>image.ColorModelFunc</td> <td>color.ModelFunc</td></tr> -<tr><td>image.PalettedColorModel</td> <td>color.Palette</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>image.RGBAColor</td> <td>color.RGBA</td></tr> -<tr><td>image.RGBA64Color</td> <td>color.RGBA64</td></tr> -<tr><td>image.NRGBAColor</td> <td>color.NRGBA</td></tr> -<tr><td>image.NRGBA64Color</td> <td>color.NRGBA64</td></tr> -<tr><td>image.AlphaColor</td> <td>color.Alpha</td></tr> -<tr><td>image.Alpha16Color</td> <td>color.Alpha16</td></tr> -<tr><td>image.GrayColor</td> <td>color.Gray</td></tr> -<tr><td>image.Gray16Color</td> <td>color.Gray16</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>image.RGBAColorModel</td> <td>color.RGBAModel</td></tr> -<tr><td>image.RGBA64ColorModel</td> <td>color.RGBA64Model</td></tr> -<tr><td>image.NRGBAColorModel</td> <td>color.NRGBAModel</td></tr> -<tr><td>image.NRGBA64ColorModel</td> <td>color.NRGBA64Model</td></tr> -<tr><td>image.AlphaColorModel</td> <td>color.AlphaModel</td></tr> -<tr><td>image.Alpha16ColorModel</td> <td>color.Alpha16Model</td></tr> -<tr><td>image.GrayColorModel</td> <td>color.GrayModel</td></tr> -<tr><td>image.Gray16ColorModel</td> <td>color.Gray16Model</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>ycbcr.RGBToYCbCr</td> <td>color.RGBToYCbCr</td></tr> -<tr><td>ycbcr.YCbCrToRGB</td> <td>color.YCbCrToRGB</td></tr> -<tr><td>ycbcr.YCbCrColorModel</td> <td>color.YCbCrModel</td></tr> -<tr><td>ycbcr.YCbCrColor</td> <td>color.YCbCr</td></tr> -<tr><td>ycbcr.YCbCr</td> <td>image.YCbCr</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>ycbcr.SubsampleRatio444</td> <td>image.YCbCrSubsampleRatio444</td></tr> -<tr><td>ycbcr.SubsampleRatio422</td> <td>image.YCbCrSubsampleRatio422</td></tr> -<tr><td>ycbcr.SubsampleRatio420</td> <td>image.YCbCrSubsampleRatio420</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>image.ColorImage</td> <td>image.Uniform</td></tr> -</table> - -<p> -The image package's <code>New</code> functions -(<a href="/pkg/image/#NewRGBA"><code>NewRGBA</code></a>, -<a href="/pkg/image/#NewRGBA64"><code>NewRGBA64</code></a>, etc.) -take an <a href="/pkg/image/#Rectangle"><code>image.Rectangle</code></a> as an argument -instead of four integers. -</p> - -<p> -Finally, there are new predefined <code>color.Color</code> variables -<a href="/pkg/image/color/#Black"><code>color.Black</code></a>, -<a href="/pkg/image/color/#White"><code>color.White</code></a>, -<a href="/pkg/image/color/#Opaque"><code>color.Opaque</code></a> -and -<a href="/pkg/image/color/#Transparent"><code>color.Transparent</code></a>. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update almost all code affected by the change. -</p> - -<h3 id="log_syslog">The log/syslog package</h3> - -<p> -In Go 1, the <a href="/pkg/log/syslog/#NewLogger"><code>syslog.NewLogger</code></a> -function returns an error as well as a <code>log.Logger</code>. -</p> - -<p> -<em>Updating</em>: -What little code is affected will be caught by the compiler and must be updated by hand. -</p> - -<h3 id="mime">The mime package</h3> - -<p> -In Go 1, the <a href="/pkg/mime/#FormatMediaType"><code>FormatMediaType</code></a> function -of the <code>mime</code> package has been simplified to make it -consistent with -<a href="/pkg/mime/#ParseMediaType"><code>ParseMediaType</code></a>. -It now takes <code>"text/html"</code> rather than <code>"text"</code> and <code>"html"</code>. -</p> - -<p> -<em>Updating</em>: -What little code is affected will be caught by the compiler and must be updated by hand. -</p> - -<h3 id="net">The net package</h3> - -<p> -In Go 1, the various <code>SetTimeout</code>, -<code>SetReadTimeout</code>, and <code>SetWriteTimeout</code> methods -have been replaced with -<a href="/pkg/net/#IPConn.SetDeadline"><code>SetDeadline</code></a>, -<a href="/pkg/net/#IPConn.SetReadDeadline"><code>SetReadDeadline</code></a>, and -<a href="/pkg/net/#IPConn.SetWriteDeadline"><code>SetWriteDeadline</code></a>, -respectively. Rather than taking a timeout value in nanoseconds that -apply to any activity on the connection, the new methods set an -absolute deadline (as a <code>time.Time</code> value) after which -reads and writes will time out and no longer block. -</p> - -<p> -There are also new functions -<a href="/pkg/net/#DialTimeout"><code>net.DialTimeout</code></a> -to simplify timing out dialing a network address and -<a href="/pkg/net/#ListenMulticastUDP"><code>net.ListenMulticastUDP</code></a> -to allow multicast UDP to listen concurrently across multiple listeners. -The <code>net.ListenMulticastUDP</code> function replaces the old -<code>JoinGroup</code> and <code>LeaveGroup</code> methods. -</p> - -<p> -<em>Updating</em>: -Code that uses the old methods will fail to compile and must be updated by hand. -The semantic change makes it difficult for the fix tool to update automatically. -</p> - -<h3 id="os">The os package</h3> - -<p> -The <code>Time</code> function has been removed; callers should use -the <a href="/pkg/time/#Time"><code>Time</code></a> type from the -<code>time</code> package. -</p> - -<p> -The <code>Exec</code> function has been removed; callers should use -<code>Exec</code> from the <code>syscall</code> package, where available. -</p> - -<p> -The <code>ShellExpand</code> function has been renamed to <a -href="/pkg/os/#ExpandEnv"><code>ExpandEnv</code></a>. -</p> - -<p> -The <a href="/pkg/os/#NewFile"><code>NewFile</code></a> function -now takes a <code>uintptr</code> fd, instead of an <code>int</code>. -The <a href="/pkg/os/#File.Fd"><code>Fd</code></a> method on files now -also returns a <code>uintptr</code>. -</p> - -<p> -There are no longer error constants such as <code>EINVAL</code> -in the <code>os</code> package, since the set of values varied with -the underlying operating system. There are new portable functions like -<a href="/pkg/os/#IsPermission"><code>IsPermission</code></a> -to test common error properties, plus a few new error values -with more Go-like names, such as -<a href="/pkg/os/#ErrPermission"><code>ErrPermission</code></a> -and -<a href="/pkg/os/#ErrNoEnv"><code>ErrNoEnv</code></a>. -</p> - -<p> -The <code>Getenverror</code> function has been removed. To distinguish -between a non-existent environment variable and an empty string, -use <a href="/pkg/os/#Environ"><code>os.Environ</code></a> or -<a href="/pkg/syscall/#Getenv"><code>syscall.Getenv</code></a>. -</p> - - -<p> -The <a href="/pkg/os/#Process.Wait"><code>Process.Wait</code></a> method has -dropped its option argument and the associated constants are gone -from the package. -Also, the function <code>Wait</code> is gone; only the method of -the <code>Process</code> type persists. -</p> - -<p> -The <code>Waitmsg</code> type returned by -<a href="/pkg/os/#Process.Wait"><code>Process.Wait</code></a> -has been replaced with a more portable -<a href="/pkg/os/#ProcessState"><code>ProcessState</code></a> -type with accessor methods to recover information about the -process. -Because of changes to <code>Wait</code>, the <code>ProcessState</code> -value always describes an exited process. -Portability concerns simplified the interface in other ways, but the values returned by the -<a href="/pkg/os/#ProcessState.Sys"><code>ProcessState.Sys</code></a> and -<a href="/pkg/os/#ProcessState.SysUsage"><code>ProcessState.SysUsage</code></a> -methods can be type-asserted to underlying system-specific data structures such as -<a href="/pkg/syscall/#WaitStatus"><code>syscall.WaitStatus</code></a> and -<a href="/pkg/syscall/#Rusage"><code>syscall.Rusage</code></a> on Unix. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will drop a zero argument to <code>Process.Wait</code>. -All other changes will be caught by the compiler and must be updated by hand. -</p> - -<h4 id="os_fileinfo">The os.FileInfo type</h4> - -<p> -Go 1 redefines the <a href="/pkg/os/#FileInfo"><code>os.FileInfo</code></a> type, -changing it from a struct to an interface: -</p> - -<pre> - type FileInfo interface { - Name() string // base name of the file - Size() int64 // length in bytes - Mode() FileMode // file mode bits - ModTime() time.Time // modification time - IsDir() bool // abbreviation for Mode().IsDir() - Sys() interface{} // underlying data source (can return nil) - } -</pre> - -<p> -The file mode information has been moved into a subtype called -<a href="/pkg/os/#FileMode"><code>os.FileMode</code></a>, -a simple integer type with <code>IsDir</code>, <code>Perm</code>, and <code>String</code> -methods. -</p> - -<p> -The system-specific details of file modes and properties such as (on Unix) -i-number have been removed from <code>FileInfo</code> altogether. -Instead, each operating system's <code>os</code> package provides an -implementation of the <code>FileInfo</code> interface, which -has a <code>Sys</code> method that returns the -system-specific representation of file metadata. -For instance, to discover the i-number of a file on a Unix system, unpack -the <code>FileInfo</code> like this: -</p> - -<pre> - fi, err := os.Stat("hello.go") - if err != nil { - log.Fatal(err) - } - // Check that it's a Unix file. - unixStat, ok := fi.Sys().(*syscall.Stat_t) - if !ok { - log.Fatal("hello.go: not a Unix file") - } - fmt.Printf("file i-number: %d\n", unixStat.Ino) -</pre> - -<p> -Assuming (which is unwise) that <code>"hello.go"</code> is a Unix file, -the i-number expression could be contracted to -</p> - -<pre> - fi.Sys().(*syscall.Stat_t).Ino -</pre> - -<p> -The vast majority of uses of <code>FileInfo</code> need only the methods -of the standard interface. -</p> - -<p> -The <code>os</code> package no longer contains wrappers for the POSIX errors -such as <code>ENOENT</code>. -For the few programs that need to verify particular error conditions, there are -now the boolean functions -<a href="/pkg/os/#IsExist"><code>IsExist</code></a>, -<a href="/pkg/os/#IsNotExist"><code>IsNotExist</code></a> -and -<a href="/pkg/os/#IsPermission"><code>IsPermission</code></a>. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/os\.Open/` `/}/`}} ---> f, err := os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0600) - if os.IsExist(err) { - log.Printf(&#34;%s already exists&#34;, name) - }</pre> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update code that uses the old equivalent of the current <code>os.FileInfo</code> -and <code>os.FileMode</code> API. -Code that needs system-specific file details will need to be updated by hand. -Code that uses the old POSIX error values from the <code>os</code> package -will fail to compile and will also need to be updated by hand. -</p> - -<h3 id="os_signal">The os/signal package</h3> - -<p> -The <code>os/signal</code> package in Go 1 replaces the -<code>Incoming</code> function, which returned a channel -that received all incoming signals, -with the selective <code>Notify</code> function, which asks -for delivery of specific signals on an existing channel. -</p> - -<p> -<em>Updating</em>: -Code must be updated by hand. -A literal translation of -</p> -<pre> -c := signal.Incoming() -</pre> -<p> -is -</p> -<pre> -c := make(chan os.Signal) -signal.Notify(c) // ask for all signals -</pre> -<p> -but most code should list the specific signals it wants to handle instead: -</p> -<pre> -c := make(chan os.Signal) -signal.Notify(c, syscall.SIGHUP, syscall.SIGQUIT) -</pre> - -<h3 id="path_filepath">The path/filepath package</h3> - -<p> -In Go 1, the <a href="/pkg/path/filepath/#Walk"><code>Walk</code></a> function of the -<code>path/filepath</code> package -has been changed to take a function value of type -<a href="/pkg/path/filepath/#WalkFunc"><code>WalkFunc</code></a> -instead of a <code>Visitor</code> interface value. -<code>WalkFunc</code> unifies the handling of both files and directories. -</p> - -<pre> - type WalkFunc func(path string, info os.FileInfo, err error) error -</pre> - -<p> -The <code>WalkFunc</code> function will be called even for files or directories that could not be opened; -in such cases the error argument will describe the failure. -If a directory's contents are to be skipped, -the function should return the value <a href="/pkg/path/filepath/#variables"><code>filepath.SkipDir</code></a> -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/STARTWALK/` `/ENDWALK/`}} ---> markFn := func(path string, info os.FileInfo, err error) error { - if path == &#34;pictures&#34; { <span class="comment">// Will skip walking of directory pictures and its contents.</span> - return filepath.SkipDir - } - if err != nil { - return err - } - log.Println(path) - return nil - } - err := filepath.Walk(&#34;.&#34;, markFn) - if err != nil { - log.Fatal(err) - }</pre> - -<p> -<em>Updating</em>: -The change simplifies most code but has subtle consequences, so affected programs -will need to be updated by hand. -The compiler will catch code using the old interface. -</p> - -<h3 id="regexp">The regexp package</h3> - -<p> -The <a href="/pkg/regexp/"><code>regexp</code></a> package has been rewritten. -It has the same interface but the specification of the regular expressions -it supports has changed from the old "egrep" form to that of -<a href="http://code.google.com/p/re2/">RE2</a>. -</p> - -<p> -<em>Updating</em>: -Code that uses the package should have its regular expressions checked by hand. -</p> - -<h3 id="runtime">The runtime package</h3> - -<p> -In Go 1, much of the API exported by package -<code>runtime</code> has been removed in favor of -functionality provided by other packages. -Code using the <code>runtime.Type</code> interface -or its specific concrete type implementations should -now use package <a href="/pkg/reflect/"><code>reflect</code></a>. -Code using <code>runtime.Semacquire</code> or <code>runtime.Semrelease</code> -should use channels or the abstractions in package <a href="/pkg/sync/"><code>sync</code></a>. -The <code>runtime.Alloc</code>, <code>runtime.Free</code>, -and <code>runtime.Lookup</code> functions, an unsafe API created for -debugging the memory allocator, have no replacement. -</p> - -<p> -Before, <code>runtime.MemStats</code> was a global variable holding -statistics about memory allocation, and calls to <code>runtime.UpdateMemStats</code> -ensured that it was up to date. -In Go 1, <code>runtime.MemStats</code> is a struct type, and code should use -<a href="/pkg/runtime/#ReadMemStats"><code>runtime.ReadMemStats</code></a> -to obtain the current statistics. -</p> - -<p> -The package adds a new function, -<a href="/pkg/runtime/#NumCPU"><code>runtime.NumCPU</code></a>, that returns the number of CPUs available -for parallel execution, as reported by the operating system kernel. -Its value can inform the setting of <code>GOMAXPROCS</code>. -The <code>runtime.Cgocalls</code> and <code>runtime.Goroutines</code> functions -have been renamed to <code>runtime.NumCgoCall</code> and <code>runtime.NumGoroutine</code>. -</p> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update code for the function renamings. -Other code will need to be updated by hand. -</p> - -<h3 id="strconv">The strconv package</h3> - -<p> -In Go 1, the -<a href="/pkg/strconv/"><code>strconv</code></a> -package has been significantly reworked to make it more Go-like and less C-like, -although <code>Atoi</code> lives on (it's similar to -<code>int(ParseInt(x, 10, 0))</code>, as does -<code>Itoa(x)</code> (<code>FormatInt(int64(x), 10)</code>). -There are also new variants of some of the functions that append to byte slices rather than -return strings, to allow control over allocation. -</p> - -<p> -This table summarizes the renamings; see the -<a href="/pkg/strconv/">package documentation</a> -for full details. -</p> - -<table class="codetable" frame="border" summary="strconv renames"> -<colgroup align="left" width="50%"></colgroup> -<colgroup align="left" width="50%"></colgroup> -<tr> -<th align="left">Old call</th> -<th align="left">New call</th> -</tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Atob(x)</td> <td>ParseBool(x)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Atof32(x)</td> <td>ParseFloat(x, 32)§</td></tr> -<tr><td>Atof64(x)</td> <td>ParseFloat(x, 64)</td></tr> -<tr><td>AtofN(x, n)</td> <td>ParseFloat(x, n)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Atoi(x)</td> <td>Atoi(x)</td></tr> -<tr><td>Atoi(x)</td> <td>ParseInt(x, 10, 0)§</td></tr> -<tr><td>Atoi64(x)</td> <td>ParseInt(x, 10, 64)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Atoui(x)</td> <td>ParseUint(x, 10, 0)§</td></tr> -<tr><td>Atoui64(x)</td> <td>ParseUint(x, 10, 64)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Btoi64(x, b)</td> <td>ParseInt(x, b, 64)</td></tr> -<tr><td>Btoui64(x, b)</td> <td>ParseUint(x, b, 64)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Btoa(x)</td> <td>FormatBool(x)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Ftoa32(x, f, p)</td> <td>FormatFloat(float64(x), f, p, 32)</td></tr> -<tr><td>Ftoa64(x, f, p)</td> <td>FormatFloat(x, f, p, 64)</td></tr> -<tr><td>FtoaN(x, f, p, n)</td> <td>FormatFloat(x, f, p, n)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Itoa(x)</td> <td>Itoa(x)</td></tr> -<tr><td>Itoa(x)</td> <td>FormatInt(int64(x), 10)</td></tr> -<tr><td>Itoa64(x)</td> <td>FormatInt(x, 10)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Itob(x, b)</td> <td>FormatInt(int64(x), b)</td></tr> -<tr><td>Itob64(x, b)</td> <td>FormatInt(x, b)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Uitoa(x)</td> <td>FormatUint(uint64(x), 10)</td></tr> -<tr><td>Uitoa64(x)</td> <td>FormatUint(x, 10)</td></tr> -<tr> -<td colspan="2"><hr></td> -</tr> -<tr><td>Uitob(x, b)</td> <td>FormatUint(uint64(x), b)</td></tr> -<tr><td>Uitob64(x, b)</td> <td>FormatUint(x, b)</td></tr> -</table> - -<p> -<em>Updating</em>: -Running <code>go</code> <code>fix</code> will update almost all code affected by the change. -<br> -§ <code>Atoi</code> persists but <code>Atoui</code> and <code>Atof32</code> do not, so -they may require -a cast that must be added by hand; the <code>go</code> <code>fix</code> tool will warn about it. -</p> - - -<h3 id="templates">The template packages</h3> - -<p> -The <code>template</code> and <code>exp/template/html</code> packages have moved to -<a href="/pkg/text/template/"><code>text/template</code></a> and -<a href="/pkg/html/template/"><code>html/template</code></a>. -More significant, the interface to these packages has been simplified. -The template language is the same, but the concept of "template set" is gone -and the functions and methods of the packages have changed accordingly, -often by elimination. -</p> - -<p> -Instead of sets, a <code>Template</code> object -may contain multiple named template definitions, -in effect constructing -name spaces for template invocation. -A template can invoke any other template associated with it, but only those -templates associated with it. -The simplest way to associate templates is to parse them together, something -made easier with the new structure of the packages. -</p> - -<p> -<em>Updating</em>: -The imports will be updated by fix tool. -Single-template uses will be otherwise be largely unaffected. -Code that uses multiple templates in concert will need to be updated by hand. -The <a href="/pkg/text/template/#examples">examples</a> in -the documentation for <code>text/template</code> can provide guidance. -</p> - -<h3 id="testing">The testing package</h3> - -<p> -The testing package has a type, <code>B</code>, passed as an argument to benchmark functions. -In Go 1, <code>B</code> has new methods, analogous to those of <code>T</code>, enabling -logging and failure reporting. -</p> - -<pre><!--{{code "/doc/progs/go1.go" `/func.*Benchmark/` `/^}/`}} --->func BenchmarkSprintf(b *testing.B) { - <span class="comment">// Verify correctness before running benchmark.</span> - b.StopTimer() - got := fmt.Sprintf(&#34;%x&#34;, 23) - const expect = &#34;17&#34; - if expect != got { - b.Fatalf(&#34;expected %q; got %q&#34;, expect, got) - } - b.StartTimer() - for i := 0; i &lt; b.N; i++ { - fmt.Sprintf(&#34;%x&#34;, 23) - } -}</pre> - -<p> -<em>Updating</em>: -Existing code is unaffected, although benchmarks that use <code>println</code> -or <code>panic</code> should be updated to use the new methods. -</p> - -<h3 id="testing_script">The testing/script package</h3> - -<p> -The testing/script package has been deleted. It was a dreg. -</p> - -<p> -<em>Updating</em>: -No code is likely to be affected. -</p> - -<h3 id="unsafe">The unsafe package</h3> - -<p> -In Go 1, the functions -<code>unsafe.Typeof</code>, <code>unsafe.Reflect</code>, -<code>unsafe.Unreflect</code>, <code>unsafe.New</code>, and -<code>unsafe.NewArray</code> have been removed; -they duplicated safer functionality provided by -package <a href="/pkg/reflect/"><code>reflect</code></a>. -</p> - -<p> -<em>Updating</em>: -Code using these functions must be rewritten to use -package <a href="/pkg/reflect/"><code>reflect</code></a>. -The changes to <a href="http://code.google.com/p/go/source/detail?r=2646dc956207">encoding/gob</a> and the <a href="http://code.google.com/p/goprotobuf/source/detail?r=5340ad310031">protocol buffer library</a> -may be helpful as examples. -</p> - -<h3 id="url">The url package</h3> - -<p> -In Go 1 several fields from the <a href="/pkg/net/url/#URL"><code>url.URL</code></a> type -were removed or replaced. -</p> - -<p> -The <a href="/pkg/net/url/#URL.String"><code>String</code></a> method now -predictably rebuilds an encoded URL string using all of <code>URL</code>'s -fields as necessary. The resulting string will also no longer have -passwords escaped. -</p> - -<p> -The <code>Raw</code> field has been removed. In most cases the <code>String</code> -method may be used in its place. -</p> - -<p> -The old <code>RawUserinfo</code> field is replaced by the <code>User</code> -field, of type <a href="/pkg/net/url/#Userinfo"><code>*net.Userinfo</code></a>. -Values of this type may be created using the new <a href="/pkg/net/url/#User"><code>net.User</code></a> -and <a href="/pkg/net/url/#UserPassword"><code>net.UserPassword</code></a> -functions. The <code>EscapeUserinfo</code> and <code>UnescapeUserinfo</code> -functions are also gone. -</p> - -<p> -The <code>RawAuthority</code> field has been removed. The same information is -available in the <code>Host</code> and <code>User</code> fields. -</p> - -<p> -The <code>RawPath</code> field and the <code>EncodedPath</code> method have -been removed. The path information in rooted URLs (with a slash following the -schema) is now available only in decoded form in the <code>Path</code> field. -Occasionally, the encoded data may be required to obtain information that -was lost in the decoding process. These cases must be handled by accessing -the data the URL was built from. -</p> - -<p> -URLs with non-rooted paths, such as <code>"mailto:dev@golang.org?subject=Hi"</code>, -are also handled differently. The <code>OpaquePath</code> boolean field has been -removed and a new <code>Opaque</code> string field introduced to hold the encoded -path for such URLs. In Go 1, the cited URL parses as: -</p> - -<pre> - URL{ - Scheme: "mailto", - Opaque: "dev@golang.org", - RawQuery: "subject=Hi", - } -</pre> - -<p> -A new <a href="/pkg/net/url/#URL.RequestURI"><code>RequestURI</code></a> method was -added to <code>URL</code>. -</p> - -<p> -The <code>ParseWithReference</code> function has been renamed to <code>ParseWithFragment</code>. -</p> - -<p> -<em>Updating</em>: -Code that uses the old fields will fail to compile and must be updated by hand. -The semantic changes make it difficult for the fix tool to update automatically. -</p> - -<h2 id="cmd_go">The go command</h2> - -<p> -Go 1 introduces the <a href="/cmd/go/">go command</a>, a tool for fetching, -building, and installing Go packages and commands. The <code>go</code> command -does away with makefiles, instead using Go source code to find dependencies and -determine build conditions. Most existing Go programs will no longer require -makefiles to be built. -</p> - -<p> -See <a href="/doc/code.html">How to Write Go Code</a> for a primer on the -<code>go</code> command and the <a href="/cmd/go/">go command documentation</a> -for the full details. -</p> - -<p> -<em>Updating</em>: -Projects that depend on the Go project's old makefile-based build -infrastructure (<code>Make.pkg</code>, <code>Make.cmd</code>, and so on) should -switch to using the <code>go</code> command for building Go code and, if -necessary, rewrite their makefiles to perform any auxiliary build tasks. -</p> - -<h2 id="cmd_cgo">The cgo command</h2> - -<p> -In Go 1, the <a href="/cmd/cgo">cgo command</a> -uses a different <code>_cgo_export.h</code> -file, which is generated for packages containing <code>//export</code> lines. -The <code>_cgo_export.h</code> file now begins with the C preamble comment, -so that exported function definitions can use types defined there. -This has the effect of compiling the preamble multiple times, so a -package using <code>//export</code> must not put function definitions -or variable initializations in the C preamble. -</p> - -<h2 id="releases">Packaged releases</h2> - -<p> -One of the most significant changes associated with Go 1 is the availability -of prepackaged, downloadable distributions. -They are available for many combinations of architecture and operating system -(including Windows) and the list will grow. -Installation details are described on the -<a href="/doc/install">Getting Started</a> page, while -the distributions themselves are listed on the -<a href="http://code.google.com/p/go/downloads/list">downloads page</a>. - - -</div> - -<div id="footer"> -Build version go1.0.1.<br> -Except as <a href="http://code.google.com/policies.html#restrictions">noted</a>, -the content of this page is licensed under the -Creative Commons Attribution 3.0 License, -and code is licensed under a <a href="/LICENSE">BSD license</a>.<br> -<a href="/doc/tos.html">Terms of Service</a> | -<a href="http://www.google.com/intl/en/privacy/privacy-policy.html">Privacy Policy</a> -</div> - -<script type="text/javascript"> -(function() { - var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true; - ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js"; - var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s); -})(); -</script> -</body> -<script type="text/javascript"> - (function() { - var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; - po.src = 'https://apis.google.com/js/plusone.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); - })(); -</script> -</html> - diff --git a/vendor/golang.org/x/net/html/testdata/webkit/README b/vendor/golang.org/x/net/html/testdata/webkit/README deleted file mode 100644 index 9b4c2d8b..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/README +++ /dev/null @@ -1,28 +0,0 @@ -The *.dat files in this directory are copied from The WebKit Open Source -Project, specifically $WEBKITROOT/LayoutTests/html5lib/resources. -WebKit is licensed under a BSD style license. -http://webkit.org/coding/bsd-license.html says: - -Copyright (C) 2009 Apple Inc. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, -this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, -this list of conditions and the following disclaimer in the documentation -and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS "AS IS" AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat b/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat deleted file mode 100644 index 787e1b01..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/adoption01.dat +++ /dev/null @@ -1,194 +0,0 @@ -#data -<a><p></a></p> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <p> -| <a> - -#data -<a>1<p>2</a>3</p> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <p> -| <a> -| "2" -| "3" - -#data -<a>1<button>2</a>3</button> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <button> -| <a> -| "2" -| "3" - -#data -<a>1<b>2</a>3</b> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <b> -| "2" -| <b> -| "3" - -#data -<a>1<div>2<div>3</a>4</div>5</div> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <div> -| <a> -| "2" -| <div> -| <a> -| "3" -| "4" -| "5" - -#data -<table><a>1<p>2</a>3</p> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <p> -| <a> -| "2" -| "3" -| <table> - -#data -<b><b><a><p></a> -#errors -#document -| <html> -| <head> -| <body> -| <b> -| <b> -| <a> -| <p> -| <a> - -#data -<b><a><b><p></a> -#errors -#document -| <html> -| <head> -| <body> -| <b> -| <a> -| <b> -| <b> -| <p> -| <a> - -#data -<a><b><b><p></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <b> -| <b> -| <p> -| <a> - -#data -<p>1<s id="A">2<b id="B">3</p>4</s>5</b> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| "1" -| <s> -| id="A" -| "2" -| <b> -| id="B" -| "3" -| <s> -| id="A" -| <b> -| id="B" -| "4" -| <b> -| id="B" -| "5" - -#data -<table><a>1<td>2</td>3</table> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "1" -| <a> -| "3" -| <table> -| <tbody> -| <tr> -| <td> -| "2" - -#data -<table>A<td>B</td>C</table> -#errors -#document -| <html> -| <head> -| <body> -| "AC" -| <table> -| <tbody> -| <tr> -| <td> -| "B" - -#data -<a><svg><tr><input></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <svg svg> -| <svg tr> -| <svg input> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat b/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat deleted file mode 100644 index d18151b4..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/adoption02.dat +++ /dev/null @@ -1,31 +0,0 @@ -#data -<b>1<i>2<p>3</b>4 -#errors -#document -| <html> -| <head> -| <body> -| <b> -| "1" -| <i> -| "2" -| <i> -| <p> -| <b> -| "3" -| "4" - -#data -<a><div><style></style><address><a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <div> -| <a> -| <style> -| <address> -| <a> -| <a> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat b/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat deleted file mode 100644 index 44f18768..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/comments01.dat +++ /dev/null @@ -1,135 +0,0 @@ -#data -FOO<!-- BAR -->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR --> -| "BAZ" - -#data -FOO<!-- BAR --!>BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR --> -| "BAZ" - -#data -FOO<!-- BAR -- >BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- >BAZ --> - -#data -FOO<!-- BAR -- <QUX> -- MUX -->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- <QUX> -- MUX --> -| "BAZ" - -#data -FOO<!-- BAR -- <QUX> -- MUX --!>BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- <QUX> -- MUX --> -| "BAZ" - -#data -FOO<!-- BAR -- <QUX> -- MUX -- >BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- BAR -- <QUX> -- MUX -- >BAZ --> - -#data -FOO<!---->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- --> -| "BAZ" - -#data -FOO<!--->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- --> -| "BAZ" - -#data -FOO<!-->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- --> -| "BAZ" - -#data -<?xml version="1.0">Hi -#errors -#document -| <!-- ?xml version="1.0" --> -| <html> -| <head> -| <body> -| "Hi" - -#data -<?xml version="1.0"> -#errors -#document -| <!-- ?xml version="1.0" --> -| <html> -| <head> -| <body> - -#data -<?xml version -#errors -#document -| <!-- ?xml version --> -| <html> -| <head> -| <body> - -#data -FOO<!----->BAZ -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <!-- - --> -| "BAZ" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat b/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat deleted file mode 100644 index ae457328..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/doctype01.dat +++ /dev/null @@ -1,370 +0,0 @@ -#data -<!DOCTYPE html>Hello -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!dOctYpE HtMl>Hello -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPEhtml>Hello -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE>Hello -#errors -#document -| <!DOCTYPE > -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE >Hello -#errors -#document -| <!DOCTYPE > -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato taco>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato taco "ddd>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato sYstEM>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato sYstEM >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato sYstEM ggg>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM taco >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM 'taco"'>Hello -#errors -#document -| <!DOCTYPE potato "" "taco""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM "taco">Hello -#errors -#document -| <!DOCTYPE potato "" "taco"> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEM "tai'co">Hello -#errors -#document -| <!DOCTYPE potato "" "tai'co"> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato SYSTEMtaco "ddd">Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato grass SYSTEM taco>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato pUbLIc>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato pUbLIc >Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato pUbLIcgoof>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC goof>Hello -#errors -#document -| <!DOCTYPE potato> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC "go'of">Hello -#errors -#document -| <!DOCTYPE potato "go'of" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC 'go'of'>Hello -#errors -#document -| <!DOCTYPE potato "go" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC 'go:hh of' >Hello -#errors -#document -| <!DOCTYPE potato "go:hh of" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello -#errors -#document -| <!DOCTYPE potato "W3C-//dfdf" ""> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" - "http://www.w3.org/TR/html4/strict.dtd">Hello -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE ...>Hello -#errors -#document -| <!DOCTYPE ...> -| <html> -| <head> -| <body> -| "Hello" - -#data -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" -"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" -"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ -<!-- internal declarations --> -]> -#errors -#document -| <!DOCTYPE root-element> -| <html> -| <head> -| <body> -| "]>" - -#data -<!DOCTYPE html PUBLIC - "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" - "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> -#errors -#document -| <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body> -#errors -#document -| <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd"> -| <html> -| <head> -| <body> -| <b> -| "Mine!" - -#data -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd"> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'> -#errors -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> -| <html> -| <head> -| <body> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat b/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat deleted file mode 100644 index c8073b78..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/entities01.dat +++ /dev/null @@ -1,603 +0,0 @@ -#data -FOO&gt;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO>BAR" - -#data -FOO&gtBAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO>BAR" - -#data -FOO&gt BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO> BAR" - -#data -FOO&gt;;;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO>;;BAR" - -#data -I'm &notit; I tell you -#errors -#document -| <html> -| <head> -| <body> -| "I'm ¬it; I tell you" - -#data -I'm &notin; I tell you -#errors -#document -| <html> -| <head> -| <body> -| "I'm ∉ I tell you" - -#data -FOO& BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO& BAR" - -#data -FOO&<BAR> -#errors -#document -| <html> -| <head> -| <body> -| "FOO&" -| <bar> - -#data -FOO&&&&gt;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO&&&>BAR" - -#data -FOO&#41;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO)BAR" - -#data -FOO&#x41;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOOABAR" - -#data -FOO&#X41;BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOOABAR" - -#data -FOO&#BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#BAR" - -#data -FOO&#ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#ZOO" - -#data -FOO&#xBAR -#errors -#document -| <html> -| <head> -| <body> -| "FOOºR" - -#data -FOO&#xZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#xZOO" - -#data -FOO&#XZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO&#XZOO" - -#data -FOO&#41BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO)BAR" - -#data -FOO&#x41BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO䆺R" - -#data -FOO&#x41ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOAZOO" - -#data -FOO&#x0000;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO&#x0078;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOxZOO" - -#data -FOO&#x0079;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOyZOO" - -#data -FOO&#x0080;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO€ZOO" - -#data -FOO&#x0081;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÂZOO" - -#data -FOO&#x0082;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‚ZOO" - -#data -FOO&#x0083;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÆ’ZOO" - -#data -FOO&#x0084;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO„ZOO" - -#data -FOO&#x0085;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO…ZOO" - -#data -FOO&#x0086;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO†ZOO" - -#data -FOO&#x0087;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‡ZOO" - -#data -FOO&#x0088;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOˆZOO" - -#data -FOO&#x0089;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‰ZOO" - -#data -FOO&#x008A;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÅ ZOO" - -#data -FOO&#x008B;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‹ZOO" - -#data -FOO&#x008C;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÅ’ZOO" - -#data -FOO&#x008D;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÂZOO" - -#data -FOO&#x008E;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOŽZOO" - -#data -FOO&#x008F;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÂZOO" - -#data -FOO&#x0090;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÂZOO" - -#data -FOO&#x0091;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO‘ZOO" - -#data -FOO&#x0092;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO’ZOO" - -#data -FOO&#x0093;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO“ZOO" - -#data -FOO&#x0094;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOâ€ZOO" - -#data -FOO&#x0095;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO•ZOO" - -#data -FOO&#x0096;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO–ZOO" - -#data -FOO&#x0097;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO—ZOO" - -#data -FOO&#x0098;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOËœZOO" - -#data -FOO&#x0099;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOâ„¢ZOO" - -#data -FOO&#x009A;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÅ¡ZOO" - -#data -FOO&#x009B;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO›ZOO" - -#data -FOO&#x009C;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÅ“ZOO" - -#data -FOO&#x009D;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOÂZOO" - -#data -FOO&#x009E;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOžZOO" - -#data -FOO&#x009F;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOŸZOO" - -#data -FOO&#x00A0;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO ZOO" - -#data -FOO&#xD7FF;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO퟿ZOO" - -#data -FOO&#xD800;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO&#xD801;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO&#xDFFE;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO&#xDFFF;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO&#xE000;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOZOO" - -#data -FOO&#x10FFFE;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOô¿¾ZOO" - -#data -FOO&#x1087D4;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOôˆŸ”ZOO" - -#data -FOO&#x10FFFF;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOOô¿¿ZOO" - -#data -FOO&#x110000;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" - -#data -FOO&#xFFFFFF;ZOO -#errors -#document -| <html> -| <head> -| <body> -| "FOO�ZOO" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat b/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat deleted file mode 100644 index e2fb42a0..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/entities02.dat +++ /dev/null @@ -1,249 +0,0 @@ -#data -<div bar="ZZ&gt;YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>YY" - -#data -<div bar="ZZ&"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&" - -#data -<div bar='ZZ&'></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&" - -#data -<div bar=ZZ&></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&" - -#data -<div bar="ZZ&gt=YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&gt=YY" - -#data -<div bar="ZZ&gt0YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&gt0YY" - -#data -<div bar="ZZ&gt9YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&gt9YY" - -#data -<div bar="ZZ&gtaYY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&gtaYY" - -#data -<div bar="ZZ&gtZYY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&gtZYY" - -#data -<div bar="ZZ&gt YY"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ> YY" - -#data -<div bar="ZZ&gt"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>" - -#data -<div bar='ZZ&gt'></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>" - -#data -<div bar=ZZ&gt></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ>" - -#data -<div bar="ZZ&pound_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ£_id=23" - -#data -<div bar="ZZ&prod_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&prod_id=23" - -#data -<div bar="ZZ&pound;_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ£_id=23" - -#data -<div bar="ZZ&prod;_id=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZâˆ_id=23" - -#data -<div bar="ZZ&pound=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&pound=23" - -#data -<div bar="ZZ&prod=23"></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| bar="ZZ&prod=23" - -#data -<div>ZZ&pound_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ£_id=23" - -#data -<div>ZZ&prod_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ&prod_id=23" - -#data -<div>ZZ&pound;_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ£_id=23" - -#data -<div>ZZ&prod;_id=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZâˆ_id=23" - -#data -<div>ZZ&pound=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ£=23" - -#data -<div>ZZ&prod=23</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "ZZ&prod=23" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat b/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat deleted file mode 100644 index d7cb71db..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/html5test-com.dat +++ /dev/null @@ -1,246 +0,0 @@ -#data -<div<div> -#errors -#document -| <html> -| <head> -| <body> -| <div<div> - -#data -<div foo<bar=''> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo<bar="" - -#data -<div foo=`bar`> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo="`bar`" - -#data -<div \"foo=''> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| \"foo="" - -#data -<a href='\nbar'></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| href="\nbar" - -#data -<!DOCTYPE html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -&lang;&rang; -#errors -#document -| <html> -| <head> -| <body> -| "⟨⟩" - -#data -&apos; -#errors -#document -| <html> -| <head> -| <body> -| "'" - -#data -&ImaginaryI; -#errors -#document -| <html> -| <head> -| <body> -| "â…ˆ" - -#data -&Kopf; -#errors -#document -| <html> -| <head> -| <body> -| "ð•‚" - -#data -&notinva; -#errors -#document -| <html> -| <head> -| <body> -| "∉" - -#data -<?import namespace="foo" implementation="#bar"> -#errors -#document -| <!-- ?import namespace="foo" implementation="#bar" --> -| <html> -| <head> -| <body> - -#data -<!--foo--bar--> -#errors -#document -| <!-- foo--bar --> -| <html> -| <head> -| <body> - -#data -<![CDATA[x]]> -#errors -#document -| <!-- [CDATA[x]] --> -| <html> -| <head> -| <body> - -#data -<textarea><!--</textarea>--></textarea> -#errors -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--" -| "-->" - -#data -<textarea><!--</textarea>--> -#errors -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--" -| "-->" - -#data -<style><!--</style>--></style> -#errors -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "-->" - -#data -<style><!--</style>--> -#errors -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "-->" - -#data -<ul><li>A </li> <li>B</li></ul> -#errors -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| "A " -| " " -| <li> -| "B" - -#data -<table><form><input type=hidden><input></form><div></div></table> -#errors -#document -| <html> -| <head> -| <body> -| <input> -| <div> -| <table> -| <form> -| <input> -| type="hidden" - -#data -<i>A<b>B<p></i>C</b>D -#errors -#document -| <html> -| <head> -| <body> -| <i> -| "A" -| <b> -| "B" -| <b> -| <p> -| <b> -| <i> -| "C" -| "D" - -#data -<div></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> - -#data -<svg></svg> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<math></math> -#errors -#document -| <html> -| <head> -| <body> -| <math math> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat b/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat deleted file mode 100644 index 3f2bd374..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/inbody01.dat +++ /dev/null @@ -1,43 +0,0 @@ -#data -<button>1</foo> -#errors -#document -| <html> -| <head> -| <body> -| <button> -| "1" - -#data -<foo>1<p>2</foo> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| "1" -| <p> -| "2" - -#data -<dd>1</foo> -#errors -#document -| <html> -| <head> -| <body> -| <dd> -| "1" - -#data -<foo>1<dd>2</foo> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| "1" -| <dd> -| "2" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat b/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat deleted file mode 100644 index 88325ffe..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/isindex.dat +++ /dev/null @@ -1,40 +0,0 @@ -#data -<isindex> -#errors -#document -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<isindex name="A" action="B" prompt="C" foo="D"> -#errors -#document -| <html> -| <head> -| <body> -| <form> -| action="B" -| <hr> -| <label> -| "C" -| <input> -| foo="D" -| name="isindex" -| <hr> - -#data -<form><isindex> -#errors -#document -| <html> -| <head> -| <body> -| <form> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat b/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat deleted file mode 100644 index a5ebb1eb..00000000 Binary files a/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes-plain-text-unsafe.dat and /dev/null differ diff --git a/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat b/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat deleted file mode 100644 index 5a920846..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/pending-spec-changes.dat +++ /dev/null @@ -1,52 +0,0 @@ -#data -<input type="hidden"><frameset> -#errors -21: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -31: “frameset†start tag seen. -31: End of file seen and there were open elements. -#document -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><table><caption><svg>foo</table>bar -#errors -47: End tag “table†did not match the name of the current open element (“svgâ€). -47: “table†closed but “caption†was still open. -47: End tag “table†seen, but there were open elements. -36: Unclosed element “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| "foo" -| "bar" - -#data -<table><tr><td><svg><desc><td></desc><circle> -#errors -7: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -30: A table cell was implicitly closed, but there were open elements. -26: Unclosed element “descâ€. -20: Unclosed element “svgâ€. -37: Stray end tag “descâ€. -45: End of file seen and there were open elements. -45: Unclosed element “circleâ€. -7: Unclosed element “tableâ€. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg desc> -| <td> -| <circle> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat b/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat deleted file mode 100644 index 04cc11fb..00000000 Binary files a/vendor/golang.org/x/net/html/testdata/webkit/plain-text-unsafe.dat and /dev/null differ diff --git a/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat b/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat deleted file mode 100644 index 76b67f4b..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/scriptdata01.dat +++ /dev/null @@ -1,308 +0,0 @@ -#data -FOO<script>'Hello'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'Hello'" -| "BAR" - -#data -FOO<script></script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script></script >BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script></script/>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script></script/ >BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script type="text/plain"></scriptx>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "</scriptx>BAR" - -#data -FOO<script></script foo=">" dd>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "BAR" - -#data -FOO<script>'<'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<'" -| "BAR" - -#data -FOO<script>'<!'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!'" -| "BAR" - -#data -FOO<script>'<!-'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-'" -| "BAR" - -#data -FOO<script>'<!--'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!--'" -| "BAR" - -#data -FOO<script>'<!---'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!---'" -| "BAR" - -#data -FOO<script>'<!-->'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-->'" -| "BAR" - -#data -FOO<script>'<!-->'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-->'" -| "BAR" - -#data -FOO<script>'<!-- potato'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-- potato'" -| "BAR" - -#data -FOO<script>'<!-- <sCrIpt'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-- <sCrIpt'" -| "BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt>'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> -'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> --'</script>BAR" - -#data -FOO<script>'<!-- <sCrIpt> -->'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| "'<!-- <sCrIpt> -->'" -| "BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> --!>'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt> -- >'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt '</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt/'</script>BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt\'" -| "BAR" - -#data -FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX -#errors -#document -| <html> -| <head> -| <body> -| "FOO" -| <script> -| type="text/plain" -| "'<!-- <sCrIpt/'</script>BAR" -| "QUX" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat b/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat deleted file mode 100644 index 4e08d0e8..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/scripted/adoption01.dat +++ /dev/null @@ -1,15 +0,0 @@ -#data -<p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| id="B" -| <script> -| "document.getElementById("A").id = "B"" -| <b> -| id="A" -| "TEXT" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat b/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat deleted file mode 100644 index ef4a41ca..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/scripted/webkit01.dat +++ /dev/null @@ -1,28 +0,0 @@ -#data -1<script>document.write("2")</script>3 -#errors -#document -| <html> -| <head> -| <body> -| "1" -| <script> -| "document.write("2")" -| "23" - -#data -1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4 -#errors -#document -| <html> -| <head> -| <body> -| "1" -| <script> -| "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")" -| <script> -| "document.write('2')" -| "2" -| <script> -| "document.write('3')" -| "34" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat b/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat deleted file mode 100644 index c4b47e48..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tables01.dat +++ /dev/null @@ -1,212 +0,0 @@ -#data -<table><th> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <th> - -#data -<table><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><col foo='bar'> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <col> -| foo="bar" - -#data -<table><colgroup></html>foo -#errors -#document -| <html> -| <head> -| <body> -| "foo" -| <table> -| <colgroup> - -#data -<table></table><p>foo -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <p> -| "foo" - -#data -<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><select><option>3</select></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| "3" -| <table> - -#data -<table><select><table></table></select></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <table> -| <table> - -#data -<table><select></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <table> - -#data -<table><select><option>A<tr><td>B</td></tr></table> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| "A" -| <table> -| <tbody> -| <tr> -| <td> -| "B" - -#data -<table><td></body></caption></col></colgroup></html>foo -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "foo" - -#data -<table><td>A</table>B -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "A" -| "B" - -#data -<table><tr><caption> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <caption> - -#data -<table><tr></body></caption></col></colgroup></html></td></th><td>foo -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "foo" - -#data -<table><td><tr> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <tr> - -#data -<table><td><button><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <button> -| <td> - -#data -<table><tr><td><svg><desc><td> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg desc> -| <td> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat deleted file mode 100644 index cbf8bdda..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests1.dat +++ /dev/null @@ -1,1952 +0,0 @@ -#data -Test -#errors -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "Test" - -#data -<p>One<p>Two -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <p> -| "One" -| <p> -| "Two" - -#data -Line1<br>Line2<br>Line3<br>Line4 -#errors -Line: 1 Col: 5 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "Line1" -| <br> -| "Line2" -| <br> -| "Line3" -| <br> -| "Line4" - -#data -<html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<head> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<body> -#errors -Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></head> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></head><body> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></head><body></body> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head><body></body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><head></body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end tag (body). -Line: 1 Col: 26 Unexpected end tag (html). -#document -| <html> -| <head> -| <body> - -#data -<html><head><body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<html><body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<head></html> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (html). Ignored. -#document -| <html> -| <head> -| <body> - -#data -</head> -#errors -Line: 1 Col: 7 Unexpected end tag (head). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -</body> -#errors -Line: 1 Col: 7 Unexpected end tag (body). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected end tag (body) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -</html> -#errors -Line: 1 Col: 7 Unexpected end tag (html). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected end tag (html) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -<b><table><td><i></table> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> - -#data -<b><table><td></b><i></table>X -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 30 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> -| "X" - -#data -<h1>Hello<h2>World -#errors -4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -13: Heading cannot be a child of another heading. -18: End of file seen and there were open elements. -#document -| <html> -| <head> -| <body> -| <h1> -| "Hello" -| <h2> -| "World" - -#data -<a><p>X<a>Y</a>Z</p></a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 10 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 24 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <a> -| <p> -| <a> -| "X" -| <a> -| "Y" -| "Z" - -#data -<b><button>foo</b>bar -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <b> -| <button> -| <b> -| "foo" -| "bar" - -#data -<!DOCTYPE html><span><button>foo</span>bar -#errors -39: End tag “span†seen but there were unclosed elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <span> -| <button> -| "foobar" - -#data -<p><b><div><marquee></p></b></div>X -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -Line: 1 Col: 24 Unexpected end tag (p). Ignored. -Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 35 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| <div> -| <b> -| <marquee> -| <p> -| "X" - -#data -<script><div></script></div><title><p></title><p><p> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected end tag (div). Ignored. -#document -| <html> -| <head> -| <script> -| "<div>" -| <title> -| "<p>" -| <body> -| <p> -| <p> - -#data -<!--><div>--<!--> -#errors -Line: 1 Col: 5 Incorrect comment. -Line: 1 Col: 10 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 17 Incorrect comment. -Line: 1 Col: 17 Expected closing tag. Unexpected end of file. -#document -| <!-- --> -| <html> -| <head> -| <body> -| <div> -| "--" -| <!-- --> - -#data -<p><hr></p> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -#document -| <html> -| <head> -| <body> -| <p> -| <hr> -| <p> - -#data -<select><b><option><select><option></b></select>X -#errors -Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored. -Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 48 Unexpected end tag (select). Ignored. -Line: 1 Col: 49 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> -| "X" - -#data -<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 63 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 64 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <a> -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| <table> -| <a> -| <a> -| <b> -| "X" -| "C" -| <a> -| "Y" - -#data -<a X>0<b>1<a Y>2 -#errors -Line: 1 Col: 5 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 16 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| x="" -| "0" -| <b> -| "1" -| <b> -| <a> -| y="" -| "2" - -#data -<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X--> -#errors -Line: 1 Col: 7 Unexpected '-' after '--' found in comment. -Line: 1 Col: 14 Unexpected start tag (font). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 41 Unexpected start tag (b) in table context caused voodoo mode. -Line: 1 Col: 48 Unexpected implied end tag (b) in the table phase. -Line: 1 Col: 48 Unexpected table cell start tag (th) in the table body phase. -Line: 1 Col: 63 Got table cell end tag (th) while required end tags are missing. -Line: 1 Col: 71 Unexpected end of file. Expected table content. -#document -| <!-- - --> -| <html> -| <head> -| <body> -| <font> -| <div> -| "helloexcite!" -| <b> -| "me!" -| <table> -| <tbody> -| <tr> -| <th> -| <i> -| "please!" -| <!-- X --> - -#data -<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do--> -#errors -Line: 1 Col: 61 Unexpected end tag (li). Missing end tag (body). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <li> -| "hello" -| <li> -| "world" -| <ul> -| "how" -| <li> -| "do" -| "you" -| <!-- do --> - -#data -<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E -#errors -Line: 1 Col: 54 Unexpected end tag (option) in the select phase. Ignored. -Line: 1 Col: 55 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "A" -| <option> -| "B" -| <optgroup> -| "C" -| <select> -| "DE" - -#data -< -#errors -Line: 1 Col: 1 Expected tag name. Got something else instead -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "<" - -#data -<# -#errors -Line: 1 Col: 1 Expected tag name. Got something else instead -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "<#" - -#data -</ -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected end of file. -Line: 1 Col: 2 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "</" - -#data -</# -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected character '#' found. -Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- # --> -| <html> -| <head> -| <body> - -#data -<? -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ? --> -| <html> -| <head> -| <body> - -#data -<?# -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ?# --> -| <html> -| <head> -| <body> - -#data -<! -#errors -Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 2 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- --> -| <html> -| <head> -| <body> - -#data -<!# -#errors -Line: 1 Col: 3 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 3 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- # --> -| <html> -| <head> -| <body> - -#data -<?COMMENT?> -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 11 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ?COMMENT? --> -| <html> -| <head> -| <body> - -#data -<!COMMENT> -#errors -Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 10 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COMMENT --> -| <html> -| <head> -| <body> - -#data -</ COMMENT > -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found. -Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COMMENT --> -| <html> -| <head> -| <body> - -#data -<?COM--MENT?> -#errors -Line: 1 Col: 1 Expected tag name. Got '?' instead. (HTML doesn't support processing instructions.) -Line: 1 Col: 13 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- ?COM--MENT? --> -| <html> -| <head> -| <body> - -#data -<!COM--MENT> -#errors -Line: 1 Col: 2 Expected '--' or 'DOCTYPE'. Not found. -Line: 1 Col: 12 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COM--MENT --> -| <html> -| <head> -| <body> - -#data -</ COM--MENT > -#errors -Line: 1 Col: 2 Expected closing tag. Unexpected character ' ' found. -Line: 1 Col: 14 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- COM--MENT --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><style> EOF -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| " EOF" -| <body> - -#data -<!DOCTYPE html><script> <!-- </script> --> </script> EOF -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| " <!-- " -| " " -| <body> -| "--> EOF" - -#data -<b><p></b>TEST -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 10 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <b> -| <p> -| <b> -| "TEST" - -#data -<p id=a><b><p id=b></b>TEST -#errors -Line: 1 Col: 8 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end tag (p). Ignored. -Line: 1 Col: 23 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <p> -| id="a" -| <b> -| <p> -| id="b" -| "TEST" - -#data -<b id=a><p><b id=b></p></b>TEST -#errors -Line: 1 Col: 8 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end tag (p). Ignored. -Line: 1 Col: 27 End tag (b) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 31 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| id="a" -| <p> -| <b> -| id="b" -| "TEST" - -#data -<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body> -#errors -Line: 1 Col: 61 Unexpected end tag (p). Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "U-test" -| <body> -| <div> -| <p> -| "Test" -| <u> - -#data -<!DOCTYPE html><font><table></font></table></font> -#errors -Line: 1 Col: 35 Unexpected end tag (font) in table context caused voodoo mode. -Line: 1 Col: 35 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <table> - -#data -<font><p>hello<b>cruel</font>world -#errors -Line: 1 Col: 6 Unexpected start tag (font). Expected DOCTYPE. -Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 29 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 34 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <font> -| <p> -| <font> -| "hello" -| <b> -| "cruel" -| <b> -| "world" - -#data -<b>Test</i>Test -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 11 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "TestTest" - -#data -<b>A<cite>B<div>C -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 17 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "A" -| <cite> -| "B" -| <div> -| "C" - -#data -<b>A<cite>B<div>C</cite>D -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end tag (cite). Ignored. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "A" -| <cite> -| "B" -| <div> -| "CD" - -#data -<b>A<cite>B<div>C</b>D -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 21 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 22 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "A" -| <cite> -| "B" -| <div> -| <b> -| "C" -| "D" - -#data - -#errors -Line: 1 Col: 0 Unexpected End of file. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<DIV> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 5 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> - -#data -<DIV> abc -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 9 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc" - -#data -<DIV> abc <B> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 13 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> - -#data -<DIV> abc <B> def -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 17 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def" - -#data -<DIV> abc <B> def <I> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 21 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> - -#data -<DIV> abc <B> def <I> ghi -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi" - -#data -<DIV> abc <B> def <I> ghi <P> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <p> - -#data -<DIV> abc <B> def <I> ghi <P> jkl -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 33 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <p> -| " jkl" - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 38 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <b> -| " jkl " - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 42 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <b> -| " jkl " -| " mno" - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 51 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " -| " pqr" - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 56 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " -| " pqr " - -#data -<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 38 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 47 End tag (i) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 60 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " abc " -| <b> -| " def " -| <i> -| " ghi " -| <i> -| <p> -| <i> -| <b> -| " jkl " -| " mno " -| " pqr " -| " stu" - -#data -<test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------> -#errors -Line: 1 Col: 1040 Unexpected start tag (test). Expected DOCTYPE. -Line: 1 Col: 1040 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <test> -| attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------="" - -#data -<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe -#errors -Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 39 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 39 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 39 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 45 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 71 Expected closing tag. Unexpected end of file. - -#document -| <html> -| <head> -| <body> -| <a> -| href="blah" -| "aba" -| <a> -| href="foo" -| "br" -| <a> -| href="foo" -| "x" -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| href="foo" -| "aoe" - -#data -<a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe -#errors -Line: 1 Col: 15 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 60 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 71 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| href="blah" -| "abax" -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| href="foo" -| "br" -| "aoe" - -#data -<table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 29 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 54 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 68 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 71 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| href="blah" -| "aba" -| <a> -| href="blah" -| "x" -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| href="foo" -| "br" -| <a> -| href="blah" -| "aoe" - -#data -<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa -#errors -Line: 1 Col: 10 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 45 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 47 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| href="a" -| "aa" -| <marquee> -| "aa" -| <a> -| href="b" -| "bb" -| "aa" - -#data -<wbr><strike><code></strike><code><strike></code> -#errors -Line: 1 Col: 5 Unexpected start tag (wbr). Expected DOCTYPE. -Line: 1 Col: 28 End tag (strike) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 49 Unexpected end tag (code). Ignored. -#document -| <html> -| <head> -| <body> -| <wbr> -| <strike> -| <code> -| <code> -| <code> -| <strike> - -#data -<!DOCTYPE html><spacer>foo -#errors -26: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <spacer> -| "foo" - -#data -<title><meta></title><link><title><meta></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "<meta>" -| <link> -| <title> -| "<meta>" -| <body> - -#data -<style><!--</style><meta><script>--><link></script> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 51 Unexpected end of file. Expected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--" -| <meta> -| <script> -| "--><link>" -| <body> - -#data -<head><meta></head><link> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected start tag (link) that can be in head. Moved. -#document -| <html> -| <head> -| <meta> -| <link> -| <body> - -#data -<table><tr><tr><td><td><span><th><span>X</table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 33 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 48 Got table cell end tag (th) while required end tags are missing. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <tr> -| <td> -| <td> -| <span> -| <th> -| <span> -| "X" - -#data -<body><body><base><link><meta><title><p></title><body><p></body> -#errors -Line: 1 Col: 6 Unexpected start tag (body). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected start tag (body). -Line: 1 Col: 54 Unexpected start tag (body). -Line: 1 Col: 64 Unexpected end tag (p). Missing end tag (body). -#document -| <html> -| <head> -| <body> -| <base> -| <link> -| <meta> -| <title> -| "<p>" -| <p> - -#data -<textarea><p></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| "<p>" - -#data -<p><image></p> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected start tag (image). Treated as img. -#document -| <html> -| <head> -| <body> -| <p> -| <img> - -#data -<a><table><a></table><p><a><div><a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 13 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 13 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 21 Unexpected end tag (table). Expected end tag (a). -Line: 1 Col: 27 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 27 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 32 Unexpected end tag (p). Ignored. -Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 35 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 35 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <a> -| <table> -| <p> -| <a> -| <div> -| <a> - -#data -<head></p><meta><p> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end tag (p). Ignored. -#document -| <html> -| <head> -| <meta> -| <body> -| <p> - -#data -<head></html><meta><p> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected start tag (meta). -#document -| <html> -| <head> -| <body> -| <meta> -| <p> - -#data -<b><table><td><i></table> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 25 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> - -#data -<b><table><td></b><i></table> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 18 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| <table> -| <tbody> -| <tr> -| <td> -| <i> - -#data -<h1><h2> -#errors -4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -8: Heading cannot be a child of another heading. -8: End of file seen and there were open elements. -#document -| <html> -| <head> -| <body> -| <h1> -| <h2> - -#data -<a><p><a></a></p></a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 9 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 21 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <a> -| <p> -| <a> -| <a> - -#data -<b><button></b></button></b> -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 15 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <b> -| <button> -| <b> - -#data -<p><b><div><marquee></p></b></div> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -Line: 1 Col: 24 Unexpected end tag (p). Ignored. -Line: 1 Col: 28 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 34 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 34 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| <div> -| <b> -| <marquee> -| <p> - -#data -<script></script></div><title></title><p><p> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end tag (div). Ignored. -#document -| <html> -| <head> -| <script> -| <title> -| <body> -| <p> -| <p> - -#data -<p><hr></p> -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end tag (p). Ignored. -#document -| <html> -| <head> -| <body> -| <p> -| <hr> -| <p> - -#data -<select><b><option><select><option></b></select> -#errors -Line: 1 Col: 8 Unexpected start tag (select). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected start tag token (b) in the select phase. Ignored. -Line: 1 Col: 27 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 39 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 48 Unexpected end tag (select). Ignored. -Line: 1 Col: 48 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> - -#data -<html><head><title></title><body></body></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| <body> - -#data -<a><table><td><a><table></table><a></tr><a></table><a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 35 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 40 Got table cell end tag (td) while required end tags are missing. -Line: 1 Col: 43 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 43 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 43 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 51 Unexpected implied end tag (a) in the table phase. -Line: 1 Col: 54 Unexpected start tag (a) implies end tag (a). -Line: 1 Col: 54 End tag (a) violates step 1, paragraph 2 of the adoption agency algorithm. -Line: 1 Col: 54 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <a> -| <table> -| <tbody> -| <tr> -| <td> -| <a> -| <table> -| <a> -| <a> - -#data -<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul> -#errors -Line: 1 Col: 4 Unexpected start tag (ul). Expected DOCTYPE. -Line: 1 Col: 45 Missing end tag (div, li). -Line: 1 Col: 58 Missing end tag (address, li). -Line: 1 Col: 69 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| <div> -| <li> -| <li> -| <li> -| <div> -| <li> -| <address> -| <li> -| <b> -| <em> -| <li> - -#data -<ul><li><ul></li><li>a</li></ul></li></ul> -#errors -XXX: fix me -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| <ul> -| <li> -| "a" - -#data -<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -#document -| <html> -| <head> -| <frameset> -| <frame> -| <frameset> -| <frame> -| <noframes> - -#data -<h1><table><td><h3></table><h3></h1> -#errors -4: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -15: “td†start tag in table body. -27: Unclosed elements. -31: Heading cannot be a child of another heading. -36: End tag “h1†seen but there were unclosed elements. -#document -| <html> -| <head> -| <body> -| <h1> -| <table> -| <tbody> -| <tr> -| <td> -| <h3> -| <h3> - -#data -<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <col> -| <colgroup> -| <col> -| <col> -| <col> -| <colgroup> -| <col> -| <col> -| <thead> -| <tr> -| <td> - -#data -<table><col><tbody><col><tr><col><td><col></table><col> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 55 Unexpected start tag col. Ignored. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <col> -| <tbody> -| <colgroup> -| <col> -| <tbody> -| <tr> -| <colgroup> -| <col> -| <tbody> -| <tr> -| <td> -| <colgroup> -| <col> - -#data -<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 52 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 80 Unexpected start tag colgroup. Ignored. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> -| <tbody> -| <colgroup> -| <tbody> -| <tr> -| <colgroup> -| <tbody> -| <tr> -| <td> -| <colgroup> - -#data -</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> -#errors -Line: 1 Col: 9 Unexpected end tag (strong). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end tag (strong) after the (implied) root element. -Line: 1 Col: 13 Unexpected end tag (b) after the (implied) root element. -Line: 1 Col: 18 Unexpected end tag (em) after the (implied) root element. -Line: 1 Col: 22 Unexpected end tag (i) after the (implied) root element. -Line: 1 Col: 26 Unexpected end tag (u) after the (implied) root element. -Line: 1 Col: 35 Unexpected end tag (strike) after the (implied) root element. -Line: 1 Col: 39 Unexpected end tag (s) after the (implied) root element. -Line: 1 Col: 47 Unexpected end tag (blink) after the (implied) root element. -Line: 1 Col: 52 Unexpected end tag (tt) after the (implied) root element. -Line: 1 Col: 58 Unexpected end tag (pre) after the (implied) root element. -Line: 1 Col: 64 Unexpected end tag (big) after the (implied) root element. -Line: 1 Col: 72 Unexpected end tag (small) after the (implied) root element. -Line: 1 Col: 79 Unexpected end tag (font) after the (implied) root element. -Line: 1 Col: 88 Unexpected end tag (select) after the (implied) root element. -Line: 1 Col: 93 Unexpected end tag (h1) after the (implied) root element. -Line: 1 Col: 98 Unexpected end tag (h2) after the (implied) root element. -Line: 1 Col: 103 Unexpected end tag (h3) after the (implied) root element. -Line: 1 Col: 108 Unexpected end tag (h4) after the (implied) root element. -Line: 1 Col: 113 Unexpected end tag (h5) after the (implied) root element. -Line: 1 Col: 118 Unexpected end tag (h6) after the (implied) root element. -Line: 1 Col: 125 Unexpected end tag (body) after the (implied) root element. -Line: 1 Col: 130 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 134 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 140 This element (img) has no end tag. -Line: 1 Col: 148 Unexpected end tag (title). Ignored. -Line: 1 Col: 155 Unexpected end tag (span). Ignored. -Line: 1 Col: 163 Unexpected end tag (style). Ignored. -Line: 1 Col: 172 Unexpected end tag (script). Ignored. -Line: 1 Col: 180 Unexpected end tag (table). Ignored. -Line: 1 Col: 185 Unexpected end tag (th). Ignored. -Line: 1 Col: 190 Unexpected end tag (td). Ignored. -Line: 1 Col: 195 Unexpected end tag (tr). Ignored. -Line: 1 Col: 203 This element (frame) has no end tag. -Line: 1 Col: 210 This element (area) has no end tag. -Line: 1 Col: 217 Unexpected end tag (link). Ignored. -Line: 1 Col: 225 This element (param) has no end tag. -Line: 1 Col: 230 This element (hr) has no end tag. -Line: 1 Col: 238 This element (input) has no end tag. -Line: 1 Col: 244 Unexpected end tag (col). Ignored. -Line: 1 Col: 251 Unexpected end tag (base). Ignored. -Line: 1 Col: 258 Unexpected end tag (meta). Ignored. -Line: 1 Col: 269 This element (basefont) has no end tag. -Line: 1 Col: 279 This element (bgsound) has no end tag. -Line: 1 Col: 287 This element (embed) has no end tag. -Line: 1 Col: 296 This element (spacer) has no end tag. -Line: 1 Col: 300 Unexpected end tag (p). Ignored. -Line: 1 Col: 305 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 310 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 320 Unexpected end tag (caption). Ignored. -Line: 1 Col: 331 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 339 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 347 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 355 Unexpected end tag (thead). Ignored. -Line: 1 Col: 365 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 378 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 387 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 393 Unexpected end tag (dir). Ignored. -Line: 1 Col: 399 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 404 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 425 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 432 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 437 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 442 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 447 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 454 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 460 This element (wbr) has no end tag. -Line: 1 Col: 476 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 486 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 495 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 513 Unexpected end tag (html). Ignored. -Line: 1 Col: 513 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 520 Unexpected end tag (head). Ignored. -Line: 1 Col: 529 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 537 This element (image) has no end tag. -Line: 1 Col: 547 This element (isindex) has no end tag. -Line: 1 Col: 557 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 568 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 579 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 590 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 599 Unexpected end tag (option). Ignored. -Line: 1 Col: 611 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 622 Unexpected end tag (textarea). Ignored. -#document -| <html> -| <head> -| <body> -| <br> -| <p> - -#data -<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (strong) in table context caused voodoo mode. -Line: 1 Col: 20 End tag (strong) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 24 Unexpected end tag (b) in table context caused voodoo mode. -Line: 1 Col: 24 End tag (b) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 29 Unexpected end tag (em) in table context caused voodoo mode. -Line: 1 Col: 29 End tag (em) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 33 Unexpected end tag (i) in table context caused voodoo mode. -Line: 1 Col: 33 End tag (i) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 37 Unexpected end tag (u) in table context caused voodoo mode. -Line: 1 Col: 37 End tag (u) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 46 Unexpected end tag (strike) in table context caused voodoo mode. -Line: 1 Col: 46 End tag (strike) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 50 Unexpected end tag (s) in table context caused voodoo mode. -Line: 1 Col: 50 End tag (s) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 58 Unexpected end tag (blink) in table context caused voodoo mode. -Line: 1 Col: 58 Unexpected end tag (blink). Ignored. -Line: 1 Col: 63 Unexpected end tag (tt) in table context caused voodoo mode. -Line: 1 Col: 63 End tag (tt) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 69 Unexpected end tag (pre) in table context caused voodoo mode. -Line: 1 Col: 69 End tag (pre) seen too early. Expected other end tag. -Line: 1 Col: 75 Unexpected end tag (big) in table context caused voodoo mode. -Line: 1 Col: 75 End tag (big) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 83 Unexpected end tag (small) in table context caused voodoo mode. -Line: 1 Col: 83 End tag (small) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 90 Unexpected end tag (font) in table context caused voodoo mode. -Line: 1 Col: 90 End tag (font) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 99 Unexpected end tag (select) in table context caused voodoo mode. -Line: 1 Col: 99 Unexpected end tag (select). Ignored. -Line: 1 Col: 104 Unexpected end tag (h1) in table context caused voodoo mode. -Line: 1 Col: 104 End tag (h1) seen too early. Expected other end tag. -Line: 1 Col: 109 Unexpected end tag (h2) in table context caused voodoo mode. -Line: 1 Col: 109 End tag (h2) seen too early. Expected other end tag. -Line: 1 Col: 114 Unexpected end tag (h3) in table context caused voodoo mode. -Line: 1 Col: 114 End tag (h3) seen too early. Expected other end tag. -Line: 1 Col: 119 Unexpected end tag (h4) in table context caused voodoo mode. -Line: 1 Col: 119 End tag (h4) seen too early. Expected other end tag. -Line: 1 Col: 124 Unexpected end tag (h5) in table context caused voodoo mode. -Line: 1 Col: 124 End tag (h5) seen too early. Expected other end tag. -Line: 1 Col: 129 Unexpected end tag (h6) in table context caused voodoo mode. -Line: 1 Col: 129 End tag (h6) seen too early. Expected other end tag. -Line: 1 Col: 136 Unexpected end tag (body) in the table row phase. Ignored. -Line: 1 Col: 141 Unexpected end tag (br) in table context caused voodoo mode. -Line: 1 Col: 141 Unexpected end tag (br). Treated as br element. -Line: 1 Col: 145 Unexpected end tag (a) in table context caused voodoo mode. -Line: 1 Col: 145 End tag (a) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 151 Unexpected end tag (img) in table context caused voodoo mode. -Line: 1 Col: 151 This element (img) has no end tag. -Line: 1 Col: 159 Unexpected end tag (title) in table context caused voodoo mode. -Line: 1 Col: 159 Unexpected end tag (title). Ignored. -Line: 1 Col: 166 Unexpected end tag (span) in table context caused voodoo mode. -Line: 1 Col: 166 Unexpected end tag (span). Ignored. -Line: 1 Col: 174 Unexpected end tag (style) in table context caused voodoo mode. -Line: 1 Col: 174 Unexpected end tag (style). Ignored. -Line: 1 Col: 183 Unexpected end tag (script) in table context caused voodoo mode. -Line: 1 Col: 183 Unexpected end tag (script). Ignored. -Line: 1 Col: 196 Unexpected end tag (th). Ignored. -Line: 1 Col: 201 Unexpected end tag (td). Ignored. -Line: 1 Col: 206 Unexpected end tag (tr). Ignored. -Line: 1 Col: 214 This element (frame) has no end tag. -Line: 1 Col: 221 This element (area) has no end tag. -Line: 1 Col: 228 Unexpected end tag (link). Ignored. -Line: 1 Col: 236 This element (param) has no end tag. -Line: 1 Col: 241 This element (hr) has no end tag. -Line: 1 Col: 249 This element (input) has no end tag. -Line: 1 Col: 255 Unexpected end tag (col). Ignored. -Line: 1 Col: 262 Unexpected end tag (base). Ignored. -Line: 1 Col: 269 Unexpected end tag (meta). Ignored. -Line: 1 Col: 280 This element (basefont) has no end tag. -Line: 1 Col: 290 This element (bgsound) has no end tag. -Line: 1 Col: 298 This element (embed) has no end tag. -Line: 1 Col: 307 This element (spacer) has no end tag. -Line: 1 Col: 311 Unexpected end tag (p). Ignored. -Line: 1 Col: 316 End tag (dd) seen too early. Expected other end tag. -Line: 1 Col: 321 End tag (dt) seen too early. Expected other end tag. -Line: 1 Col: 331 Unexpected end tag (caption). Ignored. -Line: 1 Col: 342 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 350 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 358 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 366 Unexpected end tag (thead). Ignored. -Line: 1 Col: 376 End tag (address) seen too early. Expected other end tag. -Line: 1 Col: 389 End tag (blockquote) seen too early. Expected other end tag. -Line: 1 Col: 398 End tag (center) seen too early. Expected other end tag. -Line: 1 Col: 404 Unexpected end tag (dir). Ignored. -Line: 1 Col: 410 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 415 End tag (dl) seen too early. Expected other end tag. -Line: 1 Col: 426 End tag (fieldset) seen too early. Expected other end tag. -Line: 1 Col: 436 End tag (listing) seen too early. Expected other end tag. -Line: 1 Col: 443 End tag (menu) seen too early. Expected other end tag. -Line: 1 Col: 448 End tag (ol) seen too early. Expected other end tag. -Line: 1 Col: 453 End tag (ul) seen too early. Expected other end tag. -Line: 1 Col: 458 End tag (li) seen too early. Expected other end tag. -Line: 1 Col: 465 End tag (nobr) violates step 1, paragraph 1 of the adoption agency algorithm. -Line: 1 Col: 471 This element (wbr) has no end tag. -Line: 1 Col: 487 End tag (button) seen too early. Expected other end tag. -Line: 1 Col: 497 End tag (marquee) seen too early. Expected other end tag. -Line: 1 Col: 506 End tag (object) seen too early. Expected other end tag. -Line: 1 Col: 524 Unexpected end tag (html). Ignored. -Line: 1 Col: 524 Unexpected end tag (frameset). Ignored. -Line: 1 Col: 531 Unexpected end tag (head). Ignored. -Line: 1 Col: 540 Unexpected end tag (iframe). Ignored. -Line: 1 Col: 548 This element (image) has no end tag. -Line: 1 Col: 558 This element (isindex) has no end tag. -Line: 1 Col: 568 Unexpected end tag (noembed). Ignored. -Line: 1 Col: 579 Unexpected end tag (noframes). Ignored. -Line: 1 Col: 590 Unexpected end tag (noscript). Ignored. -Line: 1 Col: 601 Unexpected end tag (optgroup). Ignored. -Line: 1 Col: 610 Unexpected end tag (option). Ignored. -Line: 1 Col: 622 Unexpected end tag (plaintext). Ignored. -Line: 1 Col: 633 Unexpected end tag (textarea). Ignored. -#document -| <html> -| <head> -| <body> -| <br> -| <table> -| <tbody> -| <tr> -| <p> - -#data -<frameset> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 10 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat deleted file mode 100644 index 4f8df86f..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests10.dat +++ /dev/null @@ -1,799 +0,0 @@ -#data -<!DOCTYPE html><svg></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> - -#data -<!DOCTYPE html><svg></svg><![CDATA[a]]> -#errors -29: Bogus comment -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <!-- [CDATA[a]] --> - -#data -<!DOCTYPE html><body><svg></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> - -#data -<!DOCTYPE html><body><select><svg></svg></select> -#errors -35: Stray “svg†start tag. -42: Stray end tag “svg†-#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!DOCTYPE html><body><select><option><svg></svg></option></select> -#errors -43: Stray “svg†start tag. -50: Stray end tag “svg†-#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!DOCTYPE html><body><table><svg></svg></table> -#errors -34: Start tag “svg†seen in “tableâ€. -41: Stray end tag “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <table> - -#data -<!DOCTYPE html><body><table><svg><g>foo</g></svg></table> -#errors -34: Start tag “svg†seen in “tableâ€. -46: Stray end tag “gâ€. -53: Stray end tag “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <table> - -#data -<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table> -#errors -34: Start tag “svg†seen in “tableâ€. -46: Stray end tag “gâ€. -58: Stray end tag “gâ€. -65: Stray end tag “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <table> - -#data -<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table> -#errors -41: Start tag “svg†seen in “tableâ€. -53: Stray end tag “gâ€. -65: Stray end tag “gâ€. -72: Stray end tag “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <table> -| <tbody> - -#data -<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table> -#errors -45: Start tag “svg†seen in “tableâ€. -57: Stray end tag “gâ€. -69: Stray end tag “gâ€. -76: Stray end tag “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" - -#data -<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -70: HTML start tag “p†in a foreign namespace context. -81: “table†closed but “caption†was still open. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux -#errors -78: “table†closed but “caption†was still open. -78: Unclosed elements on stack. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -44: Start tag “svg†seen in “tableâ€. -56: Stray end tag “gâ€. -68: Stray end tag “gâ€. -71: HTML start tag “p†in a foreign namespace context. -71: Start tag “p†seen in “tableâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" -| <table> -| <colgroup> -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -50: Stray “svg†start tag. -54: Stray “g†start tag. -62: Stray end tag “g†-66: Stray “g†start tag. -74: Stray end tag “g†-77: Stray “p†start tag. -88: “table†end tag with “select†open. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| "foobarbaz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux -#errors -36: Start tag “select†seen in “tableâ€. -42: Stray “svg†start tag. -46: Stray “g†start tag. -54: Stray end tag “g†-58: Stray “g†start tag. -66: Stray end tag “g†-69: Stray “p†start tag. -80: “table†end tag with “select†open. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "foobarbaz" -| <table> -| <p> -| "quux" - -#data -<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz -#errors -41: Stray “svg†start tag. -68: HTML start tag “p†in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz -#errors -34: Stray “svg†start tag. -61: HTML start tag “p†in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg g> -| "foo" -| <svg g> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><frameset><svg><g></g><g></g><p><span> -#errors -31: Stray “svg†start tag. -35: Stray “g†start tag. -40: Stray end tag “g†-44: Stray “g†start tag. -49: Stray end tag “g†-52: Stray “p†start tag. -58: Stray “span†start tag. -58: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span> -#errors -42: Stray “svg†start tag. -46: Stray “g†start tag. -51: Stray end tag “g†-55: Stray “g†start tag. -60: Stray end tag “g†-63: Stray “p†start tag. -69: Stray “span†start tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| <svg svg> -| xlink href="foo" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <svg svg> -| <svg g> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <svg svg> -| <svg g> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <svg svg> -| <svg g> -| xlink href="foo" -| xml lang="en" -| "bar" - -#data -<svg></path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<div><svg></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| "a" - -#data -<div><svg><path></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| "a" - -#data -<div><svg><path></svg><path> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <path> - -#data -<div><svg><path><foreignObject><math></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <svg foreignObject> -| <math math> -| "a" - -#data -<div><svg><path><foreignObject><p></div>a -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <svg foreignObject> -| <p> -| "a" - -#data -<!DOCTYPE html><svg><desc><div><svg><ul>a -#errors -40: HTML start tag “ul†in a foreign namespace context. -41: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg desc> -| <div> -| <svg svg> -| <ul> -| "a" - -#data -<!DOCTYPE html><svg><desc><svg><ul>a -#errors -35: HTML start tag “ul†in a foreign namespace context. -36: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg desc> -| <svg svg> -| <ul> -| "a" - -#data -<!DOCTYPE html><p><svg><desc><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <svg svg> -| <svg desc> -| <p> - -#data -<!DOCTYPE html><p><svg><title><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <svg svg> -| <svg title> -| <p> - -#data -<div><svg><path><foreignObject><p></foreignObject><p> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <svg svg> -| <svg path> -| <svg foreignObject> -| <p> -| <p> - -#data -<math><mi><div><object><div><span></span></div></object></div></mi><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <div> -| <object> -| <div> -| <span> -| <math mi> - -#data -<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <svg svg> -| <svg foreignObject> -| <div> -| <div> -| <math mi> - -#data -<svg><script></script><path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg script> -| <svg path> - -#data -<table><svg></svg><tr> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <table> -| <tbody> -| <tr> - -#data -<math><mi><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <math mglyph> - -#data -<math><mi><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| <math malignmark> - -#data -<math><mo><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mo> -| <math mglyph> - -#data -<math><mo><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mo> -| <math malignmark> - -#data -<math><mn><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| <math mglyph> - -#data -<math><mn><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| <math malignmark> - -#data -<math><ms><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math ms> -| <math mglyph> - -#data -<math><ms><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math ms> -| <math malignmark> - -#data -<math><mtext><mglyph> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mtext> -| <math mglyph> - -#data -<math><mtext><malignmark> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mtext> -| <math malignmark> - -#data -<math><annotation-xml><svg></svg></annotation-xml><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <math mi> - -#data -<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <svg foreignObject> -| <div> -| <math math> -| <math mi> -| <span> -| <svg path> -| <math mi> - -#data -<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <svg foreignObject> -| <math math> -| <math mi> -| <svg svg> -| <math mo> -| <span> -| <svg path> -| <math mi> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat deleted file mode 100644 index 638cde47..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests11.dat +++ /dev/null @@ -1,482 +0,0 @@ -#data -<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data -<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' DIFFUSECONSTANT='' EDGEMODE='' EXTERNALRESOURCESREQUIRED='' FILTERRES='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data -<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' contentscripttype='' contentstyletype='' diffuseconstant='' edgemode='' externalresourcesrequired='' filterres='' filterunits='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| attributeName="" -| attributeType="" -| baseFrequency="" -| baseProfile="" -| calcMode="" -| clipPathUnits="" -| contentScriptType="" -| contentStyleType="" -| diffuseConstant="" -| edgeMode="" -| externalResourcesRequired="" -| filterRes="" -| filterUnits="" -| glyphRef="" -| gradientTransform="" -| gradientUnits="" -| kernelMatrix="" -| kernelUnitLength="" -| keyPoints="" -| keySplines="" -| keyTimes="" -| lengthAdjust="" -| limitingConeAngle="" -| markerHeight="" -| markerUnits="" -| markerWidth="" -| maskContentUnits="" -| maskUnits="" -| numOctaves="" -| pathLength="" -| patternContentUnits="" -| patternTransform="" -| patternUnits="" -| pointsAtX="" -| pointsAtY="" -| pointsAtZ="" -| preserveAlpha="" -| preserveAspectRatio="" -| primitiveUnits="" -| refX="" -| refY="" -| repeatCount="" -| repeatDur="" -| requiredExtensions="" -| requiredFeatures="" -| specularConstant="" -| specularExponent="" -| spreadMethod="" -| startOffset="" -| stdDeviation="" -| stitchTiles="" -| surfaceScale="" -| systemLanguage="" -| tableValues="" -| targetX="" -| targetY="" -| textLength="" -| viewBox="" -| viewTarget="" -| xChannelSelector="" -| yChannelSelector="" -| zoomAndPan="" - -#data -<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' contentScriptType='' contentStyleType='' diffuseConstant='' edgeMode='' externalResourcesRequired='' filterRes='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| attributename="" -| attributetype="" -| basefrequency="" -| baseprofile="" -| calcmode="" -| clippathunits="" -| contentscripttype="" -| contentstyletype="" -| diffuseconstant="" -| edgemode="" -| externalresourcesrequired="" -| filterres="" -| filterunits="" -| glyphref="" -| gradienttransform="" -| gradientunits="" -| kernelmatrix="" -| kernelunitlength="" -| keypoints="" -| keysplines="" -| keytimes="" -| lengthadjust="" -| limitingconeangle="" -| markerheight="" -| markerunits="" -| markerwidth="" -| maskcontentunits="" -| maskunits="" -| numoctaves="" -| pathlength="" -| patterncontentunits="" -| patterntransform="" -| patternunits="" -| pointsatx="" -| pointsaty="" -| pointsatz="" -| preservealpha="" -| preserveaspectratio="" -| primitiveunits="" -| refx="" -| refy="" -| repeatcount="" -| repeatdur="" -| requiredextensions="" -| requiredfeatures="" -| specularconstant="" -| specularexponent="" -| spreadmethod="" -| startoffset="" -| stddeviation="" -| stitchtiles="" -| surfacescale="" -| systemlanguage="" -| tablevalues="" -| targetx="" -| targety="" -| textlength="" -| viewbox="" -| viewtarget="" -| xchannelselector="" -| ychannelselector="" -| zoomandpan="" - -#data -<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg altGlyph> -| <svg altGlyphDef> -| <svg altGlyphItem> -| <svg animateColor> -| <svg animateMotion> -| <svg animateTransform> -| <svg clipPath> -| <svg feBlend> -| <svg feColorMatrix> -| <svg feComponentTransfer> -| <svg feComposite> -| <svg feConvolveMatrix> -| <svg feDiffuseLighting> -| <svg feDisplacementMap> -| <svg feDistantLight> -| <svg feFlood> -| <svg feFuncA> -| <svg feFuncB> -| <svg feFuncG> -| <svg feFuncR> -| <svg feGaussianBlur> -| <svg feImage> -| <svg feMerge> -| <svg feMergeNode> -| <svg feMorphology> -| <svg feOffset> -| <svg fePointLight> -| <svg feSpecularLighting> -| <svg feSpotLight> -| <svg feTile> -| <svg feTurbulence> -| <svg foreignObject> -| <svg glyphRef> -| <svg linearGradient> -| <svg radialGradient> -| <svg textPath> - -#data -<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg altGlyph> -| <svg altGlyphDef> -| <svg altGlyphItem> -| <svg animateColor> -| <svg animateMotion> -| <svg animateTransform> -| <svg clipPath> -| <svg feBlend> -| <svg feColorMatrix> -| <svg feComponentTransfer> -| <svg feComposite> -| <svg feConvolveMatrix> -| <svg feDiffuseLighting> -| <svg feDisplacementMap> -| <svg feDistantLight> -| <svg feFlood> -| <svg feFuncA> -| <svg feFuncB> -| <svg feFuncG> -| <svg feFuncR> -| <svg feGaussianBlur> -| <svg feImage> -| <svg feMerge> -| <svg feMergeNode> -| <svg feMorphology> -| <svg feOffset> -| <svg fePointLight> -| <svg feSpecularLighting> -| <svg feSpotLight> -| <svg feTile> -| <svg feTurbulence> -| <svg foreignObject> -| <svg glyphRef> -| <svg linearGradient> -| <svg radialGradient> -| <svg textPath> - -#data -<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg altGlyph> -| <svg altGlyphDef> -| <svg altGlyphItem> -| <svg animateColor> -| <svg animateMotion> -| <svg animateTransform> -| <svg clipPath> -| <svg feBlend> -| <svg feColorMatrix> -| <svg feComponentTransfer> -| <svg feComposite> -| <svg feConvolveMatrix> -| <svg feDiffuseLighting> -| <svg feDisplacementMap> -| <svg feDistantLight> -| <svg feFlood> -| <svg feFuncA> -| <svg feFuncB> -| <svg feFuncG> -| <svg feFuncR> -| <svg feGaussianBlur> -| <svg feImage> -| <svg feMerge> -| <svg feMergeNode> -| <svg feMorphology> -| <svg feOffset> -| <svg fePointLight> -| <svg feSpecularLighting> -| <svg feSpotLight> -| <svg feTile> -| <svg feTurbulence> -| <svg foreignObject> -| <svg glyphRef> -| <svg linearGradient> -| <svg radialGradient> -| <svg textPath> - -#data -<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math altglyph> -| <math altglyphdef> -| <math altglyphitem> -| <math animatecolor> -| <math animatemotion> -| <math animatetransform> -| <math clippath> -| <math feblend> -| <math fecolormatrix> -| <math fecomponenttransfer> -| <math fecomposite> -| <math feconvolvematrix> -| <math fediffuselighting> -| <math fedisplacementmap> -| <math fedistantlight> -| <math feflood> -| <math fefunca> -| <math fefuncb> -| <math fefuncg> -| <math fefuncr> -| <math fegaussianblur> -| <math feimage> -| <math femerge> -| <math femergenode> -| <math femorphology> -| <math feoffset> -| <math fepointlight> -| <math fespecularlighting> -| <math fespotlight> -| <math fetile> -| <math feturbulence> -| <math foreignobject> -| <math glyphref> -| <math lineargradient> -| <math radialgradient> -| <math textpath> - -#data -<!DOCTYPE html><body><svg><solidColor /></svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg solidcolor> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat deleted file mode 100644 index 63107d27..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests12.dat +++ /dev/null @@ -1,62 +0,0 @@ -#data -<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "foo" -| <math math> -| <math mtext> -| <i> -| "baz" -| <math annotation-xml> -| <svg svg> -| <svg desc> -| <b> -| "eggs" -| <svg g> -| <svg foreignObject> -| <p> -| "spam" -| <table> -| <tbody> -| <tr> -| <td> -| <img> -| <svg g> -| "quux" -| "bar" - -#data -<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "foo" -| <math math> -| <math mtext> -| <i> -| "baz" -| <math annotation-xml> -| <svg svg> -| <svg desc> -| <b> -| "eggs" -| <svg g> -| <svg foreignObject> -| <p> -| "spam" -| <table> -| <tbody> -| <tr> -| <td> -| <img> -| <svg g> -| "quux" -| "bar" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat deleted file mode 100644 index b8713f88..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests14.dat +++ /dev/null @@ -1,74 +0,0 @@ -#data -<!DOCTYPE html><html><body><xyz:abc></xyz:abc> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xyz:abc> - -#data -<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xyz:abc> -| <span> - -#data -<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc> -#errors -15: Unexpected start tag html -#document -| <!DOCTYPE html> -| <html> -| abc:def="gh" -| <head> -| <body> -| <xyz:abc> - -#data -<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo> -#errors -15: Unexpected start tag html -#document -| <!DOCTYPE html> -| <html> -| xml:lang="bar" -| <head> -| <body> - -#data -<!DOCTYPE html><html 123=456> -#errors -#document -| <!DOCTYPE html> -| <html> -| 123="456" -| <head> -| <body> - -#data -<!DOCTYPE html><html 123=456><html 789=012> -#errors -#document -| <!DOCTYPE html> -| <html> -| 123="456" -| 789="012" -| <head> -| <body> - -#data -<!DOCTYPE html><html><body 789=012> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| 789="012" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat deleted file mode 100644 index 6ce1c0d1..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests15.dat +++ /dev/null @@ -1,208 +0,0 @@ -#data -<!DOCTYPE html><p><b><i><u></p> <p>X -#errors -Line: 1 Col: 31 Unexpected end tag (p). Ignored. -Line: 1 Col: 36 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <b> -| <i> -| <u> -| <b> -| <i> -| <u> -| " " -| <p> -| "X" - -#data -<p><b><i><u></p> -<p>X -#errors -Line: 1 Col: 3 Unexpected start tag (p). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end tag (p). Ignored. -Line: 2 Col: 4 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| <i> -| <u> -| <b> -| <i> -| <u> -| " -" -| <p> -| "X" - -#data -<!doctype html></html> <head> -#errors -Line: 1 Col: 22 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " " - -#data -<!doctype html></body><meta> -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <meta> - -#data -<html></html><!-- foo --> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (html) after the (implied) root element. -#document -| <html> -| <head> -| <body> -| <!-- foo --> - -#data -<!doctype html></body><title>X</title> -#errors -Line: 1 Col: 22 Unexpected end tag (body) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" - -#data -<!doctype html><table> X<meta></table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " X" -| <meta> -| <table> - -#data -<!doctype html><table> x</table> -#errors -Line: 1 Col: 24 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> - -#data -<!doctype html><table> x </table> -#errors -Line: 1 Col: 25 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x " -| <table> - -#data -<!doctype html><table><tr> x</table> -#errors -Line: 1 Col: 28 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " x" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table>X<style> <tr>x </style> </table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <style> -| " <tr>x " -| " " - -#data -<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div> -#errors -Line: 1 Col: 30 Unexpected start tag (a) in table context caused voodoo mode. -Line: 1 Col: 37 Unexpected end tag (a) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <a> -| "foo" -| <table> -| " " -| <tbody> -| <tr> -| <td> -| "bar" -| " " - -#data -<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes> -#errors -6: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -13: Stray start tag “frameâ€. -21: Stray end tag “frameâ€. -29: Stray end tag “frameâ€. -39: “frameset†start tag after “body†already open. -105: End of file seen inside an [R]CDATA element. -105: End of file seen and there were open elements. -XXX: These errors are wrong, please fix me! -#document -| <html> -| <head> -| <frameset> -| <frame> -| <frameset> -| <frame> -| <noframes> -| "</frameset><noframes>" - -#data -<!DOCTYPE html><object></html> -#errors -1: Expected closing tag. Unexpected end of file -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat deleted file mode 100644 index c8ef66f0..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests16.dat +++ /dev/null @@ -1,2299 +0,0 @@ -#data -<!doctype html><script> -#errors -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script>a -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<!doctype html><script>< -#errors -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<!doctype html><script></ -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<!doctype html><script></S -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<!doctype html><script></SC -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<!doctype html><script></SCR -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<!doctype html><script></SCRI -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<!doctype html><script></SCRIP -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<!doctype html><script></SCRIPT -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script></s -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<!doctype html><script></sc -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<!doctype html><script></scr -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<!doctype html><script></scri -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<!doctype html><script></scrip -#errors -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<!doctype html><script></script -#errors -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| <body> - -#data -<!doctype html><script><! -#errors -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<!doctype html><script><!a -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<!doctype html><script><!- -#errors -Line: 1 Col: 26 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<!doctype html><script><!-a -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<!doctype html><script><!-- -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--a -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<!doctype html><script><!--< -#errors -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<!doctype html><script><!--<a -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<!doctype html><script><!--</ -#errors -Line: 1 Col: 27 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<!doctype html><script><!--</script -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<!doctype html><script><!--<s -#errors -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<!doctype html><script><!--<script -#errors -Line: 1 Col: 35 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<!doctype html><script><!--<script < -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<!doctype html><script><!--<script <a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<!doctype html><script><!--<script </ -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<!doctype html><script><!--<script </s -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 43 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<!doctype html><script><!--<script </scripta -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<!doctype html><script><!--<script </script -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script> -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<!doctype html><script><!--<script </script/ -#errors -Line: 1 Col: 44 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<!doctype html><script><!--<script </script < -#errors -Line: 1 Col: 45 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<!doctype html><script><!--<script </script <a -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<!doctype html><script><!--<script </script </ -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<!doctype html><script><!--<script </script </script -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script/ -#errors -Line: 1 Col: 53 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script </script </script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<!doctype html><script><!--<script - -#errors -Line: 1 Col: 36 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<!doctype html><script><!--<script -a -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<!doctype html><script><!--<script -< -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -<" -| <body> - -#data -<!doctype html><script><!--<script -- -#errors -Line: 1 Col: 37 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<!doctype html><script><!--<script --a -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<!doctype html><script><!--<script --< -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --<" -| <body> - -#data -<!doctype html><script><!--<script --> -#errors -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script -->< -#errors -Line: 1 Col: 39 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<!doctype html><script><!--<script --></ -#errors -Line: 1 Col: 40 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 46 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<!doctype html><script><!--<script --></script -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script/ -#errors -Line: 1 Col: 47 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script --></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<!doctype html><script><!--<script><\/script>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<!doctype html><script><!--<script></scr'+'ipt>--></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>--><!--</script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-- ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- -></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>- - ></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<!doctype html><script><!--<script></script><script></script>-></script> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<!doctype html><script><!--<script>--!></script>X -#errors -Line: 1 Col: 49 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<!doctype html><script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 59 Unexpected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<!doctype html><script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 57 Unexpected end of file. Expected end tag (script). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<!doctype html><style><!--<style></style>--></style> -#errors -Line: 1 Col: 52 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<!doctype html><style><!--</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<!doctype html><style><!--...</style>...--></style> -#errors -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<!doctype html><style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 66 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<!doctype html><style><!--...</style><!-- --><style>@import ...</style> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<!doctype html><style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 63 Unexpected end tag (style). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<!doctype html><style>...<!--[if IE]><style>...</style>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<!doctype html><title><!--<title></title>--></title> -#errors -Line: 1 Col: 52 Unexpected end tag (title). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "<!--<title>" -| <body> -| "-->" - -#data -<!doctype html><title>&lt;/title></title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "</title>" -| <body> - -#data -<!doctype html><title>foo/title><link></head><body>X -#errors -Line: 1 Col: 52 Unexpected end of file. Expected end tag (title). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<!doctype html><noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 64 Unexpected end tag (noscript). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<!doctype html><noscript><!--</noscript>X<noscript>--></noscript> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<!doctype html><noscript><iframe></noscript>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<!doctype html><noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 64 Unexpected end tag (noframes). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<!doctype html><noframes><body><script><!--...</script></body></noframes></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<!doctype html><textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 64 Unexpected end tag (textarea). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<!doctype html><textarea>&lt;/textarea></textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<!doctype html><textarea>&lt;</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "<" - -#data -<!doctype html><textarea>a&lt;b</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "a<b" - -#data -<!doctype html><iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 56 Unexpected end tag (iframe). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<!doctype html><iframe>...<!--X->...<!--/X->...</iframe> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<!doctype html><xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 44 Unexpected end tag (xmp). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<!doctype html><noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 60 Unexpected end tag (noembed). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script>a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "a" -| <body> - -#data -<script>< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 9 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<" -| <body> - -#data -<script></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</" -| <body> - -#data -<script></S -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</S" -| <body> - -#data -<script></SC -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SC" -| <body> - -#data -<script></SCR -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCR" -| <body> - -#data -<script></SCRI -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRI" -| <body> - -#data -<script></SCRIP -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIP" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</SCRIPT" -| <body> - -#data -<script></SCRIPT -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script></s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</s" -| <body> - -#data -<script></sc -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</sc" -| <body> - -#data -<script></scr -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scr" -| <body> - -#data -<script></scri -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scri" -| <body> - -#data -<script></scrip -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</scrip" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</script" -| <body> - -#data -<script></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| <body> - -#data -<script><! -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 10 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!" -| <body> - -#data -<script><!a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!a" -| <body> - -#data -<script><!- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-" -| <body> - -#data -<script><!-a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!-a" -| <body> - -#data -<script><!-- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--a" -| <body> - -#data -<script><!--< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<" -| <body> - -#data -<script><!--<a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<a" -| <body> - -#data -<script><!--</ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--</script" -| <body> - -#data -<script><!--</script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--" -| <body> - -#data -<script><!--<s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<s" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script" -| <body> - -#data -<script><!--<script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script " -| <body> - -#data -<script><!--<script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <" -| <body> - -#data -<script><!--<script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script <a" -| <body> - -#data -<script><!--<script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </" -| <body> - -#data -<script><!--<script </s -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </s" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script" -| <body> - -#data -<script><!--<script </scripta -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </scripta" -| <body> - -#data -<script><!--<script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script>" -| <body> - -#data -<script><!--<script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script/" -| <body> - -#data -<script><!--<script </script < -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 30 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <" -| <body> - -#data -<script><!--<script </script <a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script <a" -| <body> - -#data -<script><!--<script </script </ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script </script" -| <body> - -#data -<script><!--<script </script </script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 38 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script </script </script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script </script " -| <body> - -#data -<script><!--<script - -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -" -| <body> - -#data -<script><!--<script -a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -a" -| <body> - -#data -<script><!--<script -- -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --" -| <body> - -#data -<script><!--<script --a -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --a" -| <body> - -#data -<script><!--<script --> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script -->< -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --><" -| <body> - -#data -<script><!--<script --></ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script --></script" -| <body> - -#data -<script><!--<script --></script -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script/ -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 32 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script --></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script -->" -| <body> - -#data -<script><!--<script><\/script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script><\/script>-->" -| <body> - -#data -<script><!--<script></scr'+'ipt>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt>-->" -| <body> - -#data -<script><!--<script></script><script></script></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>" -| <body> - -#data -<script><!--<script></script><script></script>--><!--</script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>--><!--" -| <body> - -#data -<script><!--<script></script><script></script>-- ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>-- >" -| <body> - -#data -<script><!--<script></script><script></script>- -></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- ->" -| <body> - -#data -<script><!--<script></script><script></script>- - ></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>- - >" -| <body> - -#data -<script><!--<script></script><script></script>-></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| "<!--<script></script><script></script>->" -| <body> - -#data -<script><!--<script>--!></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 34 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script>--!></script>X" -| <body> - -#data -<script><!--<scr'+'ipt></script>--></script> -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 44 Unexpected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<scr'+'ipt>" -| <body> -| "-->" - -#data -<script><!--<script></scr'+'ipt></script>X -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 42 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "<!--<script></scr'+'ipt></script>X" -| <body> - -#data -<style><!--<style></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--<style>" -| <body> -| "-->" - -#data -<style><!--</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--" -| <body> -| "X" - -#data -<style><!--...</style>...--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 36 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--..." -| <body> -| "...-->" - -#data -<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>" -| <body> -| "X" - -#data -<style><!--...<style><!--...--!></style>--></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 51 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "<!--...<style><!--...--!>" -| <body> -| "-->" - -#data -<style><!--...</style><!-- --><style>@import ...</style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "<!--..." -| <!-- --> -| <style> -| "@import ..." -| <body> - -#data -<style>...<style><!--...</style><!-- --></style> -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 48 Unexpected end tag (style). -#document -| <html> -| <head> -| <style> -| "...<style><!--..." -| <!-- --> -| <body> - -#data -<style>...<!--[if IE]><style>...</style>X -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| "...<!--[if IE]><style>..." -| <body> -| "X" - -#data -<title><!--<title></title>--></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end tag (title). -#document -| <html> -| <head> -| <title> -| "<!--<title>" -| <body> -| "-->" - -#data -<title>&lt;/title></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "</title>" -| <body> - -#data -<title>foo/title><link></head><body>X -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 37 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "foo/title><link></head><body>X" -| <body> - -#data -<noscript><!--<noscript></noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noscript). -#document -| <html> -| <head> -| <noscript> -| "<!--<noscript>" -| <body> -| "-->" - -#data -<noscript><!--</noscript>X<noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "X" -| <noscript> -| "-->" - -#data -<noscript><iframe></noscript>X -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<iframe>" -| <body> -| "X" - -#data -<noframes><!--<noframes></noframes>--></noframes> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (noframes). -#document -| <html> -| <head> -| <noframes> -| "<!--<noframes>" -| <body> -| "-->" - -#data -<noframes><body><script><!--...</script></body></noframes></html> -#errors -Line: 1 Col: 10 Unexpected start tag (noframes). Expected DOCTYPE. -#document -| <html> -| <head> -| <noframes> -| "<body><script><!--...</script></body>" -| <body> - -#data -<textarea><!--<textarea></textarea>--></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 49 Unexpected end tag (textarea). -#document -| <html> -| <head> -| <body> -| <textarea> -| "<!--<textarea>" -| "-->" - -#data -<textarea>&lt;/textarea></textarea> -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| "</textarea>" - -#data -<iframe><!--<iframe></iframe>--></iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -Line: 1 Col: 41 Unexpected end tag (iframe). -#document -| <html> -| <head> -| <body> -| <iframe> -| "<!--<iframe>" -| "-->" - -#data -<iframe>...<!--X->...<!--/X->...</iframe> -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| "...<!--X->...<!--/X->..." - -#data -<xmp><!--<xmp></xmp>--></xmp> -#errors -Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. -Line: 1 Col: 29 Unexpected end tag (xmp). -#document -| <html> -| <head> -| <body> -| <xmp> -| "<!--<xmp>" -| "-->" - -#data -<noembed><!--<noembed></noembed>--></noembed> -#errors -Line: 1 Col: 9 Unexpected start tag (noembed). Expected DOCTYPE. -Line: 1 Col: 45 Unexpected end tag (noembed). -#document -| <html> -| <head> -| <body> -| <noembed> -| "<!--<noembed>" -| "-->" - -#data -<!doctype html><table> - -#errors -Line 2 Col 0 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " -" - -#data -<!doctype html><table><td><span><font></span><span> -#errors -Line 1 Col 26 Unexpected table cell start tag (td) in the table body phase. -Line 1 Col 45 Unexpected end tag (span). -Line 1 Col 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <span> -| <font> -| <font> -| <span> - -#data -<!doctype html><form><table></form><form></table></form> -#errors -35: Stray end tag “formâ€. -41: Start tag “form†seen in “tableâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <table> -| <form> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat deleted file mode 100644 index 7b555f88..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests17.dat +++ /dev/null @@ -1,153 +0,0 @@ -#data -<!doctype html><table><tbody><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tr><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<!doctype html><table><tr><td><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| <td> - -#data -<!doctype html><table><tr><th><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <th> -| <select> -| <td> - -#data -<!doctype html><table><caption><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <select> -| <tbody> -| <tr> - -#data -<!doctype html><select><tr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><th> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tbody> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><thead> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><select><caption> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><table><tr></table>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| "a" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat deleted file mode 100644 index 680e1f06..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests18.dat +++ /dev/null @@ -1,269 +0,0 @@ -#data -<!doctype html><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> - -#data -<!doctype html><table><tbody><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><tbody><tr><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><caption><plaintext></plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <plaintext> -| "</plaintext>" - -#data -<!doctype html><table><tr><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <style> -| "</script>" - -#data -<!doctype html><table><tr><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <tbody> -| <tr> -| <script> -| "</style>" - -#data -<!doctype html><table><caption><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><table><td><style></script></style>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <style> -| "</script>" -| "abc" - -#data -<!doctype html><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" - -#data -<!doctype html><table><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> - -#data -<!doctype html><table><tr><select><script></style></script>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <script> -| "</style>" -| "abc" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><frameset></frameset><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><frameset></frameset></html><noframes>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" - -#data -<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <noframes> -| "abc" -| <!-- abc --> - -#data -<!doctype html><table><tr></tbody><tfoot> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <tfoot> - -#data -<!doctype html><table><td><svg></svg>abc<td> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| "abc" -| <td> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat deleted file mode 100644 index 0d62f5a5..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests19.dat +++ /dev/null @@ -1,1237 +0,0 @@ -#data -<!doctype html><math><mn DefinitionUrl="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mn> -| definitionURL="foo" - -#data -<!doctype html><html></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <!-- foo --> -| <head> -| <body> - -#data -<!doctype html><head></head></p><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- foo --> -| <body> - -#data -<!doctype html><body><p><pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <pre> - -#data -<!doctype html><body><p><listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <listing> - -#data -<!doctype html><p><plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <plaintext> - -#data -<!doctype html><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <h1> - -#data -<!doctype html><form><isindex> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> - -#data -<!doctype html><isindex action="POST"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| action="POST" -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex prompt="this is isindex"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "this is isindex" -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><isindex type="hidden"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| type="hidden" -| <hr> - -#data -<!doctype html><isindex name="foo"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<!doctype html><ruby><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rp> - -#data -<!doctype html><ruby><div><span><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rp> - -#data -<!doctype html><ruby><div><p><rp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rp> - -#data -<!doctype html><ruby><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <p> -| <rt> - -#data -<!doctype html><ruby><div><span><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <span> -| <rt> - -#data -<!doctype html><ruby><div><p><rt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <p> -| <rt> - -#data -<!doctype html><math/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <foo> - -#data -<!doctype html><svg/><foo> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <foo> - -#data -<!doctype html><div></body><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <!-- foo --> - -#data -<!doctype html><h1><div><h3><span></h1>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h1> -| <div> -| <h3> -| <span> -| "foo" - -#data -<!doctype html><p></h3>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "foo" - -#data -<!doctype html><h3><li>abc</h2>foo -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <h3> -| <li> -| "abc" -| "foo" - -#data -<!doctype html><table>abc<!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "abc" -| <table> -| <!-- foo --> - -#data -<!doctype html><table> <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <!-- foo --> - -#data -<!doctype html><table> b <!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| " b " -| <table> -| <!-- foo --> - -#data -<!doctype html><select><option><option> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><select><option></optgroup> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!doctype html><p><math><mi><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mi> -| <p> -| <h1> - -#data -<!doctype html><p><math><mo><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mo> -| <p> -| <h1> - -#data -<!doctype html><p><math><mn><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <p> -| <h1> - -#data -<!doctype html><p><math><ms><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math ms> -| <p> -| <h1> - -#data -<!doctype html><p><math><mtext><p><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mtext> -| <p> -| <h1> - -#data -<!doctype html><frameset></noframes> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html c=d><body></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><html c=d><frameset></frameset></html><html a=b> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><!--foo--> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <!-- foo --> - -#data -<!doctype html><html><frameset></frameset></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| " " - -#data -<!doctype html><html><frameset></frameset></html>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><html><frameset></frameset></html></p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<html><frameset></frameset></html><!doctype html> -#errors -#document -| <html> -| <head> -| <frameset> - -#data -<!doctype html><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html><p><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><p>a<frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "a" - -#data -<!doctype html><p> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><pre><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> - -#data -<!doctype html><listing><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <listing> - -#data -<!doctype html><li><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <li> - -#data -<!doctype html><dd><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dd> - -#data -<!doctype html><dt><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> - -#data -<!doctype html><button><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <button> - -#data -<!doctype html><applet><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <applet> - -#data -<!doctype html><marquee><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <marquee> - -#data -<!doctype html><object><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <object> - -#data -<!doctype html><table><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> - -#data -<!doctype html><area><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <area> - -#data -<!doctype html><basefont><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <basefont> -| <frameset> - -#data -<!doctype html><bgsound><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <bgsound> -| <frameset> - -#data -<!doctype html><br><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <br> - -#data -<!doctype html><embed><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <embed> - -#data -<!doctype html><img><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html><input><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> - -#data -<!doctype html><keygen><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <keygen> - -#data -<!doctype html><wbr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <wbr> - -#data -<!doctype html><hr><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <hr> - -#data -<!doctype html><textarea></textarea><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> - -#data -<!doctype html><xmp></xmp><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <xmp> - -#data -<!doctype html><iframe></iframe><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <iframe> - -#data -<!doctype html><select></select><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!doctype html><svg></svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><math></math><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg><foreignObject><div> <frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<!doctype html><svg>a</svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| "a" - -#data -<!doctype html><svg> </svg><frameset><frame> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> -| <frame> - -#data -<html>aaa<frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "aaa" - -#data -<html> a <frameset></frameset> -#errors -#document -| <html> -| <head> -| <body> -| "a " - -#data -<!doctype html><div><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><div><body><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> - -#data -<!doctype html><p><math></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| "a" - -#data -<!doctype html><p><math><mn><span></p>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <math math> -| <math mn> -| <span> -| <p> -| "a" - -#data -<!doctype html><math></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!doctype html><meta charset="ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| charset="ascii" -| <body> - -#data -<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| content="text/html;charset=ascii" -| http-equiv="content-type" -| <body> - -#data -<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8"> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa --> -| <meta> -| charset="utf8" -| <body> - -#data -<!doctype html><html a=b><head></head><html c=d> -#errors -#document -| <!DOCTYPE html> -| <html> -| a="b" -| c="d" -| <head> -| <body> - -#data -<!doctype html><image/> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> - -#data -<!doctype html>a<i>b<table>c<b>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "a" -| <i> -| "bc" -| <b> -| "de" -| "f" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" - -#data -<!doctype html><table><i>a<b>b<div>c</i> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <i> -| "c" -| <table> - -#data -<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <b> -| "b" -| <b> -| <div> -| <b> -| <i> -| "c" -| <a> -| "d" -| <a> -| "e" -| <a> -| "f" -| <table> - -#data -<!doctype html><table><i>a<div>b<tr>c<b>d</i>e -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <i> -| "a" -| <div> -| "b" -| <i> -| "c" -| <b> -| "d" -| <b> -| "e" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><table><td><table><i>a<div>b<b>c</i>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <i> -| "a" -| <div> -| <i> -| "b" -| <b> -| "c" -| <b> -| "d" -| <table> - -#data -<!doctype html><body><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <bgsound> - -#data -<!doctype html><body><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <basefont> - -#data -<!doctype html><a><b></a><basefont> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <basefont> - -#data -<!doctype html><a><b></a><bgsound> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| <b> -| <bgsound> - -#data -<!doctype html><figcaption><article></figcaption>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <figcaption> -| <article> -| "a" - -#data -<!doctype html><summary><article></summary>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <summary> -| <article> -| "a" - -#data -<!doctype html><p><a><plaintext>b -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <a> -| <plaintext> -| <a> -| "b" - -#data -<!DOCTYPE html><div>a<a></div>b<p>c</p>d -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| "a" -| <a> -| <a> -| "b" -| <p> -| "c" -| "d" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat deleted file mode 100644 index 60d85922..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests2.dat +++ /dev/null @@ -1,763 +0,0 @@ -#data -<!DOCTYPE html>Test -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "Test" - -#data -<textarea>test</div>test -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 24 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <textarea> -| "test</div>test" - -#data -<table><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 11 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><td>test</tbody></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected table cell start tag (td) in the table body phase. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "test" - -#data -<frame>test -#errors -Line: 1 Col: 7 Unexpected start tag (frame). Expected DOCTYPE. -Line: 1 Col: 7 Unexpected start tag frame. Ignored. -#document -| <html> -| <head> -| <body> -| "test" - -#data -<!DOCTYPE html><frameset>test -#errors -Line: 1 Col: 29 Unepxected characters in the frameset phase. Characters ignored. -Line: 1 Col: 29 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset><!DOCTYPE html> -#errors -Line: 1 Col: 40 Unexpected DOCTYPE. Ignored. -Line: 1 Col: 40 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><font><p><b>test</font> -#errors -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 38 End tag (font) violates step 1, paragraph 3 of the adoption agency algorithm. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <p> -| <font> -| <b> -| "test" - -#data -<!DOCTYPE html><dt><div><dd> -#errors -Line: 1 Col: 28 Missing end tag (div, dt). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <dt> -| <div> -| <dd> - -#data -<script></x -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -Line: 1 Col: 11 Unexpected end of file. Expected end tag (script). -#document -| <html> -| <head> -| <script> -| "</x" -| <body> - -#data -<table><plaintext><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 18 Unexpected start tag (plaintext) in table context caused voodoo mode. -Line: 1 Col: 22 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "<td>" -| <table> - -#data -<plaintext></plaintext> -#errors -Line: 1 Col: 11 Unexpected start tag (plaintext). Expected DOCTYPE. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <plaintext> -| "</plaintext>" - -#data -<!DOCTYPE html><table><tr>TEST -#errors -Line: 1 Col: 30 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 30 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "TEST" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4> -#errors -Line: 1 Col: 37 Unexpected start tag (body). -Line: 1 Col: 53 Unexpected start tag (body). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| t1="1" -| t2="2" -| t3="3" -| t4="4" - -#data -</b test -#errors -Line: 1 Col: 8 Unexpected end of file in attribute name. -Line: 1 Col: 8 End tag contains unexpected attributes. -Line: 1 Col: 8 Unexpected end tag (b). Expected DOCTYPE. -Line: 1 Col: 8 Unexpected end tag (b) after the (implied) root element. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html></b test<b &=&amp>X -#errors -Line: 1 Col: 32 Named entity didn't end with ';'. -Line: 1 Col: 33 End tag contains unexpected attributes. -Line: 1 Col: 33 Unexpected end tag (b) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" - -#data -<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 54 Unexpected end of file in the tag name. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| type="text/x-foobar;baz" -| "X</SCRipt" -| <body> - -#data -& -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&# -#errors -Line: 1 Col: 1 Numeric entity expected. Got end of file instead. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#" - -#data -&#X -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#X" - -#data -&#x -#errors -Line: 1 Col: 3 Numeric entity expected but none found. -Line: 1 Col: 3 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&#x" - -#data -&#45 -#errors -Line: 1 Col: 4 Numeric entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "-" - -#data -&x-test -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&x-test" - -#data -<!doctypehtml><p><li> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <li> - -#data -<!doctypehtml><p><dt> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dt> - -#data -<!doctypehtml><p><dd> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <dd> - -#data -<!doctypehtml><p><form> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <form> - -#data -<!DOCTYPE html><p></P>X -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| "X" - -#data -&AMP -#errors -Line: 1 Col: 4 Named entity didn't end with ';'. -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&" - -#data -&AMp; -#errors -Line: 1 Col: 1 Named entity expected. Got none. -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "&AMp;" - -#data -<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY> -#errors -Line: 1 Col: 110 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly> - -#data -<!DOCTYPE html>X</body>X -#errors -Line: 1 Col: 24 Unexpected non-space characters in the after body phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "XX" - -#data -<!DOCTYPE html><!-- X -#errors -Line: 1 Col: 21 Unexpected end of file in comment. -#document -| <!DOCTYPE html> -| <!-- X --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><table><caption>test TEST</caption><td>test -#errors -Line: 1 Col: 54 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 58 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| "test TEST" -| <tbody> -| <tr> -| <td> -| "test" - -#data -<!DOCTYPE html><select><option><optgroup> -#errors -Line: 1 Col: 41 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option> -#errors -Line: 1 Col: 68 Unexpected select start tag in the select phase treated as select end tag. -Line: 1 Col: 76 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <option> -| <option> - -#data -<!DOCTYPE html><select><optgroup><option><optgroup> -#errors -Line: 1 Col: 51 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> -| <option> -| <optgroup> - -#data -<!DOCTYPE html><datalist><option>foo</datalist>bar -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <datalist> -| <option> -| "foo" -| "bar" - -#data -<!DOCTYPE html><font><input><input></font> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <font> -| <input> -| <input> - -#data -<!DOCTYPE html><!-- XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX -#errors -Line: 1 Col: 29 Unexpected end of file in comment (-) -#document -| <!DOCTYPE html> -| <!-- XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><!-- XXX - XXX - XXX --> -#errors -#document -| <!DOCTYPE html> -| <!-- XXX - XXX - XXX --> -| <html> -| <head> -| <body> - -#data -<isindex test=x name=x> -#errors -Line: 1 Col: 23 Unexpected start tag (isindex). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected start tag isindex. Don't use it! -#document -| <html> -| <head> -| <body> -| <form> -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| test="x" -| <hr> - -#data -test -test -#errors -Line: 2 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "test -test" - -#data -<!DOCTYPE html><body><title>test</body></title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "test</body>" - -#data -<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style> -x { content:"</style" } </style> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" -| <meta> -| name="z" -| <link> -| rel="foo" -| <style> -| " -x { content:"</style" } " - -#data -<!DOCTYPE html><select><optgroup></optgroup></select> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <optgroup> - -#data - - -#errors -Line: 2 Col: 1 Unexpected End of file. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html> <html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><script> -</script> <title>x</title> </head> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <script> -| " -" -| " " -| <title> -| "x" -| " " -| <body> - -#data -<!DOCTYPE html><html><body><html id=x> -#errors -Line: 1 Col: 38 html needs to be the first start tag. -#document -| <!DOCTYPE html> -| <html> -| id="x" -| <head> -| <body> - -#data -<!DOCTYPE html>X</body><html id="x"> -#errors -Line: 1 Col: 36 Unexpected start tag token (html) in the after body phase. -Line: 1 Col: 36 html needs to be the first start tag. -#document -| <!DOCTYPE html> -| <html> -| id="x" -| <head> -| <body> -| "X" - -#data -<!DOCTYPE html><head><html id=x> -#errors -Line: 1 Col: 32 html needs to be the first start tag. -#document -| <!DOCTYPE html> -| <html> -| id="x" -| <head> -| <body> - -#data -<!DOCTYPE html>X</html>X -#errors -Line: 1 Col: 24 Unexpected non-space characters in the after body phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "XX" - -#data -<!DOCTYPE html>X</html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X " - -#data -<!DOCTYPE html>X</html><p>X -#errors -Line: 1 Col: 26 Unexpected start tag (p). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <p> -| "X" - -#data -<!DOCTYPE html>X<p/x/y/z> -#errors -Line: 1 Col: 19 Expected a > after the /. -Line: 1 Col: 21 Solidus (/) incorrectly placed in tag. -Line: 1 Col: 23 Solidus (/) incorrectly placed in tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <p> -| x="" -| y="" -| z="" - -#data -<!DOCTYPE html><!--x-- -#errors -Line: 1 Col: 22 Unexpected end of file in comment (--). -#document -| <!DOCTYPE html> -| <!-- x --> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE html><table><tr><td></p></table> -#errors -Line: 1 Col: 34 Unexpected end tag (p). Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <p> - -#data -<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->--> -#errors -Line: 1 Col: 20 Expected space or '>'. Got '' -Line: 1 Col: 25 Erroneous DOCTYPE. -Line: 1 Col: 35 Unexpected character in comment found. -#document -| <!DOCTYPE <!doctype> -| <html> -| <head> -| <body> -| ">" -| <!-- <!--x --> -| "-->" - -#data -<!doctype html><div><form></form><div></div></div> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <form> -| <div> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat deleted file mode 100644 index 6bd82560..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests20.dat +++ /dev/null @@ -1,455 +0,0 @@ -#data -<!doctype html><p><button><button> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <button> - -#data -<!doctype html><p><button><address> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <address> - -#data -<!doctype html><p><button><blockquote> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <blockquote> - -#data -<!doctype html><p><button><menu> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <menu> - -#data -<!doctype html><p><button><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <p> - -#data -<!doctype html><p><button><ul> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <ul> - -#data -<!doctype html><p><button><h1> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <h1> - -#data -<!doctype html><p><button><h6> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <h6> - -#data -<!doctype html><p><button><listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <listing> - -#data -<!doctype html><p><button><pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <pre> - -#data -<!doctype html><p><button><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <form> - -#data -<!doctype html><p><button><li> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <li> - -#data -<!doctype html><p><button><dd> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <dd> - -#data -<!doctype html><p><button><dt> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <dt> - -#data -<!doctype html><p><button><plaintext> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <plaintext> - -#data -<!doctype html><p><button><table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <table> - -#data -<!doctype html><p><button><hr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <hr> - -#data -<!doctype html><p><button><xmp> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <xmp> - -#data -<!doctype html><p><button></p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <button> -| <p> - -#data -<!doctype html><address><button></address>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <address> -| <button> -| "a" - -#data -<!doctype html><address><button></address>a -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <address> -| <button> -| "a" - -#data -<p><table></p> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <p> -| <table> - -#data -<!doctype html><svg> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> - -#data -<!doctype html><p><figcaption> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <figcaption> - -#data -<!doctype html><p><summary> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <summary> - -#data -<!doctype html><form><table><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <table> - -#data -<!doctype html><table><form><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <form> - -#data -<!doctype html><table><form></table><form> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <form> - -#data -<!doctype html><svg><foreignObject><p> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg foreignObject> -| <p> - -#data -<!doctype html><svg><title>abc -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| "abc" - -#data -<option><span><option> -#errors -#document -| <html> -| <head> -| <body> -| <option> -| <span> -| <option> - -#data -<option><option> -#errors -#document -| <html> -| <head> -| <body> -| <option> -| <option> - -#data -<math><annotation-xml><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <div> - -#data -<math><annotation-xml encoding="application/svg+xml"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="application/svg+xml" -| <div> - -#data -<math><annotation-xml encoding="application/xhtml+xml"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="application/xhtml+xml" -| <div> - -#data -<math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="aPPlication/xhtmL+xMl" -| <div> - -#data -<math><annotation-xml encoding="text/html"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="text/html" -| <div> - -#data -<math><annotation-xml encoding="Text/htmL"><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding="Text/htmL" -| <div> - -#data -<math><annotation-xml encoding=" text/html "><div> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| encoding=" text/html " -| <div> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat deleted file mode 100644 index 1260ec03..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests21.dat +++ /dev/null @@ -1,221 +0,0 @@ -#data -<svg><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "foo" - -#data -<math><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| "foo" - -#data -<div><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <!-- [CDATA[foo]] --> - -#data -<svg><![CDATA[foo -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "foo" - -#data -<svg><![CDATA[foo -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "foo" - -#data -<svg><![CDATA[ -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<svg><![CDATA[]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> - -#data -<svg><![CDATA[]] >]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]] >" - -#data -<svg><![CDATA[]] >]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]] >" - -#data -<svg><![CDATA[]] -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]]" - -#data -<svg><![CDATA[] -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]" - -#data -<svg><![CDATA[]>a -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "]>a" - -#data -<svg><foreignObject><div><![CDATA[foo]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg foreignObject> -| <div> -| <!-- [CDATA[foo]] --> - -#data -<svg><![CDATA[<svg>]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" - -#data -<svg><![CDATA[</svg>a]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "</svg>a" - -#data -<svg><![CDATA[<svg>a -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>a" - -#data -<svg><![CDATA[</svg>a -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "</svg>a" - -#data -<svg><![CDATA[<svg>]]><path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" -| <svg path> - -#data -<svg><![CDATA[<svg>]]></path> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" - -#data -<svg><![CDATA[<svg>]]><!--path--> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>" -| <!-- path --> - -#data -<svg><![CDATA[<svg>]]>path -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<svg>path" - -#data -<svg><![CDATA[<!--svg-->]]> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| "<!--svg-->" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat deleted file mode 100644 index aab27b2e..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests22.dat +++ /dev/null @@ -1,157 +0,0 @@ -#data -<a><b><big><em><strong><div>X</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <big> -| <em> -| <strong> -| <big> -| <em> -| <strong> -| <div> -| <a> -| "X" - -#data -<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <div> -| id="1" -| <a> -| <div> -| id="2" -| <a> -| <div> -| id="3" -| <a> -| <div> -| id="4" -| <a> -| <div> -| id="5" -| <a> -| <div> -| id="6" -| <a> -| <div> -| id="7" -| <a> -| <div> -| id="8" -| <a> -| "A" - -#data -<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <div> -| id="1" -| <a> -| <div> -| id="2" -| <a> -| <div> -| id="3" -| <a> -| <div> -| id="4" -| <a> -| <div> -| id="5" -| <a> -| <div> -| id="6" -| <a> -| <div> -| id="7" -| <a> -| <div> -| id="8" -| <a> -| <div> -| id="9" -| "A" - -#data -<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <b> -| <b> -| <div> -| id="1" -| <a> -| <div> -| id="2" -| <a> -| <div> -| id="3" -| <a> -| <div> -| id="4" -| <a> -| <div> -| id="5" -| <a> -| <div> -| id="6" -| <a> -| <div> -| id="7" -| <a> -| <div> -| id="8" -| <a> -| <div> -| id="9" -| <div> -| id="10" -| "A" - -#data -<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST -#errors -Line: 1 Col: 6 Unexpected start tag (cite). Expected DOCTYPE. -Line: 1 Col: 46 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 50 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <cite> -| <b> -| <cite> -| <i> -| <cite> -| <i> -| <cite> -| <i> -| <i> -| <i> -| <div> -| <b> -| "X" -| "TEST" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat deleted file mode 100644 index 34d2a73f..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests23.dat +++ /dev/null @@ -1,155 +0,0 @@ -#data -<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X -#errors -3: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -116: Unclosed elements. -117: End of file seen and there were open elements. -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| size="4" -| <font> -| color="red" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| color="red" -| <p> -| <font> -| color="red" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| color="red" -| "X" - -#data -<p><font size=4><font size=4><font size=4><font size=4><p>X -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| "X" - -#data -<p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="5" -| <font> -| size="4" -| <p> -| <font> -| size="4" -| <font> -| size="4" -| <font> -| size="5" -| <font> -| size="4" -| "X" - -#data -<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <font> -| id="a" -| size="4" -| <font> -| id="b" -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| <p> -| <font> -| id="a" -| size="4" -| <font> -| id="b" -| size="4" -| <font> -| size="4" -| <font> -| size="4" -| "X" - -#data -<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <b> -| id="a" -| <b> -| id="a" -| <b> -| id="a" -| <b> -| <object> -| <b> -| id="a" -| <b> -| id="a" -| "X" -| <p> -| <b> -| id="a" -| <b> -| id="a" -| <b> -| id="a" -| <b> -| "Y" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat deleted file mode 100644 index f6dc7eb4..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests24.dat +++ /dev/null @@ -1,79 +0,0 @@ -#data -<!DOCTYPE html>&NotEqualTilde; -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "≂̸" - -#data -<!DOCTYPE html>&NotEqualTilde;A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "≂̸A" - -#data -<!DOCTYPE html>&ThickSpace; -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "âŸâ€Š" - -#data -<!DOCTYPE html>&ThickSpace;A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "âŸâ€ŠA" - -#data -<!DOCTYPE html>&NotSubset; -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "⊂⃒" - -#data -<!DOCTYPE html>&NotSubset;A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "⊂⃒A" - -#data -<!DOCTYPE html>&Gopf; -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "ð”¾" - -#data -<!DOCTYPE html>&Gopf;A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "ð”¾A" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat deleted file mode 100644 index 00de7295..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests25.dat +++ /dev/null @@ -1,219 +0,0 @@ -#data -<!DOCTYPE html><body><foo>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <foo> -| "A" - -#data -<!DOCTYPE html><body><area>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <area> -| "A" - -#data -<!DOCTYPE html><body><base>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <base> -| "A" - -#data -<!DOCTYPE html><body><basefont>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <basefont> -| "A" - -#data -<!DOCTYPE html><body><bgsound>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <bgsound> -| "A" - -#data -<!DOCTYPE html><body><br>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <br> -| "A" - -#data -<!DOCTYPE html><body><col>A -#errors -26: Stray start tag “colâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "A" - -#data -<!DOCTYPE html><body><command>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <command> -| "A" - -#data -<!DOCTYPE html><body><embed>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <embed> -| "A" - -#data -<!DOCTYPE html><body><frame>A -#errors -26: Stray start tag “frameâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "A" - -#data -<!DOCTYPE html><body><hr>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <hr> -| "A" - -#data -<!DOCTYPE html><body><img>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <img> -| "A" - -#data -<!DOCTYPE html><body><input>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> -| "A" - -#data -<!DOCTYPE html><body><keygen>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <keygen> -| "A" - -#data -<!DOCTYPE html><body><link>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <link> -| "A" - -#data -<!DOCTYPE html><body><meta>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <meta> -| "A" - -#data -<!DOCTYPE html><body><param>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <param> -| "A" - -#data -<!DOCTYPE html><body><source>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <source> -| "A" - -#data -<!DOCTYPE html><body><track>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <track> -| "A" - -#data -<!DOCTYPE html><body><wbr>A -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <wbr> -| "A" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat deleted file mode 100644 index fae11ffd..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests26.dat +++ /dev/null @@ -1,313 +0,0 @@ -#data -<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <a> -| href="#1" -| <nobr> -| "1" -| <nobr> -| <nobr> -| <br> -| <a> -| href="#2" -| <a> -| href="#2" -| <nobr> -| "2" -| <nobr> -| <nobr> -| <br> -| <a> -| href="#3" -| <a> -| href="#3" -| <nobr> -| "3" -| <nobr> - -#data -<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" -| <table> - -#data -<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <table> -| <tbody> -| <tr> -| <td> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <div> -| <b> -| <nobr> -| <nobr> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <div> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" -| <nobr> -| <nobr> -| "3" - -#data -<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <nobr> -| <ins> -| <nobr> -| <i> -| <i> -| <nobr> - -#data -<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2 -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| <nobr> -| "1" -| <ins> -| <nobr> -| <nobr> -| <i> -| "2" - -#data -<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <b> -| "1" -| <nobr> -| <nobr> -| <i> -| <i> -| <nobr> -| "2" - -#data -<p><code x</code></p> - -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <code> -| code="" -| x<="" -| <code> -| code="" -| x<="" -| " -" - -#data -<!DOCTYPE html><svg><foreignObject><p><i></p>a -#errors -45: End tag “p†seen, but there were open elements. -41: Unclosed element “iâ€. -46: End of file seen and there were open elements. -35: Unclosed element “foreignObjectâ€. -20: Unclosed element “svgâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <svg svg> -| <svg foreignObject> -| <p> -| <i> -| <i> -| "a" - -#data -<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a -#errors -56: End tag “p†seen, but there were open elements. -52: Unclosed element “iâ€. -57: End of file seen and there were open elements. -46: Unclosed element “foreignObjectâ€. -31: Unclosed element “svgâ€. -22: Unclosed element “tableâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg foreignObject> -| <p> -| <i> -| <i> -| "a" - -#data -<!DOCTYPE html><math><mtext><p><i></p>a -#errors -38: End tag “p†seen, but there were open elements. -34: Unclosed element “iâ€. -39: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mtext> -| <p> -| <i> -| <i> -| "a" - -#data -<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a -#errors -53: End tag “p†seen, but there were open elements. -49: Unclosed element “iâ€. -54: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <math math> -| <math mtext> -| <p> -| <i> -| <i> -| "a" - -#data -<!DOCTYPE html><body><div><!/div>a -#errors -29: Bogus comment. -34: End of file seen and there were open elements. -26: Unclosed element “divâ€. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <div> -| <!-- /div --> -| "a" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat deleted file mode 100644 index 38dc501b..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests3.dat +++ /dev/null @@ -1,305 +0,0 @@ -#data -<head></head><style></style> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected start tag (style) that can be in head. Moved. -#document -| <html> -| <head> -| <style> -| <body> - -#data -<head></head><script></script> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected start tag (script) that can be in head. Moved. -#document -| <html> -| <head> -| <script> -| <body> - -#data -<head></head><!-- --><style></style><!-- --><script></script> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -Line: 1 Col: 28 Unexpected start tag (style) that can be in head. Moved. -#document -| <html> -| <head> -| <style> -| <script> -| <!-- --> -| <!-- --> -| <body> - -#data -<head></head><!-- -->x<style></style><!-- --><script></script> -#errors -Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE. -#document -| <html> -| <head> -| <!-- --> -| <body> -| "x" -| <style> -| <!-- --> -| <script> - -#data -<!DOCTYPE html><html><head></head><body><pre> -</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> - -#data -<!DOCTYPE html><html><head></head><body><pre> -foo</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "foo" - -#data -<!DOCTYPE html><html><head></head><body><pre> - -foo</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| " -foo" - -#data -<!DOCTYPE html><html><head></head><body><pre> -foo -</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "foo -" - -#data -<!DOCTYPE html><html><head></head><body><pre>x</pre><span> -</span></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "x" -| <span> -| " -" - -#data -<!DOCTYPE html><html><head></head><body><pre>x -y</pre></body></html> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "x -y" - -#data -<!DOCTYPE html><html><head></head><body><pre>x<div> -y</pre></body></html> -#errors -Line: 2 Col: 7 End tag (pre) seen too early. Expected other end tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| "x" -| <div> -| " -y" - -#data -<!DOCTYPE html><pre>&#x0a;&#x0a;A</pre> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <pre> -| " -A" - -#data -<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML> -#errors -Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <meta> -| <body> - -#data -<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML> -#errors -Line: 1 Col: 33 Unexpected start tag head in existing head. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<textarea>foo<span>bar</span><i>baz -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -Line: 1 Col: 35 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <textarea> -| "foo<span>bar</span><i>baz" - -#data -<title>foo<span>bar</em><i>baz -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 30 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "foo<span>bar</em><i>baz" -| <body> - -#data -<!DOCTYPE html><textarea> -</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> - -#data -<!DOCTYPE html><textarea> -foo</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| "foo" - -#data -<!DOCTYPE html><textarea> - -foo</textarea> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <textarea> -| " -foo" - -#data -<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html> -#errors -Line: 1 Col: 60 Missing end tag (div, li). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <ul> -| <li> -| <div> -| <p> -| <li> - -#data -<!doctype html><nobr><nobr><nobr> -#errors -Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). -Line: 1 Col: 33 Unexpected start tag (nobr) implies end tag (nobr). -Line: 1 Col: 33 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <nobr> -| <nobr> -| <nobr> - -#data -<!doctype html><nobr><nobr></nobr><nobr> -#errors -Line: 1 Col: 27 Unexpected start tag (nobr) implies end tag (nobr). -Line: 1 Col: 40 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <nobr> -| <nobr> -| <nobr> - -#data -<!doctype html><html><body><p><table></table></body></html> -#errors -Not known -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <table> - -#data -<p><table></table> -#errors -Not known -#document -| <html> -| <head> -| <body> -| <p> -| <table> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat deleted file mode 100644 index 3c506326..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests4.dat +++ /dev/null @@ -1,59 +0,0 @@ -#data -direct div content -#errors -#document-fragment -div -#document -| "direct div content" - -#data -direct textarea content -#errors -#document-fragment -textarea -#document -| "direct textarea content" - -#data -textarea content with <em>pseudo</em> <foo>markup -#errors -#document-fragment -textarea -#document -| "textarea content with <em>pseudo</em> <foo>markup" - -#data -this is &#x0043;DATA inside a <style> element -#errors -#document-fragment -style -#document -| "this is &#x0043;DATA inside a <style> element" - -#data -</plaintext> -#errors -#document-fragment -plaintext -#document -| "</plaintext>" - -#data -setting html's innerHTML -#errors -Line: 1 Col: 24 Unexpected EOF in inner html mode. -#document-fragment -html -#document -| <head> -| <body> -| "setting html's innerHTML" - -#data -<title>setting head's innerHTML</title> -#errors -#document-fragment -head -#document -| <title> -| "setting head's innerHTML" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat deleted file mode 100644 index d7b5128a..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests5.dat +++ /dev/null @@ -1,191 +0,0 @@ -#data -<style> <!-- </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end of file. Expected end tag (style). -#document -| <html> -| <head> -| <style> -| " <!-- " -| <body> -| "x" - -#data -<style> <!-- </style> --> </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!-- " -| " " -| <body> -| "--> x" - -#data -<style> <!--> </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!--> " -| <body> -| "x" - -#data -<style> <!---> </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!---> " -| <body> -| "x" - -#data -<iframe> <!---> </iframe>x -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| " <!---> " -| "x" - -#data -<iframe> <!--- </iframe>->x</iframe> --> </iframe>x -#errors -Line: 1 Col: 8 Unexpected start tag (iframe). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <iframe> -| " <!--- " -| "->x --> x" - -#data -<script> <!-- </script> --> </script>x -#errors -Line: 1 Col: 8 Unexpected start tag (script). Expected DOCTYPE. -#document -| <html> -| <head> -| <script> -| " <!-- " -| " " -| <body> -| "--> x" - -#data -<title> <!-- </title> --> </title>x -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| " <!-- " -| " " -| <body> -| "--> x" - -#data -<textarea> <!--- </textarea>->x</textarea> --> </textarea>x -#errors -Line: 1 Col: 10 Unexpected start tag (textarea). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <textarea> -| " <!--- " -| "->x --> x" - -#data -<style> <!</-- </style>x -#errors -Line: 1 Col: 7 Unexpected start tag (style). Expected DOCTYPE. -#document -| <html> -| <head> -| <style> -| " <!</-- " -| <body> -| "x" - -#data -<p><xmp></xmp> -#errors -XXX: Unknown -#document -| <html> -| <head> -| <body> -| <p> -| <xmp> - -#data -<xmp> <!-- > --> </xmp> -#errors -Line: 1 Col: 5 Unexpected start tag (xmp). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <xmp> -| " <!-- > --> " - -#data -<title>&amp;</title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "&" -| <body> - -#data -<title><!--&amp;--></title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -#document -| <html> -| <head> -| <title> -| "<!--&-->" -| <body> - -#data -<title><!--</title> -#errors -Line: 1 Col: 7 Unexpected start tag (title). Expected DOCTYPE. -Line: 1 Col: 19 Unexpected end of file. Expected end tag (title). -#document -| <html> -| <head> -| <title> -| "<!--" -| <body> - -#data -<noscript><!--</noscript>--></noscript> -#errors -Line: 1 Col: 10 Unexpected start tag (noscript). Expected DOCTYPE. -#document -| <html> -| <head> -| <noscript> -| "<!--" -| <body> -| "-->" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat deleted file mode 100644 index f28ece4f..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests6.dat +++ /dev/null @@ -1,663 +0,0 @@ -#data -<!doctype html></head> <head> -#errors -Line: 1 Col: 29 Unexpected start tag head. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| " " -| <body> - -#data -<!doctype html><form><div></form><div> -#errors -33: End tag "form" seen but there were unclosed elements. -38: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <form> -| <div> -| <div> - -#data -<!doctype html><title>&amp;</title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "&" -| <body> - -#data -<!doctype html><title><!--&amp;--></title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "<!--&-->" -| <body> - -#data -<!doctype> -#errors -Line: 1 Col: 9 No space after literal string 'DOCTYPE'. -Line: 1 Col: 10 Unexpected > character. Expected DOCTYPE name. -Line: 1 Col: 10 Erroneous DOCTYPE. -#document -| <!DOCTYPE > -| <html> -| <head> -| <body> - -#data -<!---x -#errors -Line: 1 Col: 6 Unexpected end of file in comment. -Line: 1 Col: 6 Unexpected End of file. Expected DOCTYPE. -#document -| <!-- -x --> -| <html> -| <head> -| <body> - -#data -<body> -<div> -#errors -Line: 1 Col: 6 Unexpected start tag (body). -Line: 2 Col: 5 Expected closing tag. Unexpected end of file. -#document-fragment -div -#document -| " -" -| <div> - -#data -<frameset></frameset> -foo -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 3 Unexpected non-space characters in the after frameset phase. Ignored. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<frameset></frameset> -<noframes> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 10 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> -| " -" -| <noframes> - -#data -<frameset></frameset> -<div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 5 Unexpected start tag (div) in the after frameset phase. Ignored. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<frameset></frameset> -</html> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<frameset></frameset> -</div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 2 Col: 6 Unexpected end tag (div) in the after frameset phase. Ignored. -#document -| <html> -| <head> -| <frameset> -| " -" - -#data -<form><form> -#errors -Line: 1 Col: 6 Unexpected start tag (form). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected start tag (form). -Line: 1 Col: 12 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <form> - -#data -<button><button> -#errors -Line: 1 Col: 8 Unexpected start tag (button). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected start tag (button) implies end tag (button). -Line: 1 Col: 16 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <button> -| <button> - -#data -<table><tr><td></th> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (th). Ignored. -Line: 1 Col: 20 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><caption><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (td). Ignored. -Line: 1 Col: 20 Unexpected table cell start tag (td) in the table body phase. -Line: 1 Col: 20 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <tbody> -| <tr> -| <td> - -#data -<table><caption><div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 21 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <div> - -#data -</caption><div> -#errors -Line: 1 Col: 10 Unexpected end tag (caption). Ignored. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document-fragment -caption -#document -| <div> - -#data -<table><caption><div></caption> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 31 Unexpected end tag (caption). Missing end tag (div). -Line: 1 Col: 31 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <div> - -#data -<table><caption></table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 24 Unexpected end table tag in caption. Generates implied end caption. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> - -#data -</table><div> -#errors -Line: 1 Col: 8 Unexpected end table tag in caption. Generates implied end caption. -Line: 1 Col: 8 Unexpected end tag (caption). Ignored. -Line: 1 Col: 13 Expected closing tag. Unexpected end of file. -#document-fragment -caption -#document -| <div> - -#data -<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 23 Unexpected end tag (body). Ignored. -Line: 1 Col: 29 Unexpected end tag (col). Ignored. -Line: 1 Col: 40 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 47 Unexpected end tag (html). Ignored. -Line: 1 Col: 55 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 60 Unexpected end tag (td). Ignored. -Line: 1 Col: 68 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 73 Unexpected end tag (th). Ignored. -Line: 1 Col: 81 Unexpected end tag (thead). Ignored. -Line: 1 Col: 86 Unexpected end tag (tr). Ignored. -Line: 1 Col: 86 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> - -#data -<table><caption><div></div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 27 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <caption> -| <div> - -#data -<table><tr><td></body></caption></col></colgroup></html> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end tag (body). Ignored. -Line: 1 Col: 32 Unexpected end tag (caption). Ignored. -Line: 1 Col: 38 Unexpected end tag (col). Ignored. -Line: 1 Col: 49 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 56 Unexpected end tag (html). Ignored. -Line: 1 Col: 56 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> - -#data -</table></tbody></tfoot></thead></tr><div> -#errors -Line: 1 Col: 8 Unexpected end tag (table). Ignored. -Line: 1 Col: 16 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 24 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 32 Unexpected end tag (thead). Ignored. -Line: 1 Col: 37 Unexpected end tag (tr). Ignored. -Line: 1 Col: 42 Expected closing tag. Unexpected end of file. -#document-fragment -td -#document -| <div> - -#data -<table><colgroup>foo -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 20 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| "foo" -| <table> -| <colgroup> - -#data -foo<col> -#errors -Line: 1 Col: 3 Unexpected end tag (colgroup). Ignored. -#document-fragment -colgroup -#document -| <col> - -#data -<table><colgroup></col> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 23 This element (col) has no end tag. -Line: 1 Col: 23 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <table> -| <colgroup> - -#data -<frameset><div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 15 Unexpected start tag token (div) in the frameset phase. Ignored. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> - -#data -</frameset><frame> -#errors -Line: 1 Col: 11 Unexpected end tag token (frameset) in the frameset phase (innerHTML). -#document-fragment -frameset -#document -| <frame> - -#data -<frameset></div> -#errors -Line: 1 Col: 10 Unexpected start tag (frameset). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected end tag token (div) in the frameset phase. Ignored. -Line: 1 Col: 16 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <frameset> - -#data -</body><div> -#errors -Line: 1 Col: 7 Unexpected end tag (body). Ignored. -Line: 1 Col: 12 Expected closing tag. Unexpected end of file. -#document-fragment -body -#document -| <div> - -#data -<table><tr><div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 16 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <div> -| <table> -| <tbody> -| <tr> - -#data -</tr><td> -#errors -Line: 1 Col: 5 Unexpected end tag (tr). Ignored. -#document-fragment -tr -#document -| <td> - -#data -</tbody></tfoot></thead><td> -#errors -Line: 1 Col: 8 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 16 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 24 Unexpected end tag (thead). Ignored. -#document-fragment -tr -#document -| <td> - -#data -<table><tr><div><td> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 16 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 20 Unexpected implied end tag (div) in the table row phase. -Line: 1 Col: 20 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| <table> -| <tbody> -| <tr> -| <td> - -#data -<caption><col><colgroup><tbody><tfoot><thead><tr> -#errors -Line: 1 Col: 9 Unexpected start tag (caption). -Line: 1 Col: 14 Unexpected start tag (col). -Line: 1 Col: 24 Unexpected start tag (colgroup). -Line: 1 Col: 31 Unexpected start tag (tbody). -Line: 1 Col: 38 Unexpected start tag (tfoot). -Line: 1 Col: 45 Unexpected start tag (thead). -Line: 1 Col: 49 Unexpected end of file. Expected table content. -#document-fragment -tbody -#document -| <tr> - -#data -<table><tbody></thead> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 22 Unexpected end tag (thead) in the table body phase. Ignored. -Line: 1 Col: 22 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> - -#data -</table><tr> -#errors -Line: 1 Col: 8 Unexpected end tag (table). Ignored. -Line: 1 Col: 12 Unexpected end of file. Expected table content. -#document-fragment -tbody -#document -| <tr> - -#data -<table><tbody></body></caption></col></colgroup></html></td></th></tr> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 21 Unexpected end tag (body) in the table body phase. Ignored. -Line: 1 Col: 31 Unexpected end tag (caption) in the table body phase. Ignored. -Line: 1 Col: 37 Unexpected end tag (col) in the table body phase. Ignored. -Line: 1 Col: 48 Unexpected end tag (colgroup) in the table body phase. Ignored. -Line: 1 Col: 55 Unexpected end tag (html) in the table body phase. Ignored. -Line: 1 Col: 60 Unexpected end tag (td) in the table body phase. Ignored. -Line: 1 Col: 65 Unexpected end tag (th) in the table body phase. Ignored. -Line: 1 Col: 70 Unexpected end tag (tr) in the table body phase. Ignored. -Line: 1 Col: 70 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> - -#data -<table><tbody></div> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 20 Unexpected end tag (div) in table context caused voodoo mode. -Line: 1 Col: 20 End tag (div) seen too early. Expected other end tag. -Line: 1 Col: 20 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> - -#data -<table><table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected start tag (table) implies end tag (table). -Line: 1 Col: 14 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> -| <table> - -#data -<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 14 Unexpected end tag (body). Ignored. -Line: 1 Col: 24 Unexpected end tag (caption). Ignored. -Line: 1 Col: 30 Unexpected end tag (col). Ignored. -Line: 1 Col: 41 Unexpected end tag (colgroup). Ignored. -Line: 1 Col: 48 Unexpected end tag (html). Ignored. -Line: 1 Col: 56 Unexpected end tag (tbody). Ignored. -Line: 1 Col: 61 Unexpected end tag (td). Ignored. -Line: 1 Col: 69 Unexpected end tag (tfoot). Ignored. -Line: 1 Col: 74 Unexpected end tag (th). Ignored. -Line: 1 Col: 82 Unexpected end tag (thead). Ignored. -Line: 1 Col: 87 Unexpected end tag (tr). Ignored. -Line: 1 Col: 87 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <table> - -#data -</table><tr> -#errors -Line: 1 Col: 8 Unexpected end tag (table). Ignored. -Line: 1 Col: 12 Unexpected end of file. Expected table content. -#document-fragment -table -#document -| <tbody> -| <tr> - -#data -<body></body></html> -#errors -Line: 1 Col: 20 Unexpected html end tag in inner html mode. -Line: 1 Col: 20 Unexpected EOF in inner html mode. -#document-fragment -html -#document -| <head> -| <body> - -#data -<html><frameset></frameset></html> -#errors -Line: 1 Col: 6 Unexpected start tag (html). Expected DOCTYPE. -#document -| <html> -| <head> -| <frameset> -| " " - -#data -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html> -#errors -Line: 1 Col: 50 Erroneous DOCTYPE. -Line: 1 Col: 63 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" ""> -| <html> -| <head> -| <body> - -#data -<param><frameset></frameset> -#errors -Line: 1 Col: 7 Unexpected start tag (param). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected start tag (frameset). -#document -| <html> -| <head> -| <frameset> - -#data -<source><frameset></frameset> -#errors -Line: 1 Col: 7 Unexpected start tag (source). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected start tag (frameset). -#document -| <html> -| <head> -| <frameset> - -#data -<track><frameset></frameset> -#errors -Line: 1 Col: 7 Unexpected start tag (track). Expected DOCTYPE. -Line: 1 Col: 17 Unexpected start tag (frameset). -#document -| <html> -| <head> -| <frameset> - -#data -</html><frameset></frameset> -#errors -7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -17: Stray “frameset†start tag. -17: “frameset†start tag seen. -#document -| <html> -| <head> -| <frameset> - -#data -</body><frameset></frameset> -#errors -7: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>â€. -17: Stray “frameset†start tag. -17: “frameset†start tag seen. -#document -| <html> -| <head> -| <frameset> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat deleted file mode 100644 index f5193c66..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests7.dat +++ /dev/null @@ -1,390 +0,0 @@ -#data -<!doctype html><body><title>X</title> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" - -#data -<!doctype html><table><title>X</title></table> -#errors -Line: 1 Col: 29 Unexpected start tag (title) in table context caused voodoo mode. -Line: 1 Col: 38 Unexpected end tag (title) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <title> -| "X" -| <table> - -#data -<!doctype html><head></head><title>X</title> -#errors -Line: 1 Col: 35 Unexpected start tag (title) that can be in head. Moved. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "X" -| <body> - -#data -<!doctype html></head><title>X</title> -#errors -Line: 1 Col: 29 Unexpected start tag (title) that can be in head. Moved. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <title> -| "X" -| <body> - -#data -<!doctype html><table><meta></table> -#errors -Line: 1 Col: 28 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <meta> -| <table> - -#data -<!doctype html><table>X<tr><td><table> <meta></table></table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 45 Unexpected start tag (meta) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <tbody> -| <tr> -| <td> -| <meta> -| <table> -| " " - -#data -<!doctype html><html> <head> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html> <head> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!doctype html><table><style> <tr>x </style> </table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <style> -| " <tr>x " -| " " - -#data -<!doctype html><table><TBODY><script> <tr>x </script> </table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <script> -| " <tr>x " -| " " - -#data -<!doctype html><p><applet><p>X</p></applet> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <p> -| <applet> -| <p> -| "X" - -#data -<!doctype html><listing> -X</listing> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <listing> -| "X" - -#data -<!doctype html><select><input>X -#errors -Line: 1 Col: 30 Unexpected input start tag in the select phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <input> -| "X" - -#data -<!doctype html><select><select>X -#errors -Line: 1 Col: 31 Unexpected select start tag in the select phase treated as select end tag. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "X" - -#data -<!doctype html><table><input type=hidDEN></table> -#errors -Line: 1 Col: 41 Unexpected input with type hidden in table context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <input> -| type="hidDEN" - -#data -<!doctype html><table>X<input type=hidDEN></table> -#errors -Line: 1 Col: 23 Unexpected non-space characters in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| "X" -| <table> -| <input> -| type="hidDEN" - -#data -<!doctype html><table> <input type=hidDEN></table> -#errors -Line: 1 Col: 43 Unexpected input with type hidden in table context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <input> -| type="hidDEN" - -#data -<!doctype html><table> <input type='hidDEN'></table> -#errors -Line: 1 Col: 45 Unexpected input with type hidden in table context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| " " -| <input> -| type="hidDEN" - -#data -<!doctype html><table><input type=" hidden"><input type=hidDEN></table> -#errors -Line: 1 Col: 44 Unexpected start tag (input) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> -| type=" hidden" -| <table> -| <input> -| type="hidDEN" - -#data -<!doctype html><table><select>X<tr> -#errors -Line: 1 Col: 30 Unexpected start tag (select) in table context caused voodoo mode. -Line: 1 Col: 35 Unexpected table element start tag (trs) in the select in table phase. -Line: 1 Col: 35 Unexpected end of file. Expected table content. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "X" -| <table> -| <tbody> -| <tr> - -#data -<!doctype html><select>X</select> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "X" - -#data -<!DOCTYPE hTmL><html></html> -#errors -Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<!DOCTYPE HTML><html></html> -#errors -Line: 1 Col: 28 Unexpected end tag (html) after the (implied) root element. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> - -#data -<body>X</body></body> -#errors -Line: 1 Col: 21 Unexpected end tag token (body) in the after body phase. -Line: 1 Col: 21 Unexpected EOF in inner html mode. -#document-fragment -html -#document -| <head> -| <body> -| "X" - -#data -<div><p>a</x> b -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 13 Unexpected end tag (x). Ignored. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| <p> -| "a b" - -#data -<table><tr><td><code></code> </table> -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <code> -| " " - -#data -<table><b><tr><td>aaa</td></tr>bbb</table>ccc -#errors -XXX: Fix me -#document -| <html> -| <head> -| <body> -| <b> -| <b> -| "bbb" -| <table> -| <tbody> -| <tr> -| <td> -| "aaa" -| <b> -| "ccc" - -#data -A<table><tr> B</tr> B</table> -#errors -XXX: Fix me -#document -| <html> -| <head> -| <body> -| "A B B" -| <table> -| <tbody> -| <tr> - -#data -A<table><tr> B</tr> </em>C</table> -#errors -XXX: Fix me -#document -| <html> -| <head> -| <body> -| "A BC" -| <table> -| <tbody> -| <tr> -| " " - -#data -<select><keygen> -#errors -Not known -#document -| <html> -| <head> -| <body> -| <select> -| <keygen> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat deleted file mode 100644 index 90e6c919..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests8.dat +++ /dev/null @@ -1,148 +0,0 @@ -#data -<div> -<div></div> -</span>x -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 3 Col: 7 Unexpected end tag (span). Ignored. -Line: 3 Col: 8 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| " -" -| <div> -| " -x" - -#data -<div>x<div></div> -</span>x -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 2 Col: 7 Unexpected end tag (span). Ignored. -Line: 2 Col: 8 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| " -x" - -#data -<div>x<div></div>x</span>x -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end tag (span). Ignored. -Line: 1 Col: 26 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| "xx" - -#data -<div>x<div></div>y</span>z -#errors -Line: 1 Col: 5 Unexpected start tag (div). Expected DOCTYPE. -Line: 1 Col: 25 Unexpected end tag (span). Ignored. -Line: 1 Col: 26 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| "yz" - -#data -<table><div>x<div></div>x</span>x -#errors -Line: 1 Col: 7 Unexpected start tag (table). Expected DOCTYPE. -Line: 1 Col: 12 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 18 Unexpected start tag (div) in table context caused voodoo mode. -Line: 1 Col: 24 Unexpected end tag (div) in table context caused voodoo mode. -Line: 1 Col: 32 Unexpected end tag (span) in table context caused voodoo mode. -Line: 1 Col: 32 Unexpected end tag (span). Ignored. -Line: 1 Col: 33 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| <div> -| "x" -| <div> -| "xx" -| <table> - -#data -x<table>x -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -Line: 1 Col: 9 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 9 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| "xx" -| <table> - -#data -x<table><table>x -#errors -Line: 1 Col: 1 Unexpected non-space characters. Expected DOCTYPE. -Line: 1 Col: 15 Unexpected start tag (table) implies end tag (table). -Line: 1 Col: 16 Unexpected non-space characters in table context caused voodoo mode. -Line: 1 Col: 16 Unexpected end of file. Expected table content. -#document -| <html> -| <head> -| <body> -| "x" -| <table> -| "x" -| <table> - -#data -<b>a<div></div><div></b>y -#errors -Line: 1 Col: 3 Unexpected start tag (b). Expected DOCTYPE. -Line: 1 Col: 24 End tag (b) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 25 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <b> -| "a" -| <div> -| <div> -| <b> -| "y" - -#data -<a><div><p></a> -#errors -Line: 1 Col: 3 Unexpected start tag (a). Expected DOCTYPE. -Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 15 End tag (a) violates step 1, paragraph 3 of the adoption agency algorithm. -Line: 1 Col: 15 Expected closing tag. Unexpected end of file. -#document -| <html> -| <head> -| <body> -| <a> -| <div> -| <a> -| <p> -| <a> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat deleted file mode 100644 index 554e27ae..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests9.dat +++ /dev/null @@ -1,457 +0,0 @@ -#data -<!DOCTYPE html><math></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!DOCTYPE html><body><math></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> - -#data -<!DOCTYPE html><math><mi> -#errors -25: End of file in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> - -#data -<!DOCTYPE html><math><annotation-xml><svg><u> -#errors -45: HTML start tag “u†in a foreign namespace context. -45: End of file seen and there were open elements. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math annotation-xml> -| <svg svg> -| <u> - -#data -<!DOCTYPE html><body><select><math></math></select> -#errors -Line: 1 Col: 35 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 42 Unexpected end tag (math) in the select phase. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> - -#data -<!DOCTYPE html><body><select><option><math></math></option></select> -#errors -Line: 1 Col: 43 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 50 Unexpected end tag (math) in the select phase. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| <option> - -#data -<!DOCTYPE html><body><table><math></math></table> -#errors -Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 41 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <table> - -#data -<!DOCTYPE html><body><table><math><mi>foo</mi></math></table> -#errors -Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 53 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <table> - -#data -<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table> -#errors -Line: 1 Col: 34 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 46 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 58 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 65 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <table> - -#data -<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table> -#errors -Line: 1 Col: 41 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 53 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 65 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 72 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <table> -| <tbody> - -#data -<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table> -#errors -Line: 1 Col: 45 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 57 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 69 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 76 Unexpected end tag (math) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <table> -| <tbody> -| <tr> - -#data -<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" - -#data -<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 70 HTML start tag "p" in a foreign namespace context. -Line: 1 Col: 81 Unexpected end table tag in caption. Generates implied end caption. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux -#errors -Line: 1 Col: 78 Unexpected end table tag in caption. Generates implied end caption. -Line: 1 Col: 78 Unexpected end tag (caption). Missing end tag (math). -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <caption> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| "baz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 44 Unexpected start tag (math) in table context caused voodoo mode. -Line: 1 Col: 56 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 68 Unexpected end tag (mi) in table context caused voodoo mode. -Line: 1 Col: 71 HTML start tag "p" in a foreign namespace context. -Line: 1 Col: 71 Unexpected start tag (p) in table context caused voodoo mode. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" -| <table> -| <colgroup> -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 50 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 54 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 62 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 66 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 74 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 77 Unexpected start tag token (p) in the select phase. Ignored. -Line: 1 Col: 88 Unexpected table element end tag (tables) in the select in table phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <select> -| "foobarbaz" -| <p> -| "quux" - -#data -<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux -#errors -Line: 1 Col: 36 Unexpected start tag (select) in table context caused voodoo mode. -Line: 1 Col: 42 Unexpected start tag token (math) in the select phase. Ignored. -Line: 1 Col: 46 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 54 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 58 Unexpected start tag token (mi) in the select phase. Ignored. -Line: 1 Col: 66 Unexpected end tag (mi) in the select phase. Ignored. -Line: 1 Col: 69 Unexpected start tag token (p) in the select phase. Ignored. -Line: 1 Col: 80 Unexpected table element end tag (tables) in the select in table phase. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <select> -| "foobarbaz" -| <table> -| <p> -| "quux" - -#data -<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz -#errors -Line: 1 Col: 41 Unexpected start tag (math). -Line: 1 Col: 68 HTML start tag "p" in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz -#errors -Line: 1 Col: 34 Unexpected start tag token (math) in the after body phase. -Line: 1 Col: 61 HTML start tag "p" in a foreign namespace context. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <math math> -| <math mi> -| "foo" -| <math mi> -| "bar" -| <p> -| "baz" - -#data -<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span> -#errors -Line: 1 Col: 31 Unexpected start tag token (math) in the frameset phase. Ignored. -Line: 1 Col: 35 Unexpected start tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 40 Unexpected end tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 44 Unexpected start tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 49 Unexpected end tag token (mi) in the frameset phase. Ignored. -Line: 1 Col: 52 Unexpected start tag token (p) in the frameset phase. Ignored. -Line: 1 Col: 58 Unexpected start tag token (span) in the frameset phase. Ignored. -Line: 1 Col: 58 Expected closing tag. Unexpected end of file. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span> -#errors -Line: 1 Col: 42 Unexpected start tag (math) in the after frameset phase. Ignored. -Line: 1 Col: 46 Unexpected start tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 51 Unexpected end tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 55 Unexpected start tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 60 Unexpected end tag (mi) in the after frameset phase. Ignored. -Line: 1 Col: 63 Unexpected start tag (p) in the after frameset phase. Ignored. -Line: 1 Col: 69 Unexpected start tag (span) in the after frameset phase. Ignored. -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| <math math> -| xlink href="foo" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <math math> -| <math mi> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <math math> -| <math mi> -| xlink href="foo" -| xml lang="en" - -#data -<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| xlink:href="foo" -| xml:lang="en" -| <math math> -| <math mi> -| xlink href="foo" -| xml lang="en" -| "bar" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat b/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat deleted file mode 100644 index 6c78661e..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tests_innerHTML_1.dat +++ /dev/null @@ -1,741 +0,0 @@ -#data -<body><span> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><body> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><body> -#errors -#document-fragment -div -#document -| <span> - -#data -<body><span> -#errors -#document-fragment -html -#document -| <head> -| <body> -| <span> - -#data -<frameset><span> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><frameset> -#errors -#document-fragment -body -#document -| <span> - -#data -<span><frameset> -#errors -#document-fragment -div -#document -| <span> - -#data -<frameset><span> -#errors -#document-fragment -html -#document -| <head> -| <frameset> - -#data -<table><tr> -#errors -#document-fragment -table -#document -| <tbody> -| <tr> - -#data -</table><tr> -#errors -#document-fragment -table -#document -| <tbody> -| <tr> - -#data -<a> -#errors -#document-fragment -table -#document -| <a> - -#data -<a> -#errors -#document-fragment -table -#document -| <a> - -#data -<a><caption>a -#errors -#document-fragment -table -#document -| <a> -| <caption> -| "a" - -#data -<a><colgroup><col> -#errors -#document-fragment -table -#document -| <a> -| <colgroup> -| <col> - -#data -<a><tbody><tr> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> - -#data -<a><tfoot><tr> -#errors -#document-fragment -table -#document -| <a> -| <tfoot> -| <tr> - -#data -<a><thead><tr> -#errors -#document-fragment -table -#document -| <a> -| <thead> -| <tr> - -#data -<a><tr> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> - -#data -<a><th> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> -| <th> - -#data -<a><td> -#errors -#document-fragment -table -#document -| <a> -| <tbody> -| <tr> -| <td> - -#data -<table></table><tbody> -#errors -#document-fragment -caption -#document -| <table> - -#data -</table><span> -#errors -#document-fragment -caption -#document -| <span> - -#data -<span></table> -#errors -#document-fragment -caption -#document -| <span> - -#data -</caption><span> -#errors -#document-fragment -caption -#document -| <span> - -#data -<span></caption><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><caption><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><col><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><colgroup><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><html><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><tbody><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><td><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><tfoot><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><thead><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><th><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span><tr><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -<span></table><span> -#errors -#document-fragment -caption -#document -| <span> -| <span> - -#data -</colgroup><col> -#errors -#document-fragment -colgroup -#document -| <col> - -#data -<a><col> -#errors -#document-fragment -colgroup -#document -| <col> - -#data -<caption><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<col><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<colgroup><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<tbody><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<tfoot><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<thead><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -</table><a> -#errors -#document-fragment -tbody -#document -| <a> - -#data -<a><tr> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> - -#data -<a><td> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> -| <td> - -#data -<a><td> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> -| <td> - -#data -<a><td> -#errors -#document-fragment -tbody -#document -| <a> -| <tr> -| <td> - -#data -<td><table><tbody><a><tr> -#errors -#document-fragment -tbody -#document -| <tr> -| <td> -| <a> -| <table> -| <tbody> -| <tr> - -#data -</tr><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<td><table><a><tr></tr><tr> -#errors -#document-fragment -tr -#document -| <td> -| <a> -| <table> -| <tbody> -| <tr> -| <tr> - -#data -<caption><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<col><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<colgroup><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<tbody><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<tfoot><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<thead><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<tr><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -</table><td> -#errors -#document-fragment -tr -#document -| <td> - -#data -<td><table></table><td> -#errors -#document-fragment -tr -#document -| <td> -| <table> -| <td> - -#data -<td><table></table><td> -#errors -#document-fragment -tr -#document -| <td> -| <table> -| <td> - -#data -<caption><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<col><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<colgroup><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<tbody><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<tfoot><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<th><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<thead><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<tr><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</table><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</tbody><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</td><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</tfoot><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</thead><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</th><a> -#errors -#document-fragment -td -#document -| <a> - -#data -</tr><a> -#errors -#document-fragment -td -#document -| <a> - -#data -<table><td><td> -#errors -#document-fragment -td -#document -| <table> -| <tbody> -| <tr> -| <td> -| <td> - -#data -</select><option> -#errors -#document-fragment -select -#document -| <option> - -#data -<input><option> -#errors -#document-fragment -select -#document -| <option> - -#data -<keygen><option> -#errors -#document-fragment -select -#document -| <option> - -#data -<textarea><option> -#errors -#document-fragment -select -#document -| <option> - -#data -</html><!--abc--> -#errors -#document-fragment -html -#document -| <head> -| <body> -| <!-- abc --> - -#data -</frameset><frame> -#errors -#document-fragment -frameset -#document -| <frame> - -#data -#errors -#document-fragment -html -#document -| <head> -| <body> diff --git a/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat b/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat deleted file mode 100644 index 08419924..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/tricky01.dat +++ /dev/null @@ -1,261 +0,0 @@ -#data -<b><p>Bold </b> Not bold</p> -Also not bold. -#errors -#document -| <html> -| <head> -| <body> -| <b> -| <p> -| <b> -| "Bold " -| " Not bold" -| " -Also not bold." - -#data -<html> -<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain -<p>I should not be red. <font color=red>Red. <i>Italic and red.</p> -<p>Italic and red. </i> Red.</font> I should not be red.</p> -<b>Bold <i>Bold and italic</b> Only Italic </i> Plain -#errors -#document -| <html> -| <head> -| <body> -| <font> -| color="red" -| <i> -| "Italic and Red" -| <i> -| <p> -| <font> -| color="red" -| "Italic and Red " -| " Just italic." -| " Italic only." -| " Plain -" -| <p> -| "I should not be red. " -| <font> -| color="red" -| "Red. " -| <i> -| "Italic and red." -| <font> -| color="red" -| <i> -| " -" -| <p> -| <font> -| color="red" -| <i> -| "Italic and red. " -| " Red." -| " I should not be red." -| " -" -| <b> -| "Bold " -| <i> -| "Bold and italic" -| <i> -| " Only Italic " -| " Plain" - -#data -<html><body> -<p><font size="7">First paragraph.</p> -<p>Second paragraph.</p></font> -<b><p><i>Bold and Italic</b> Italic</p> -#errors -#document -| <html> -| <head> -| <body> -| " -" -| <p> -| <font> -| size="7" -| "First paragraph." -| <font> -| size="7" -| " -" -| <p> -| "Second paragraph." -| " -" -| <b> -| <p> -| <b> -| <i> -| "Bold and Italic" -| <i> -| " Italic" - -#data -<html> -<dl> -<dt><b>Boo -<dd>Goo? -</dl> -</html> -#errors -#document -| <html> -| <head> -| <body> -| <dl> -| " -" -| <dt> -| <b> -| "Boo -" -| <dd> -| <b> -| "Goo? -" -| <b> -| " -" - -#data -<html><body> -<label><a><div>Hello<div>World</div></a></label> -</body></html> -#errors -#document -| <html> -| <head> -| <body> -| " -" -| <label> -| <a> -| <div> -| <a> -| "Hello" -| <div> -| "World" -| " -" - -#data -<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table> -#errors -#document -| <html> -| <head> -| <body> -| <center> -| " " -| <font> -| "a" -| <font> -| <img> -| " " -| <table> -| " " -| <tbody> -| <tr> -| <td> -| " " -| " " -| " " - -#data -<table><tr><p><a><p>You should see this text. -#errors -#document -| <html> -| <head> -| <body> -| <p> -| <a> -| <p> -| <a> -| "You should see this text." -| <table> -| <tbody> -| <tr> - -#data -<TABLE> -<TR> -<CENTER><CENTER><TD></TD></TR><TR> -<FONT> -<TABLE><tr></tr></TABLE> -</P> -<a></font><font></a> -This page contains an insanely badly-nested tag sequence. -#errors -#document -| <html> -| <head> -| <body> -| <center> -| <center> -| <font> -| " -" -| <table> -| " -" -| <tbody> -| <tr> -| " -" -| <td> -| <tr> -| " -" -| <table> -| <tbody> -| <tr> -| <font> -| " -" -| <p> -| " -" -| <a> -| <a> -| <font> -| <font> -| " -This page contains an insanely badly-nested tag sequence." - -#data -<html> -<body> -<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the -nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre> -</body> -</html> -#errors -#document -| <html> -| <head> -| <body> -| " -" -| <b> -| <nobr> -| <div> -| <b> -| <nobr> -| "This text is in a div inside a nobr" -| "More text that should not be in the nobr, i.e., the -nobr should have closed the div inside it implicitly. " -| <pre> -| "A pre tag outside everything else." -| " - -" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat b/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat deleted file mode 100644 index 9d425e99..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/webkit01.dat +++ /dev/null @@ -1,610 +0,0 @@ -#data -Test -#errors -Line: 1 Col: 4 Unexpected non-space characters. Expected DOCTYPE. -#document -| <html> -| <head> -| <body> -| "Test" - -#data -<div></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> - -#data -<div>Test</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "Test" - -#data -<di -#errors -#document -| <html> -| <head> -| <body> - -#data -<div>Hello</div> -<script> -console.log("PASS"); -</script> -<div>Bye</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "Hello" -| " -" -| <script> -| " -console.log("PASS"); -" -| " -" -| <div> -| "Bye" - -#data -<div foo="bar">Hello</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo="bar" -| "Hello" - -#data -<div>Hello</div> -<script> -console.log("FOO<span>BAR</span>BAZ"); -</script> -<div>Bye</div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| "Hello" -| " -" -| <script> -| " -console.log("FOO<span>BAR</span>BAZ"); -" -| " -" -| <div> -| "Bye" - -#data -<foo bar="baz"></foo><potato quack="duck"></potato> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| bar="baz" -| <potato> -| quack="duck" - -#data -<foo bar="baz"><potato quack="duck"></potato></foo> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| bar="baz" -| <potato> -| quack="duck" - -#data -<foo></foo bar="baz"><potato></potato quack="duck"> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| <potato> - -#data -</ tttt> -#errors -#document -| <!-- tttt --> -| <html> -| <head> -| <body> - -#data -<div FOO ><img><img></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| foo="" -| <img> -| <img> - -#data -<p>Test</p<p>Test2</p> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| "TestTest2" - -#data -<rdar://problem/6869687> -#errors -#document -| <html> -| <head> -| <body> -| <rdar:> -| 6869687="" -| problem="" - -#data -<A>test< /A> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| "test< /A>" - -#data -&lt; -#errors -#document -| <html> -| <head> -| <body> -| "<" - -#data -<body foo='bar'><body foo='baz' yo='mama'> -#errors -#document -| <html> -| <head> -| <body> -| foo="bar" -| yo="mama" - -#data -<body></br foo="bar"></body> -#errors -#document -| <html> -| <head> -| <body> -| <br> - -#data -<bdy><br foo="bar"></body> -#errors -#document -| <html> -| <head> -| <body> -| <bdy> -| <br> -| foo="bar" - -#data -<body></body></br foo="bar"> -#errors -#document -| <html> -| <head> -| <body> -| <br> - -#data -<bdy></body><br foo="bar"> -#errors -#document -| <html> -| <head> -| <body> -| <bdy> -| <br> -| foo="bar" - -#data -<html><body></body></html><!-- Hi there --> -#errors -#document -| <html> -| <head> -| <body> -| <!-- Hi there --> - -#data -<html><body></body></html>x<!-- Hi there --> -#errors -#document -| <html> -| <head> -| <body> -| "x" -| <!-- Hi there --> - -#data -<html><body></body></html>x<!-- Hi there --></html><!-- Again --> -#errors -#document -| <html> -| <head> -| <body> -| "x" -| <!-- Hi there --> -| <!-- Again --> - -#data -<html><body></body></html>x<!-- Hi there --></body></html><!-- Again --> -#errors -#document -| <html> -| <head> -| <body> -| "x" -| <!-- Hi there --> -| <!-- Again --> - -#data -<html><body><ruby><div><rp>xx</rp></div></ruby></body></html> -#errors -#document -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <rp> -| "xx" - -#data -<html><body><ruby><div><rt>xx</rt></div></ruby></body></html> -#errors -#document -| <html> -| <head> -| <body> -| <ruby> -| <div> -| <rt> -| "xx" - -#data -<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6--> -#errors -#document -| <html> -| <head> -| <frameset> -| <!-- 1 --> -| <noframes> -| "A" -| <!-- 2 --> -| <!-- 3 --> -| <noframes> -| "B" -| <!-- 4 --> -| <noframes> -| "C" -| <!-- 5 --> -| <!-- 6 --> - -#data -<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select> -#errors -#document -| <html> -| <head> -| <body> -| <select> -| <option> -| "A" -| <option> -| "B" -| <select> -| <option> -| "C" -| <option> -| "D" -| <select> -| <option> -| "E" -| <option> -| "F" -| <select> -| <option> -| "G" - -#data -<dd><dd><dt><dt><dd><li><li> -#errors -#document -| <html> -| <head> -| <body> -| <dd> -| <dd> -| <dt> -| <dt> -| <dd> -| <li> -| <li> - -#data -<div><b></div><div><nobr>a<nobr> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <b> -| <div> -| <b> -| <nobr> -| "a" -| <nobr> - -#data -<head></head> -<body></body> -#errors -#document -| <html> -| <head> -| " -" -| <body> - -#data -<head></head> <style></style>ddd -#errors -#document -| <html> -| <head> -| <style> -| " " -| <body> -| "ddd" - -#data -<kbd><table></kbd><col><select><tr> -#errors -#document -| <html> -| <head> -| <body> -| <kbd> -| <select> -| <table> -| <colgroup> -| <col> -| <tbody> -| <tr> - -#data -<kbd><table></kbd><col><select><tr></table><div> -#errors -#document -| <html> -| <head> -| <body> -| <kbd> -| <select> -| <table> -| <colgroup> -| <col> -| <tbody> -| <tr> -| <div> - -#data -<a><li><style></style><title></title></a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <li> -| <a> -| <style> -| <title> - -#data -<font></p><p><meta><title></title></font> -#errors -#document -| <html> -| <head> -| <body> -| <font> -| <p> -| <p> -| <font> -| <meta> -| <title> - -#data -<a><center><title></title><a> -#errors -#document -| <html> -| <head> -| <body> -| <a> -| <center> -| <a> -| <title> -| <a> - -#data -<svg><title><div> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| <div> - -#data -<svg><title><rect><div> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| <rect> -| <div> - -#data -<svg><title><svg><div> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg title> -| <svg svg> -| <div> - -#data -<img <="" FAIL> -#errors -#document -| <html> -| <head> -| <body> -| <img> -| <="" -| fail="" - -#data -<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul> -#errors -#document -| <html> -| <head> -| <body> -| <ul> -| <li> -| <div> -| id="foo" -| "A" -| <li> -| "B" -| <div> -| "C" - -#data -<svg><em><desc></em> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <em> -| <desc> - -#data -<table><tr><td><svg><desc><td></desc><circle> -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| <svg svg> -| <svg desc> -| <td> -| <circle> - -#data -<svg><tfoot></mi><td> -#errors -#document -| <html> -| <head> -| <body> -| <svg svg> -| <svg tfoot> -| <svg td> - -#data -<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math> -#errors -#document -| <html> -| <head> -| <body> -| <math math> -| <math mrow> -| <math mrow> -| <math mn> -| "1" -| <math mi> -| "a" - -#data -<!doctype html><input type="hidden"><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <frameset> - -#data -<!doctype html><input type="button"><frameset> -#errors -#document -| <!DOCTYPE html> -| <html> -| <head> -| <body> -| <input> -| type="button" diff --git a/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat b/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat deleted file mode 100644 index 905783d3..00000000 --- a/vendor/golang.org/x/net/html/testdata/webkit/webkit02.dat +++ /dev/null @@ -1,159 +0,0 @@ -#data -<foo bar=qux/> -#errors -#document -| <html> -| <head> -| <body> -| <foo> -| bar="qux/" - -#data -<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p> -#errors -#document -| <html> -| <head> -| <body> -| <p> -| id="status" -| <noscript> -| "<strong>A</strong>" -| <span> -| "B" - -#data -<div><sarcasm><div></div></sarcasm></div> -#errors -#document -| <html> -| <head> -| <body> -| <div> -| <sarcasm> -| <div> - -#data -<html><body><img src="" border="0" alt="><div>A</div></body></html> -#errors -#document -| <html> -| <head> -| <body> - -#data -<table><td></tbody>A -#errors -#document -| <html> -| <head> -| <body> -| "A" -| <table> -| <tbody> -| <tr> -| <td> - -#data -<table><td></thead>A -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "A" - -#data -<table><td></tfoot>A -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <tbody> -| <tr> -| <td> -| "A" - -#data -<table><thead><td></tbody>A -#errors -#document -| <html> -| <head> -| <body> -| <table> -| <thead> -| <tr> -| <td> -| "A" - -#data -<legend>test</legend> -#errors -#document -| <html> -| <head> -| <body> -| <legend> -| "test" - -#data -<table><input> -#errors -#document -| <html> -| <head> -| <body> -| <input> -| <table> - -#data -<b><em><dcell><postfield><postfield><postfield><postfield><missing_glyph><missing_glyph><missing_glyph><missing_glyph><hkern><aside></b></em> -#errors -#document-fragment -div -#document -| <b> -| <em> -| <dcell> -| <postfield> -| <postfield> -| <postfield> -| <postfield> -| <missing_glyph> -| <missing_glyph> -| <missing_glyph> -| <missing_glyph> -| <hkern> -| <aside> -| <em> -| <b> - -#data -<isindex action="x"> -#errors -#document-fragment -table -#document -| <form> -| action="x" -| <hr> -| <label> -| "This is a searchable index. Enter search keywords: " -| <input> -| name="isindex" -| <hr> - -#data -<option><XH<optgroup></optgroup> -#errors -#document-fragment -select -#document -| <option> diff --git a/vendor/golang.org/x/net/html/token.go b/vendor/golang.org/x/net/html/token.go index 893e272a..e3c01d7c 100644 --- a/vendor/golang.org/x/net/html/token.go +++ b/vendor/golang.org/x/net/html/token.go @@ -1161,8 +1161,8 @@ func (z *Tokenizer) TagAttr() (key, val []byte, moreAttr bool) { return nil, nil, false } -// Token returns the next Token. The result's Data and Attr values remain valid -// after subsequent Next calls. +// Token returns the current Token. The result's Data and Attr values remain +// valid after subsequent Next calls. func (z *Tokenizer) Token() Token { t := Token{Type: z.tt} switch z.tt { diff --git a/vendor/golang.org/x/net/html/token_test.go b/vendor/golang.org/x/net/html/token_test.go deleted file mode 100644 index f6988a88..00000000 --- a/vendor/golang.org/x/net/html/token_test.go +++ /dev/null @@ -1,748 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package html - -import ( - "bytes" - "io" - "io/ioutil" - "reflect" - "runtime" - "strings" - "testing" -) - -type tokenTest struct { - // A short description of the test case. - desc string - // The HTML to parse. - html string - // The string representations of the expected tokens, joined by '$'. - golden string -} - -var tokenTests = []tokenTest{ - { - "empty", - "", - "", - }, - // A single text node. The tokenizer should not break text nodes on whitespace, - // nor should it normalize whitespace within a text node. - { - "text", - "foo bar", - "foo bar", - }, - // An entity. - { - "entity", - "one &lt; two", - "one &lt; two", - }, - // A start, self-closing and end tag. The tokenizer does not care if the start - // and end tokens don't match; that is the job of the parser. - { - "tags", - "<a>b<c/>d</e>", - "<a>$b$<c/>$d$</e>", - }, - // Angle brackets that aren't a tag. - { - "not a tag #0", - "<", - "&lt;", - }, - { - "not a tag #1", - "</", - "&lt;/", - }, - { - "not a tag #2", - "</>", - "<!---->", - }, - { - "not a tag #3", - "a</>b", - "a$<!---->$b", - }, - { - "not a tag #4", - "</ >", - "<!-- -->", - }, - { - "not a tag #5", - "</.", - "<!--.-->", - }, - { - "not a tag #6", - "</.>", - "<!--.-->", - }, - { - "not a tag #7", - "a < b", - "a &lt; b", - }, - { - "not a tag #8", - "<.>", - "&lt;.&gt;", - }, - { - "not a tag #9", - "a<<<b>>>c", - "a&lt;&lt;$<b>$&gt;&gt;c", - }, - { - "not a tag #10", - "if x<0 and y < 0 then x*y>0", - "if x&lt;0 and y &lt; 0 then x*y&gt;0", - }, - { - "not a tag #11", - "<<p>", - "&lt;$<p>", - }, - // EOF in a tag name. - { - "tag name eof #0", - "<a", - "", - }, - { - "tag name eof #1", - "<a ", - "", - }, - { - "tag name eof #2", - "a<b", - "a", - }, - { - "tag name eof #3", - "<a><b", - "<a>", - }, - { - "tag name eof #4", - `<a x`, - ``, - }, - // Some malformed tags that are missing a '>'. - { - "malformed tag #0", - `<p</p>`, - `<p< p="">`, - }, - { - "malformed tag #1", - `<p </p>`, - `<p <="" p="">`, - }, - { - "malformed tag #2", - `<p id`, - ``, - }, - { - "malformed tag #3", - `<p id=`, - ``, - }, - { - "malformed tag #4", - `<p id=>`, - `<p id="">`, - }, - { - "malformed tag #5", - `<p id=0`, - ``, - }, - { - "malformed tag #6", - `<p id=0</p>`, - `<p id="0&lt;/p">`, - }, - { - "malformed tag #7", - `<p id="0</p>`, - ``, - }, - { - "malformed tag #8", - `<p id="0"</p>`, - `<p id="0" <="" p="">`, - }, - { - "malformed tag #9", - `<p></p id`, - `<p>`, - }, - // Raw text and RCDATA. - { - "basic raw text", - "<script><a></b></script>", - "<script>$&lt;a&gt;&lt;/b&gt;$</script>", - }, - { - "unfinished script end tag", - "<SCRIPT>a</SCR", - "<script>$a&lt;/SCR", - }, - { - "broken script end tag", - "<SCRIPT>a</SCR ipt>", - "<script>$a&lt;/SCR ipt&gt;", - }, - { - "EOF in script end tag", - "<SCRIPT>a</SCRipt", - "<script>$a&lt;/SCRipt", - }, - { - "scriptx end tag", - "<SCRIPT>a</SCRiptx", - "<script>$a&lt;/SCRiptx", - }, - { - "' ' completes script end tag", - "<SCRIPT>a</SCRipt ", - "<script>$a", - }, - { - "'>' completes script end tag", - "<SCRIPT>a</SCRipt>", - "<script>$a$</script>", - }, - { - "self-closing script end tag", - "<SCRIPT>a</SCRipt/>", - "<script>$a$</script>", - }, - { - "nested script tag", - "<SCRIPT>a</SCRipt<script>", - "<script>$a&lt;/SCRipt&lt;script&gt;", - }, - { - "script end tag after unfinished", - "<SCRIPT>a</SCRipt</script>", - "<script>$a&lt;/SCRipt$</script>", - }, - { - "script/style mismatched tags", - "<script>a</style>", - "<script>$a&lt;/style&gt;", - }, - { - "style element with entity", - "<style>&apos;", - "<style>$&amp;apos;", - }, - { - "textarea with tag", - "<textarea><div></textarea>", - "<textarea>$&lt;div&gt;$</textarea>", - }, - { - "title with tag and entity", - "<title><b>K&amp;R C</b></title>", - "<title>$&lt;b&gt;K&amp;R C&lt;/b&gt;$</title>", - }, - // DOCTYPE tests. - { - "Proper DOCTYPE", - "<!DOCTYPE html>", - "<!DOCTYPE html>", - }, - { - "DOCTYPE with no space", - "<!doctypehtml>", - "<!DOCTYPE html>", - }, - { - "DOCTYPE with two spaces", - "<!doctype html>", - "<!DOCTYPE html>", - }, - { - "looks like DOCTYPE but isn't", - "<!DOCUMENT html>", - "<!--DOCUMENT html-->", - }, - { - "DOCTYPE at EOF", - "<!DOCtype", - "<!DOCTYPE >", - }, - // XML processing instructions. - { - "XML processing instruction", - "<?xml?>", - "<!--?xml?-->", - }, - // Comments. - { - "comment0", - "abc<b><!-- skipme --></b>def", - "abc$<b>$<!-- skipme -->$</b>$def", - }, - { - "comment1", - "a<!-->z", - "a$<!---->$z", - }, - { - "comment2", - "a<!--->z", - "a$<!---->$z", - }, - { - "comment3", - "a<!--x>-->z", - "a$<!--x>-->$z", - }, - { - "comment4", - "a<!--x->-->z", - "a$<!--x->-->$z", - }, - { - "comment5", - "a<!>z", - "a$<!---->$z", - }, - { - "comment6", - "a<!->z", - "a$<!----->$z", - }, - { - "comment7", - "a<!---<>z", - "a$<!---<>z-->", - }, - { - "comment8", - "a<!--z", - "a$<!--z-->", - }, - { - "comment9", - "a<!--z-", - "a$<!--z-->", - }, - { - "comment10", - "a<!--z--", - "a$<!--z-->", - }, - { - "comment11", - "a<!--z---", - "a$<!--z--->", - }, - { - "comment12", - "a<!--z----", - "a$<!--z---->", - }, - { - "comment13", - "a<!--x--!>z", - "a$<!--x-->$z", - }, - // An attribute with a backslash. - { - "backslash", - `<p id="a\"b">`, - `<p id="a\" b"="">`, - }, - // Entities, tag name and attribute key lower-casing, and whitespace - // normalization within a tag. - { - "tricky", - "<p \t\n iD=\"a&quot;B\" foo=\"bar\"><EM>te&lt;&amp;;xt</em></p>", - `<p id="a&#34;B" foo="bar">$<em>$te&lt;&amp;;xt$</em>$</p>`, - }, - // A nonexistent entity. Tokenizing and converting back to a string should - // escape the "&" to become "&amp;". - { - "noSuchEntity", - `<a b="c&noSuchEntity;d">&lt;&alsoDoesntExist;&`, - `<a b="c&amp;noSuchEntity;d">$&lt;&amp;alsoDoesntExist;&amp;`, - }, - { - "entity without semicolon", - `&notit;&notin;<a b="q=z&amp=5&notice=hello&not;=world">`, - `¬it;∉$<a b="q=z&amp;amp=5&amp;notice=hello¬=world">`, - }, - { - "entity with digits", - "&frac12;", - "½", - }, - // Attribute tests: - // http://dev.w3.org/html5/spec/Overview.html#attributes-0 - { - "Empty attribute", - `<input disabled FOO>`, - `<input disabled="" foo="">`, - }, - { - "Empty attribute, whitespace", - `<input disabled FOO >`, - `<input disabled="" foo="">`, - }, - { - "Unquoted attribute value", - `<input value=yes FOO=BAR>`, - `<input value="yes" foo="BAR">`, - }, - { - "Unquoted attribute value, spaces", - `<input value = yes FOO = BAR>`, - `<input value="yes" foo="BAR">`, - }, - { - "Unquoted attribute value, trailing space", - `<input value=yes FOO=BAR >`, - `<input value="yes" foo="BAR">`, - }, - { - "Single-quoted attribute value", - `<input value='yes' FOO='BAR'>`, - `<input value="yes" foo="BAR">`, - }, - { - "Single-quoted attribute value, trailing space", - `<input value='yes' FOO='BAR' >`, - `<input value="yes" foo="BAR">`, - }, - { - "Double-quoted attribute value", - `<input value="I'm an attribute" FOO="BAR">`, - `<input value="I&#39;m an attribute" foo="BAR">`, - }, - { - "Attribute name characters", - `<meta http-equiv="content-type">`, - `<meta http-equiv="content-type">`, - }, - { - "Mixed attributes", - `a<P V="0 1" w='2' X=3 y>z`, - `a$<p v="0 1" w="2" x="3" y="">$z`, - }, - { - "Attributes with a solitary single quote", - `<p id=can't><p id=won't>`, - `<p id="can&#39;t">$<p id="won&#39;t">`, - }, -} - -func TestTokenizer(t *testing.T) { -loop: - for _, tt := range tokenTests { - z := NewTokenizer(strings.NewReader(tt.html)) - if tt.golden != "" { - for i, s := range strings.Split(tt.golden, "$") { - if z.Next() == ErrorToken { - t.Errorf("%s token %d: want %q got error %v", tt.desc, i, s, z.Err()) - continue loop - } - actual := z.Token().String() - if s != actual { - t.Errorf("%s token %d: want %q got %q", tt.desc, i, s, actual) - continue loop - } - } - } - z.Next() - if z.Err() != io.EOF { - t.Errorf("%s: want EOF got %q", tt.desc, z.Err()) - } - } -} - -func TestMaxBuffer(t *testing.T) { - // Exceeding the maximum buffer size generates ErrBufferExceeded. - z := NewTokenizer(strings.NewReader("<" + strings.Repeat("t", 10))) - z.SetMaxBuf(5) - tt := z.Next() - if got, want := tt, ErrorToken; got != want { - t.Fatalf("token type: got: %v want: %v", got, want) - } - if got, want := z.Err(), ErrBufferExceeded; got != want { - t.Errorf("error type: got: %v want: %v", got, want) - } - if got, want := string(z.Raw()), "<tttt"; got != want { - t.Fatalf("buffered before overflow: got: %q want: %q", got, want) - } -} - -func TestMaxBufferReconstruction(t *testing.T) { - // Exceeding the maximum buffer size at any point while tokenizing permits - // reconstructing the original input. -tests: - for _, test := range tokenTests { - for maxBuf := 1; ; maxBuf++ { - r := strings.NewReader(test.html) - z := NewTokenizer(r) - z.SetMaxBuf(maxBuf) - var tokenized bytes.Buffer - for { - tt := z.Next() - tokenized.Write(z.Raw()) - if tt == ErrorToken { - if err := z.Err(); err != io.EOF && err != ErrBufferExceeded { - t.Errorf("%s: unexpected error: %v", test.desc, err) - } - break - } - } - // Anything tokenized along with untokenized input or data left in the reader. - assembled, err := ioutil.ReadAll(io.MultiReader(&tokenized, bytes.NewReader(z.Buffered()), r)) - if err != nil { - t.Errorf("%s: ReadAll: %v", test.desc, err) - continue tests - } - if got, want := string(assembled), test.html; got != want { - t.Errorf("%s: reassembled html:\n got: %q\nwant: %q", test.desc, got, want) - continue tests - } - // EOF indicates that we completed tokenization and hence found the max - // maxBuf that generates ErrBufferExceeded, so continue to the next test. - if z.Err() == io.EOF { - break - } - } // buffer sizes - } // tests -} - -func TestPassthrough(t *testing.T) { - // Accumulating the raw output for each parse event should reconstruct the - // original input. - for _, test := range tokenTests { - z := NewTokenizer(strings.NewReader(test.html)) - var parsed bytes.Buffer - for { - tt := z.Next() - parsed.Write(z.Raw()) - if tt == ErrorToken { - break - } - } - if got, want := parsed.String(), test.html; got != want { - t.Errorf("%s: parsed output:\n got: %q\nwant: %q", test.desc, got, want) - } - } -} - -func TestBufAPI(t *testing.T) { - s := "0<a>1</a>2<b>3<a>4<a>5</a>6</b>7</a>8<a/>9" - z := NewTokenizer(bytes.NewBufferString(s)) - var result bytes.Buffer - depth := 0 -loop: - for { - tt := z.Next() - switch tt { - case ErrorToken: - if z.Err() != io.EOF { - t.Error(z.Err()) - } - break loop - case TextToken: - if depth > 0 { - result.Write(z.Text()) - } - case StartTagToken, EndTagToken: - tn, _ := z.TagName() - if len(tn) == 1 && tn[0] == 'a' { - if tt == StartTagToken { - depth++ - } else { - depth-- - } - } - } - } - u := "14567" - v := string(result.Bytes()) - if u != v { - t.Errorf("TestBufAPI: want %q got %q", u, v) - } -} - -func TestConvertNewlines(t *testing.T) { - testCases := map[string]string{ - "Mac\rDOS\r\nUnix\n": "Mac\nDOS\nUnix\n", - "Unix\nMac\rDOS\r\n": "Unix\nMac\nDOS\n", - "DOS\r\nDOS\r\nDOS\r\n": "DOS\nDOS\nDOS\n", - "": "", - "\n": "\n", - "\n\r": "\n\n", - "\r": "\n", - "\r\n": "\n", - "\r\n\n": "\n\n", - "\r\n\r": "\n\n", - "\r\n\r\n": "\n\n", - "\r\r": "\n\n", - "\r\r\n": "\n\n", - "\r\r\n\n": "\n\n\n", - "\r\r\r\n": "\n\n\n", - "\r \n": "\n \n", - "xyz": "xyz", - } - for in, want := range testCases { - if got := string(convertNewlines([]byte(in))); got != want { - t.Errorf("input %q: got %q, want %q", in, got, want) - } - } -} - -func TestReaderEdgeCases(t *testing.T) { - const s = "<p>An io.Reader can return (0, nil) or (n, io.EOF).</p>" - testCases := []io.Reader{ - &zeroOneByteReader{s: s}, - &eofStringsReader{s: s}, - &stuckReader{}, - } - for i, tc := range testCases { - got := []TokenType{} - z := NewTokenizer(tc) - for { - tt := z.Next() - if tt == ErrorToken { - break - } - got = append(got, tt) - } - if err := z.Err(); err != nil && err != io.EOF { - if err != io.ErrNoProgress { - t.Errorf("i=%d: %v", i, err) - } - continue - } - want := []TokenType{ - StartTagToken, - TextToken, - EndTagToken, - } - if !reflect.DeepEqual(got, want) { - t.Errorf("i=%d: got %v, want %v", i, got, want) - continue - } - } -} - -// zeroOneByteReader is like a strings.Reader that alternates between -// returning 0 bytes and 1 byte at a time. -type zeroOneByteReader struct { - s string - n int -} - -func (r *zeroOneByteReader) Read(p []byte) (int, error) { - if len(p) == 0 { - return 0, nil - } - if len(r.s) == 0 { - return 0, io.EOF - } - r.n++ - if r.n%2 != 0 { - return 0, nil - } - p[0], r.s = r.s[0], r.s[1:] - return 1, nil -} - -// eofStringsReader is like a strings.Reader but can return an (n, err) where -// n > 0 && err != nil. -type eofStringsReader struct { - s string -} - -func (r *eofStringsReader) Read(p []byte) (int, error) { - n := copy(p, r.s) - r.s = r.s[n:] - if r.s != "" { - return n, nil - } - return n, io.EOF -} - -// stuckReader is an io.Reader that always returns no data and no error. -type stuckReader struct{} - -func (*stuckReader) Read(p []byte) (int, error) { - return 0, nil -} - -const ( - rawLevel = iota - lowLevel - highLevel -) - -func benchmarkTokenizer(b *testing.B, level int) { - buf, err := ioutil.ReadFile("testdata/go1.html") - if err != nil { - b.Fatalf("could not read testdata/go1.html: %v", err) - } - b.SetBytes(int64(len(buf))) - runtime.GC() - b.ReportAllocs() - b.ResetTimer() - for i := 0; i < b.N; i++ { - z := NewTokenizer(bytes.NewBuffer(buf)) - for { - tt := z.Next() - if tt == ErrorToken { - if err := z.Err(); err != nil && err != io.EOF { - b.Fatalf("tokenizer error: %v", err) - } - break - } - switch level { - case rawLevel: - // Calling z.Raw just returns the raw bytes of the token. It does - // not unescape &lt; to <, or lower-case tag names and attribute keys. - z.Raw() - case lowLevel: - // Caling z.Text, z.TagName and z.TagAttr returns []byte values - // whose contents may change on the next call to z.Next. - switch tt { - case TextToken, CommentToken, DoctypeToken: - z.Text() - case StartTagToken, SelfClosingTagToken: - _, more := z.TagName() - for more { - _, _, more = z.TagAttr() - } - case EndTagToken: - z.TagName() - } - case highLevel: - // Calling z.Token converts []byte values to strings whose validity - // extend beyond the next call to z.Next. - z.Token() - } - } - } -} - -func BenchmarkRawLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, rawLevel) } -func BenchmarkLowLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, lowLevel) } -func BenchmarkHighLevelTokenizer(b *testing.B) { benchmarkTokenizer(b, highLevel) } diff --git a/vendor/golang.org/x/net/icmp/dstunreach.go b/vendor/golang.org/x/net/icmp/dstunreach.go deleted file mode 100644 index 01dc660f..00000000 --- a/vendor/golang.org/x/net/icmp/dstunreach.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// A DstUnreach represents an ICMP destination unreachable message -// body. -type DstUnreach struct { - Data []byte // data, known as original datagram field - Extensions []Extension // extensions -} - -// Len implements the Len method of MessageBody interface. -func (p *DstUnreach) Len(proto int) int { - if p == nil { - return 0 - } - l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) - return l -} - -// Marshal implements the Marshal method of MessageBody interface. -func (p *DstUnreach) Marshal(proto int) ([]byte, error) { - return marshalMultipartMessageBody(proto, p.Data, p.Extensions) -} - -// parseDstUnreach parses b as an ICMP destination unreachable message -// body. -func parseDstUnreach(proto int, b []byte) (MessageBody, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - p := &DstUnreach{} - var err error - p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) - if err != nil { - return nil, err - } - return p, nil -} diff --git a/vendor/golang.org/x/net/icmp/echo.go b/vendor/golang.org/x/net/icmp/echo.go deleted file mode 100644 index 8943eab3..00000000 --- a/vendor/golang.org/x/net/icmp/echo.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// An Echo represents an ICMP echo request or reply message body. -type Echo struct { - ID int // identifier - Seq int // sequence number - Data []byte // data -} - -// Len implements the Len method of MessageBody interface. -func (p *Echo) Len(proto int) int { - if p == nil { - return 0 - } - return 4 + len(p.Data) -} - -// Marshal implements the Marshal method of MessageBody interface. -func (p *Echo) Marshal(proto int) ([]byte, error) { - b := make([]byte, 4+len(p.Data)) - b[0], b[1] = byte(p.ID>>8), byte(p.ID) - b[2], b[3] = byte(p.Seq>>8), byte(p.Seq) - copy(b[4:], p.Data) - return b, nil -} - -// parseEcho parses b as an ICMP echo request or reply message body. -func parseEcho(proto int, b []byte) (MessageBody, error) { - bodyLen := len(b) - if bodyLen < 4 { - return nil, errMessageTooShort - } - p := &Echo{ID: int(b[0])<<8 | int(b[1]), Seq: int(b[2])<<8 | int(b[3])} - if bodyLen > 4 { - p.Data = make([]byte, bodyLen-4) - copy(p.Data, b[4:]) - } - return p, nil -} diff --git a/vendor/golang.org/x/net/icmp/endpoint.go b/vendor/golang.org/x/net/icmp/endpoint.go deleted file mode 100644 index 0213d1a1..00000000 --- a/vendor/golang.org/x/net/icmp/endpoint.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "net" - "runtime" - "syscall" - "time" - - "golang.org/x/net/ipv4" - "golang.org/x/net/ipv6" -) - -var _ net.PacketConn = &PacketConn{} - -// A PacketConn represents a packet network endpoint that uses either -// ICMPv4 or ICMPv6. -type PacketConn struct { - c net.PacketConn - p4 *ipv4.PacketConn - p6 *ipv6.PacketConn -} - -func (c *PacketConn) ok() bool { return c != nil && c.c != nil } - -// IPv4PacketConn returns the ipv4.PacketConn of c. -// It returns nil when c is not created as the endpoint for ICMPv4. -func (c *PacketConn) IPv4PacketConn() *ipv4.PacketConn { - if !c.ok() { - return nil - } - return c.p4 -} - -// IPv6PacketConn returns the ipv6.PacketConn of c. -// It returns nil when c is not created as the endpoint for ICMPv6. -func (c *PacketConn) IPv6PacketConn() *ipv6.PacketConn { - if !c.ok() { - return nil - } - return c.p6 -} - -// ReadFrom reads an ICMP message from the connection. -func (c *PacketConn) ReadFrom(b []byte) (int, net.Addr, error) { - if !c.ok() { - return 0, nil, syscall.EINVAL - } - // Please be informed that ipv4.NewPacketConn enables - // IP_STRIPHDR option by default on Darwin. - // See golang.org/issue/9395 for futher information. - if runtime.GOOS == "darwin" && c.p4 != nil { - n, _, peer, err := c.p4.ReadFrom(b) - return n, peer, err - } - return c.c.ReadFrom(b) -} - -// WriteTo writes the ICMP message b to dst. -// Dst must be net.UDPAddr when c is a non-privileged -// datagram-oriented ICMP endpoint. Otherwise it must be net.IPAddr. -func (c *PacketConn) WriteTo(b []byte, dst net.Addr) (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - return c.c.WriteTo(b, dst) -} - -// Close closes the endpoint. -func (c *PacketConn) Close() error { - if !c.ok() { - return syscall.EINVAL - } - return c.c.Close() -} - -// LocalAddr returns the local network address. -func (c *PacketConn) LocalAddr() net.Addr { - if !c.ok() { - return nil - } - return c.c.LocalAddr() -} - -// SetDeadline sets the read and write deadlines associated with the -// endpoint. -func (c *PacketConn) SetDeadline(t time.Time) error { - if !c.ok() { - return syscall.EINVAL - } - return c.c.SetDeadline(t) -} - -// SetReadDeadline sets the read deadline associated with the -// endpoint. -func (c *PacketConn) SetReadDeadline(t time.Time) error { - if !c.ok() { - return syscall.EINVAL - } - return c.c.SetReadDeadline(t) -} - -// SetWriteDeadline sets the write deadline associated with the -// endpoint. -func (c *PacketConn) SetWriteDeadline(t time.Time) error { - if !c.ok() { - return syscall.EINVAL - } - return c.c.SetWriteDeadline(t) -} diff --git a/vendor/golang.org/x/net/icmp/example_test.go b/vendor/golang.org/x/net/icmp/example_test.go deleted file mode 100644 index 1df4cecc..00000000 --- a/vendor/golang.org/x/net/icmp/example_test.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp_test - -import ( - "log" - "net" - "os" - "runtime" - - "golang.org/x/net/icmp" - "golang.org/x/net/ipv6" -) - -func ExamplePacketConn_nonPrivilegedPing() { - switch runtime.GOOS { - case "darwin": - case "linux": - log.Println("you may need to adjust the net.ipv4.ping_group_range kernel state") - default: - log.Println("not supported on", runtime.GOOS) - return - } - - c, err := icmp.ListenPacket("udp6", "fe80::1%en0") - if err != nil { - log.Fatal(err) - } - defer c.Close() - - wm := icmp.Message{ - Type: ipv6.ICMPTypeEchoRequest, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: 1, - Data: []byte("HELLO-R-U-THERE"), - }, - } - wb, err := wm.Marshal(nil) - if err != nil { - log.Fatal(err) - } - if _, err := c.WriteTo(wb, &net.UDPAddr{IP: net.ParseIP("ff02::1"), Zone: "en0"}); err != nil { - log.Fatal(err) - } - - rb := make([]byte, 1500) - n, peer, err := c.ReadFrom(rb) - if err != nil { - log.Fatal(err) - } - rm, err := icmp.ParseMessage(58, rb[:n]) - if err != nil { - log.Fatal(err) - } - switch rm.Type { - case ipv6.ICMPTypeEchoReply: - log.Printf("got reflection from %v", peer) - default: - log.Printf("got %+v; want echo reply", rm) - } -} diff --git a/vendor/golang.org/x/net/icmp/extension.go b/vendor/golang.org/x/net/icmp/extension.go deleted file mode 100644 index 720e167f..00000000 --- a/vendor/golang.org/x/net/icmp/extension.go +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// An Extension represents an ICMP extension. -type Extension interface { - // Len returns the length of ICMP extension. - // Proto must be either the ICMPv4 or ICMPv6 protocol number. - Len(proto int) int - - // Marshal returns the binary enconding of ICMP extension. - // Proto must be either the ICMPv4 or ICMPv6 protocol number. - Marshal(proto int) ([]byte, error) -} - -const extensionVersion = 2 - -func validExtensionHeader(b []byte) bool { - v := int(b[0]&0xf0) >> 4 - s := uint16(b[2])<<8 | uint16(b[3]) - if s != 0 { - s = checksum(b) - } - if v != extensionVersion || s != 0 { - return false - } - return true -} - -// parseExtensions parses b as a list of ICMP extensions. -// The length attribute l must be the length attribute field in -// received icmp messages. -// -// It will return a list of ICMP extensions and an adjusted length -// attribute that represents the length of the padded original -// datagram field. Otherwise, it returns an error. -func parseExtensions(b []byte, l int) ([]Extension, int, error) { - // Still a lot of non-RFC 4884 compliant implementations are - // out there. Set the length attribute l to 128 when it looks - // inappropriate for backwards compatibility. - // - // A minimal extension at least requires 8 octets; 4 octets - // for an extension header, and 4 octets for a single object - // header. - // - // See RFC 4884 for further information. - if 128 > l || l+8 > len(b) { - l = 128 - } - if l+8 > len(b) { - return nil, -1, errNoExtension - } - if !validExtensionHeader(b[l:]) { - if l == 128 { - return nil, -1, errNoExtension - } - l = 128 - if !validExtensionHeader(b[l:]) { - return nil, -1, errNoExtension - } - } - var exts []Extension - for b = b[l+4:]; len(b) >= 4; { - ol := int(b[0])<<8 | int(b[1]) - if 4 > ol || ol > len(b) { - break - } - switch b[2] { - case classMPLSLabelStack: - ext, err := parseMPLSLabelStack(b[:ol]) - if err != nil { - return nil, -1, err - } - exts = append(exts, ext) - case classInterfaceInfo: - ext, err := parseInterfaceInfo(b[:ol]) - if err != nil { - return nil, -1, err - } - exts = append(exts, ext) - } - b = b[ol:] - } - return exts, l, nil -} diff --git a/vendor/golang.org/x/net/icmp/extension_test.go b/vendor/golang.org/x/net/icmp/extension_test.go deleted file mode 100644 index 0b3f7b9e..00000000 --- a/vendor/golang.org/x/net/icmp/extension_test.go +++ /dev/null @@ -1,259 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "net" - "reflect" - "testing" - - "golang.org/x/net/internal/iana" -) - -var marshalAndParseExtensionTests = []struct { - proto int - hdr []byte - obj []byte - exts []Extension -}{ - // MPLS label stack with no label - { - proto: iana.ProtocolICMP, - hdr: []byte{ - 0x20, 0x00, 0x00, 0x00, - }, - obj: []byte{ - 0x00, 0x04, 0x01, 0x01, - }, - exts: []Extension{ - &MPLSLabelStack{ - Class: classMPLSLabelStack, - Type: typeIncomingMPLSLabelStack, - }, - }, - }, - // MPLS label stack with a single label - { - proto: iana.ProtocolIPv6ICMP, - hdr: []byte{ - 0x20, 0x00, 0x00, 0x00, - }, - obj: []byte{ - 0x00, 0x08, 0x01, 0x01, - 0x03, 0xe8, 0xe9, 0xff, - }, - exts: []Extension{ - &MPLSLabelStack{ - Class: classMPLSLabelStack, - Type: typeIncomingMPLSLabelStack, - Labels: []MPLSLabel{ - { - Label: 16014, - TC: 0x4, - S: true, - TTL: 255, - }, - }, - }, - }, - }, - // MPLS label stack with multiple labels - { - proto: iana.ProtocolICMP, - hdr: []byte{ - 0x20, 0x00, 0x00, 0x00, - }, - obj: []byte{ - 0x00, 0x0c, 0x01, 0x01, - 0x03, 0xe8, 0xde, 0xfe, - 0x03, 0xe8, 0xe1, 0xff, - }, - exts: []Extension{ - &MPLSLabelStack{ - Class: classMPLSLabelStack, - Type: typeIncomingMPLSLabelStack, - Labels: []MPLSLabel{ - { - Label: 16013, - TC: 0x7, - S: false, - TTL: 254, - }, - { - Label: 16014, - TC: 0, - S: true, - TTL: 255, - }, - }, - }, - }, - }, - // Interface information with no attribute - { - proto: iana.ProtocolICMP, - hdr: []byte{ - 0x20, 0x00, 0x00, 0x00, - }, - obj: []byte{ - 0x00, 0x04, 0x02, 0x00, - }, - exts: []Extension{ - &InterfaceInfo{ - Class: classInterfaceInfo, - }, - }, - }, - // Interface information with ifIndex and name - { - proto: iana.ProtocolICMP, - hdr: []byte{ - 0x20, 0x00, 0x00, 0x00, - }, - obj: []byte{ - 0x00, 0x10, 0x02, 0x0a, - 0x00, 0x00, 0x00, 0x10, - 0x08, byte('e'), byte('n'), byte('1'), - byte('0'), byte('1'), 0x00, 0x00, - }, - exts: []Extension{ - &InterfaceInfo{ - Class: classInterfaceInfo, - Type: 0x0a, - Interface: &net.Interface{ - Index: 16, - Name: "en101", - }, - }, - }, - }, - // Interface information with ifIndex, IPAddr, name and MTU - { - proto: iana.ProtocolIPv6ICMP, - hdr: []byte{ - 0x20, 0x00, 0x00, 0x00, - }, - obj: []byte{ - 0x00, 0x28, 0x02, 0x0f, - 0x00, 0x00, 0x00, 0x0f, - 0x00, 0x02, 0x00, 0x00, - 0xfe, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x08, byte('e'), byte('n'), byte('1'), - byte('0'), byte('1'), 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, - }, - exts: []Extension{ - &InterfaceInfo{ - Class: classInterfaceInfo, - Type: 0x0f, - Interface: &net.Interface{ - Index: 15, - Name: "en101", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.ParseIP("fe80::1"), - Zone: "en101", - }, - }, - }, - }, -} - -func TestMarshalAndParseExtension(t *testing.T) { - for i, tt := range marshalAndParseExtensionTests { - for j, ext := range tt.exts { - var err error - var b []byte - switch ext := ext.(type) { - case *MPLSLabelStack: - b, err = ext.Marshal(tt.proto) - if err != nil { - t.Errorf("#%v/%v: %v", i, j, err) - continue - } - case *InterfaceInfo: - b, err = ext.Marshal(tt.proto) - if err != nil { - t.Errorf("#%v/%v: %v", i, j, err) - continue - } - } - if !reflect.DeepEqual(b, tt.obj) { - t.Errorf("#%v/%v: got %#v; want %#v", i, j, b, tt.obj) - continue - } - } - - for j, wire := range []struct { - data []byte // original datagram - inlattr int // length of padded original datagram, a hint - outlattr int // length of padded original datagram, a want - err error - }{ - {nil, 0, -1, errNoExtension}, - {make([]byte, 127), 128, -1, errNoExtension}, - - {make([]byte, 128), 127, -1, errNoExtension}, - {make([]byte, 128), 128, -1, errNoExtension}, - {make([]byte, 128), 129, -1, errNoExtension}, - - {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 127, 128, nil}, - {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 128, 128, nil}, - {append(make([]byte, 128), append(tt.hdr, tt.obj...)...), 129, 128, nil}, - - {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 511, -1, errNoExtension}, - {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 512, 512, nil}, - {append(make([]byte, 512), append(tt.hdr, tt.obj...)...), 513, -1, errNoExtension}, - } { - exts, l, err := parseExtensions(wire.data, wire.inlattr) - if err != wire.err { - t.Errorf("#%v/%v: got %v; want %v", i, j, err, wire.err) - continue - } - if wire.err != nil { - continue - } - if l != wire.outlattr { - t.Errorf("#%v/%v: got %v; want %v", i, j, l, wire.outlattr) - } - if !reflect.DeepEqual(exts, tt.exts) { - for j, ext := range exts { - switch ext := ext.(type) { - case *MPLSLabelStack: - want := tt.exts[j].(*MPLSLabelStack) - t.Errorf("#%v/%v: got %#v; want %#v", i, j, ext, want) - case *InterfaceInfo: - want := tt.exts[j].(*InterfaceInfo) - t.Errorf("#%v/%v: got %#v; want %#v", i, j, ext, want) - } - } - continue - } - } - } -} - -var parseInterfaceNameTests = []struct { - b []byte - error -}{ - {[]byte{0, 'e', 'n', '0'}, errInvalidExtension}, - {[]byte{4, 'e', 'n', '0'}, nil}, - {[]byte{7, 'e', 'n', '0', 0xff, 0xff, 0xff, 0xff}, errInvalidExtension}, - {[]byte{8, 'e', 'n', '0', 0xff, 0xff, 0xff}, errMessageTooShort}, -} - -func TestParseInterfaceName(t *testing.T) { - ifi := InterfaceInfo{Interface: &net.Interface{}} - for i, tt := range parseInterfaceNameTests { - if _, err := ifi.parseName(tt.b); err != tt.error { - t.Errorf("#%d: got %v; want %v", i, err, tt.error) - } - } -} diff --git a/vendor/golang.org/x/net/icmp/helper_posix.go b/vendor/golang.org/x/net/icmp/helper_posix.go deleted file mode 100644 index 398fd388..00000000 --- a/vendor/golang.org/x/net/icmp/helper_posix.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows - -package icmp - -import ( - "net" - "strconv" - "syscall" -) - -func sockaddr(family int, address string) (syscall.Sockaddr, error) { - switch family { - case syscall.AF_INET: - a, err := net.ResolveIPAddr("ip4", address) - if err != nil { - return nil, err - } - if len(a.IP) == 0 { - a.IP = net.IPv4zero - } - if a.IP = a.IP.To4(); a.IP == nil { - return nil, net.InvalidAddrError("non-ipv4 address") - } - sa := &syscall.SockaddrInet4{} - copy(sa.Addr[:], a.IP) - return sa, nil - case syscall.AF_INET6: - a, err := net.ResolveIPAddr("ip6", address) - if err != nil { - return nil, err - } - if len(a.IP) == 0 { - a.IP = net.IPv6unspecified - } - if a.IP.Equal(net.IPv4zero) { - a.IP = net.IPv6unspecified - } - if a.IP = a.IP.To16(); a.IP == nil || a.IP.To4() != nil { - return nil, net.InvalidAddrError("non-ipv6 address") - } - sa := &syscall.SockaddrInet6{ZoneId: zoneToUint32(a.Zone)} - copy(sa.Addr[:], a.IP) - return sa, nil - default: - return nil, net.InvalidAddrError("unexpected family") - } -} - -func zoneToUint32(zone string) uint32 { - if zone == "" { - return 0 - } - if ifi, err := net.InterfaceByName(zone); err == nil { - return uint32(ifi.Index) - } - n, err := strconv.Atoi(zone) - if err != nil { - return 0 - } - return uint32(n) -} - -func last(s string, b byte) int { - i := len(s) - for i--; i >= 0; i-- { - if s[i] == b { - break - } - } - return i -} diff --git a/vendor/golang.org/x/net/icmp/interface.go b/vendor/golang.org/x/net/icmp/interface.go deleted file mode 100644 index c7bf8dd1..00000000 --- a/vendor/golang.org/x/net/icmp/interface.go +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "net" - "strings" - - "golang.org/x/net/internal/iana" -) - -const ( - classInterfaceInfo = 2 - - afiIPv4 = 1 - afiIPv6 = 2 -) - -const ( - attrMTU = 1 << iota - attrName - attrIPAddr - attrIfIndex -) - -// An InterfaceInfo represents interface and next-hop identification. -type InterfaceInfo struct { - Class int // extension object class number - Type int // extension object sub-type - Interface *net.Interface - Addr *net.IPAddr -} - -func (ifi *InterfaceInfo) nameLen() int { - if len(ifi.Interface.Name) > 63 { - return 64 - } - l := 1 + len(ifi.Interface.Name) - return (l + 3) &^ 3 -} - -func (ifi *InterfaceInfo) attrsAndLen(proto int) (attrs, l int) { - l = 4 - if ifi.Interface != nil && ifi.Interface.Index > 0 { - attrs |= attrIfIndex - l += 4 - if len(ifi.Interface.Name) > 0 { - attrs |= attrName - l += ifi.nameLen() - } - if ifi.Interface.MTU > 0 { - attrs |= attrMTU - l += 4 - } - } - if ifi.Addr != nil { - switch proto { - case iana.ProtocolICMP: - if ifi.Addr.IP.To4() != nil { - attrs |= attrIPAddr - l += 4 + net.IPv4len - } - case iana.ProtocolIPv6ICMP: - if ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { - attrs |= attrIPAddr - l += 4 + net.IPv6len - } - } - } - return -} - -// Len implements the Len method of Extension interface. -func (ifi *InterfaceInfo) Len(proto int) int { - _, l := ifi.attrsAndLen(proto) - return l -} - -// Marshal implements the Marshal method of Extension interface. -func (ifi *InterfaceInfo) Marshal(proto int) ([]byte, error) { - attrs, l := ifi.attrsAndLen(proto) - b := make([]byte, l) - if err := ifi.marshal(proto, b, attrs, l); err != nil { - return nil, err - } - return b, nil -} - -func (ifi *InterfaceInfo) marshal(proto int, b []byte, attrs, l int) error { - b[0], b[1] = byte(l>>8), byte(l) - b[2], b[3] = classInterfaceInfo, byte(ifi.Type) - for b = b[4:]; len(b) > 0 && attrs != 0; { - switch { - case attrs&attrIfIndex != 0: - b = ifi.marshalIfIndex(proto, b) - attrs &^= attrIfIndex - case attrs&attrIPAddr != 0: - b = ifi.marshalIPAddr(proto, b) - attrs &^= attrIPAddr - case attrs&attrName != 0: - b = ifi.marshalName(proto, b) - attrs &^= attrName - case attrs&attrMTU != 0: - b = ifi.marshalMTU(proto, b) - attrs &^= attrMTU - } - } - return nil -} - -func (ifi *InterfaceInfo) marshalIfIndex(proto int, b []byte) []byte { - b[0], b[1], b[2], b[3] = byte(ifi.Interface.Index>>24), byte(ifi.Interface.Index>>16), byte(ifi.Interface.Index>>8), byte(ifi.Interface.Index) - return b[4:] -} - -func (ifi *InterfaceInfo) parseIfIndex(b []byte) ([]byte, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - ifi.Interface.Index = int(b[0])<<24 | int(b[1])<<16 | int(b[2])<<8 | int(b[3]) - return b[4:], nil -} - -func (ifi *InterfaceInfo) marshalIPAddr(proto int, b []byte) []byte { - switch proto { - case iana.ProtocolICMP: - b[0], b[1] = byte(afiIPv4>>8), byte(afiIPv4) - copy(b[4:4+net.IPv4len], ifi.Addr.IP.To4()) - b = b[4+net.IPv4len:] - case iana.ProtocolIPv6ICMP: - b[0], b[1] = byte(afiIPv6>>8), byte(afiIPv6) - copy(b[4:4+net.IPv6len], ifi.Addr.IP.To16()) - b = b[4+net.IPv6len:] - } - return b -} - -func (ifi *InterfaceInfo) parseIPAddr(b []byte) ([]byte, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - afi := int(b[0])<<8 | int(b[1]) - b = b[4:] - switch afi { - case afiIPv4: - if len(b) < net.IPv4len { - return nil, errMessageTooShort - } - ifi.Addr.IP = make(net.IP, net.IPv4len) - copy(ifi.Addr.IP, b[:net.IPv4len]) - b = b[net.IPv4len:] - case afiIPv6: - if len(b) < net.IPv6len { - return nil, errMessageTooShort - } - ifi.Addr.IP = make(net.IP, net.IPv6len) - copy(ifi.Addr.IP, b[:net.IPv6len]) - b = b[net.IPv6len:] - } - return b, nil -} - -func (ifi *InterfaceInfo) marshalName(proto int, b []byte) []byte { - l := byte(ifi.nameLen()) - b[0] = l - copy(b[1:], []byte(ifi.Interface.Name)) - return b[l:] -} - -func (ifi *InterfaceInfo) parseName(b []byte) ([]byte, error) { - if 4 > len(b) || len(b) < int(b[0]) { - return nil, errMessageTooShort - } - l := int(b[0]) - if l%4 != 0 || 4 > l || l > 64 { - return nil, errInvalidExtension - } - var name [63]byte - copy(name[:], b[1:l]) - ifi.Interface.Name = strings.Trim(string(name[:]), "\000") - return b[l:], nil -} - -func (ifi *InterfaceInfo) marshalMTU(proto int, b []byte) []byte { - b[0], b[1], b[2], b[3] = byte(ifi.Interface.MTU>>24), byte(ifi.Interface.MTU>>16), byte(ifi.Interface.MTU>>8), byte(ifi.Interface.MTU) - return b[4:] -} - -func (ifi *InterfaceInfo) parseMTU(b []byte) ([]byte, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - ifi.Interface.MTU = int(b[0])<<24 | int(b[1])<<16 | int(b[2])<<8 | int(b[3]) - return b[4:], nil -} - -func parseInterfaceInfo(b []byte) (Extension, error) { - ifi := &InterfaceInfo{ - Class: int(b[2]), - Type: int(b[3]), - } - if ifi.Type&(attrIfIndex|attrName|attrMTU) != 0 { - ifi.Interface = &net.Interface{} - } - if ifi.Type&attrIPAddr != 0 { - ifi.Addr = &net.IPAddr{} - } - attrs := ifi.Type & (attrIfIndex | attrIPAddr | attrName | attrMTU) - for b = b[4:]; len(b) > 0 && attrs != 0; { - var err error - switch { - case attrs&attrIfIndex != 0: - b, err = ifi.parseIfIndex(b) - attrs &^= attrIfIndex - case attrs&attrIPAddr != 0: - b, err = ifi.parseIPAddr(b) - attrs &^= attrIPAddr - case attrs&attrName != 0: - b, err = ifi.parseName(b) - attrs &^= attrName - case attrs&attrMTU != 0: - b, err = ifi.parseMTU(b) - attrs &^= attrMTU - } - if err != nil { - return nil, err - } - } - if ifi.Interface != nil && ifi.Interface.Name != "" && ifi.Addr != nil && ifi.Addr.IP.To16() != nil && ifi.Addr.IP.To4() == nil { - ifi.Addr.Zone = ifi.Interface.Name - } - return ifi, nil -} diff --git a/vendor/golang.org/x/net/icmp/ipv4.go b/vendor/golang.org/x/net/icmp/ipv4.go deleted file mode 100644 index a252d730..00000000 --- a/vendor/golang.org/x/net/icmp/ipv4.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "net" - "runtime" - "unsafe" - - "golang.org/x/net/ipv4" -) - -// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. -var freebsdVersion uint32 - -// ParseIPv4Header parses b as an IPv4 header of ICMP error message -// invoking packet, which is contained in ICMP error message. -func ParseIPv4Header(b []byte) (*ipv4.Header, error) { - if len(b) < ipv4.HeaderLen { - return nil, errHeaderTooShort - } - hdrlen := int(b[0]&0x0f) << 2 - if hdrlen > len(b) { - return nil, errBufferTooShort - } - h := &ipv4.Header{ - Version: int(b[0] >> 4), - Len: hdrlen, - TOS: int(b[1]), - ID: int(b[4])<<8 | int(b[5]), - FragOff: int(b[6])<<8 | int(b[7]), - TTL: int(b[8]), - Protocol: int(b[9]), - Checksum: int(b[10])<<8 | int(b[11]), - Src: net.IPv4(b[12], b[13], b[14], b[15]), - Dst: net.IPv4(b[16], b[17], b[18], b[19]), - } - switch runtime.GOOS { - case "darwin": - // TODO(mikio): fix potential misaligned memory access - h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[2:3][0]))) - case "freebsd": - if freebsdVersion >= 1000000 { - h.TotalLen = int(b[2])<<8 | int(b[3]) - } else { - // TODO(mikio): fix potential misaligned memory access - h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[2:3][0]))) - } - default: - h.TotalLen = int(b[2])<<8 | int(b[3]) - } - h.Flags = ipv4.HeaderFlags(h.FragOff&0xe000) >> 13 - h.FragOff = h.FragOff & 0x1fff - if hdrlen-ipv4.HeaderLen > 0 { - h.Options = make([]byte, hdrlen-ipv4.HeaderLen) - copy(h.Options, b[ipv4.HeaderLen:]) - } - return h, nil -} diff --git a/vendor/golang.org/x/net/icmp/ipv4_test.go b/vendor/golang.org/x/net/icmp/ipv4_test.go deleted file mode 100644 index b05c6973..00000000 --- a/vendor/golang.org/x/net/icmp/ipv4_test.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "net" - "reflect" - "runtime" - "testing" - - "golang.org/x/net/ipv4" -) - -var ( - wireHeaderFromKernel = [ipv4.HeaderLen]byte{ - 0x45, 0x01, 0xbe, 0xef, - 0xca, 0xfe, 0x45, 0xdc, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - wireHeaderFromTradBSDKernel = [ipv4.HeaderLen]byte{ - 0x45, 0x01, 0xef, 0xbe, - 0xca, 0xfe, 0x45, 0xdc, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - // TODO(mikio): Add platform dependent wire header formats when - // we support new platforms. - - testHeader = &ipv4.Header{ - Version: ipv4.Version, - Len: ipv4.HeaderLen, - TOS: 1, - TotalLen: 0xbeef, - ID: 0xcafe, - Flags: ipv4.DontFragment, - FragOff: 1500, - TTL: 255, - Protocol: 1, - Checksum: 0xdead, - Src: net.IPv4(172, 16, 254, 254), - Dst: net.IPv4(192, 168, 0, 1), - } -) - -func TestParseIPv4Header(t *testing.T) { - var wh []byte - switch runtime.GOOS { - case "darwin": - wh = wireHeaderFromTradBSDKernel[:] - case "freebsd": - if freebsdVersion >= 1000000 { - wh = wireHeaderFromKernel[:] - } else { - wh = wireHeaderFromTradBSDKernel[:] - } - default: - wh = wireHeaderFromKernel[:] - } - h, err := ParseIPv4Header(wh) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(h, testHeader) { - t.Fatalf("got %#v; want %#v", h, testHeader) - } -} diff --git a/vendor/golang.org/x/net/icmp/ipv6.go b/vendor/golang.org/x/net/icmp/ipv6.go deleted file mode 100644 index fe4031a2..00000000 --- a/vendor/golang.org/x/net/icmp/ipv6.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import ( - "net" - - "golang.org/x/net/internal/iana" -) - -const ipv6PseudoHeaderLen = 2*net.IPv6len + 8 - -// IPv6PseudoHeader returns an IPv6 pseudo header for checkusm -// calculation. -func IPv6PseudoHeader(src, dst net.IP) []byte { - b := make([]byte, ipv6PseudoHeaderLen) - copy(b, src.To16()) - copy(b[net.IPv6len:], dst.To16()) - b[len(b)-1] = byte(iana.ProtocolIPv6ICMP) - return b -} diff --git a/vendor/golang.org/x/net/icmp/listen_posix.go b/vendor/golang.org/x/net/icmp/listen_posix.go deleted file mode 100644 index b9f26079..00000000 --- a/vendor/golang.org/x/net/icmp/listen_posix.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows - -package icmp - -import ( - "net" - "os" - "runtime" - "syscall" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/ipv4" - "golang.org/x/net/ipv6" -) - -const sysIP_STRIPHDR = 0x17 // for now only darwin supports this option - -// ListenPacket listens for incoming ICMP packets addressed to -// address. See net.Dial for the syntax of address. -// -// For non-privileged datagram-oriented ICMP endpoints, network must -// be "udp4" or "udp6". The endpoint allows to read, write a few -// limited ICMP messages such as echo request and echo reply. -// Currently only Darwin and Linux support this. -// -// Examples: -// ListenPacket("udp4", "192.168.0.1") -// ListenPacket("udp4", "0.0.0.0") -// ListenPacket("udp6", "fe80::1%en0") -// ListenPacket("udp6", "::") -// -// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" -// followed by a colon and an ICMP protocol number or name. -// -// Examples: -// ListenPacket("ip4:icmp", "192.168.0.1") -// ListenPacket("ip4:1", "0.0.0.0") -// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") -// ListenPacket("ip6:58", "::") -func ListenPacket(network, address string) (*PacketConn, error) { - var family, proto int - switch network { - case "udp4": - family, proto = syscall.AF_INET, iana.ProtocolICMP - case "udp6": - family, proto = syscall.AF_INET6, iana.ProtocolIPv6ICMP - default: - i := last(network, ':') - switch network[:i] { - case "ip4": - proto = iana.ProtocolICMP - case "ip6": - proto = iana.ProtocolIPv6ICMP - } - } - var cerr error - var c net.PacketConn - switch family { - case syscall.AF_INET, syscall.AF_INET6: - s, err := syscall.Socket(family, syscall.SOCK_DGRAM, proto) - if err != nil { - return nil, os.NewSyscallError("socket", err) - } - defer syscall.Close(s) - if runtime.GOOS == "darwin" && family == syscall.AF_INET { - if err := syscall.SetsockoptInt(s, iana.ProtocolIP, sysIP_STRIPHDR, 1); err != nil { - return nil, os.NewSyscallError("setsockopt", err) - } - } - sa, err := sockaddr(family, address) - if err != nil { - return nil, err - } - if err := syscall.Bind(s, sa); err != nil { - return nil, os.NewSyscallError("bind", err) - } - f := os.NewFile(uintptr(s), "datagram-oriented icmp") - defer f.Close() - c, cerr = net.FilePacketConn(f) - default: - c, cerr = net.ListenPacket(network, address) - } - if cerr != nil { - return nil, cerr - } - switch proto { - case iana.ProtocolICMP: - return &PacketConn{c: c, p4: ipv4.NewPacketConn(c)}, nil - case iana.ProtocolIPv6ICMP: - return &PacketConn{c: c, p6: ipv6.NewPacketConn(c)}, nil - default: - return &PacketConn{c: c}, nil - } -} diff --git a/vendor/golang.org/x/net/icmp/listen_stub.go b/vendor/golang.org/x/net/icmp/listen_stub.go deleted file mode 100644 index 668728d1..00000000 --- a/vendor/golang.org/x/net/icmp/listen_stub.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 - -package icmp - -// ListenPacket listens for incoming ICMP packets addressed to -// address. See net.Dial for the syntax of address. -// -// For non-privileged datagram-oriented ICMP endpoints, network must -// be "udp4" or "udp6". The endpoint allows to read, write a few -// limited ICMP messages such as echo request and echo reply. -// Currently only Darwin and Linux support this. -// -// Examples: -// ListenPacket("udp4", "192.168.0.1") -// ListenPacket("udp4", "0.0.0.0") -// ListenPacket("udp6", "fe80::1%en0") -// ListenPacket("udp6", "::") -// -// For privileged raw ICMP endpoints, network must be "ip4" or "ip6" -// followed by a colon and an ICMP protocol number or name. -// -// Examples: -// ListenPacket("ip4:icmp", "192.168.0.1") -// ListenPacket("ip4:1", "0.0.0.0") -// ListenPacket("ip6:ipv6-icmp", "fe80::1%en0") -// ListenPacket("ip6:58", "::") -func ListenPacket(network, address string) (*PacketConn, error) { - return nil, errOpNoSupport -} diff --git a/vendor/golang.org/x/net/icmp/message.go b/vendor/golang.org/x/net/icmp/message.go deleted file mode 100644 index 3f9ccb1a..00000000 --- a/vendor/golang.org/x/net/icmp/message.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package icmp provides basic functions for the manipulation of -// messages used in the Internet Control Message Protocols, -// ICMPv4 and ICMPv6. -// -// ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443. -// Multi-part message support for ICMP is defined in RFC 4884. -// ICMP extensions for MPLS are defined in RFC 4950. -// ICMP extensions for interface and next-hop identification are -// defined in RFC 5837. -package icmp // import "golang.org/x/net/icmp" - -import ( - "errors" - "net" - "syscall" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/ipv4" - "golang.org/x/net/ipv6" -) - -var ( - errMessageTooShort = errors.New("message too short") - errHeaderTooShort = errors.New("header too short") - errBufferTooShort = errors.New("buffer too short") - errOpNoSupport = errors.New("operation not supported") - errNoExtension = errors.New("no extension") - errInvalidExtension = errors.New("invalid extension") -) - -func checksum(b []byte) uint16 { - csumcv := len(b) - 1 // checksum coverage - s := uint32(0) - for i := 0; i < csumcv; i += 2 { - s += uint32(b[i+1])<<8 | uint32(b[i]) - } - if csumcv&1 == 0 { - s += uint32(b[csumcv]) - } - s = s>>16 + s&0xffff - s = s + s>>16 - return ^uint16(s) -} - -// A Type represents an ICMP message type. -type Type interface { - Protocol() int -} - -// A Message represents an ICMP message. -type Message struct { - Type Type // type, either ipv4.ICMPType or ipv6.ICMPType - Code int // code - Checksum int // checksum - Body MessageBody // body -} - -// Marshal returns the binary enconding of the ICMP message m. -// -// For an ICMPv4 message, the returned message always contains the -// calculated checksum field. -// -// For an ICMPv6 message, the returned message contains the calculated -// checksum field when psh is not nil, otherwise the kernel will -// compute the checksum field during the message transmission. -// When psh is not nil, it must be the pseudo header for IPv6. -func (m *Message) Marshal(psh []byte) ([]byte, error) { - var mtype int - switch typ := m.Type.(type) { - case ipv4.ICMPType: - mtype = int(typ) - case ipv6.ICMPType: - mtype = int(typ) - default: - return nil, syscall.EINVAL - } - b := []byte{byte(mtype), byte(m.Code), 0, 0} - if m.Type.Protocol() == iana.ProtocolIPv6ICMP && psh != nil { - b = append(psh, b...) - } - if m.Body != nil && m.Body.Len(m.Type.Protocol()) != 0 { - mb, err := m.Body.Marshal(m.Type.Protocol()) - if err != nil { - return nil, err - } - b = append(b, mb...) - } - if m.Type.Protocol() == iana.ProtocolIPv6ICMP { - if psh == nil { // cannot calculate checksum here - return b, nil - } - off, l := 2*net.IPv6len, len(b)-len(psh) - b[off], b[off+1], b[off+2], b[off+3] = byte(l>>24), byte(l>>16), byte(l>>8), byte(l) - } - s := checksum(b) - // Place checksum back in header; using ^= avoids the - // assumption the checksum bytes are zero. - b[len(psh)+2] ^= byte(s) - b[len(psh)+3] ^= byte(s >> 8) - return b[len(psh):], nil -} - -var parseFns = map[Type]func(int, []byte) (MessageBody, error){ - ipv4.ICMPTypeDestinationUnreachable: parseDstUnreach, - ipv4.ICMPTypeTimeExceeded: parseTimeExceeded, - ipv4.ICMPTypeParameterProblem: parseParamProb, - - ipv4.ICMPTypeEcho: parseEcho, - ipv4.ICMPTypeEchoReply: parseEcho, - - ipv6.ICMPTypeDestinationUnreachable: parseDstUnreach, - ipv6.ICMPTypePacketTooBig: parsePacketTooBig, - ipv6.ICMPTypeTimeExceeded: parseTimeExceeded, - ipv6.ICMPTypeParameterProblem: parseParamProb, - - ipv6.ICMPTypeEchoRequest: parseEcho, - ipv6.ICMPTypeEchoReply: parseEcho, -} - -// ParseMessage parses b as an ICMP message. -// Proto must be either the ICMPv4 or ICMPv6 protocol number. -func ParseMessage(proto int, b []byte) (*Message, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - var err error - m := &Message{Code: int(b[1]), Checksum: int(b[2])<<8 | int(b[3])} - switch proto { - case iana.ProtocolICMP: - m.Type = ipv4.ICMPType(b[0]) - case iana.ProtocolIPv6ICMP: - m.Type = ipv6.ICMPType(b[0]) - default: - return nil, syscall.EINVAL - } - if fn, ok := parseFns[m.Type]; !ok { - m.Body, err = parseDefaultMessageBody(proto, b[4:]) - } else { - m.Body, err = fn(proto, b[4:]) - } - if err != nil { - return nil, err - } - return m, nil -} diff --git a/vendor/golang.org/x/net/icmp/message_test.go b/vendor/golang.org/x/net/icmp/message_test.go deleted file mode 100644 index 5d2605f8..00000000 --- a/vendor/golang.org/x/net/icmp/message_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp_test - -import ( - "net" - "reflect" - "testing" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/ipv4" - "golang.org/x/net/ipv6" -) - -var marshalAndParseMessageForIPv4Tests = []icmp.Message{ - { - Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, - Body: &icmp.DstUnreach{ - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv4.ICMPTypeTimeExceeded, Code: 1, - Body: &icmp.TimeExceeded{ - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv4.ICMPTypeParameterProblem, Code: 2, - Body: &icmp.ParamProb{ - Pointer: 8, - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv4.ICMPTypeEcho, Code: 0, - Body: &icmp.Echo{ - ID: 1, Seq: 2, - Data: []byte("HELLO-R-U-THERE"), - }, - }, - { - Type: ipv4.ICMPTypePhoturis, - Body: &icmp.DefaultMessageBody{ - Data: []byte{0x80, 0x40, 0x20, 0x10}, - }, - }, -} - -func TestMarshalAndParseMessageForIPv4(t *testing.T) { - for i, tt := range marshalAndParseMessageForIPv4Tests { - b, err := tt.Marshal(nil) - if err != nil { - t.Fatal(err) - } - m, err := icmp.ParseMessage(iana.ProtocolICMP, b) - if err != nil { - t.Fatal(err) - } - if m.Type != tt.Type || m.Code != tt.Code { - t.Errorf("#%v: got %v; want %v", i, m, &tt) - } - if !reflect.DeepEqual(m.Body, tt.Body) { - t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) - } - } -} - -var marshalAndParseMessageForIPv6Tests = []icmp.Message{ - { - Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, - Body: &icmp.DstUnreach{ - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv6.ICMPTypePacketTooBig, Code: 0, - Body: &icmp.PacketTooBig{ - MTU: 1<<16 - 1, - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv6.ICMPTypeTimeExceeded, Code: 1, - Body: &icmp.TimeExceeded{ - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv6.ICMPTypeParameterProblem, Code: 2, - Body: &icmp.ParamProb{ - Pointer: 8, - Data: []byte("ERROR-INVOKING-PACKET"), - }, - }, - { - Type: ipv6.ICMPTypeEchoRequest, Code: 0, - Body: &icmp.Echo{ - ID: 1, Seq: 2, - Data: []byte("HELLO-R-U-THERE"), - }, - }, - { - Type: ipv6.ICMPTypeDuplicateAddressConfirmation, - Body: &icmp.DefaultMessageBody{ - Data: []byte{0x80, 0x40, 0x20, 0x10}, - }, - }, -} - -func TestMarshalAndParseMessageForIPv6(t *testing.T) { - pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) - for i, tt := range marshalAndParseMessageForIPv6Tests { - for _, psh := range [][]byte{pshicmp, nil} { - b, err := tt.Marshal(psh) - if err != nil { - t.Fatal(err) - } - m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) - if err != nil { - t.Fatal(err) - } - if m.Type != tt.Type || m.Code != tt.Code { - t.Errorf("#%v: got %v; want %v", i, m, &tt) - } - if !reflect.DeepEqual(m.Body, tt.Body) { - t.Errorf("#%v: got %v; want %v", i, m.Body, tt.Body) - } - } - } -} diff --git a/vendor/golang.org/x/net/icmp/messagebody.go b/vendor/golang.org/x/net/icmp/messagebody.go deleted file mode 100644 index d3144805..00000000 --- a/vendor/golang.org/x/net/icmp/messagebody.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// A MessageBody represents an ICMP message body. -type MessageBody interface { - // Len returns the length of ICMP message body. - // Proto must be either the ICMPv4 or ICMPv6 protocol number. - Len(proto int) int - - // Marshal returns the binary enconding of ICMP message body. - // Proto must be either the ICMPv4 or ICMPv6 protocol number. - Marshal(proto int) ([]byte, error) -} - -// A DefaultMessageBody represents the default message body. -type DefaultMessageBody struct { - Data []byte // data -} - -// Len implements the Len method of MessageBody interface. -func (p *DefaultMessageBody) Len(proto int) int { - if p == nil { - return 0 - } - return len(p.Data) -} - -// Marshal implements the Marshal method of MessageBody interface. -func (p *DefaultMessageBody) Marshal(proto int) ([]byte, error) { - return p.Data, nil -} - -// parseDefaultMessageBody parses b as an ICMP message body. -func parseDefaultMessageBody(proto int, b []byte) (MessageBody, error) { - p := &DefaultMessageBody{Data: make([]byte, len(b))} - copy(p.Data, b) - return p, nil -} diff --git a/vendor/golang.org/x/net/icmp/mpls.go b/vendor/golang.org/x/net/icmp/mpls.go deleted file mode 100644 index 31bcfe8d..00000000 --- a/vendor/golang.org/x/net/icmp/mpls.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// A MPLSLabel represents a MPLS label stack entry. -type MPLSLabel struct { - Label int // label value - TC int // traffic class; formerly experimental use - S bool // bottom of stack - TTL int // time to live -} - -const ( - classMPLSLabelStack = 1 - typeIncomingMPLSLabelStack = 1 -) - -// A MPLSLabelStack represents a MPLS label stack. -type MPLSLabelStack struct { - Class int // extension object class number - Type int // extension object sub-type - Labels []MPLSLabel -} - -// Len implements the Len method of Extension interface. -func (ls *MPLSLabelStack) Len(proto int) int { - return 4 + (4 * len(ls.Labels)) -} - -// Marshal implements the Marshal method of Extension interface. -func (ls *MPLSLabelStack) Marshal(proto int) ([]byte, error) { - b := make([]byte, ls.Len(proto)) - if err := ls.marshal(proto, b); err != nil { - return nil, err - } - return b, nil -} - -func (ls *MPLSLabelStack) marshal(proto int, b []byte) error { - l := ls.Len(proto) - b[0], b[1] = byte(l>>8), byte(l) - b[2], b[3] = classMPLSLabelStack, typeIncomingMPLSLabelStack - off := 4 - for _, ll := range ls.Labels { - b[off], b[off+1], b[off+2] = byte(ll.Label>>12), byte(ll.Label>>4&0xff), byte(ll.Label<<4&0xf0) - b[off+2] |= byte(ll.TC << 1 & 0x0e) - if ll.S { - b[off+2] |= 0x1 - } - b[off+3] = byte(ll.TTL) - off += 4 - } - return nil -} - -func parseMPLSLabelStack(b []byte) (Extension, error) { - ls := &MPLSLabelStack{ - Class: int(b[2]), - Type: int(b[3]), - } - for b = b[4:]; len(b) >= 4; b = b[4:] { - ll := MPLSLabel{ - Label: int(b[0])<<12 | int(b[1])<<4 | int(b[2])>>4, - TC: int(b[2]&0x0e) >> 1, - TTL: int(b[3]), - } - if b[2]&0x1 != 0 { - ll.S = true - } - ls.Labels = append(ls.Labels, ll) - } - return ls, nil -} diff --git a/vendor/golang.org/x/net/icmp/multipart.go b/vendor/golang.org/x/net/icmp/multipart.go deleted file mode 100644 index 54ac8bc1..00000000 --- a/vendor/golang.org/x/net/icmp/multipart.go +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import "golang.org/x/net/internal/iana" - -// multipartMessageBodyDataLen takes b as an original datagram and -// exts as extensions, and returns a required length for message body -// and a required length for a padded original datagram in wire -// format. -func multipartMessageBodyDataLen(proto int, b []byte, exts []Extension) (bodyLen, dataLen int) { - for _, ext := range exts { - bodyLen += ext.Len(proto) - } - if bodyLen > 0 { - dataLen = multipartMessageOrigDatagramLen(proto, b) - bodyLen += 4 // length of extension header - } else { - dataLen = len(b) - } - bodyLen += dataLen - return bodyLen, dataLen -} - -// multipartMessageOrigDatagramLen takes b as an original datagram, -// and returns a required length for a padded orignal datagram in wire -// format. -func multipartMessageOrigDatagramLen(proto int, b []byte) int { - roundup := func(b []byte, align int) int { - // According to RFC 4884, the padded original datagram - // field must contain at least 128 octets. - if len(b) < 128 { - return 128 - } - r := len(b) - return (r + align) &^ (align - 1) - } - switch proto { - case iana.ProtocolICMP: - return roundup(b, 4) - case iana.ProtocolIPv6ICMP: - return roundup(b, 8) - default: - return len(b) - } -} - -// marshalMultipartMessageBody takes data as an original datagram and -// exts as extesnsions, and returns a binary encoding of message body. -// It can be used for non-multipart message bodies when exts is nil. -func marshalMultipartMessageBody(proto int, data []byte, exts []Extension) ([]byte, error) { - bodyLen, dataLen := multipartMessageBodyDataLen(proto, data, exts) - b := make([]byte, 4+bodyLen) - copy(b[4:], data) - off := dataLen + 4 - if len(exts) > 0 { - b[dataLen+4] = byte(extensionVersion << 4) - off += 4 // length of object header - for _, ext := range exts { - switch ext := ext.(type) { - case *MPLSLabelStack: - if err := ext.marshal(proto, b[off:]); err != nil { - return nil, err - } - off += ext.Len(proto) - case *InterfaceInfo: - attrs, l := ext.attrsAndLen(proto) - if err := ext.marshal(proto, b[off:], attrs, l); err != nil { - return nil, err - } - off += ext.Len(proto) - } - } - s := checksum(b[dataLen+4:]) - b[dataLen+4+2] ^= byte(s) - b[dataLen+4+3] ^= byte(s >> 8) - switch proto { - case iana.ProtocolICMP: - b[1] = byte(dataLen / 4) - case iana.ProtocolIPv6ICMP: - b[0] = byte(dataLen / 8) - } - } - return b, nil -} - -// parseMultipartMessageBody parses b as either a non-multipart -// message body or a multipart message body. -func parseMultipartMessageBody(proto int, b []byte) ([]byte, []Extension, error) { - var l int - switch proto { - case iana.ProtocolICMP: - l = 4 * int(b[1]) - case iana.ProtocolIPv6ICMP: - l = 8 * int(b[0]) - } - if len(b) == 4 { - return nil, nil, nil - } - exts, l, err := parseExtensions(b[4:], l) - if err != nil { - l = len(b) - 4 - } - data := make([]byte, l) - copy(data, b[4:]) - return data, exts, nil -} diff --git a/vendor/golang.org/x/net/icmp/multipart_test.go b/vendor/golang.org/x/net/icmp/multipart_test.go deleted file mode 100644 index 9248e475..00000000 --- a/vendor/golang.org/x/net/icmp/multipart_test.go +++ /dev/null @@ -1,315 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp_test - -import ( - "fmt" - "net" - "reflect" - "testing" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/ipv4" - "golang.org/x/net/ipv6" -) - -var marshalAndParseMultipartMessageForIPv4Tests = []icmp.Message{ - { - Type: ipv4.ICMPTypeDestinationUnreachable, Code: 15, - Body: &icmp.DstUnreach{ - Data: []byte("ERROR-INVOKING-PACKET"), - Extensions: []icmp.Extension{ - &icmp.MPLSLabelStack{ - Class: 1, - Type: 1, - Labels: []icmp.MPLSLabel{ - { - Label: 16014, - TC: 0x4, - S: true, - TTL: 255, - }, - }, - }, - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x0f, - Interface: &net.Interface{ - Index: 15, - Name: "en101", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.IPv4(192, 168, 0, 1).To4(), - }, - }, - }, - }, - }, - { - Type: ipv4.ICMPTypeTimeExceeded, Code: 1, - Body: &icmp.TimeExceeded{ - Data: []byte("ERROR-INVOKING-PACKET"), - Extensions: []icmp.Extension{ - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x0f, - Interface: &net.Interface{ - Index: 15, - Name: "en101", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.IPv4(192, 168, 0, 1).To4(), - }, - }, - &icmp.MPLSLabelStack{ - Class: 1, - Type: 1, - Labels: []icmp.MPLSLabel{ - { - Label: 16014, - TC: 0x4, - S: true, - TTL: 255, - }, - }, - }, - }, - }, - }, - { - Type: ipv4.ICMPTypeParameterProblem, Code: 2, - Body: &icmp.ParamProb{ - Pointer: 8, - Data: []byte("ERROR-INVOKING-PACKET"), - Extensions: []icmp.Extension{ - &icmp.MPLSLabelStack{ - Class: 1, - Type: 1, - Labels: []icmp.MPLSLabel{ - { - Label: 16014, - TC: 0x4, - S: true, - TTL: 255, - }, - }, - }, - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x0f, - Interface: &net.Interface{ - Index: 15, - Name: "en101", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.IPv4(192, 168, 0, 1).To4(), - }, - }, - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x2f, - Interface: &net.Interface{ - Index: 16, - Name: "en102", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.IPv4(192, 168, 0, 2).To4(), - }, - }, - }, - }, - }, -} - -func TestMarshalAndParseMultipartMessageForIPv4(t *testing.T) { - for i, tt := range marshalAndParseMultipartMessageForIPv4Tests { - b, err := tt.Marshal(nil) - if err != nil { - t.Fatal(err) - } - if b[5] != 32 { - t.Errorf("#%v: got %v; want 32", i, b[5]) - } - m, err := icmp.ParseMessage(iana.ProtocolICMP, b) - if err != nil { - t.Fatal(err) - } - if m.Type != tt.Type || m.Code != tt.Code { - t.Errorf("#%v: got %v; want %v", i, m, &tt) - } - switch m.Type { - case ipv4.ICMPTypeDestinationUnreachable: - got, want := m.Body.(*icmp.DstUnreach), tt.Body.(*icmp.DstUnreach) - if !reflect.DeepEqual(got.Extensions, want.Extensions) { - t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) - } - if len(got.Data) != 128 { - t.Errorf("#%v: got %v; want 128", i, len(got.Data)) - } - case ipv4.ICMPTypeTimeExceeded: - got, want := m.Body.(*icmp.TimeExceeded), tt.Body.(*icmp.TimeExceeded) - if !reflect.DeepEqual(got.Extensions, want.Extensions) { - t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) - } - if len(got.Data) != 128 { - t.Errorf("#%v: got %v; want 128", i, len(got.Data)) - } - case ipv4.ICMPTypeParameterProblem: - got, want := m.Body.(*icmp.ParamProb), tt.Body.(*icmp.ParamProb) - if !reflect.DeepEqual(got.Extensions, want.Extensions) { - t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) - } - if len(got.Data) != 128 { - t.Errorf("#%v: got %v; want 128", i, len(got.Data)) - } - } - } -} - -var marshalAndParseMultipartMessageForIPv6Tests = []icmp.Message{ - { - Type: ipv6.ICMPTypeDestinationUnreachable, Code: 6, - Body: &icmp.DstUnreach{ - Data: []byte("ERROR-INVOKING-PACKET"), - Extensions: []icmp.Extension{ - &icmp.MPLSLabelStack{ - Class: 1, - Type: 1, - Labels: []icmp.MPLSLabel{ - { - Label: 16014, - TC: 0x4, - S: true, - TTL: 255, - }, - }, - }, - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x0f, - Interface: &net.Interface{ - Index: 15, - Name: "en101", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.ParseIP("fe80::1"), - Zone: "en101", - }, - }, - }, - }, - }, - { - Type: ipv6.ICMPTypeTimeExceeded, Code: 1, - Body: &icmp.TimeExceeded{ - Data: []byte("ERROR-INVOKING-PACKET"), - Extensions: []icmp.Extension{ - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x0f, - Interface: &net.Interface{ - Index: 15, - Name: "en101", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.ParseIP("fe80::1"), - Zone: "en101", - }, - }, - &icmp.MPLSLabelStack{ - Class: 1, - Type: 1, - Labels: []icmp.MPLSLabel{ - { - Label: 16014, - TC: 0x4, - S: true, - TTL: 255, - }, - }, - }, - &icmp.InterfaceInfo{ - Class: 2, - Type: 0x2f, - Interface: &net.Interface{ - Index: 16, - Name: "en102", - MTU: 8192, - }, - Addr: &net.IPAddr{ - IP: net.ParseIP("fe80::1"), - Zone: "en102", - }, - }, - }, - }, - }, -} - -func TestMarshalAndParseMultipartMessageForIPv6(t *testing.T) { - pshicmp := icmp.IPv6PseudoHeader(net.ParseIP("fe80::1"), net.ParseIP("ff02::1")) - for i, tt := range marshalAndParseMultipartMessageForIPv6Tests { - for _, psh := range [][]byte{pshicmp, nil} { - b, err := tt.Marshal(psh) - if err != nil { - t.Fatal(err) - } - if b[4] != 16 { - t.Errorf("#%v: got %v; want 16", i, b[4]) - } - m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, b) - if err != nil { - t.Fatal(err) - } - if m.Type != tt.Type || m.Code != tt.Code { - t.Errorf("#%v: got %v; want %v", i, m, &tt) - } - switch m.Type { - case ipv6.ICMPTypeDestinationUnreachable: - got, want := m.Body.(*icmp.DstUnreach), tt.Body.(*icmp.DstUnreach) - if !reflect.DeepEqual(got.Extensions, want.Extensions) { - t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) - } - if len(got.Data) != 128 { - t.Errorf("#%v: got %v; want 128", i, len(got.Data)) - } - case ipv6.ICMPTypeTimeExceeded: - got, want := m.Body.(*icmp.TimeExceeded), tt.Body.(*icmp.TimeExceeded) - if !reflect.DeepEqual(got.Extensions, want.Extensions) { - t.Error(dumpExtensions(i, got.Extensions, want.Extensions)) - } - if len(got.Data) != 128 { - t.Errorf("#%v: got %v; want 128", i, len(got.Data)) - } - } - } - } -} - -func dumpExtensions(i int, gotExts, wantExts []icmp.Extension) string { - var s string - for j, got := range gotExts { - switch got := got.(type) { - case *icmp.MPLSLabelStack: - want := wantExts[j].(*icmp.MPLSLabelStack) - if !reflect.DeepEqual(got, want) { - s += fmt.Sprintf("#%v/%v: got %#v; want %#v\n", i, j, got, want) - } - case *icmp.InterfaceInfo: - want := wantExts[j].(*icmp.InterfaceInfo) - if !reflect.DeepEqual(got, want) { - s += fmt.Sprintf("#%v/%v: got %#v, %#v, %#v; want %#v, %#v, %#v\n", i, j, got, got.Interface, got.Addr, want, want.Interface, want.Addr) - } - } - } - return s[:len(s)-1] -} diff --git a/vendor/golang.org/x/net/icmp/packettoobig.go b/vendor/golang.org/x/net/icmp/packettoobig.go deleted file mode 100644 index 91d289b2..00000000 --- a/vendor/golang.org/x/net/icmp/packettoobig.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// A PacketTooBig represents an ICMP packet too big message body. -type PacketTooBig struct { - MTU int // maximum transmission unit of the nexthop link - Data []byte // data, known as original datagram field -} - -// Len implements the Len method of MessageBody interface. -func (p *PacketTooBig) Len(proto int) int { - if p == nil { - return 0 - } - return 4 + len(p.Data) -} - -// Marshal implements the Marshal method of MessageBody interface. -func (p *PacketTooBig) Marshal(proto int) ([]byte, error) { - b := make([]byte, 4+len(p.Data)) - b[0], b[1], b[2], b[3] = byte(p.MTU>>24), byte(p.MTU>>16), byte(p.MTU>>8), byte(p.MTU) - copy(b[4:], p.Data) - return b, nil -} - -// parsePacketTooBig parses b as an ICMP packet too big message body. -func parsePacketTooBig(proto int, b []byte) (MessageBody, error) { - bodyLen := len(b) - if bodyLen < 4 { - return nil, errMessageTooShort - } - p := &PacketTooBig{MTU: int(b[0])<<24 | int(b[1])<<16 | int(b[2])<<8 | int(b[3])} - if bodyLen > 4 { - p.Data = make([]byte, bodyLen-4) - copy(p.Data, b[4:]) - } - return p, nil -} diff --git a/vendor/golang.org/x/net/icmp/paramprob.go b/vendor/golang.org/x/net/icmp/paramprob.go deleted file mode 100644 index f200a7c2..00000000 --- a/vendor/golang.org/x/net/icmp/paramprob.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import "golang.org/x/net/internal/iana" - -// A ParamProb represents an ICMP parameter problem message body. -type ParamProb struct { - Pointer uintptr // offset within the data where the error was detected - Data []byte // data, known as original datagram field - Extensions []Extension // extensions -} - -// Len implements the Len method of MessageBody interface. -func (p *ParamProb) Len(proto int) int { - if p == nil { - return 0 - } - l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) - return l -} - -// Marshal implements the Marshal method of MessageBody interface. -func (p *ParamProb) Marshal(proto int) ([]byte, error) { - if proto == iana.ProtocolIPv6ICMP { - b := make([]byte, 4+p.Len(proto)) - b[0], b[1], b[2], b[3] = byte(p.Pointer>>24), byte(p.Pointer>>16), byte(p.Pointer>>8), byte(p.Pointer) - copy(b[4:], p.Data) - return b, nil - } - b, err := marshalMultipartMessageBody(proto, p.Data, p.Extensions) - if err != nil { - return nil, err - } - b[0] = byte(p.Pointer) - return b, nil -} - -// parseParamProb parses b as an ICMP parameter problem message body. -func parseParamProb(proto int, b []byte) (MessageBody, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - p := &ParamProb{} - if proto == iana.ProtocolIPv6ICMP { - p.Pointer = uintptr(b[0])<<24 | uintptr(b[1])<<16 | uintptr(b[2])<<8 | uintptr(b[3]) - p.Data = make([]byte, len(b)-4) - copy(p.Data, b[4:]) - return p, nil - } - p.Pointer = uintptr(b[0]) - var err error - p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) - if err != nil { - return nil, err - } - return p, nil -} diff --git a/vendor/golang.org/x/net/icmp/ping_test.go b/vendor/golang.org/x/net/icmp/ping_test.go deleted file mode 100644 index 4ec26928..00000000 --- a/vendor/golang.org/x/net/icmp/ping_test.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp_test - -import ( - "errors" - "fmt" - "net" - "os" - "runtime" - "testing" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" - "golang.org/x/net/ipv6" -) - -func googleAddr(c *icmp.PacketConn, protocol int) (net.Addr, error) { - const host = "www.google.com" - ips, err := net.LookupIP(host) - if err != nil { - return nil, err - } - netaddr := func(ip net.IP) (net.Addr, error) { - switch c.LocalAddr().(type) { - case *net.UDPAddr: - return &net.UDPAddr{IP: ip}, nil - case *net.IPAddr: - return &net.IPAddr{IP: ip}, nil - default: - return nil, errors.New("neither UDPAddr nor IPAddr") - } - } - for _, ip := range ips { - switch protocol { - case iana.ProtocolICMP: - if ip.To4() != nil { - return netaddr(ip) - } - case iana.ProtocolIPv6ICMP: - if ip.To16() != nil && ip.To4() == nil { - return netaddr(ip) - } - } - } - return nil, errors.New("no A or AAAA record") -} - -type pingTest struct { - network, address string - protocol int - mtype icmp.Type -} - -var nonPrivilegedPingTests = []pingTest{ - {"udp4", "0.0.0.0", iana.ProtocolICMP, ipv4.ICMPTypeEcho}, - - {"udp6", "::", iana.ProtocolIPv6ICMP, ipv6.ICMPTypeEchoRequest}, -} - -func TestNonPrivilegedPing(t *testing.T) { - if testing.Short() { - t.Skip("avoid external network") - } - switch runtime.GOOS { - case "darwin": - case "linux": - t.Log("you may need to adjust the net.ipv4.ping_group_range kernel state") - default: - t.Skipf("not supported on %s", runtime.GOOS) - } - - for i, tt := range nonPrivilegedPingTests { - if err := doPing(tt, i); err != nil { - t.Error(err) - } - } -} - -var privilegedPingTests = []pingTest{ - {"ip4:icmp", "0.0.0.0", iana.ProtocolICMP, ipv4.ICMPTypeEcho}, - - {"ip6:ipv6-icmp", "::", iana.ProtocolIPv6ICMP, ipv6.ICMPTypeEchoRequest}, -} - -func TestPrivilegedPing(t *testing.T) { - if testing.Short() { - t.Skip("avoid external network") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - for i, tt := range privilegedPingTests { - if err := doPing(tt, i); err != nil { - t.Error(err) - } - } -} - -func doPing(tt pingTest, seq int) error { - c, err := icmp.ListenPacket(tt.network, tt.address) - if err != nil { - return err - } - defer c.Close() - - dst, err := googleAddr(c, tt.protocol) - if err != nil { - return err - } - - if tt.network != "udp6" && tt.protocol == iana.ProtocolIPv6ICMP { - var f ipv6.ICMPFilter - f.SetAll(true) - f.Accept(ipv6.ICMPTypeDestinationUnreachable) - f.Accept(ipv6.ICMPTypePacketTooBig) - f.Accept(ipv6.ICMPTypeTimeExceeded) - f.Accept(ipv6.ICMPTypeParameterProblem) - f.Accept(ipv6.ICMPTypeEchoReply) - if err := c.IPv6PacketConn().SetICMPFilter(&f); err != nil { - return err - } - } - - wm := icmp.Message{ - Type: tt.mtype, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: 1 << uint(seq), - Data: []byte("HELLO-R-U-THERE"), - }, - } - wb, err := wm.Marshal(nil) - if err != nil { - return err - } - if n, err := c.WriteTo(wb, dst); err != nil { - return err - } else if n != len(wb) { - return fmt.Errorf("got %v; want %v", n, len(wb)) - } - - rb := make([]byte, 1500) - if err := c.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { - return err - } - n, peer, err := c.ReadFrom(rb) - if err != nil { - return err - } - rm, err := icmp.ParseMessage(tt.protocol, rb[:n]) - if err != nil { - return err - } - switch rm.Type { - case ipv4.ICMPTypeEchoReply, ipv6.ICMPTypeEchoReply: - return nil - default: - return fmt.Errorf("got %+v from %v; want echo reply", rm, peer) - } -} diff --git a/vendor/golang.org/x/net/icmp/sys_freebsd.go b/vendor/golang.org/x/net/icmp/sys_freebsd.go deleted file mode 100644 index c75f3dda..00000000 --- a/vendor/golang.org/x/net/icmp/sys_freebsd.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -import "syscall" - -func init() { - freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") -} diff --git a/vendor/golang.org/x/net/icmp/timeexceeded.go b/vendor/golang.org/x/net/icmp/timeexceeded.go deleted file mode 100644 index 18628c8b..00000000 --- a/vendor/golang.org/x/net/icmp/timeexceeded.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package icmp - -// A TimeExceeded represents an ICMP time exceeded message body. -type TimeExceeded struct { - Data []byte // data, known as original datagram field - Extensions []Extension // extensions -} - -// Len implements the Len method of MessageBody interface. -func (p *TimeExceeded) Len(proto int) int { - if p == nil { - return 0 - } - l, _ := multipartMessageBodyDataLen(proto, p.Data, p.Extensions) - return l -} - -// Marshal implements the Marshal method of MessageBody interface. -func (p *TimeExceeded) Marshal(proto int) ([]byte, error) { - return marshalMultipartMessageBody(proto, p.Data, p.Extensions) -} - -// parseTimeExceeded parses b as an ICMP time exceeded message body. -func parseTimeExceeded(proto int, b []byte) (MessageBody, error) { - if len(b) < 4 { - return nil, errMessageTooShort - } - p := &TimeExceeded{} - var err error - p.Data, p.Extensions, err = parseMultipartMessageBody(proto, b) - if err != nil { - return nil, err - } - return p, nil -} diff --git a/vendor/golang.org/x/net/idna/idna.go b/vendor/golang.org/x/net/idna/idna.go deleted file mode 100644 index 3daa8979..00000000 --- a/vendor/golang.org/x/net/idna/idna.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package idna implements IDNA2008 (Internationalized Domain Names for -// Applications), defined in RFC 5890, RFC 5891, RFC 5892, RFC 5893 and -// RFC 5894. -package idna // import "golang.org/x/net/idna" - -import ( - "strings" - "unicode/utf8" -) - -// TODO(nigeltao): specify when errors occur. For example, is ToASCII(".") or -// ToASCII("foo\x00") an error? See also http://www.unicode.org/faq/idn.html#11 - -// acePrefix is the ASCII Compatible Encoding prefix. -const acePrefix = "xn--" - -// ToASCII converts a domain or domain label to its ASCII form. For example, -// ToASCII("bücher.example.com") is "xn--bcher-kva.example.com", and -// ToASCII("golang") is "golang". -func ToASCII(s string) (string, error) { - if ascii(s) { - return s, nil - } - labels := strings.Split(s, ".") - for i, label := range labels { - if !ascii(label) { - a, err := encode(acePrefix, label) - if err != nil { - return "", err - } - labels[i] = a - } - } - return strings.Join(labels, "."), nil -} - -// ToUnicode converts a domain or domain label to its Unicode form. For example, -// ToUnicode("xn--bcher-kva.example.com") is "bücher.example.com", and -// ToUnicode("golang") is "golang". -func ToUnicode(s string) (string, error) { - if !strings.Contains(s, acePrefix) { - return s, nil - } - labels := strings.Split(s, ".") - for i, label := range labels { - if strings.HasPrefix(label, acePrefix) { - u, err := decode(label[len(acePrefix):]) - if err != nil { - return "", err - } - labels[i] = u - } - } - return strings.Join(labels, "."), nil -} - -func ascii(s string) bool { - for i := 0; i < len(s); i++ { - if s[i] >= utf8.RuneSelf { - return false - } - } - return true -} diff --git a/vendor/golang.org/x/net/idna/idna_test.go b/vendor/golang.org/x/net/idna/idna_test.go deleted file mode 100644 index b1bc6fa2..00000000 --- a/vendor/golang.org/x/net/idna/idna_test.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -import ( - "testing" -) - -var idnaTestCases = [...]struct { - ascii, unicode string -}{ - // Labels. - {"books", "books"}, - {"xn--bcher-kva", "bücher"}, - - // Domains. - {"foo--xn--bar.org", "foo--xn--bar.org"}, - {"golang.org", "golang.org"}, - {"example.xn--p1ai", "example.рф"}, - {"xn--czrw28b.tw", "商業.tw"}, - {"www.xn--mller-kva.de", "www.müller.de"}, -} - -func TestIDNA(t *testing.T) { - for _, tc := range idnaTestCases { - if a, err := ToASCII(tc.unicode); err != nil { - t.Errorf("ToASCII(%q): %v", tc.unicode, err) - } else if a != tc.ascii { - t.Errorf("ToASCII(%q): got %q, want %q", tc.unicode, a, tc.ascii) - } - - if u, err := ToUnicode(tc.ascii); err != nil { - t.Errorf("ToUnicode(%q): %v", tc.ascii, err) - } else if u != tc.unicode { - t.Errorf("ToUnicode(%q): got %q, want %q", tc.ascii, u, tc.unicode) - } - } -} - -// TODO(nigeltao): test errors, once we've specified when ToASCII and ToUnicode -// return errors. diff --git a/vendor/golang.org/x/net/idna/punycode.go b/vendor/golang.org/x/net/idna/punycode.go deleted file mode 100644 index 92e733f6..00000000 --- a/vendor/golang.org/x/net/idna/punycode.go +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -// This file implements the Punycode algorithm from RFC 3492. - -import ( - "fmt" - "math" - "strings" - "unicode/utf8" -) - -// These parameter values are specified in section 5. -// -// All computation is done with int32s, so that overflow behavior is identical -// regardless of whether int is 32-bit or 64-bit. -const ( - base int32 = 36 - damp int32 = 700 - initialBias int32 = 72 - initialN int32 = 128 - skew int32 = 38 - tmax int32 = 26 - tmin int32 = 1 -) - -// decode decodes a string as specified in section 6.2. -func decode(encoded string) (string, error) { - if encoded == "" { - return "", nil - } - pos := 1 + strings.LastIndex(encoded, "-") - if pos == 1 { - return "", fmt.Errorf("idna: invalid label %q", encoded) - } - if pos == len(encoded) { - return encoded[:len(encoded)-1], nil - } - output := make([]rune, 0, len(encoded)) - if pos != 0 { - for _, r := range encoded[:pos-1] { - output = append(output, r) - } - } - i, n, bias := int32(0), initialN, initialBias - for pos < len(encoded) { - oldI, w := i, int32(1) - for k := base; ; k += base { - if pos == len(encoded) { - return "", fmt.Errorf("idna: invalid label %q", encoded) - } - digit, ok := decodeDigit(encoded[pos]) - if !ok { - return "", fmt.Errorf("idna: invalid label %q", encoded) - } - pos++ - i += digit * w - if i < 0 { - return "", fmt.Errorf("idna: invalid label %q", encoded) - } - t := k - bias - if t < tmin { - t = tmin - } else if t > tmax { - t = tmax - } - if digit < t { - break - } - w *= base - t - if w >= math.MaxInt32/base { - return "", fmt.Errorf("idna: invalid label %q", encoded) - } - } - x := int32(len(output) + 1) - bias = adapt(i-oldI, x, oldI == 0) - n += i / x - i %= x - if n > utf8.MaxRune || len(output) >= 1024 { - return "", fmt.Errorf("idna: invalid label %q", encoded) - } - output = append(output, 0) - copy(output[i+1:], output[i:]) - output[i] = n - i++ - } - return string(output), nil -} - -// encode encodes a string as specified in section 6.3 and prepends prefix to -// the result. -// -// The "while h < length(input)" line in the specification becomes "for -// remaining != 0" in the Go code, because len(s) in Go is in bytes, not runes. -func encode(prefix, s string) (string, error) { - output := make([]byte, len(prefix), len(prefix)+1+2*len(s)) - copy(output, prefix) - delta, n, bias := int32(0), initialN, initialBias - b, remaining := int32(0), int32(0) - for _, r := range s { - if r < 0x80 { - b++ - output = append(output, byte(r)) - } else { - remaining++ - } - } - h := b - if b > 0 { - output = append(output, '-') - } - for remaining != 0 { - m := int32(0x7fffffff) - for _, r := range s { - if m > r && r >= n { - m = r - } - } - delta += (m - n) * (h + 1) - if delta < 0 { - return "", fmt.Errorf("idna: invalid label %q", s) - } - n = m - for _, r := range s { - if r < n { - delta++ - if delta < 0 { - return "", fmt.Errorf("idna: invalid label %q", s) - } - continue - } - if r > n { - continue - } - q := delta - for k := base; ; k += base { - t := k - bias - if t < tmin { - t = tmin - } else if t > tmax { - t = tmax - } - if q < t { - break - } - output = append(output, encodeDigit(t+(q-t)%(base-t))) - q = (q - t) / (base - t) - } - output = append(output, encodeDigit(q)) - bias = adapt(delta, h+1, h == b) - delta = 0 - h++ - remaining-- - } - delta++ - n++ - } - return string(output), nil -} - -func decodeDigit(x byte) (digit int32, ok bool) { - switch { - case '0' <= x && x <= '9': - return int32(x - ('0' - 26)), true - case 'A' <= x && x <= 'Z': - return int32(x - 'A'), true - case 'a' <= x && x <= 'z': - return int32(x - 'a'), true - } - return 0, false -} - -func encodeDigit(digit int32) byte { - switch { - case 0 <= digit && digit < 26: - return byte(digit + 'a') - case 26 <= digit && digit < 36: - return byte(digit + ('0' - 26)) - } - panic("idna: internal error in punycode encoding") -} - -// adapt is the bias adaptation function specified in section 6.1. -func adapt(delta, numPoints int32, firstTime bool) int32 { - if firstTime { - delta /= damp - } else { - delta /= 2 - } - delta += delta / numPoints - k := int32(0) - for delta > ((base-tmin)*tmax)/2 { - delta /= base - tmin - k += base - } - return k + (base-tmin+1)*delta/(delta+skew) -} diff --git a/vendor/golang.org/x/net/idna/punycode_test.go b/vendor/golang.org/x/net/idna/punycode_test.go deleted file mode 100644 index bfec81de..00000000 --- a/vendor/golang.org/x/net/idna/punycode_test.go +++ /dev/null @@ -1,198 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package idna - -import ( - "strings" - "testing" -) - -var punycodeTestCases = [...]struct { - s, encoded string -}{ - {"", ""}, - {"-", "--"}, - {"-a", "-a-"}, - {"-a-", "-a--"}, - {"a", "a-"}, - {"a-", "a--"}, - {"a-b", "a-b-"}, - {"books", "books-"}, - {"bücher", "bcher-kva"}, - {"Hello世界", "Hello-ck1hg65u"}, - {"ü", "tda"}, - {"üý", "tdac"}, - - // The test cases below come from RFC 3492 section 7.1 with Errata 3026. - { - // (A) Arabic (Egyptian). - "\u0644\u064A\u0647\u0645\u0627\u0628\u062A\u0643\u0644" + - "\u0645\u0648\u0634\u0639\u0631\u0628\u064A\u061F", - "egbpdaj6bu4bxfgehfvwxn", - }, - { - // (B) Chinese (simplified). - "\u4ED6\u4EEC\u4E3A\u4EC0\u4E48\u4E0D\u8BF4\u4E2D\u6587", - "ihqwcrb4cv8a8dqg056pqjye", - }, - { - // (C) Chinese (traditional). - "\u4ED6\u5011\u7232\u4EC0\u9EBD\u4E0D\u8AAA\u4E2D\u6587", - "ihqwctvzc91f659drss3x8bo0yb", - }, - { - // (D) Czech. - "\u0050\u0072\u006F\u010D\u0070\u0072\u006F\u0073\u0074" + - "\u011B\u006E\u0065\u006D\u006C\u0075\u0076\u00ED\u010D" + - "\u0065\u0073\u006B\u0079", - "Proprostnemluvesky-uyb24dma41a", - }, - { - // (E) Hebrew. - "\u05DC\u05DE\u05D4\u05D4\u05DD\u05E4\u05E9\u05D5\u05D8" + - "\u05DC\u05D0\u05DE\u05D3\u05D1\u05E8\u05D9\u05DD\u05E2" + - "\u05D1\u05E8\u05D9\u05EA", - "4dbcagdahymbxekheh6e0a7fei0b", - }, - { - // (F) Hindi (Devanagari). - "\u092F\u0939\u0932\u094B\u0917\u0939\u093F\u0928\u094D" + - "\u0926\u0940\u0915\u094D\u092F\u094B\u0902\u0928\u0939" + - "\u0940\u0902\u092C\u094B\u0932\u0938\u0915\u0924\u0947" + - "\u0939\u0948\u0902", - "i1baa7eci9glrd9b2ae1bj0hfcgg6iyaf8o0a1dig0cd", - }, - { - // (G) Japanese (kanji and hiragana). - "\u306A\u305C\u307F\u3093\u306A\u65E5\u672C\u8A9E\u3092" + - "\u8A71\u3057\u3066\u304F\u308C\u306A\u3044\u306E\u304B", - "n8jok5ay5dzabd5bym9f0cm5685rrjetr6pdxa", - }, - { - // (H) Korean (Hangul syllables). - "\uC138\uACC4\uC758\uBAA8\uB4E0\uC0AC\uB78C\uB4E4\uC774" + - "\uD55C\uAD6D\uC5B4\uB97C\uC774\uD574\uD55C\uB2E4\uBA74" + - "\uC5BC\uB9C8\uB098\uC88B\uC744\uAE4C", - "989aomsvi5e83db1d2a355cv1e0vak1dwrv93d5xbh15a0dt30a5j" + - "psd879ccm6fea98c", - }, - { - // (I) Russian (Cyrillic). - "\u043F\u043E\u0447\u0435\u043C\u0443\u0436\u0435\u043E" + - "\u043D\u0438\u043D\u0435\u0433\u043E\u0432\u043E\u0440" + - "\u044F\u0442\u043F\u043E\u0440\u0443\u0441\u0441\u043A" + - "\u0438", - "b1abfaaepdrnnbgefbadotcwatmq2g4l", - }, - { - // (J) Spanish. - "\u0050\u006F\u0072\u0071\u0075\u00E9\u006E\u006F\u0070" + - "\u0075\u0065\u0064\u0065\u006E\u0073\u0069\u006D\u0070" + - "\u006C\u0065\u006D\u0065\u006E\u0074\u0065\u0068\u0061" + - "\u0062\u006C\u0061\u0072\u0065\u006E\u0045\u0073\u0070" + - "\u0061\u00F1\u006F\u006C", - "PorqunopuedensimplementehablarenEspaol-fmd56a", - }, - { - // (K) Vietnamese. - "\u0054\u1EA1\u0069\u0073\u0061\u006F\u0068\u1ECD\u006B" + - "\u0068\u00F4\u006E\u0067\u0074\u0068\u1EC3\u0063\u0068" + - "\u1EC9\u006E\u00F3\u0069\u0074\u0069\u1EBF\u006E\u0067" + - "\u0056\u0069\u1EC7\u0074", - "TisaohkhngthchnitingVit-kjcr8268qyxafd2f1b9g", - }, - { - // (L) 3<nen>B<gumi><kinpachi><sensei>. - "\u0033\u5E74\u0042\u7D44\u91D1\u516B\u5148\u751F", - "3B-ww4c5e180e575a65lsy2b", - }, - { - // (M) <amuro><namie>-with-SUPER-MONKEYS. - "\u5B89\u5BA4\u5948\u7F8E\u6075\u002D\u0077\u0069\u0074" + - "\u0068\u002D\u0053\u0055\u0050\u0045\u0052\u002D\u004D" + - "\u004F\u004E\u004B\u0045\u0059\u0053", - "-with-SUPER-MONKEYS-pc58ag80a8qai00g7n9n", - }, - { - // (N) Hello-Another-Way-<sorezore><no><basho>. - "\u0048\u0065\u006C\u006C\u006F\u002D\u0041\u006E\u006F" + - "\u0074\u0068\u0065\u0072\u002D\u0057\u0061\u0079\u002D" + - "\u305D\u308C\u305E\u308C\u306E\u5834\u6240", - "Hello-Another-Way--fc4qua05auwb3674vfr0b", - }, - { - // (O) <hitotsu><yane><no><shita>2. - "\u3072\u3068\u3064\u5C4B\u6839\u306E\u4E0B\u0032", - "2-u9tlzr9756bt3uc0v", - }, - { - // (P) Maji<de>Koi<suru>5<byou><mae> - "\u004D\u0061\u006A\u0069\u3067\u004B\u006F\u0069\u3059" + - "\u308B\u0035\u79D2\u524D", - "MajiKoi5-783gue6qz075azm5e", - }, - { - // (Q) <pafii>de<runba> - "\u30D1\u30D5\u30A3\u30FC\u0064\u0065\u30EB\u30F3\u30D0", - "de-jg4avhby1noc0d", - }, - { - // (R) <sono><supiido><de> - "\u305D\u306E\u30B9\u30D4\u30FC\u30C9\u3067", - "d9juau41awczczp", - }, - { - // (S) -> $1.00 <- - "\u002D\u003E\u0020\u0024\u0031\u002E\u0030\u0030\u0020" + - "\u003C\u002D", - "-> $1.00 <--", - }, -} - -func TestPunycode(t *testing.T) { - for _, tc := range punycodeTestCases { - if got, err := decode(tc.encoded); err != nil { - t.Errorf("decode(%q): %v", tc.encoded, err) - } else if got != tc.s { - t.Errorf("decode(%q): got %q, want %q", tc.encoded, got, tc.s) - } - - if got, err := encode("", tc.s); err != nil { - t.Errorf(`encode("", %q): %v`, tc.s, err) - } else if got != tc.encoded { - t.Errorf(`encode("", %q): got %q, want %q`, tc.s, got, tc.encoded) - } - } -} - -var punycodeErrorTestCases = [...]string{ - "decode -", // A sole '-' is invalid. - "decode foo\x00bar", // '\x00' is not in [0-9A-Za-z]. - "decode foo#bar", // '#' is not in [0-9A-Za-z]. - "decode foo\u00A3bar", // '\u00A3' is not in [0-9A-Za-z]. - "decode 9", // "9a" decodes to codepoint \u00A3; "9" is truncated. - "decode 99999a", // "99999a" decodes to codepoint \U0048A3C1, which is > \U0010FFFF. - "decode 9999999999a", // "9999999999a" overflows the int32 calculation. - - "encode " + strings.Repeat("x", 65536) + "\uff00", // int32 overflow. -} - -func TestPunycodeErrors(t *testing.T) { - for _, tc := range punycodeErrorTestCases { - var err error - switch { - case strings.HasPrefix(tc, "decode "): - _, err = decode(tc[7:]) - case strings.HasPrefix(tc, "encode "): - _, err = encode("", tc[7:]) - } - if err == nil { - if len(tc) > 256 { - tc = tc[:100] + "..." + tc[len(tc)-100:] - } - t.Errorf("no error for %s", tc) - } - } -} diff --git a/vendor/golang.org/x/net/internal/iana/const.go b/vendor/golang.org/x/net/internal/iana/const.go deleted file mode 100644 index 7fe88225..00000000 --- a/vendor/golang.org/x/net/internal/iana/const.go +++ /dev/null @@ -1,181 +0,0 @@ -// go generate gen.go -// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT - -// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA). -package iana // import "golang.org/x/net/internal/iana" - -// Differentiated Services Field Codepoints (DSCP), Updated: 2013-06-25 -const ( - DiffServCS0 = 0x0 // CS0 - DiffServCS1 = 0x20 // CS1 - DiffServCS2 = 0x40 // CS2 - DiffServCS3 = 0x60 // CS3 - DiffServCS4 = 0x80 // CS4 - DiffServCS5 = 0xa0 // CS5 - DiffServCS6 = 0xc0 // CS6 - DiffServCS7 = 0xe0 // CS7 - DiffServAF11 = 0x28 // AF11 - DiffServAF12 = 0x30 // AF12 - DiffServAF13 = 0x38 // AF13 - DiffServAF21 = 0x48 // AF21 - DiffServAF22 = 0x50 // AF22 - DiffServAF23 = 0x58 // AF23 - DiffServAF31 = 0x68 // AF31 - DiffServAF32 = 0x70 // AF32 - DiffServAF33 = 0x78 // AF33 - DiffServAF41 = 0x88 // AF41 - DiffServAF42 = 0x90 // AF42 - DiffServAF43 = 0x98 // AF43 - DiffServEFPHB = 0xb8 // EF PHB - DiffServVOICEADMIT = 0xb0 // VOICE-ADMIT -) - -// IPv4 TOS Byte and IPv6 Traffic Class Octet, Updated: 2001-09-06 -const ( - NotECNTransport = 0x0 // Not-ECT (Not ECN-Capable Transport) - ECNTransport1 = 0x1 // ECT(1) (ECN-Capable Transport(1)) - ECNTransport0 = 0x2 // ECT(0) (ECN-Capable Transport(0)) - CongestionExperienced = 0x3 // CE (Congestion Experienced) -) - -// Protocol Numbers, Updated: 2015-06-23 -const ( - ProtocolIP = 0 // IPv4 encapsulation, pseudo protocol number - ProtocolHOPOPT = 0 // IPv6 Hop-by-Hop Option - ProtocolICMP = 1 // Internet Control Message - ProtocolIGMP = 2 // Internet Group Management - ProtocolGGP = 3 // Gateway-to-Gateway - ProtocolIPv4 = 4 // IPv4 encapsulation - ProtocolST = 5 // Stream - ProtocolTCP = 6 // Transmission Control - ProtocolCBT = 7 // CBT - ProtocolEGP = 8 // Exterior Gateway Protocol - ProtocolIGP = 9 // any private interior gateway (used by Cisco for their IGRP) - ProtocolBBNRCCMON = 10 // BBN RCC Monitoring - ProtocolNVPII = 11 // Network Voice Protocol - ProtocolPUP = 12 // PUP - ProtocolARGUS = 13 // ARGUS - ProtocolEMCON = 14 // EMCON - ProtocolXNET = 15 // Cross Net Debugger - ProtocolCHAOS = 16 // Chaos - ProtocolUDP = 17 // User Datagram - ProtocolMUX = 18 // Multiplexing - ProtocolDCNMEAS = 19 // DCN Measurement Subsystems - ProtocolHMP = 20 // Host Monitoring - ProtocolPRM = 21 // Packet Radio Measurement - ProtocolXNSIDP = 22 // XEROX NS IDP - ProtocolTRUNK1 = 23 // Trunk-1 - ProtocolTRUNK2 = 24 // Trunk-2 - ProtocolLEAF1 = 25 // Leaf-1 - ProtocolLEAF2 = 26 // Leaf-2 - ProtocolRDP = 27 // Reliable Data Protocol - ProtocolIRTP = 28 // Internet Reliable Transaction - ProtocolISOTP4 = 29 // ISO Transport Protocol Class 4 - ProtocolNETBLT = 30 // Bulk Data Transfer Protocol - ProtocolMFENSP = 31 // MFE Network Services Protocol - ProtocolMERITINP = 32 // MERIT Internodal Protocol - ProtocolDCCP = 33 // Datagram Congestion Control Protocol - Protocol3PC = 34 // Third Party Connect Protocol - ProtocolIDPR = 35 // Inter-Domain Policy Routing Protocol - ProtocolXTP = 36 // XTP - ProtocolDDP = 37 // Datagram Delivery Protocol - ProtocolIDPRCMTP = 38 // IDPR Control Message Transport Proto - ProtocolTPPP = 39 // TP++ Transport Protocol - ProtocolIL = 40 // IL Transport Protocol - ProtocolIPv6 = 41 // IPv6 encapsulation - ProtocolSDRP = 42 // Source Demand Routing Protocol - ProtocolIPv6Route = 43 // Routing Header for IPv6 - ProtocolIPv6Frag = 44 // Fragment Header for IPv6 - ProtocolIDRP = 45 // Inter-Domain Routing Protocol - ProtocolRSVP = 46 // Reservation Protocol - ProtocolGRE = 47 // Generic Routing Encapsulation - ProtocolDSR = 48 // Dynamic Source Routing Protocol - ProtocolBNA = 49 // BNA - ProtocolESP = 50 // Encap Security Payload - ProtocolAH = 51 // Authentication Header - ProtocolINLSP = 52 // Integrated Net Layer Security TUBA - ProtocolNARP = 54 // NBMA Address Resolution Protocol - ProtocolMOBILE = 55 // IP Mobility - ProtocolTLSP = 56 // Transport Layer Security Protocol using Kryptonet key management - ProtocolSKIP = 57 // SKIP - ProtocolIPv6ICMP = 58 // ICMP for IPv6 - ProtocolIPv6NoNxt = 59 // No Next Header for IPv6 - ProtocolIPv6Opts = 60 // Destination Options for IPv6 - ProtocolCFTP = 62 // CFTP - ProtocolSATEXPAK = 64 // SATNET and Backroom EXPAK - ProtocolKRYPTOLAN = 65 // Kryptolan - ProtocolRVD = 66 // MIT Remote Virtual Disk Protocol - ProtocolIPPC = 67 // Internet Pluribus Packet Core - ProtocolSATMON = 69 // SATNET Monitoring - ProtocolVISA = 70 // VISA Protocol - ProtocolIPCV = 71 // Internet Packet Core Utility - ProtocolCPNX = 72 // Computer Protocol Network Executive - ProtocolCPHB = 73 // Computer Protocol Heart Beat - ProtocolWSN = 74 // Wang Span Network - ProtocolPVP = 75 // Packet Video Protocol - ProtocolBRSATMON = 76 // Backroom SATNET Monitoring - ProtocolSUNND = 77 // SUN ND PROTOCOL-Temporary - ProtocolWBMON = 78 // WIDEBAND Monitoring - ProtocolWBEXPAK = 79 // WIDEBAND EXPAK - ProtocolISOIP = 80 // ISO Internet Protocol - ProtocolVMTP = 81 // VMTP - ProtocolSECUREVMTP = 82 // SECURE-VMTP - ProtocolVINES = 83 // VINES - ProtocolTTP = 84 // Transaction Transport Protocol - ProtocolIPTM = 84 // Internet Protocol Traffic Manager - ProtocolNSFNETIGP = 85 // NSFNET-IGP - ProtocolDGP = 86 // Dissimilar Gateway Protocol - ProtocolTCF = 87 // TCF - ProtocolEIGRP = 88 // EIGRP - ProtocolOSPFIGP = 89 // OSPFIGP - ProtocolSpriteRPC = 90 // Sprite RPC Protocol - ProtocolLARP = 91 // Locus Address Resolution Protocol - ProtocolMTP = 92 // Multicast Transport Protocol - ProtocolAX25 = 93 // AX.25 Frames - ProtocolIPIP = 94 // IP-within-IP Encapsulation Protocol - ProtocolSCCSP = 96 // Semaphore Communications Sec. Pro. - ProtocolETHERIP = 97 // Ethernet-within-IP Encapsulation - ProtocolENCAP = 98 // Encapsulation Header - ProtocolGMTP = 100 // GMTP - ProtocolIFMP = 101 // Ipsilon Flow Management Protocol - ProtocolPNNI = 102 // PNNI over IP - ProtocolPIM = 103 // Protocol Independent Multicast - ProtocolARIS = 104 // ARIS - ProtocolSCPS = 105 // SCPS - ProtocolQNX = 106 // QNX - ProtocolAN = 107 // Active Networks - ProtocolIPComp = 108 // IP Payload Compression Protocol - ProtocolSNP = 109 // Sitara Networks Protocol - ProtocolCompaqPeer = 110 // Compaq Peer Protocol - ProtocolIPXinIP = 111 // IPX in IP - ProtocolVRRP = 112 // Virtual Router Redundancy Protocol - ProtocolPGM = 113 // PGM Reliable Transport Protocol - ProtocolL2TP = 115 // Layer Two Tunneling Protocol - ProtocolDDX = 116 // D-II Data Exchange (DDX) - ProtocolIATP = 117 // Interactive Agent Transfer Protocol - ProtocolSTP = 118 // Schedule Transfer Protocol - ProtocolSRP = 119 // SpectraLink Radio Protocol - ProtocolUTI = 120 // UTI - ProtocolSMP = 121 // Simple Message Protocol - ProtocolPTP = 123 // Performance Transparency Protocol - ProtocolISIS = 124 // ISIS over IPv4 - ProtocolFIRE = 125 // FIRE - ProtocolCRTP = 126 // Combat Radio Transport Protocol - ProtocolCRUDP = 127 // Combat Radio User Datagram - ProtocolSSCOPMCE = 128 // SSCOPMCE - ProtocolIPLT = 129 // IPLT - ProtocolSPS = 130 // Secure Packet Shield - ProtocolPIPE = 131 // Private IP Encapsulation within IP - ProtocolSCTP = 132 // Stream Control Transmission Protocol - ProtocolFC = 133 // Fibre Channel - ProtocolRSVPE2EIGNORE = 134 // RSVP-E2E-IGNORE - ProtocolMobilityHeader = 135 // Mobility Header - ProtocolUDPLite = 136 // UDPLite - ProtocolMPLSinIP = 137 // MPLS-in-IP - ProtocolMANET = 138 // MANET Protocols - ProtocolHIP = 139 // Host Identity Protocol - ProtocolShim6 = 140 // Shim6 Protocol - ProtocolWESP = 141 // Wrapped Encapsulating Security Payload - ProtocolROHC = 142 // Robust Header Compression - ProtocolReserved = 255 // Reserved -) diff --git a/vendor/golang.org/x/net/internal/iana/gen.go b/vendor/golang.org/x/net/internal/iana/gen.go deleted file mode 100644 index 2d8c07ca..00000000 --- a/vendor/golang.org/x/net/internal/iana/gen.go +++ /dev/null @@ -1,293 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -//go:generate go run gen.go - -// This program generates internet protocol constants and tables by -// reading IANA protocol registries. -package main - -import ( - "bytes" - "encoding/xml" - "fmt" - "go/format" - "io" - "io/ioutil" - "net/http" - "os" - "strconv" - "strings" -) - -var registries = []struct { - url string - parse func(io.Writer, io.Reader) error -}{ - { - "http://www.iana.org/assignments/dscp-registry/dscp-registry.xml", - parseDSCPRegistry, - }, - { - "http://www.iana.org/assignments/ipv4-tos-byte/ipv4-tos-byte.xml", - parseTOSTCByte, - }, - { - "http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml", - parseProtocolNumbers, - }, -} - -func main() { - var bb bytes.Buffer - fmt.Fprintf(&bb, "// go generate gen.go\n") - fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") - fmt.Fprintf(&bb, "// Package iana provides protocol number resources managed by the Internet Assigned Numbers Authority (IANA).\n") - fmt.Fprintf(&bb, `package iana // import "golang.org/x/net/internal/iana"`+"\n\n") - for _, r := range registries { - resp, err := http.Get(r.url) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - fmt.Fprintf(os.Stderr, "got HTTP status code %v for %v\n", resp.StatusCode, r.url) - os.Exit(1) - } - if err := r.parse(&bb, resp.Body); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - fmt.Fprintf(&bb, "\n") - } - b, err := format.Source(bb.Bytes()) - if err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if err := ioutil.WriteFile("const.go", b, 0644); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func parseDSCPRegistry(w io.Writer, r io.Reader) error { - dec := xml.NewDecoder(r) - var dr dscpRegistry - if err := dec.Decode(&dr); err != nil { - return err - } - drs := dr.escape() - fmt.Fprintf(w, "// %s, Updated: %s\n", dr.Title, dr.Updated) - fmt.Fprintf(w, "const (\n") - for _, dr := range drs { - fmt.Fprintf(w, "DiffServ%s = %#x", dr.Name, dr.Value) - fmt.Fprintf(w, "// %s\n", dr.OrigName) - } - fmt.Fprintf(w, ")\n") - return nil -} - -type dscpRegistry struct { - XMLName xml.Name `xml:"registry"` - Title string `xml:"title"` - Updated string `xml:"updated"` - Note string `xml:"note"` - RegTitle string `xml:"registry>title"` - PoolRecords []struct { - Name string `xml:"name"` - Space string `xml:"space"` - } `xml:"registry>record"` - Records []struct { - Name string `xml:"name"` - Space string `xml:"space"` - } `xml:"registry>registry>record"` -} - -type canonDSCPRecord struct { - OrigName string - Name string - Value int -} - -func (drr *dscpRegistry) escape() []canonDSCPRecord { - drs := make([]canonDSCPRecord, len(drr.Records)) - sr := strings.NewReplacer( - "+", "", - "-", "", - "/", "", - ".", "", - " ", "", - ) - for i, dr := range drr.Records { - s := strings.TrimSpace(dr.Name) - drs[i].OrigName = s - drs[i].Name = sr.Replace(s) - n, err := strconv.ParseUint(dr.Space, 2, 8) - if err != nil { - continue - } - drs[i].Value = int(n) << 2 - } - return drs -} - -func parseTOSTCByte(w io.Writer, r io.Reader) error { - dec := xml.NewDecoder(r) - var ttb tosTCByte - if err := dec.Decode(&ttb); err != nil { - return err - } - trs := ttb.escape() - fmt.Fprintf(w, "// %s, Updated: %s\n", ttb.Title, ttb.Updated) - fmt.Fprintf(w, "const (\n") - for _, tr := range trs { - fmt.Fprintf(w, "%s = %#x", tr.Keyword, tr.Value) - fmt.Fprintf(w, "// %s\n", tr.OrigKeyword) - } - fmt.Fprintf(w, ")\n") - return nil -} - -type tosTCByte struct { - XMLName xml.Name `xml:"registry"` - Title string `xml:"title"` - Updated string `xml:"updated"` - Note string `xml:"note"` - RegTitle string `xml:"registry>title"` - Records []struct { - Binary string `xml:"binary"` - Keyword string `xml:"keyword"` - } `xml:"registry>record"` -} - -type canonTOSTCByteRecord struct { - OrigKeyword string - Keyword string - Value int -} - -func (ttb *tosTCByte) escape() []canonTOSTCByteRecord { - trs := make([]canonTOSTCByteRecord, len(ttb.Records)) - sr := strings.NewReplacer( - "Capable", "", - "(", "", - ")", "", - "+", "", - "-", "", - "/", "", - ".", "", - " ", "", - ) - for i, tr := range ttb.Records { - s := strings.TrimSpace(tr.Keyword) - trs[i].OrigKeyword = s - ss := strings.Split(s, " ") - if len(ss) > 1 { - trs[i].Keyword = strings.Join(ss[1:], " ") - } else { - trs[i].Keyword = ss[0] - } - trs[i].Keyword = sr.Replace(trs[i].Keyword) - n, err := strconv.ParseUint(tr.Binary, 2, 8) - if err != nil { - continue - } - trs[i].Value = int(n) - } - return trs -} - -func parseProtocolNumbers(w io.Writer, r io.Reader) error { - dec := xml.NewDecoder(r) - var pn protocolNumbers - if err := dec.Decode(&pn); err != nil { - return err - } - prs := pn.escape() - prs = append([]canonProtocolRecord{{ - Name: "IP", - Descr: "IPv4 encapsulation, pseudo protocol number", - Value: 0, - }}, prs...) - fmt.Fprintf(w, "// %s, Updated: %s\n", pn.Title, pn.Updated) - fmt.Fprintf(w, "const (\n") - for _, pr := range prs { - if pr.Name == "" { - continue - } - fmt.Fprintf(w, "Protocol%s = %d", pr.Name, pr.Value) - s := pr.Descr - if s == "" { - s = pr.OrigName - } - fmt.Fprintf(w, "// %s\n", s) - } - fmt.Fprintf(w, ")\n") - return nil -} - -type protocolNumbers struct { - XMLName xml.Name `xml:"registry"` - Title string `xml:"title"` - Updated string `xml:"updated"` - RegTitle string `xml:"registry>title"` - Note string `xml:"registry>note"` - Records []struct { - Value string `xml:"value"` - Name string `xml:"name"` - Descr string `xml:"description"` - } `xml:"registry>record"` -} - -type canonProtocolRecord struct { - OrigName string - Name string - Descr string - Value int -} - -func (pn *protocolNumbers) escape() []canonProtocolRecord { - prs := make([]canonProtocolRecord, len(pn.Records)) - sr := strings.NewReplacer( - "-in-", "in", - "-within-", "within", - "-over-", "over", - "+", "P", - "-", "", - "/", "", - ".", "", - " ", "", - ) - for i, pr := range pn.Records { - if strings.Contains(pr.Name, "Deprecated") || - strings.Contains(pr.Name, "deprecated") { - continue - } - prs[i].OrigName = pr.Name - s := strings.TrimSpace(pr.Name) - switch pr.Name { - case "ISIS over IPv4": - prs[i].Name = "ISIS" - case "manet": - prs[i].Name = "MANET" - default: - prs[i].Name = sr.Replace(s) - } - ss := strings.Split(pr.Descr, "\n") - for i := range ss { - ss[i] = strings.TrimSpace(ss[i]) - } - if len(ss) > 1 { - prs[i].Descr = strings.Join(ss, " ") - } else { - prs[i].Descr = ss[0] - } - prs[i].Value, _ = strconv.Atoi(pr.Value) - } - return prs -} diff --git a/vendor/golang.org/x/net/internal/nettest/error_posix.go b/vendor/golang.org/x/net/internal/nettest/error_posix.go deleted file mode 100644 index 963ed996..00000000 --- a/vendor/golang.org/x/net/internal/nettest/error_posix.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd solaris windows - -package nettest - -import ( - "os" - "syscall" -) - -func protocolNotSupported(err error) bool { - switch err := err.(type) { - case syscall.Errno: - switch err { - case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: - return true - } - case *os.SyscallError: - switch err := err.Err.(type) { - case syscall.Errno: - switch err { - case syscall.EPROTONOSUPPORT, syscall.ENOPROTOOPT: - return true - } - } - } - return false -} diff --git a/vendor/golang.org/x/net/internal/nettest/error_stub.go b/vendor/golang.org/x/net/internal/nettest/error_stub.go deleted file mode 100644 index 3c74d812..00000000 --- a/vendor/golang.org/x/net/internal/nettest/error_stub.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 - -package nettest - -func protocolNotSupported(err error) bool { - return false -} diff --git a/vendor/golang.org/x/net/internal/nettest/interface.go b/vendor/golang.org/x/net/internal/nettest/interface.go deleted file mode 100644 index 53ae13a9..00000000 --- a/vendor/golang.org/x/net/internal/nettest/interface.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package nettest - -import "net" - -// IsMulticastCapable reports whether ifi is an IP multicast-capable -// network interface. Network must be "ip", "ip4" or "ip6". -func IsMulticastCapable(network string, ifi *net.Interface) (net.IP, bool) { - switch network { - case "ip", "ip4", "ip6": - default: - return nil, false - } - if ifi == nil || ifi.Flags&net.FlagUp == 0 || ifi.Flags&net.FlagMulticast == 0 { - return nil, false - } - return hasRoutableIP(network, ifi) -} - -// RoutedInterface returns a network interface that can route IP -// traffic and satisfies flags. It returns nil when an appropriate -// network interface is not found. Network must be "ip", "ip4" or -// "ip6". -func RoutedInterface(network string, flags net.Flags) *net.Interface { - switch network { - case "ip", "ip4", "ip6": - default: - return nil - } - ift, err := net.Interfaces() - if err != nil { - return nil - } - for _, ifi := range ift { - if ifi.Flags&flags != flags { - continue - } - if _, ok := hasRoutableIP(network, &ifi); !ok { - continue - } - return &ifi - } - return nil -} - -func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) { - ifat, err := ifi.Addrs() - if err != nil { - return nil, false - } - for _, ifa := range ifat { - switch ifa := ifa.(type) { - case *net.IPAddr: - if ip := routableIP(network, ifa.IP); ip != nil { - return ip, true - } - case *net.IPNet: - if ip := routableIP(network, ifa.IP); ip != nil { - return ip, true - } - } - } - return nil, false -} - -func routableIP(network string, ip net.IP) net.IP { - if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() { - return nil - } - switch network { - case "ip4": - if ip := ip.To4(); ip != nil { - return ip - } - case "ip6": - if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation - return nil - } - if ip := ip.To16(); ip != nil && ip.To4() == nil { - return ip - } - default: - if ip := ip.To4(); ip != nil { - return ip - } - if ip := ip.To16(); ip != nil { - return ip - } - } - return nil -} diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit.go b/vendor/golang.org/x/net/internal/nettest/rlimit.go deleted file mode 100644 index bb34aec0..00000000 --- a/vendor/golang.org/x/net/internal/nettest/rlimit.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package nettest - -const defaultMaxOpenFiles = 256 - -// MaxOpenFiles returns the maximum number of open files for the -// caller's process. -func MaxOpenFiles() int { return maxOpenFiles() } diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit_stub.go b/vendor/golang.org/x/net/internal/nettest/rlimit_stub.go deleted file mode 100644 index 102bef93..00000000 --- a/vendor/golang.org/x/net/internal/nettest/rlimit_stub.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 - -package nettest - -func maxOpenFiles() int { return defaultMaxOpenFiles } diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit_unix.go b/vendor/golang.org/x/net/internal/nettest/rlimit_unix.go deleted file mode 100644 index eb4312ce..00000000 --- a/vendor/golang.org/x/net/internal/nettest/rlimit_unix.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd solaris - -package nettest - -import "syscall" - -func maxOpenFiles() int { - var rlim syscall.Rlimit - if err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rlim); err != nil { - return defaultMaxOpenFiles - } - return int(rlim.Cur) -} diff --git a/vendor/golang.org/x/net/internal/nettest/rlimit_windows.go b/vendor/golang.org/x/net/internal/nettest/rlimit_windows.go deleted file mode 100644 index de927b56..00000000 --- a/vendor/golang.org/x/net/internal/nettest/rlimit_windows.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package nettest - -func maxOpenFiles() int { return 4 * defaultMaxOpenFiles /* actually it's 16581375 */ } diff --git a/vendor/golang.org/x/net/internal/nettest/stack.go b/vendor/golang.org/x/net/internal/nettest/stack.go deleted file mode 100644 index e07c015f..00000000 --- a/vendor/golang.org/x/net/internal/nettest/stack.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package nettest provides utilities for IP testing. -package nettest // import "golang.org/x/net/internal/nettest" - -import "net" - -// SupportsIPv4 reports whether the platform supports IPv4 networking -// functionality. -func SupportsIPv4() bool { - ln, err := net.Listen("tcp4", "127.0.0.1:0") - if err != nil { - return false - } - ln.Close() - return true -} - -// SupportsIPv6 reports whether the platform supports IPv6 networking -// functionality. -func SupportsIPv6() bool { - ln, err := net.Listen("tcp6", "[::1]:0") - if err != nil { - return false - } - ln.Close() - return true -} - -// ProtocolNotSupported reports whether err is a protocol not -// supported error. -func ProtocolNotSupported(err error) bool { - return protocolNotSupported(err) -} diff --git a/vendor/golang.org/x/net/internal/nettest/stack_stub.go b/vendor/golang.org/x/net/internal/nettest/stack_stub.go deleted file mode 100644 index 1b5fde1a..00000000 --- a/vendor/golang.org/x/net/internal/nettest/stack_stub.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 - -package nettest - -import ( - "fmt" - "runtime" -) - -// SupportsRawIPSocket reports whether the platform supports raw IP -// sockets. -func SupportsRawIPSocket() (string, bool) { - return fmt.Sprintf("not supported on %s", runtime.GOOS), false -} diff --git a/vendor/golang.org/x/net/internal/nettest/stack_unix.go b/vendor/golang.org/x/net/internal/nettest/stack_unix.go deleted file mode 100644 index af89229f..00000000 --- a/vendor/golang.org/x/net/internal/nettest/stack_unix.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd solaris - -package nettest - -import ( - "fmt" - "os" - "runtime" -) - -// SupportsRawIPSocket reports whether the platform supports raw IP -// sockets. -func SupportsRawIPSocket() (string, bool) { - if os.Getuid() != 0 { - return fmt.Sprintf("must be root on %s", runtime.GOOS), false - } - return "", true -} diff --git a/vendor/golang.org/x/net/internal/nettest/stack_windows.go b/vendor/golang.org/x/net/internal/nettest/stack_windows.go deleted file mode 100644 index a21f4993..00000000 --- a/vendor/golang.org/x/net/internal/nettest/stack_windows.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package nettest - -import ( - "fmt" - "runtime" - "syscall" -) - -// SupportsRawIPSocket reports whether the platform supports raw IP -// sockets. -func SupportsRawIPSocket() (string, bool) { - // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx: - // Note: To use a socket of type SOCK_RAW requires administrative privileges. - // Users running Winsock applications that use raw sockets must be a member of - // the Administrators group on the local computer, otherwise raw socket calls - // will fail with an error code of WSAEACCES. On Windows Vista and later, access - // for raw sockets is enforced at socket creation. In earlier versions of Windows, - // access for raw sockets is enforced during other socket operations. - s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0) - if err == syscall.WSAEACCES { - return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false - } - if err != nil { - return err.Error(), false - } - syscall.Closesocket(s) - return "", true -} diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries.go b/vendor/golang.org/x/net/internal/timeseries/timeseries.go deleted file mode 100644 index 1119f344..00000000 --- a/vendor/golang.org/x/net/internal/timeseries/timeseries.go +++ /dev/null @@ -1,525 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package timeseries implements a time series structure for stats collection. -package timeseries // import "golang.org/x/net/internal/timeseries" - -import ( - "fmt" - "log" - "time" -) - -const ( - timeSeriesNumBuckets = 64 - minuteHourSeriesNumBuckets = 60 -) - -var timeSeriesResolutions = []time.Duration{ - 1 * time.Second, - 10 * time.Second, - 1 * time.Minute, - 10 * time.Minute, - 1 * time.Hour, - 6 * time.Hour, - 24 * time.Hour, // 1 day - 7 * 24 * time.Hour, // 1 week - 4 * 7 * 24 * time.Hour, // 4 weeks - 16 * 7 * 24 * time.Hour, // 16 weeks -} - -var minuteHourSeriesResolutions = []time.Duration{ - 1 * time.Second, - 1 * time.Minute, -} - -// An Observable is a kind of data that can be aggregated in a time series. -type Observable interface { - Multiply(ratio float64) // Multiplies the data in self by a given ratio - Add(other Observable) // Adds the data from a different observation to self - Clear() // Clears the observation so it can be reused. - CopyFrom(other Observable) // Copies the contents of a given observation to self -} - -// Float attaches the methods of Observable to a float64. -type Float float64 - -// NewFloat returns a Float. -func NewFloat() Observable { - f := Float(0) - return &f -} - -// String returns the float as a string. -func (f *Float) String() string { return fmt.Sprintf("%g", f.Value()) } - -// Value returns the float's value. -func (f *Float) Value() float64 { return float64(*f) } - -func (f *Float) Multiply(ratio float64) { *f *= Float(ratio) } - -func (f *Float) Add(other Observable) { - o := other.(*Float) - *f += *o -} - -func (f *Float) Clear() { *f = 0 } - -func (f *Float) CopyFrom(other Observable) { - o := other.(*Float) - *f = *o -} - -// A Clock tells the current time. -type Clock interface { - Time() time.Time -} - -type defaultClock int - -var defaultClockInstance defaultClock - -func (defaultClock) Time() time.Time { return time.Now() } - -// Information kept per level. Each level consists of a circular list of -// observations. The start of the level may be derived from end and the -// len(buckets) * sizeInMillis. -type tsLevel struct { - oldest int // index to oldest bucketed Observable - newest int // index to newest bucketed Observable - end time.Time // end timestamp for this level - size time.Duration // duration of the bucketed Observable - buckets []Observable // collections of observations - provider func() Observable // used for creating new Observable -} - -func (l *tsLevel) Clear() { - l.oldest = 0 - l.newest = len(l.buckets) - 1 - l.end = time.Time{} - for i := range l.buckets { - if l.buckets[i] != nil { - l.buckets[i].Clear() - l.buckets[i] = nil - } - } -} - -func (l *tsLevel) InitLevel(size time.Duration, numBuckets int, f func() Observable) { - l.size = size - l.provider = f - l.buckets = make([]Observable, numBuckets) -} - -// Keeps a sequence of levels. Each level is responsible for storing data at -// a given resolution. For example, the first level stores data at a one -// minute resolution while the second level stores data at a one hour -// resolution. - -// Each level is represented by a sequence of buckets. Each bucket spans an -// interval equal to the resolution of the level. New observations are added -// to the last bucket. -type timeSeries struct { - provider func() Observable // make more Observable - numBuckets int // number of buckets in each level - levels []*tsLevel // levels of bucketed Observable - lastAdd time.Time // time of last Observable tracked - total Observable // convenient aggregation of all Observable - clock Clock // Clock for getting current time - pending Observable // observations not yet bucketed - pendingTime time.Time // what time are we keeping in pending - dirty bool // if there are pending observations -} - -// init initializes a level according to the supplied criteria. -func (ts *timeSeries) init(resolutions []time.Duration, f func() Observable, numBuckets int, clock Clock) { - ts.provider = f - ts.numBuckets = numBuckets - ts.clock = clock - ts.levels = make([]*tsLevel, len(resolutions)) - - for i := range resolutions { - if i > 0 && resolutions[i-1] >= resolutions[i] { - log.Print("timeseries: resolutions must be monotonically increasing") - break - } - newLevel := new(tsLevel) - newLevel.InitLevel(resolutions[i], ts.numBuckets, ts.provider) - ts.levels[i] = newLevel - } - - ts.Clear() -} - -// Clear removes all observations from the time series. -func (ts *timeSeries) Clear() { - ts.lastAdd = time.Time{} - ts.total = ts.resetObservation(ts.total) - ts.pending = ts.resetObservation(ts.pending) - ts.pendingTime = time.Time{} - ts.dirty = false - - for i := range ts.levels { - ts.levels[i].Clear() - } -} - -// Add records an observation at the current time. -func (ts *timeSeries) Add(observation Observable) { - ts.AddWithTime(observation, ts.clock.Time()) -} - -// AddWithTime records an observation at the specified time. -func (ts *timeSeries) AddWithTime(observation Observable, t time.Time) { - - smallBucketDuration := ts.levels[0].size - - if t.After(ts.lastAdd) { - ts.lastAdd = t - } - - if t.After(ts.pendingTime) { - ts.advance(t) - ts.mergePendingUpdates() - ts.pendingTime = ts.levels[0].end - ts.pending.CopyFrom(observation) - ts.dirty = true - } else if t.After(ts.pendingTime.Add(-1 * smallBucketDuration)) { - // The observation is close enough to go into the pending bucket. - // This compensates for clock skewing and small scheduling delays - // by letting the update stay in the fast path. - ts.pending.Add(observation) - ts.dirty = true - } else { - ts.mergeValue(observation, t) - } -} - -// mergeValue inserts the observation at the specified time in the past into all levels. -func (ts *timeSeries) mergeValue(observation Observable, t time.Time) { - for _, level := range ts.levels { - index := (ts.numBuckets - 1) - int(level.end.Sub(t)/level.size) - if 0 <= index && index < ts.numBuckets { - bucketNumber := (level.oldest + index) % ts.numBuckets - if level.buckets[bucketNumber] == nil { - level.buckets[bucketNumber] = level.provider() - } - level.buckets[bucketNumber].Add(observation) - } - } - ts.total.Add(observation) -} - -// mergePendingUpdates applies the pending updates into all levels. -func (ts *timeSeries) mergePendingUpdates() { - if ts.dirty { - ts.mergeValue(ts.pending, ts.pendingTime) - ts.pending = ts.resetObservation(ts.pending) - ts.dirty = false - } -} - -// advance cycles the buckets at each level until the latest bucket in -// each level can hold the time specified. -func (ts *timeSeries) advance(t time.Time) { - if !t.After(ts.levels[0].end) { - return - } - for i := 0; i < len(ts.levels); i++ { - level := ts.levels[i] - if !level.end.Before(t) { - break - } - - // If the time is sufficiently far, just clear the level and advance - // directly. - if !t.Before(level.end.Add(level.size * time.Duration(ts.numBuckets))) { - for _, b := range level.buckets { - ts.resetObservation(b) - } - level.end = time.Unix(0, (t.UnixNano()/level.size.Nanoseconds())*level.size.Nanoseconds()) - } - - for t.After(level.end) { - level.end = level.end.Add(level.size) - level.newest = level.oldest - level.oldest = (level.oldest + 1) % ts.numBuckets - ts.resetObservation(level.buckets[level.newest]) - } - - t = level.end - } -} - -// Latest returns the sum of the num latest buckets from the level. -func (ts *timeSeries) Latest(level, num int) Observable { - now := ts.clock.Time() - if ts.levels[0].end.Before(now) { - ts.advance(now) - } - - ts.mergePendingUpdates() - - result := ts.provider() - l := ts.levels[level] - index := l.newest - - for i := 0; i < num; i++ { - if l.buckets[index] != nil { - result.Add(l.buckets[index]) - } - if index == 0 { - index = ts.numBuckets - } - index-- - } - - return result -} - -// LatestBuckets returns a copy of the num latest buckets from level. -func (ts *timeSeries) LatestBuckets(level, num int) []Observable { - if level < 0 || level > len(ts.levels) { - log.Print("timeseries: bad level argument: ", level) - return nil - } - if num < 0 || num >= ts.numBuckets { - log.Print("timeseries: bad num argument: ", num) - return nil - } - - results := make([]Observable, num) - now := ts.clock.Time() - if ts.levels[0].end.Before(now) { - ts.advance(now) - } - - ts.mergePendingUpdates() - - l := ts.levels[level] - index := l.newest - - for i := 0; i < num; i++ { - result := ts.provider() - results[i] = result - if l.buckets[index] != nil { - result.CopyFrom(l.buckets[index]) - } - - if index == 0 { - index = ts.numBuckets - } - index -= 1 - } - return results -} - -// ScaleBy updates observations by scaling by factor. -func (ts *timeSeries) ScaleBy(factor float64) { - for _, l := range ts.levels { - for i := 0; i < ts.numBuckets; i++ { - l.buckets[i].Multiply(factor) - } - } - - ts.total.Multiply(factor) - ts.pending.Multiply(factor) -} - -// Range returns the sum of observations added over the specified time range. -// If start or finish times don't fall on bucket boundaries of the same -// level, then return values are approximate answers. -func (ts *timeSeries) Range(start, finish time.Time) Observable { - return ts.ComputeRange(start, finish, 1)[0] -} - -// Recent returns the sum of observations from the last delta. -func (ts *timeSeries) Recent(delta time.Duration) Observable { - now := ts.clock.Time() - return ts.Range(now.Add(-delta), now) -} - -// Total returns the total of all observations. -func (ts *timeSeries) Total() Observable { - ts.mergePendingUpdates() - return ts.total -} - -// ComputeRange computes a specified number of values into a slice using -// the observations recorded over the specified time period. The return -// values are approximate if the start or finish times don't fall on the -// bucket boundaries at the same level or if the number of buckets spanning -// the range is not an integral multiple of num. -func (ts *timeSeries) ComputeRange(start, finish time.Time, num int) []Observable { - if start.After(finish) { - log.Printf("timeseries: start > finish, %v>%v", start, finish) - return nil - } - - if num < 0 { - log.Printf("timeseries: num < 0, %v", num) - return nil - } - - results := make([]Observable, num) - - for _, l := range ts.levels { - if !start.Before(l.end.Add(-l.size * time.Duration(ts.numBuckets))) { - ts.extract(l, start, finish, num, results) - return results - } - } - - // Failed to find a level that covers the desired range. So just - // extract from the last level, even if it doesn't cover the entire - // desired range. - ts.extract(ts.levels[len(ts.levels)-1], start, finish, num, results) - - return results -} - -// RecentList returns the specified number of values in slice over the most -// recent time period of the specified range. -func (ts *timeSeries) RecentList(delta time.Duration, num int) []Observable { - if delta < 0 { - return nil - } - now := ts.clock.Time() - return ts.ComputeRange(now.Add(-delta), now, num) -} - -// extract returns a slice of specified number of observations from a given -// level over a given range. -func (ts *timeSeries) extract(l *tsLevel, start, finish time.Time, num int, results []Observable) { - ts.mergePendingUpdates() - - srcInterval := l.size - dstInterval := finish.Sub(start) / time.Duration(num) - dstStart := start - srcStart := l.end.Add(-srcInterval * time.Duration(ts.numBuckets)) - - srcIndex := 0 - - // Where should scanning start? - if dstStart.After(srcStart) { - advance := dstStart.Sub(srcStart) / srcInterval - srcIndex += int(advance) - srcStart = srcStart.Add(advance * srcInterval) - } - - // The i'th value is computed as show below. - // interval = (finish/start)/num - // i'th value = sum of observation in range - // [ start + i * interval, - // start + (i + 1) * interval ) - for i := 0; i < num; i++ { - results[i] = ts.resetObservation(results[i]) - dstEnd := dstStart.Add(dstInterval) - for srcIndex < ts.numBuckets && srcStart.Before(dstEnd) { - srcEnd := srcStart.Add(srcInterval) - if srcEnd.After(ts.lastAdd) { - srcEnd = ts.lastAdd - } - - if !srcEnd.Before(dstStart) { - srcValue := l.buckets[(srcIndex+l.oldest)%ts.numBuckets] - if !srcStart.Before(dstStart) && !srcEnd.After(dstEnd) { - // dst completely contains src. - if srcValue != nil { - results[i].Add(srcValue) - } - } else { - // dst partially overlaps src. - overlapStart := maxTime(srcStart, dstStart) - overlapEnd := minTime(srcEnd, dstEnd) - base := srcEnd.Sub(srcStart) - fraction := overlapEnd.Sub(overlapStart).Seconds() / base.Seconds() - - used := ts.provider() - if srcValue != nil { - used.CopyFrom(srcValue) - } - used.Multiply(fraction) - results[i].Add(used) - } - - if srcEnd.After(dstEnd) { - break - } - } - srcIndex++ - srcStart = srcStart.Add(srcInterval) - } - dstStart = dstStart.Add(dstInterval) - } -} - -// resetObservation clears the content so the struct may be reused. -func (ts *timeSeries) resetObservation(observation Observable) Observable { - if observation == nil { - observation = ts.provider() - } else { - observation.Clear() - } - return observation -} - -// TimeSeries tracks data at granularities from 1 second to 16 weeks. -type TimeSeries struct { - timeSeries -} - -// NewTimeSeries creates a new TimeSeries using the function provided for creating new Observable. -func NewTimeSeries(f func() Observable) *TimeSeries { - return NewTimeSeriesWithClock(f, defaultClockInstance) -} - -// NewTimeSeriesWithClock creates a new TimeSeries using the function provided for creating new Observable and the clock for -// assigning timestamps. -func NewTimeSeriesWithClock(f func() Observable, clock Clock) *TimeSeries { - ts := new(TimeSeries) - ts.timeSeries.init(timeSeriesResolutions, f, timeSeriesNumBuckets, clock) - return ts -} - -// MinuteHourSeries tracks data at granularities of 1 minute and 1 hour. -type MinuteHourSeries struct { - timeSeries -} - -// NewMinuteHourSeries creates a new MinuteHourSeries using the function provided for creating new Observable. -func NewMinuteHourSeries(f func() Observable) *MinuteHourSeries { - return NewMinuteHourSeriesWithClock(f, defaultClockInstance) -} - -// NewMinuteHourSeriesWithClock creates a new MinuteHourSeries using the function provided for creating new Observable and the clock for -// assigning timestamps. -func NewMinuteHourSeriesWithClock(f func() Observable, clock Clock) *MinuteHourSeries { - ts := new(MinuteHourSeries) - ts.timeSeries.init(minuteHourSeriesResolutions, f, - minuteHourSeriesNumBuckets, clock) - return ts -} - -func (ts *MinuteHourSeries) Minute() Observable { - return ts.timeSeries.Latest(0, 60) -} - -func (ts *MinuteHourSeries) Hour() Observable { - return ts.timeSeries.Latest(1, 60) -} - -func minTime(a, b time.Time) time.Time { - if a.Before(b) { - return a - } - return b -} - -func maxTime(a, b time.Time) time.Time { - if a.After(b) { - return a - } - return b -} diff --git a/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go b/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go deleted file mode 100644 index 66325a91..00000000 --- a/vendor/golang.org/x/net/internal/timeseries/timeseries_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package timeseries - -import ( - "math" - "testing" - "time" -) - -func isNear(x *Float, y float64, tolerance float64) bool { - return math.Abs(x.Value()-y) < tolerance -} - -func isApproximate(x *Float, y float64) bool { - return isNear(x, y, 1e-2) -} - -func checkApproximate(t *testing.T, o Observable, y float64) { - x := o.(*Float) - if !isApproximate(x, y) { - t.Errorf("Wanted %g, got %g", y, x.Value()) - } -} - -func checkNear(t *testing.T, o Observable, y, tolerance float64) { - x := o.(*Float) - if !isNear(x, y, tolerance) { - t.Errorf("Wanted %g +- %g, got %g", y, tolerance, x.Value()) - } -} - -var baseTime = time.Date(2013, 1, 1, 0, 0, 0, 0, time.UTC) - -func tu(s int64) time.Time { - return baseTime.Add(time.Duration(s) * time.Second) -} - -func tu2(s int64, ns int64) time.Time { - return baseTime.Add(time.Duration(s)*time.Second + time.Duration(ns)*time.Nanosecond) -} - -func TestBasicTimeSeries(t *testing.T) { - ts := NewTimeSeries(NewFloat) - fo := new(Float) - *fo = Float(10) - ts.AddWithTime(fo, tu(1)) - ts.AddWithTime(fo, tu(1)) - ts.AddWithTime(fo, tu(1)) - ts.AddWithTime(fo, tu(1)) - checkApproximate(t, ts.Range(tu(0), tu(1)), 40) - checkApproximate(t, ts.Total(), 40) - ts.AddWithTime(fo, tu(3)) - ts.AddWithTime(fo, tu(3)) - ts.AddWithTime(fo, tu(3)) - checkApproximate(t, ts.Range(tu(0), tu(2)), 40) - checkApproximate(t, ts.Range(tu(2), tu(4)), 30) - checkApproximate(t, ts.Total(), 70) - ts.AddWithTime(fo, tu(1)) - ts.AddWithTime(fo, tu(1)) - checkApproximate(t, ts.Range(tu(0), tu(2)), 60) - checkApproximate(t, ts.Range(tu(2), tu(4)), 30) - checkApproximate(t, ts.Total(), 90) - *fo = Float(100) - ts.AddWithTime(fo, tu(100)) - checkApproximate(t, ts.Range(tu(99), tu(100)), 100) - checkApproximate(t, ts.Range(tu(0), tu(4)), 36) - checkApproximate(t, ts.Total(), 190) - *fo = Float(10) - ts.AddWithTime(fo, tu(1)) - ts.AddWithTime(fo, tu(1)) - checkApproximate(t, ts.Range(tu(0), tu(4)), 44) - checkApproximate(t, ts.Range(tu(37), tu2(100, 100e6)), 100) - checkApproximate(t, ts.Range(tu(50), tu2(100, 100e6)), 100) - checkApproximate(t, ts.Range(tu(99), tu2(100, 100e6)), 100) - checkApproximate(t, ts.Total(), 210) - - for i, l := range ts.ComputeRange(tu(36), tu(100), 64) { - if i == 63 { - checkApproximate(t, l, 100) - } else { - checkApproximate(t, l, 0) - } - } - - checkApproximate(t, ts.Range(tu(0), tu(100)), 210) - checkApproximate(t, ts.Range(tu(10), tu(100)), 100) - - for i, l := range ts.ComputeRange(tu(0), tu(100), 100) { - if i < 10 { - checkApproximate(t, l, 11) - } else if i >= 90 { - checkApproximate(t, l, 10) - } else { - checkApproximate(t, l, 0) - } - } -} - -func TestFloat(t *testing.T) { - f := Float(1) - if g, w := f.String(), "1"; g != w { - t.Errorf("Float(1).String = %q; want %q", g, w) - } - f2 := Float(2) - var o Observable = &f2 - f.Add(o) - if g, w := f.Value(), 3.0; g != w { - t.Errorf("Float post-add = %v; want %v", g, w) - } - f.Multiply(2) - if g, w := f.Value(), 6.0; g != w { - t.Errorf("Float post-multiply = %v; want %v", g, w) - } - f.Clear() - if g, w := f.Value(), 0.0; g != w { - t.Errorf("Float post-clear = %v; want %v", g, w) - } - f.CopyFrom(&f2) - if g, w := f.Value(), 2.0; g != w { - t.Errorf("Float post-CopyFrom = %v; want %v", g, w) - } -} - -type mockClock struct { - time time.Time -} - -func (m *mockClock) Time() time.Time { return m.time } -func (m *mockClock) Set(t time.Time) { m.time = t } - -const buckets = 6 - -var testResolutions = []time.Duration{ - 10 * time.Second, // level holds one minute of observations - 100 * time.Second, // level holds ten minutes of observations - 10 * time.Minute, // level holds one hour of observations -} - -// TestTimeSeries uses a small number of buckets to force a higher -// error rate on approximations from the timeseries. -type TestTimeSeries struct { - timeSeries -} - -func TestExpectedErrorRate(t *testing.T) { - ts := new(TestTimeSeries) - fake := new(mockClock) - fake.Set(time.Now()) - ts.timeSeries.init(testResolutions, NewFloat, buckets, fake) - for i := 1; i <= 61*61; i++ { - fake.Set(fake.Time().Add(1 * time.Second)) - ob := Float(1) - ts.AddWithTime(&ob, fake.Time()) - - // The results should be accurate within one missing bucket (1/6) of the observations recorded. - checkNear(t, ts.Latest(0, buckets), min(float64(i), 60), 10) - checkNear(t, ts.Latest(1, buckets), min(float64(i), 600), 100) - checkNear(t, ts.Latest(2, buckets), min(float64(i), 3600), 600) - } -} - -func min(a, b float64) float64 { - if a < b { - return a - } - return b -} diff --git a/vendor/golang.org/x/net/ipv4/control.go b/vendor/golang.org/x/net/ipv4/control.go deleted file mode 100644 index 1f5c993f..00000000 --- a/vendor/golang.org/x/net/ipv4/control.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "fmt" - "net" - "sync" -) - -type rawOpt struct { - sync.RWMutex - cflags ControlFlags -} - -func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } -func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } -func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } - -type ControlFlags uint - -const ( - FlagTTL ControlFlags = 1 << iota // pass the TTL on the received packet - FlagSrc // pass the source address on the received packet - FlagDst // pass the destination address on the received packet - FlagInterface // pass the interface index on the received packet -) - -// A ControlMessage represents per packet basis IP-level socket options. -type ControlMessage struct { - // Receiving socket options: SetControlMessage allows to - // receive the options from the protocol stack using ReadFrom - // method of PacketConn or RawConn. - // - // Specifying socket options: ControlMessage for WriteTo - // method of PacketConn or RawConn allows to send the options - // to the protocol stack. - // - TTL int // time-to-live, receiving only - Src net.IP // source address, specifying only - Dst net.IP // destination address, receiving only - IfIndex int // interface index, must be 1 <= value when specifying -} - -func (cm *ControlMessage) String() string { - if cm == nil { - return "<nil>" - } - return fmt.Sprintf("ttl: %v, src: %v, dst: %v, ifindex: %v", cm.TTL, cm.Src, cm.Dst, cm.IfIndex) -} - -// Ancillary data socket options -const ( - ctlTTL = iota // header field - ctlSrc // header field - ctlDst // header field - ctlInterface // inbound or outbound interface - ctlPacketInfo // inbound or outbound packet path - ctlMax -) - -// A ctlOpt represents a binding for ancillary data socket option. -type ctlOpt struct { - name int // option name, must be equal or greater than 1 - length int // option length - marshal func([]byte, *ControlMessage) []byte - parse func(*ControlMessage, []byte) -} diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go deleted file mode 100644 index 33d8bc8b..00000000 --- a/vendor/golang.org/x/net/ipv4/control_bsd.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd - -package ipv4 - -import ( - "net" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func marshalDst(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIP - m.Type = sysIP_RECVDSTADDR - m.SetLen(syscall.CmsgLen(net.IPv4len)) - return b[syscall.CmsgSpace(net.IPv4len):] -} - -func parseDst(cm *ControlMessage, b []byte) { - cm.Dst = b[:net.IPv4len] -} - -func marshalInterface(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIP - m.Type = sysIP_RECVIF - m.SetLen(syscall.CmsgLen(syscall.SizeofSockaddrDatalink)) - return b[syscall.CmsgSpace(syscall.SizeofSockaddrDatalink):] -} - -func parseInterface(cm *ControlMessage, b []byte) { - sadl := (*syscall.SockaddrDatalink)(unsafe.Pointer(&b[0])) - cm.IfIndex = int(sadl.Index) -} diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go deleted file mode 100644 index 444782f3..00000000 --- a/vendor/golang.org/x/net/ipv4/control_pktinfo.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin linux - -package ipv4 - -import ( - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIP - m.Type = sysIP_PKTINFO - m.SetLen(syscall.CmsgLen(sysSizeofInetPktinfo)) - if cm != nil { - pi := (*sysInetPktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) - if ip := cm.Src.To4(); ip != nil { - copy(pi.Spec_dst[:], ip) - } - if cm.IfIndex > 0 { - pi.setIfindex(cm.IfIndex) - } - } - return b[syscall.CmsgSpace(sysSizeofInetPktinfo):] -} - -func parsePacketInfo(cm *ControlMessage, b []byte) { - pi := (*sysInetPktinfo)(unsafe.Pointer(&b[0])) - cm.IfIndex = int(pi.Ifindex) - cm.Dst = pi.Addr[:] -} diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go deleted file mode 100644 index 4d850719..00000000 --- a/vendor/golang.org/x/net/ipv4/control_stub.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv4 - -func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { - return errOpNoSupport -} - -func newControlMessage(opt *rawOpt) []byte { - return nil -} - -func parseControlMessage(b []byte) (*ControlMessage, error) { - return nil, errOpNoSupport -} - -func marshalControlMessage(cm *ControlMessage) []byte { - return nil -} diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go deleted file mode 100644 index 3000c52e..00000000 --- a/vendor/golang.org/x/net/ipv4/control_unix.go +++ /dev/null @@ -1,164 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv4 - -import ( - "os" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { - opt.Lock() - defer opt.Unlock() - if cf&FlagTTL != 0 && sockOpts[ssoReceiveTTL].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceiveTTL], boolint(on)); err != nil { - return err - } - if on { - opt.set(FlagTTL) - } else { - opt.clear(FlagTTL) - } - } - if sockOpts[ssoPacketInfo].name > 0 { - if cf&(FlagSrc|FlagDst|FlagInterface) != 0 { - if err := setInt(fd, &sockOpts[ssoPacketInfo], boolint(on)); err != nil { - return err - } - if on { - opt.set(cf & (FlagSrc | FlagDst | FlagInterface)) - } else { - opt.clear(cf & (FlagSrc | FlagDst | FlagInterface)) - } - } - } else { - if cf&FlagDst != 0 && sockOpts[ssoReceiveDst].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceiveDst], boolint(on)); err != nil { - return err - } - if on { - opt.set(FlagDst) - } else { - opt.clear(FlagDst) - } - } - if cf&FlagInterface != 0 && sockOpts[ssoReceiveInterface].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceiveInterface], boolint(on)); err != nil { - return err - } - if on { - opt.set(FlagInterface) - } else { - opt.clear(FlagInterface) - } - } - } - return nil -} - -func newControlMessage(opt *rawOpt) (oob []byte) { - opt.RLock() - var l int - if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlTTL].length) - } - if ctlOpts[ctlPacketInfo].name > 0 { - if opt.isset(FlagSrc | FlagDst | FlagInterface) { - l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) - } - } else { - if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlDst].length) - } - if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlInterface].length) - } - } - if l > 0 { - oob = make([]byte, l) - b := oob - if opt.isset(FlagTTL) && ctlOpts[ctlTTL].name > 0 { - b = ctlOpts[ctlTTL].marshal(b, nil) - } - if ctlOpts[ctlPacketInfo].name > 0 { - if opt.isset(FlagSrc | FlagDst | FlagInterface) { - b = ctlOpts[ctlPacketInfo].marshal(b, nil) - } - } else { - if opt.isset(FlagDst) && ctlOpts[ctlDst].name > 0 { - b = ctlOpts[ctlDst].marshal(b, nil) - } - if opt.isset(FlagInterface) && ctlOpts[ctlInterface].name > 0 { - b = ctlOpts[ctlInterface].marshal(b, nil) - } - } - } - opt.RUnlock() - return -} - -func parseControlMessage(b []byte) (*ControlMessage, error) { - if len(b) == 0 { - return nil, nil - } - cmsgs, err := syscall.ParseSocketControlMessage(b) - if err != nil { - return nil, os.NewSyscallError("parse socket control message", err) - } - cm := &ControlMessage{} - for _, m := range cmsgs { - if m.Header.Level != iana.ProtocolIP { - continue - } - switch int(m.Header.Type) { - case ctlOpts[ctlTTL].name: - ctlOpts[ctlTTL].parse(cm, m.Data[:]) - case ctlOpts[ctlDst].name: - ctlOpts[ctlDst].parse(cm, m.Data[:]) - case ctlOpts[ctlInterface].name: - ctlOpts[ctlInterface].parse(cm, m.Data[:]) - case ctlOpts[ctlPacketInfo].name: - ctlOpts[ctlPacketInfo].parse(cm, m.Data[:]) - } - } - return cm, nil -} - -func marshalControlMessage(cm *ControlMessage) (oob []byte) { - if cm == nil { - return nil - } - var l int - pktinfo := false - if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To4() != nil || cm.IfIndex > 0) { - pktinfo = true - l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) - } - if l > 0 { - oob = make([]byte, l) - b := oob - if pktinfo { - b = ctlOpts[ctlPacketInfo].marshal(b, cm) - } - } - return -} - -func marshalTTL(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIP - m.Type = sysIP_RECVTTL - m.SetLen(syscall.CmsgLen(1)) - return b[syscall.CmsgSpace(1):] -} - -func parseTTL(cm *ControlMessage, b []byte) { - cm.TTL = int(*(*byte)(unsafe.Pointer(&b[:1][0]))) -} diff --git a/vendor/golang.org/x/net/ipv4/control_windows.go b/vendor/golang.org/x/net/ipv4/control_windows.go deleted file mode 100644 index 800f6377..00000000 --- a/vendor/golang.org/x/net/ipv4/control_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import "syscall" - -func setControlMessage(fd syscall.Handle, opt *rawOpt, cf ControlFlags, on bool) error { - // TODO(mikio): implement this - return syscall.EWINDOWS -} - -func newControlMessage(opt *rawOpt) []byte { - // TODO(mikio): implement this - return nil -} - -func parseControlMessage(b []byte) (*ControlMessage, error) { - // TODO(mikio): implement this - return nil, syscall.EWINDOWS -} - -func marshalControlMessage(cm *ControlMessage) []byte { - // TODO(mikio): implement this - return nil -} diff --git a/vendor/golang.org/x/net/ipv4/defs_darwin.go b/vendor/golang.org/x/net/ipv4/defs_darwin.go deleted file mode 100644 index 731d56a7..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_darwin.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <sys/socket.h> - -#include <netinet/in.h> -*/ -import "C" - -const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_STRIPHDR = C.IP_STRIPHDR - sysIP_RECVTTL = C.IP_RECVTTL - sysIP_BOUND_IF = C.IP_BOUND_IF - sysIP_PKTINFO = C.IP_PKTINFO - sysIP_RECVPKTINFO = C.IP_RECVPKTINFO - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF - sysIP_MULTICAST_IFINDEX = C.IP_MULTICAST_IFINDEX - sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP - sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP - sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE - sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE - sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP - sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP - sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP - sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP - sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE - sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req -) - -type sysSockaddrStorage C.struct_sockaddr_storage - -type sysSockaddrInet C.struct_sockaddr_in - -type sysInetPktinfo C.struct_in_pktinfo - -type sysIPMreq C.struct_ip_mreq - -type sysIPMreqn C.struct_ip_mreqn - -type sysIPMreqSource C.struct_ip_mreq_source - -type sysGroupReq C.struct_group_req - -type sysGroupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go b/vendor/golang.org/x/net/ipv4/defs_dragonfly.go deleted file mode 100644 index 08e3b855..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_dragonfly.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <netinet/in.h> -*/ -import "C" - -const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_RECVTTL = C.IP_RECVTTL - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq -) - -type sysIPMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_freebsd.go b/vendor/golang.org/x/net/ipv4/defs_freebsd.go deleted file mode 100644 index f12ca327..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_freebsd.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <sys/socket.h> - -#include <netinet/in.h> -*/ -import "C" - -const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_SENDSRCADDR = C.IP_SENDSRCADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_ONESBCAST = C.IP_ONESBCAST - sysIP_BINDANY = C.IP_BINDANY - sysIP_RECVTTL = C.IP_RECVTTL - sysIP_MINTTL = C.IP_MINTTL - sysIP_DONTFRAG = C.IP_DONTFRAG - sysIP_RECVTOS = C.IP_RECVTOS - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysIP_MULTICAST_VIF = C.IP_MULTICAST_VIF - sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP - sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP - sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE - sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE - sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP - sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP - sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP - sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP - sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE - sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req -) - -type sysSockaddrStorage C.struct_sockaddr_storage - -type sysSockaddrInet C.struct_sockaddr_in - -type sysIPMreq C.struct_ip_mreq - -type sysIPMreqn C.struct_ip_mreqn - -type sysIPMreqSource C.struct_ip_mreq_source - -type sysGroupReq C.struct_group_req - -type sysGroupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv4/defs_linux.go b/vendor/golang.org/x/net/ipv4/defs_linux.go deleted file mode 100644 index fdba148a..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_linux.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <time.h> - -#include <linux/errqueue.h> -#include <linux/icmp.h> -#include <linux/in.h> -*/ -import "C" - -const ( - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_ROUTER_ALERT = C.IP_ROUTER_ALERT - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_PKTINFO = C.IP_PKTINFO - sysIP_PKTOPTIONS = C.IP_PKTOPTIONS - sysIP_MTU_DISCOVER = C.IP_MTU_DISCOVER - sysIP_RECVERR = C.IP_RECVERR - sysIP_RECVTTL = C.IP_RECVTTL - sysIP_RECVTOS = C.IP_RECVTOS - sysIP_MTU = C.IP_MTU - sysIP_FREEBIND = C.IP_FREEBIND - sysIP_TRANSPARENT = C.IP_TRANSPARENT - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_ORIGDSTADDR = C.IP_ORIGDSTADDR - sysIP_RECVORIGDSTADDR = C.IP_RECVORIGDSTADDR - sysIP_MINTTL = C.IP_MINTTL - sysIP_NODEFRAG = C.IP_NODEFRAG - sysIP_UNICAST_IF = C.IP_UNICAST_IF - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE - sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE - sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP - sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP - sysIP_MSFILTER = C.IP_MSFILTER - sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP - sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP - sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP - sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP - sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE - sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - sysMCAST_MSFILTER = C.MCAST_MSFILTER - sysIP_MULTICAST_ALL = C.IP_MULTICAST_ALL - - //sysIP_PMTUDISC_DONT = C.IP_PMTUDISC_DONT - //sysIP_PMTUDISC_WANT = C.IP_PMTUDISC_WANT - //sysIP_PMTUDISC_DO = C.IP_PMTUDISC_DO - //sysIP_PMTUDISC_PROBE = C.IP_PMTUDISC_PROBE - //sysIP_PMTUDISC_INTERFACE = C.IP_PMTUDISC_INTERFACE - //sysIP_PMTUDISC_OMIT = C.IP_PMTUDISC_OMIT - - sysICMP_FILTER = C.ICMP_FILTER - - sysSO_EE_ORIGIN_NONE = C.SO_EE_ORIGIN_NONE - sysSO_EE_ORIGIN_LOCAL = C.SO_EE_ORIGIN_LOCAL - sysSO_EE_ORIGIN_ICMP = C.SO_EE_ORIGIN_ICMP - sysSO_EE_ORIGIN_ICMP6 = C.SO_EE_ORIGIN_ICMP6 - sysSO_EE_ORIGIN_TXSTATUS = C.SO_EE_ORIGIN_TXSTATUS - sysSO_EE_ORIGIN_TIMESTAMPING = C.SO_EE_ORIGIN_TIMESTAMPING - - sysSizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage - sysSizeofSockaddrInet = C.sizeof_struct_sockaddr_in - sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo - sysSizeofSockExtendedErr = C.sizeof_struct_sock_extended_err - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqn = C.sizeof_struct_ip_mreqn - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req - - sysSizeofICMPFilter = C.sizeof_struct_icmp_filter -) - -type sysKernelSockaddrStorage C.struct___kernel_sockaddr_storage - -type sysSockaddrInet C.struct_sockaddr_in - -type sysInetPktinfo C.struct_in_pktinfo - -type sysSockExtendedErr C.struct_sock_extended_err - -type sysIPMreq C.struct_ip_mreq - -type sysIPMreqn C.struct_ip_mreqn - -type sysIPMreqSource C.struct_ip_mreq_source - -type sysGroupReq C.struct_group_req - -type sysGroupSourceReq C.struct_group_source_req - -type sysICMPFilter C.struct_icmp_filter diff --git a/vendor/golang.org/x/net/ipv4/defs_netbsd.go b/vendor/golang.org/x/net/ipv4/defs_netbsd.go deleted file mode 100644 index 8642354f..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_netbsd.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <netinet/in.h> -*/ -import "C" - -const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_RECVTTL = C.IP_RECVTTL - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq -) - -type sysIPMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_openbsd.go b/vendor/golang.org/x/net/ipv4/defs_openbsd.go deleted file mode 100644 index 8642354f..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_openbsd.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <netinet/in.h> -*/ -import "C" - -const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_RECVTTL = C.IP_RECVTTL - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq -) - -type sysIPMreq C.struct_ip_mreq diff --git a/vendor/golang.org/x/net/ipv4/defs_solaris.go b/vendor/golang.org/x/net/ipv4/defs_solaris.go deleted file mode 100644 index bb74afa4..00000000 --- a/vendor/golang.org/x/net/ipv4/defs_solaris.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in_addr [4]byte /* in_addr */ - -package ipv4 - -/* -#include <netinet/in.h> -*/ -import "C" - -const ( - sysIP_OPTIONS = C.IP_OPTIONS - sysIP_HDRINCL = C.IP_HDRINCL - sysIP_TOS = C.IP_TOS - sysIP_TTL = C.IP_TTL - sysIP_RECVOPTS = C.IP_RECVOPTS - sysIP_RECVRETOPTS = C.IP_RECVRETOPTS - sysIP_RECVDSTADDR = C.IP_RECVDSTADDR - sysIP_RETOPTS = C.IP_RETOPTS - sysIP_RECVIF = C.IP_RECVIF - sysIP_RECVSLLA = C.IP_RECVSLLA - sysIP_RECVTTL = C.IP_RECVTTL - sysIP_NEXTHOP = C.IP_NEXTHOP - sysIP_PKTINFO = C.IP_PKTINFO - sysIP_RECVPKTINFO = C.IP_RECVPKTINFO - sysIP_DONTFRAG = C.IP_DONTFRAG - sysIP_BOUND_IF = C.IP_BOUND_IF - sysIP_UNSPEC_SRC = C.IP_UNSPEC_SRC - sysIP_BROADCAST_TTL = C.IP_BROADCAST_TTL - sysIP_DHCPINIT_IF = C.IP_DHCPINIT_IF - - sysIP_MULTICAST_IF = C.IP_MULTICAST_IF - sysIP_MULTICAST_TTL = C.IP_MULTICAST_TTL - sysIP_MULTICAST_LOOP = C.IP_MULTICAST_LOOP - sysIP_ADD_MEMBERSHIP = C.IP_ADD_MEMBERSHIP - sysIP_DROP_MEMBERSHIP = C.IP_DROP_MEMBERSHIP - sysIP_BLOCK_SOURCE = C.IP_BLOCK_SOURCE - sysIP_UNBLOCK_SOURCE = C.IP_UNBLOCK_SOURCE - sysIP_ADD_SOURCE_MEMBERSHIP = C.IP_ADD_SOURCE_MEMBERSHIP - sysIP_DROP_SOURCE_MEMBERSHIP = C.IP_DROP_SOURCE_MEMBERSHIP - - sysSizeofInetPktinfo = C.sizeof_struct_in_pktinfo - - sysSizeofIPMreq = C.sizeof_struct_ip_mreq - sysSizeofIPMreqSource = C.sizeof_struct_ip_mreq_source -) - -type sysInetPktinfo C.struct_in_pktinfo - -type sysIPMreq C.struct_ip_mreq - -type sysIPMreqSource C.struct_ip_mreq_source diff --git a/vendor/golang.org/x/net/ipv4/dgramopt_posix.go b/vendor/golang.org/x/net/ipv4/dgramopt_posix.go deleted file mode 100644 index 103c4f6d..00000000 --- a/vendor/golang.org/x/net/ipv4/dgramopt_posix.go +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd windows - -package ipv4 - -import ( - "net" - "syscall" -) - -// MulticastTTL returns the time-to-live field value for outgoing -// multicast packets. -func (c *dgramOpt) MulticastTTL() (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return 0, err - } - return getInt(fd, &sockOpts[ssoMulticastTTL]) -} - -// SetMulticastTTL sets the time-to-live field value for future -// outgoing multicast packets. -func (c *dgramOpt) SetMulticastTTL(ttl int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoMulticastTTL], ttl) -} - -// MulticastInterface returns the default interface for multicast -// packet transmissions. -func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { - if !c.ok() { - return nil, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return nil, err - } - return getInterface(fd, &sockOpts[ssoMulticastInterface]) -} - -// SetMulticastInterface sets the default interface for future -// multicast packet transmissions. -func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInterface(fd, &sockOpts[ssoMulticastInterface], ifi) -} - -// MulticastLoopback reports whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) MulticastLoopback() (bool, error) { - if !c.ok() { - return false, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return false, err - } - on, err := getInt(fd, &sockOpts[ssoMulticastLoopback]) - if err != nil { - return false, err - } - return on == 1, nil -} - -// SetMulticastLoopback sets whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) SetMulticastLoopback(on bool) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoMulticastLoopback], boolint(on)) -} - -// JoinGroup joins the group address group on the interface ifi. -// By default all sources that can cast data to group are accepted. -// It's possible to mute and unmute data transmission from a specific -// source by using ExcludeSourceSpecificGroup and -// IncludeSourceSpecificGroup. -// JoinGroup uses the system assigned multicast interface when ifi is -// nil, although this is not recommended because the assignment -// depends on platforms and sometimes it might require routing -// configuration. -func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP4(group) - if grp == nil { - return errMissingAddress - } - return setGroup(fd, &sockOpts[ssoJoinGroup], ifi, grp) -} - -// LeaveGroup leaves the group address group on the interface ifi -// regardless of whether the group is any-source group or -// source-specific group. -func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP4(group) - if grp == nil { - return errMissingAddress - } - return setGroup(fd, &sockOpts[ssoLeaveGroup], ifi, grp) -} - -// JoinSourceSpecificGroup joins the source-specific group comprising -// group and source on the interface ifi. -// JoinSourceSpecificGroup uses the system assigned multicast -// interface when ifi is nil, although this is not recommended because -// the assignment depends on platforms and sometimes it might require -// routing configuration. -func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP4(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP4(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoJoinSourceGroup], ifi, grp, src) -} - -// LeaveSourceSpecificGroup leaves the source-specific group on the -// interface ifi. -func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP4(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP4(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoLeaveSourceGroup], ifi, grp, src) -} - -// ExcludeSourceSpecificGroup excludes the source-specific group from -// the already joined any-source groups by JoinGroup on the interface -// ifi. -func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP4(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP4(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoBlockSourceGroup], ifi, grp, src) -} - -// IncludeSourceSpecificGroup includes the excluded source-specific -// group by ExcludeSourceSpecificGroup again on the interface ifi. -func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP4(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP4(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoUnblockSourceGroup], ifi, grp, src) -} - -// ICMPFilter returns an ICMP filter. -// Currently only Linux supports this. -func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { - if !c.ok() { - return nil, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return nil, err - } - return getICMPFilter(fd, &sockOpts[ssoICMPFilter]) -} - -// SetICMPFilter deploys the ICMP filter. -// Currently only Linux supports this. -func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setICMPFilter(fd, &sockOpts[ssoICMPFilter], f) -} diff --git a/vendor/golang.org/x/net/ipv4/dgramopt_stub.go b/vendor/golang.org/x/net/ipv4/dgramopt_stub.go deleted file mode 100644 index b74df693..00000000 --- a/vendor/golang.org/x/net/ipv4/dgramopt_stub.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv4 - -import "net" - -// MulticastTTL returns the time-to-live field value for outgoing -// multicast packets. -func (c *dgramOpt) MulticastTTL() (int, error) { - return 0, errOpNoSupport -} - -// SetMulticastTTL sets the time-to-live field value for future -// outgoing multicast packets. -func (c *dgramOpt) SetMulticastTTL(ttl int) error { - return errOpNoSupport -} - -// MulticastInterface returns the default interface for multicast -// packet transmissions. -func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { - return nil, errOpNoSupport -} - -// SetMulticastInterface sets the default interface for future -// multicast packet transmissions. -func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { - return errOpNoSupport -} - -// MulticastLoopback reports whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) MulticastLoopback() (bool, error) { - return false, errOpNoSupport -} - -// SetMulticastLoopback sets whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) SetMulticastLoopback(on bool) error { - return errOpNoSupport -} - -// JoinGroup joins the group address group on the interface ifi. -// By default all sources that can cast data to group are accepted. -// It's possible to mute and unmute data transmission from a specific -// source by using ExcludeSourceSpecificGroup and -// IncludeSourceSpecificGroup. -// JoinGroup uses the system assigned multicast interface when ifi is -// nil, although this is not recommended because the assignment -// depends on platforms and sometimes it might require routing -// configuration. -func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { - return errOpNoSupport -} - -// LeaveGroup leaves the group address group on the interface ifi -// regardless of whether the group is any-source group or -// source-specific group. -func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { - return errOpNoSupport -} - -// JoinSourceSpecificGroup joins the source-specific group comprising -// group and source on the interface ifi. -// JoinSourceSpecificGroup uses the system assigned multicast -// interface when ifi is nil, although this is not recommended because -// the assignment depends on platforms and sometimes it might require -// routing configuration. -func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// LeaveSourceSpecificGroup leaves the source-specific group on the -// interface ifi. -func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// ExcludeSourceSpecificGroup excludes the source-specific group from -// the already joined any-source groups by JoinGroup on the interface -// ifi. -func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// IncludeSourceSpecificGroup includes the excluded source-specific -// group by ExcludeSourceSpecificGroup again on the interface ifi. -func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// ICMPFilter returns an ICMP filter. -// Currently only Linux supports this. -func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { - return nil, errOpNoSupport -} - -// SetICMPFilter deploys the ICMP filter. -// Currently only Linux supports this. -func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/doc.go b/vendor/golang.org/x/net/ipv4/doc.go deleted file mode 100644 index 9a79badf..00000000 --- a/vendor/golang.org/x/net/ipv4/doc.go +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ipv4 implements IP-level socket options for the Internet -// Protocol version 4. -// -// The package provides IP-level socket options that allow -// manipulation of IPv4 facilities. -// -// The IPv4 protocol and basic host requirements for IPv4 are defined -// in RFC 791 and RFC 1122. -// Host extensions for multicasting and socket interface extensions -// for multicast source filters are defined in RFC 1112 and RFC 3678. -// IGMPv1, IGMPv2 and IGMPv3 are defined in RFC 1112, RFC 2236 and RFC -// 3376. -// Source-specific multicast is defined in RFC 4607. -// -// -// Unicasting -// -// The options for unicasting are available for net.TCPConn, -// net.UDPConn and net.IPConn which are created as network connections -// that use the IPv4 transport. When a single TCP connection carrying -// a data flow of multiple packets needs to indicate the flow is -// important, ipv4.Conn is used to set the type-of-service field on -// the IPv4 header for each packet. -// -// ln, err := net.Listen("tcp4", "0.0.0.0:1024") -// if err != nil { -// // error handling -// } -// defer ln.Close() -// for { -// c, err := ln.Accept() -// if err != nil { -// // error handling -// } -// go func(c net.Conn) { -// defer c.Close() -// -// The outgoing packets will be labeled DiffServ assured forwarding -// class 1 low drop precedence, known as AF11 packets. -// -// if err := ipv4.NewConn(c).SetTOS(0x28); err != nil { -// // error handling -// } -// if _, err := c.Write(data); err != nil { -// // error handling -// } -// }(c) -// } -// -// -// Multicasting -// -// The options for multicasting are available for net.UDPConn and -// net.IPconn which are created as network connections that use the -// IPv4 transport. A few network facilities must be prepared before -// you begin multicasting, at a minimum joining network interfaces and -// multicast groups. -// -// en0, err := net.InterfaceByName("en0") -// if err != nil { -// // error handling -// } -// en1, err := net.InterfaceByIndex(911) -// if err != nil { -// // error handling -// } -// group := net.IPv4(224, 0, 0, 250) -// -// First, an application listens to an appropriate address with an -// appropriate service port. -// -// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") -// if err != nil { -// // error handling -// } -// defer c.Close() -// -// Second, the application joins multicast groups, starts listening to -// the groups on the specified network interfaces. Note that the -// service port for transport layer protocol does not matter with this -// operation as joining groups affects only network and link layer -// protocols, such as IPv4 and Ethernet. -// -// p := ipv4.NewPacketConn(c) -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { -// // error handling -// } -// -// The application might set per packet control message transmissions -// between the protocol stack within the kernel. When the application -// needs a destination address on an incoming packet, -// SetControlMessage of ipv4.PacketConn is used to enable control -// message transmissons. -// -// if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { -// // error handling -// } -// -// The application could identify whether the received packets are -// of interest by using the control message that contains the -// destination address of the received packet. -// -// b := make([]byte, 1500) -// for { -// n, cm, src, err := p.ReadFrom(b) -// if err != nil { -// // error handling -// } -// if cm.Dst.IsMulticast() { -// if cm.Dst.Equal(group) { -// // joined group, do something -// } else { -// // unknown group, discard -// continue -// } -// } -// -// The application can also send both unicast and multicast packets. -// -// p.SetTOS(0x0) -// p.SetTTL(16) -// if _, err := p.WriteTo(data, nil, src); err != nil { -// // error handling -// } -// dst := &net.UDPAddr{IP: group, Port: 1024} -// for _, ifi := range []*net.Interface{en0, en1} { -// if err := p.SetMulticastInterface(ifi); err != nil { -// // error handling -// } -// p.SetMulticastTTL(2) -// if _, err := p.WriteTo(data, nil, dst); err != nil { -// // error handling -// } -// } -// } -// -// -// More multicasting -// -// An application that uses PacketConn or RawConn may join multiple -// multicast groups. For example, a UDP listener with port 1024 might -// join two different groups across over two different network -// interfaces by using: -// -// c, err := net.ListenPacket("udp4", "0.0.0.0:1024") -// if err != nil { -// // error handling -// } -// defer c.Close() -// p := ipv4.NewPacketConn(c) -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}); err != nil { -// // error handling -// } -// -// It is possible for multiple UDP listeners that listen on the same -// UDP port to join the same multicast group. The net package will -// provide a socket that listens to a wildcard address with reusable -// UDP port when an appropriate multicast address prefix is passed to -// the net.ListenPacket or net.ListenUDP. -// -// c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") -// if err != nil { -// // error handling -// } -// defer c1.Close() -// c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") -// if err != nil { -// // error handling -// } -// defer c2.Close() -// p1 := ipv4.NewPacketConn(c1) -// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { -// // error handling -// } -// p2 := ipv4.NewPacketConn(c2) -// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { -// // error handling -// } -// -// Also it is possible for the application to leave or rejoin a -// multicast group on the network interface. -// -// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 248)}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}); err != nil { -// // error handling -// } -// -// -// Source-specific multicasting -// -// An application that uses PacketConn or RawConn on IGMPv3 supported -// platform is able to join source-specific multicast groups. -// The application may use JoinSourceSpecificGroup and -// LeaveSourceSpecificGroup for the operation known as "include" mode, -// -// ssmgroup := net.UDPAddr{IP: net.IPv4(232, 7, 8, 9)} -// ssmsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 1)}) -// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { -// // error handling -// } -// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { -// // error handling -// } -// -// or JoinGroup, ExcludeSourceSpecificGroup, -// IncludeSourceSpecificGroup and LeaveGroup for the operation known -// as "exclude" mode. -// -// exclsource := net.UDPAddr{IP: net.IPv4(192, 168, 0, 254)} -// if err := p.JoinGroup(en0, &ssmgroup); err != nil { -// // error handling -// } -// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { -// // error handling -// } -// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { -// // error handling -// } -// -// Note that it depends on each platform implementation what happens -// when an application which runs on IGMPv3 unsupported platform uses -// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. -// In general the platform tries to fall back to conversations using -// IGMPv1 or IGMPv2 and starts to listen to multicast traffic. -// In the fallback case, ExcludeSourceSpecificGroup and -// IncludeSourceSpecificGroup may return an error. -package ipv4 // import "golang.org/x/net/ipv4" diff --git a/vendor/golang.org/x/net/ipv4/endpoint.go b/vendor/golang.org/x/net/ipv4/endpoint.go deleted file mode 100644 index bc45bf05..00000000 --- a/vendor/golang.org/x/net/ipv4/endpoint.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "syscall" - "time" -) - -// A Conn represents a network endpoint that uses the IPv4 transport. -// It is used to control basic IP-level socket options such as TOS and -// TTL. -type Conn struct { - genericOpt -} - -type genericOpt struct { - net.Conn -} - -func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } - -// NewConn returns a new Conn. -func NewConn(c net.Conn) *Conn { - return &Conn{ - genericOpt: genericOpt{Conn: c}, - } -} - -// A PacketConn represents a packet network endpoint that uses the -// IPv4 transport. It is used to control several IP-level socket -// options including multicasting. It also provides datagram based -// network I/O methods specific to the IPv4 and higher layer protocols -// such as UDP. -type PacketConn struct { - genericOpt - dgramOpt - payloadHandler -} - -type dgramOpt struct { - net.PacketConn -} - -func (c *dgramOpt) ok() bool { return c != nil && c.PacketConn != nil } - -// SetControlMessage sets the per packet IP-level socket options. -func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - fd, err := c.payloadHandler.sysfd() - if err != nil { - return err - } - return setControlMessage(fd, &c.payloadHandler.rawOpt, cf, on) -} - -// SetDeadline sets the read and write deadlines associated with the -// endpoint. -func (c *PacketConn) SetDeadline(t time.Time) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.PacketConn.SetDeadline(t) -} - -// SetReadDeadline sets the read deadline associated with the -// endpoint. -func (c *PacketConn) SetReadDeadline(t time.Time) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.PacketConn.SetReadDeadline(t) -} - -// SetWriteDeadline sets the write deadline associated with the -// endpoint. -func (c *PacketConn) SetWriteDeadline(t time.Time) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.PacketConn.SetWriteDeadline(t) -} - -// Close closes the endpoint. -func (c *PacketConn) Close() error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.PacketConn.Close() -} - -// NewPacketConn returns a new PacketConn using c as its underlying -// transport. -func NewPacketConn(c net.PacketConn) *PacketConn { - p := &PacketConn{ - genericOpt: genericOpt{Conn: c.(net.Conn)}, - dgramOpt: dgramOpt{PacketConn: c}, - payloadHandler: payloadHandler{PacketConn: c}, - } - if _, ok := c.(*net.IPConn); ok && sockOpts[ssoStripHeader].name > 0 { - if fd, err := p.payloadHandler.sysfd(); err == nil { - setInt(fd, &sockOpts[ssoStripHeader], boolint(true)) - } - } - return p -} - -// A RawConn represents a packet network endpoint that uses the IPv4 -// transport. It is used to control several IP-level socket options -// including IPv4 header manipulation. It also provides datagram -// based network I/O methods specific to the IPv4 and higher layer -// protocols that handle IPv4 datagram directly such as OSPF, GRE. -type RawConn struct { - genericOpt - dgramOpt - packetHandler -} - -// SetControlMessage sets the per packet IP-level socket options. -func (c *RawConn) SetControlMessage(cf ControlFlags, on bool) error { - if !c.packetHandler.ok() { - return syscall.EINVAL - } - fd, err := c.packetHandler.sysfd() - if err != nil { - return err - } - return setControlMessage(fd, &c.packetHandler.rawOpt, cf, on) -} - -// SetDeadline sets the read and write deadlines associated with the -// endpoint. -func (c *RawConn) SetDeadline(t time.Time) error { - if !c.packetHandler.ok() { - return syscall.EINVAL - } - return c.packetHandler.c.SetDeadline(t) -} - -// SetReadDeadline sets the read deadline associated with the -// endpoint. -func (c *RawConn) SetReadDeadline(t time.Time) error { - if !c.packetHandler.ok() { - return syscall.EINVAL - } - return c.packetHandler.c.SetReadDeadline(t) -} - -// SetWriteDeadline sets the write deadline associated with the -// endpoint. -func (c *RawConn) SetWriteDeadline(t time.Time) error { - if !c.packetHandler.ok() { - return syscall.EINVAL - } - return c.packetHandler.c.SetWriteDeadline(t) -} - -// Close closes the endpoint. -func (c *RawConn) Close() error { - if !c.packetHandler.ok() { - return syscall.EINVAL - } - return c.packetHandler.c.Close() -} - -// NewRawConn returns a new RawConn using c as its underlying -// transport. -func NewRawConn(c net.PacketConn) (*RawConn, error) { - r := &RawConn{ - genericOpt: genericOpt{Conn: c.(net.Conn)}, - dgramOpt: dgramOpt{PacketConn: c}, - packetHandler: packetHandler{c: c.(*net.IPConn)}, - } - fd, err := r.packetHandler.sysfd() - if err != nil { - return nil, err - } - if err := setInt(fd, &sockOpts[ssoHeaderPrepend], boolint(true)); err != nil { - return nil, err - } - return r, nil -} diff --git a/vendor/golang.org/x/net/ipv4/example_test.go b/vendor/golang.org/x/net/ipv4/example_test.go deleted file mode 100644 index 2fdc6c60..00000000 --- a/vendor/golang.org/x/net/ipv4/example_test.go +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "fmt" - "log" - "net" - "os" - "runtime" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/ipv4" -) - -func ExampleConn_markingTCP() { - ln, err := net.Listen("tcp4", "0.0.0.0:1024") - if err != nil { - log.Fatal(err) - } - defer ln.Close() - - for { - c, err := ln.Accept() - if err != nil { - log.Fatal(err) - } - go func(c net.Conn) { - defer c.Close() - p := ipv4.NewConn(c) - if err := p.SetTOS(0x28); err != nil { // DSCP AF11 - log.Fatal(err) - } - if err := p.SetTTL(128); err != nil { - log.Fatal(err) - } - if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { - log.Fatal(err) - } - }(c) - } -} - -func ExamplePacketConn_servingOneShotMulticastDNS() { - c, err := net.ListenPacket("udp4", "0.0.0.0:5353") // mDNS over UDP - if err != nil { - log.Fatal(err) - } - defer c.Close() - p := ipv4.NewPacketConn(c) - - en0, err := net.InterfaceByName("en0") - if err != nil { - log.Fatal(err) - } - mDNSLinkLocal := net.UDPAddr{IP: net.IPv4(224, 0, 0, 251)} - if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { - log.Fatal(err) - } - defer p.LeaveGroup(en0, &mDNSLinkLocal) - if err := p.SetControlMessage(ipv4.FlagDst, true); err != nil { - log.Fatal(err) - } - - b := make([]byte, 1500) - for { - _, cm, peer, err := p.ReadFrom(b) - if err != nil { - log.Fatal(err) - } - if !cm.Dst.IsMulticast() || !cm.Dst.Equal(mDNSLinkLocal.IP) { - continue - } - answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this - if _, err := p.WriteTo(answers, nil, peer); err != nil { - log.Fatal(err) - } - } -} - -func ExamplePacketConn_tracingIPPacketRoute() { - // Tracing an IP packet route to www.google.com. - - const host = "www.google.com" - ips, err := net.LookupIP(host) - if err != nil { - log.Fatal(err) - } - var dst net.IPAddr - for _, ip := range ips { - if ip.To4() != nil { - dst.IP = ip - fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) - break - } - } - if dst.IP == nil { - log.Fatal("no A record found") - } - - c, err := net.ListenPacket("ip4:1", "0.0.0.0") // ICMP for IPv4 - if err != nil { - log.Fatal(err) - } - defer c.Close() - p := ipv4.NewPacketConn(c) - - if err := p.SetControlMessage(ipv4.FlagTTL|ipv4.FlagSrc|ipv4.FlagDst|ipv4.FlagInterface, true); err != nil { - log.Fatal(err) - } - wm := icmp.Message{ - Type: ipv4.ICMPTypeEcho, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, - Data: []byte("HELLO-R-U-THERE"), - }, - } - - rb := make([]byte, 1500) - for i := 1; i <= 64; i++ { // up to 64 hops - wm.Body.(*icmp.Echo).Seq = i - wb, err := wm.Marshal(nil) - if err != nil { - log.Fatal(err) - } - if err := p.SetTTL(i); err != nil { - log.Fatal(err) - } - - // In the real world usually there are several - // multiple traffic-engineered paths for each hop. - // You may need to probe a few times to each hop. - begin := time.Now() - if _, err := p.WriteTo(wb, nil, &dst); err != nil { - log.Fatal(err) - } - if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { - log.Fatal(err) - } - n, cm, peer, err := p.ReadFrom(rb) - if err != nil { - if err, ok := err.(net.Error); ok && err.Timeout() { - fmt.Printf("%v\t*\n", i) - continue - } - log.Fatal(err) - } - rm, err := icmp.ParseMessage(1, rb[:n]) - if err != nil { - log.Fatal(err) - } - rtt := time.Since(begin) - - // In the real world you need to determine whether the - // received message is yours using ControlMessage.Src, - // ControlMessage.Dst, icmp.Echo.ID and icmp.Echo.Seq. - switch rm.Type { - case ipv4.ICMPTypeTimeExceeded: - names, _ := net.LookupAddr(peer.String()) - fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) - case ipv4.ICMPTypeEchoReply: - names, _ := net.LookupAddr(peer.String()) - fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, cm) - return - default: - log.Printf("unknown ICMP message: %+v\n", rm) - } - } -} - -func ExampleRawConn_advertisingOSPFHello() { - c, err := net.ListenPacket("ip4:89", "0.0.0.0") // OSPF for IPv4 - if err != nil { - log.Fatal(err) - } - defer c.Close() - r, err := ipv4.NewRawConn(c) - if err != nil { - log.Fatal(err) - } - - en0, err := net.InterfaceByName("en0") - if err != nil { - log.Fatal(err) - } - allSPFRouters := net.IPAddr{IP: net.IPv4(224, 0, 0, 5)} - if err := r.JoinGroup(en0, &allSPFRouters); err != nil { - log.Fatal(err) - } - defer r.LeaveGroup(en0, &allSPFRouters) - - hello := make([]byte, 24) // fake hello data, you need to implement this - ospf := make([]byte, 24) // fake ospf header, you need to implement this - ospf[0] = 2 // version 2 - ospf[1] = 1 // hello packet - ospf = append(ospf, hello...) - iph := &ipv4.Header{ - Version: ipv4.Version, - Len: ipv4.HeaderLen, - TOS: 0xc0, // DSCP CS6 - TotalLen: ipv4.HeaderLen + len(ospf), - TTL: 1, - Protocol: 89, - Dst: allSPFRouters.IP.To4(), - } - - var cm *ipv4.ControlMessage - switch runtime.GOOS { - case "darwin", "linux": - cm = &ipv4.ControlMessage{IfIndex: en0.Index} - default: - if err := r.SetMulticastInterface(en0); err != nil { - log.Fatal(err) - } - } - if err := r.WriteTo(iph, ospf, cm); err != nil { - log.Fatal(err) - } -} diff --git a/vendor/golang.org/x/net/ipv4/gen.go b/vendor/golang.org/x/net/ipv4/gen.go deleted file mode 100644 index 8cef7b3b..00000000 --- a/vendor/golang.org/x/net/ipv4/gen.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -//go:generate go run gen.go - -// This program generates system adaptation constants and types, -// internet protocol constants and tables by reading template files -// and IANA protocol registries. -package main - -import ( - "bytes" - "encoding/xml" - "fmt" - "go/format" - "io" - "io/ioutil" - "net/http" - "os" - "os/exec" - "runtime" - "strconv" - "strings" -) - -func main() { - if err := genzsys(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if err := geniana(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func genzsys() error { - defs := "defs_" + runtime.GOOS + ".go" - f, err := os.Open(defs) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - f.Close() - cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) - b, err := cmd.Output() - if err != nil { - return err - } - // The ipv4 pacakge still supports go1.2, and so we need to - // take care of additional platforms in go1.3 and above for - // working with go1.2. - switch { - case runtime.GOOS == "dragonfly" || runtime.GOOS == "solaris": - b = bytes.Replace(b, []byte("package ipv4\n"), []byte("// +build "+runtime.GOOS+"\n\npackage ipv4\n"), 1) - case runtime.GOOS == "linux" && (runtime.GOARCH == "arm64" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le"): - b = bytes.Replace(b, []byte("package ipv4\n"), []byte("// +build "+runtime.GOOS+","+runtime.GOARCH+"\n\npackage ipv4\n"), 1) - } - b, err = format.Source(b) - if err != nil { - return err - } - zsys := "zsys_" + runtime.GOOS + ".go" - switch runtime.GOOS { - case "freebsd", "linux": - zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" - } - if err := ioutil.WriteFile(zsys, b, 0644); err != nil { - return err - } - return nil -} - -var registries = []struct { - url string - parse func(io.Writer, io.Reader) error -}{ - { - "http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml", - parseICMPv4Parameters, - }, -} - -func geniana() error { - var bb bytes.Buffer - fmt.Fprintf(&bb, "// go generate gen.go\n") - fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") - fmt.Fprintf(&bb, "package ipv4\n\n") - for _, r := range registries { - resp, err := http.Get(r.url) - if err != nil { - return err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) - } - if err := r.parse(&bb, resp.Body); err != nil { - return err - } - fmt.Fprintf(&bb, "\n") - } - b, err := format.Source(bb.Bytes()) - if err != nil { - return err - } - if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { - return err - } - return nil -} - -func parseICMPv4Parameters(w io.Writer, r io.Reader) error { - dec := xml.NewDecoder(r) - var icp icmpv4Parameters - if err := dec.Decode(&icp); err != nil { - return err - } - prs := icp.escape() - fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) - fmt.Fprintf(w, "const (\n") - for _, pr := range prs { - if pr.Descr == "" { - continue - } - fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Descr, pr.Value) - fmt.Fprintf(w, "// %s\n", pr.OrigDescr) - } - fmt.Fprintf(w, ")\n\n") - fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) - fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") - for _, pr := range prs { - if pr.Descr == "" { - continue - } - fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigDescr)) - } - fmt.Fprintf(w, "}\n") - return nil -} - -type icmpv4Parameters struct { - XMLName xml.Name `xml:"registry"` - Title string `xml:"title"` - Updated string `xml:"updated"` - Registries []struct { - Title string `xml:"title"` - Records []struct { - Value string `xml:"value"` - Descr string `xml:"description"` - } `xml:"record"` - } `xml:"registry"` -} - -type canonICMPv4ParamRecord struct { - OrigDescr string - Descr string - Value int -} - -func (icp *icmpv4Parameters) escape() []canonICMPv4ParamRecord { - id := -1 - for i, r := range icp.Registries { - if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { - id = i - break - } - } - if id < 0 { - return nil - } - prs := make([]canonICMPv4ParamRecord, len(icp.Registries[id].Records)) - sr := strings.NewReplacer( - "Messages", "", - "Message", "", - "ICMP", "", - "+", "P", - "-", "", - "/", "", - ".", "", - " ", "", - ) - for i, pr := range icp.Registries[id].Records { - if strings.Contains(pr.Descr, "Reserved") || - strings.Contains(pr.Descr, "Unassigned") || - strings.Contains(pr.Descr, "Deprecated") || - strings.Contains(pr.Descr, "Experiment") || - strings.Contains(pr.Descr, "experiment") { - continue - } - ss := strings.Split(pr.Descr, "\n") - if len(ss) > 1 { - prs[i].Descr = strings.Join(ss, " ") - } else { - prs[i].Descr = ss[0] - } - s := strings.TrimSpace(prs[i].Descr) - prs[i].OrigDescr = s - prs[i].Descr = sr.Replace(s) - prs[i].Value, _ = strconv.Atoi(pr.Value) - } - return prs -} diff --git a/vendor/golang.org/x/net/ipv4/genericopt_posix.go b/vendor/golang.org/x/net/ipv4/genericopt_posix.go deleted file mode 100644 index fefa0be3..00000000 --- a/vendor/golang.org/x/net/ipv4/genericopt_posix.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd windows - -package ipv4 - -import "syscall" - -// TOS returns the type-of-service field value for outgoing packets. -func (c *genericOpt) TOS() (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return 0, err - } - return getInt(fd, &sockOpts[ssoTOS]) -} - -// SetTOS sets the type-of-service field value for future outgoing -// packets. -func (c *genericOpt) SetTOS(tos int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoTOS], tos) -} - -// TTL returns the time-to-live field value for outgoing packets. -func (c *genericOpt) TTL() (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return 0, err - } - return getInt(fd, &sockOpts[ssoTTL]) -} - -// SetTTL sets the time-to-live field value for future outgoing -// packets. -func (c *genericOpt) SetTTL(ttl int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoTTL], ttl) -} diff --git a/vendor/golang.org/x/net/ipv4/genericopt_stub.go b/vendor/golang.org/x/net/ipv4/genericopt_stub.go deleted file mode 100644 index 1817badb..00000000 --- a/vendor/golang.org/x/net/ipv4/genericopt_stub.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv4 - -// TOS returns the type-of-service field value for outgoing packets. -func (c *genericOpt) TOS() (int, error) { - return 0, errOpNoSupport -} - -// SetTOS sets the type-of-service field value for future outgoing -// packets. -func (c *genericOpt) SetTOS(tos int) error { - return errOpNoSupport -} - -// TTL returns the time-to-live field value for outgoing packets. -func (c *genericOpt) TTL() (int, error) { - return 0, errOpNoSupport -} - -// SetTTL sets the time-to-live field value for future outgoing -// packets. -func (c *genericOpt) SetTTL(ttl int) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/header.go b/vendor/golang.org/x/net/ipv4/header.go deleted file mode 100644 index b22336cf..00000000 --- a/vendor/golang.org/x/net/ipv4/header.go +++ /dev/null @@ -1,149 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "errors" - "fmt" - "net" - "runtime" - "syscall" - "unsafe" -) - -var ( - errMissingAddress = errors.New("missing address") - errMissingHeader = errors.New("missing header") - errHeaderTooShort = errors.New("header too short") - errBufferTooShort = errors.New("buffer too short") - errInvalidConnType = errors.New("invalid conn type") -) - -const ( - Version = 4 // protocol version - HeaderLen = 20 // header length without extension headers - maxHeaderLen = 60 // sensible default, revisit if later RFCs define new usage of version and header length fields -) - -type HeaderFlags int - -const ( - MoreFragments HeaderFlags = 1 << iota // more fragments flag - DontFragment // don't fragment flag -) - -// A Header represents an IPv4 header. -type Header struct { - Version int // protocol version - Len int // header length - TOS int // type-of-service - TotalLen int // packet total length - ID int // identification - Flags HeaderFlags // flags - FragOff int // fragment offset - TTL int // time-to-live - Protocol int // next protocol - Checksum int // checksum - Src net.IP // source address - Dst net.IP // destination address - Options []byte // options, extension headers -} - -func (h *Header) String() string { - if h == nil { - return "<nil>" - } - return fmt.Sprintf("ver: %v, hdrlen: %v, tos: %#x, totallen: %v, id: %#x, flags: %#x, fragoff: %#x, ttl: %v, proto: %v, cksum: %#x, src: %v, dst: %v", h.Version, h.Len, h.TOS, h.TotalLen, h.ID, h.Flags, h.FragOff, h.TTL, h.Protocol, h.Checksum, h.Src, h.Dst) -} - -// Marshal returns the binary encoding of the IPv4 header h. -func (h *Header) Marshal() ([]byte, error) { - if h == nil { - return nil, syscall.EINVAL - } - if h.Len < HeaderLen { - return nil, errHeaderTooShort - } - hdrlen := HeaderLen + len(h.Options) - b := make([]byte, hdrlen) - b[0] = byte(Version<<4 | (hdrlen >> 2 & 0x0f)) - b[1] = byte(h.TOS) - flagsAndFragOff := (h.FragOff & 0x1fff) | int(h.Flags<<13) - switch runtime.GOOS { - case "darwin", "dragonfly", "freebsd", "netbsd": - // TODO(mikio): fix potential misaligned memory access - *(*uint16)(unsafe.Pointer(&b[2:3][0])) = uint16(h.TotalLen) - *(*uint16)(unsafe.Pointer(&b[6:7][0])) = uint16(flagsAndFragOff) - default: - b[2], b[3] = byte(h.TotalLen>>8), byte(h.TotalLen) - b[6], b[7] = byte(flagsAndFragOff>>8), byte(flagsAndFragOff) - } - b[4], b[5] = byte(h.ID>>8), byte(h.ID) - b[8] = byte(h.TTL) - b[9] = byte(h.Protocol) - b[10], b[11] = byte(h.Checksum>>8), byte(h.Checksum) - if ip := h.Src.To4(); ip != nil { - copy(b[12:16], ip[:net.IPv4len]) - } - if ip := h.Dst.To4(); ip != nil { - copy(b[16:20], ip[:net.IPv4len]) - } else { - return nil, errMissingAddress - } - if len(h.Options) > 0 { - copy(b[HeaderLen:], h.Options) - } - return b, nil -} - -// See http://www.freebsd.org/doc/en/books/porters-handbook/freebsd-versions.html. -var freebsdVersion uint32 - -// ParseHeader parses b as an IPv4 header. -func ParseHeader(b []byte) (*Header, error) { - if len(b) < HeaderLen { - return nil, errHeaderTooShort - } - hdrlen := int(b[0]&0x0f) << 2 - if hdrlen > len(b) { - return nil, errBufferTooShort - } - h := &Header{ - Version: int(b[0] >> 4), - Len: hdrlen, - TOS: int(b[1]), - ID: int(b[4])<<8 | int(b[5]), - TTL: int(b[8]), - Protocol: int(b[9]), - Checksum: int(b[10])<<8 | int(b[11]), - Src: net.IPv4(b[12], b[13], b[14], b[15]), - Dst: net.IPv4(b[16], b[17], b[18], b[19]), - } - switch runtime.GOOS { - case "darwin", "dragonfly", "netbsd": - // TODO(mikio): fix potential misaligned memory access - h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[2:3][0]))) + hdrlen - // TODO(mikio): fix potential misaligned memory access - h.FragOff = int(*(*uint16)(unsafe.Pointer(&b[6:7][0]))) - case "freebsd": - // TODO(mikio): fix potential misaligned memory access - h.TotalLen = int(*(*uint16)(unsafe.Pointer(&b[2:3][0]))) - if freebsdVersion < 1000000 { - h.TotalLen += hdrlen - } - // TODO(mikio): fix potential misaligned memory access - h.FragOff = int(*(*uint16)(unsafe.Pointer(&b[6:7][0]))) - default: - h.TotalLen = int(b[2])<<8 | int(b[3]) - h.FragOff = int(b[6])<<8 | int(b[7]) - } - h.Flags = HeaderFlags(h.FragOff&0xe000) >> 13 - h.FragOff = h.FragOff & 0x1fff - if hdrlen-HeaderLen > 0 { - h.Options = make([]byte, hdrlen-HeaderLen) - copy(h.Options, b[HeaderLen:]) - } - return h, nil -} diff --git a/vendor/golang.org/x/net/ipv4/header_test.go b/vendor/golang.org/x/net/ipv4/header_test.go deleted file mode 100644 index 416be6b3..00000000 --- a/vendor/golang.org/x/net/ipv4/header_test.go +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "bytes" - "net" - "reflect" - "runtime" - "testing" -) - -var ( - wireHeaderFromKernel = [HeaderLen]byte{ - 0x45, 0x01, 0xbe, 0xef, - 0xca, 0xfe, 0x45, 0xdc, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - wireHeaderToKernel = [HeaderLen]byte{ - 0x45, 0x01, 0xbe, 0xef, - 0xca, 0xfe, 0x45, 0xdc, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - wireHeaderFromTradBSDKernel = [HeaderLen]byte{ - 0x45, 0x01, 0xdb, 0xbe, - 0xca, 0xfe, 0xdc, 0x45, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - wireHeaderFromFreeBSD10Kernel = [HeaderLen]byte{ - 0x45, 0x01, 0xef, 0xbe, - 0xca, 0xfe, 0xdc, 0x45, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - wireHeaderToTradBSDKernel = [HeaderLen]byte{ - 0x45, 0x01, 0xef, 0xbe, - 0xca, 0xfe, 0xdc, 0x45, - 0xff, 0x01, 0xde, 0xad, - 172, 16, 254, 254, - 192, 168, 0, 1, - } - // TODO(mikio): Add platform dependent wire header formats when - // we support new platforms. - - testHeader = &Header{ - Version: Version, - Len: HeaderLen, - TOS: 1, - TotalLen: 0xbeef, - ID: 0xcafe, - Flags: DontFragment, - FragOff: 1500, - TTL: 255, - Protocol: 1, - Checksum: 0xdead, - Src: net.IPv4(172, 16, 254, 254), - Dst: net.IPv4(192, 168, 0, 1), - } -) - -func TestMarshalHeader(t *testing.T) { - b, err := testHeader.Marshal() - if err != nil { - t.Fatal(err) - } - var wh []byte - switch runtime.GOOS { - case "darwin", "dragonfly", "netbsd": - wh = wireHeaderToTradBSDKernel[:] - case "freebsd": - if freebsdVersion < 1000000 { - wh = wireHeaderToTradBSDKernel[:] - } else { - wh = wireHeaderFromFreeBSD10Kernel[:] - } - default: - wh = wireHeaderToKernel[:] - } - if !bytes.Equal(b, wh) { - t.Fatalf("got %#v; want %#v", b, wh) - } -} - -func TestParseHeader(t *testing.T) { - var wh []byte - switch runtime.GOOS { - case "darwin", "dragonfly", "netbsd": - wh = wireHeaderFromTradBSDKernel[:] - case "freebsd": - if freebsdVersion < 1000000 { - wh = wireHeaderFromTradBSDKernel[:] - } else { - wh = wireHeaderFromFreeBSD10Kernel[:] - } - default: - wh = wireHeaderFromKernel[:] - } - h, err := ParseHeader(wh) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(h, testHeader) { - t.Fatalf("got %#v; want %#v", h, testHeader) - } -} diff --git a/vendor/golang.org/x/net/ipv4/helper.go b/vendor/golang.org/x/net/ipv4/helper.go deleted file mode 100644 index 20c2d247..00000000 --- a/vendor/golang.org/x/net/ipv4/helper.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "errors" - "net" -) - -var ( - errOpNoSupport = errors.New("operation not supported") - errNoSuchInterface = errors.New("no such interface") - errNoSuchMulticastInterface = errors.New("no such multicast interface") -) - -func boolint(b bool) int { - if b { - return 1 - } - return 0 -} - -func netAddrToIP4(a net.Addr) net.IP { - switch v := a.(type) { - case *net.UDPAddr: - if ip := v.IP.To4(); ip != nil { - return ip - } - case *net.IPAddr: - if ip := v.IP.To4(); ip != nil { - return ip - } - } - return nil -} diff --git a/vendor/golang.org/x/net/ipv4/helper_stub.go b/vendor/golang.org/x/net/ipv4/helper_stub.go deleted file mode 100644 index dc2120cf..00000000 --- a/vendor/golang.org/x/net/ipv4/helper_stub.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv4 - -func (c *genericOpt) sysfd() (int, error) { - return 0, errOpNoSupport -} - -func (c *dgramOpt) sysfd() (int, error) { - return 0, errOpNoSupport -} - -func (c *payloadHandler) sysfd() (int, error) { - return 0, errOpNoSupport -} - -func (c *packetHandler) sysfd() (int, error) { - return 0, errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/helper_unix.go b/vendor/golang.org/x/net/ipv4/helper_unix.go deleted file mode 100644 index 345ca7dc..00000000 --- a/vendor/golang.org/x/net/ipv4/helper_unix.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv4 - -import ( - "net" - "reflect" -) - -func (c *genericOpt) sysfd() (int, error) { - switch p := c.Conn.(type) { - case *net.TCPConn, *net.UDPConn, *net.IPConn: - return sysfd(p) - } - return 0, errInvalidConnType -} - -func (c *dgramOpt) sysfd() (int, error) { - switch p := c.PacketConn.(type) { - case *net.UDPConn, *net.IPConn: - return sysfd(p.(net.Conn)) - } - return 0, errInvalidConnType -} - -func (c *payloadHandler) sysfd() (int, error) { - return sysfd(c.PacketConn.(net.Conn)) -} - -func (c *packetHandler) sysfd() (int, error) { - return sysfd(c.c) -} - -func sysfd(c net.Conn) (int, error) { - cv := reflect.ValueOf(c) - switch ce := cv.Elem(); ce.Kind() { - case reflect.Struct: - netfd := ce.FieldByName("conn").FieldByName("fd") - switch fe := netfd.Elem(); fe.Kind() { - case reflect.Struct: - fd := fe.FieldByName("sysfd") - return int(fd.Int()), nil - } - } - return 0, errInvalidConnType -} diff --git a/vendor/golang.org/x/net/ipv4/helper_windows.go b/vendor/golang.org/x/net/ipv4/helper_windows.go deleted file mode 100644 index 322b2a5e..00000000 --- a/vendor/golang.org/x/net/ipv4/helper_windows.go +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "reflect" - "syscall" -) - -func (c *genericOpt) sysfd() (syscall.Handle, error) { - switch p := c.Conn.(type) { - case *net.TCPConn, *net.UDPConn, *net.IPConn: - return sysfd(p) - } - return syscall.InvalidHandle, errInvalidConnType -} - -func (c *dgramOpt) sysfd() (syscall.Handle, error) { - switch p := c.PacketConn.(type) { - case *net.UDPConn, *net.IPConn: - return sysfd(p.(net.Conn)) - } - return syscall.InvalidHandle, errInvalidConnType -} - -func (c *payloadHandler) sysfd() (syscall.Handle, error) { - return sysfd(c.PacketConn.(net.Conn)) -} - -func (c *packetHandler) sysfd() (syscall.Handle, error) { - return sysfd(c.c) -} - -func sysfd(c net.Conn) (syscall.Handle, error) { - cv := reflect.ValueOf(c) - switch ce := cv.Elem(); ce.Kind() { - case reflect.Struct: - netfd := ce.FieldByName("conn").FieldByName("fd") - switch fe := netfd.Elem(); fe.Kind() { - case reflect.Struct: - fd := fe.FieldByName("sysfd") - return syscall.Handle(fd.Uint()), nil - } - } - return syscall.InvalidHandle, errInvalidConnType -} diff --git a/vendor/golang.org/x/net/ipv4/iana.go b/vendor/golang.org/x/net/ipv4/iana.go deleted file mode 100644 index be10c948..00000000 --- a/vendor/golang.org/x/net/ipv4/iana.go +++ /dev/null @@ -1,34 +0,0 @@ -// go generate gen.go -// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT - -package ipv4 - -// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 -const ( - ICMPTypeEchoReply ICMPType = 0 // Echo Reply - ICMPTypeDestinationUnreachable ICMPType = 3 // Destination Unreachable - ICMPTypeRedirect ICMPType = 5 // Redirect - ICMPTypeEcho ICMPType = 8 // Echo - ICMPTypeRouterAdvertisement ICMPType = 9 // Router Advertisement - ICMPTypeRouterSolicitation ICMPType = 10 // Router Solicitation - ICMPTypeTimeExceeded ICMPType = 11 // Time Exceeded - ICMPTypeParameterProblem ICMPType = 12 // Parameter Problem - ICMPTypeTimestamp ICMPType = 13 // Timestamp - ICMPTypeTimestampReply ICMPType = 14 // Timestamp Reply - ICMPTypePhoturis ICMPType = 40 // Photuris -) - -// Internet Control Message Protocol (ICMP) Parameters, Updated: 2013-04-19 -var icmpTypes = map[ICMPType]string{ - 0: "echo reply", - 3: "destination unreachable", - 5: "redirect", - 8: "echo", - 9: "router advertisement", - 10: "router solicitation", - 11: "time exceeded", - 12: "parameter problem", - 13: "timestamp", - 14: "timestamp reply", - 40: "photuris", -} diff --git a/vendor/golang.org/x/net/ipv4/icmp.go b/vendor/golang.org/x/net/ipv4/icmp.go deleted file mode 100644 index dbd05cff..00000000 --- a/vendor/golang.org/x/net/ipv4/icmp.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import "golang.org/x/net/internal/iana" - -// An ICMPType represents a type of ICMP message. -type ICMPType int - -func (typ ICMPType) String() string { - s, ok := icmpTypes[typ] - if !ok { - return "<nil>" - } - return s -} - -// Protocol returns the ICMPv4 protocol number. -func (typ ICMPType) Protocol() int { - return iana.ProtocolICMP -} - -// An ICMPFilter represents an ICMP message filter for incoming -// packets. The filter belongs to a packet delivery path on a host and -// it cannot interact with forwarding packets or tunnel-outer packets. -// -// Note: RFC 2460 defines a reasonable role model and it works not -// only for IPv6 but IPv4. A node means a device that implements IP. -// A router means a node that forwards IP packets not explicitly -// addressed to itself, and a host means a node that is not a router. -type ICMPFilter struct { - sysICMPFilter -} - -// Accept accepts incoming ICMP packets including the type field value -// typ. -func (f *ICMPFilter) Accept(typ ICMPType) { - f.accept(typ) -} - -// Block blocks incoming ICMP packets including the type field value -// typ. -func (f *ICMPFilter) Block(typ ICMPType) { - f.block(typ) -} - -// SetAll sets the filter action to the filter. -func (f *ICMPFilter) SetAll(block bool) { - f.setAll(block) -} - -// WillBlock reports whether the ICMP type will be blocked. -func (f *ICMPFilter) WillBlock(typ ICMPType) bool { - return f.willBlock(typ) -} diff --git a/vendor/golang.org/x/net/ipv4/icmp_linux.go b/vendor/golang.org/x/net/ipv4/icmp_linux.go deleted file mode 100644 index c9122533..00000000 --- a/vendor/golang.org/x/net/ipv4/icmp_linux.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -func (f *sysICMPFilter) accept(typ ICMPType) { - f.Data &^= 1 << (uint32(typ) & 31) -} - -func (f *sysICMPFilter) block(typ ICMPType) { - f.Data |= 1 << (uint32(typ) & 31) -} - -func (f *sysICMPFilter) setAll(block bool) { - if block { - f.Data = 1<<32 - 1 - } else { - f.Data = 0 - } -} - -func (f *sysICMPFilter) willBlock(typ ICMPType) bool { - return f.Data&(1<<(uint32(typ)&31)) != 0 -} diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go deleted file mode 100644 index 9ee9b6a3..00000000 --- a/vendor/golang.org/x/net/ipv4/icmp_stub.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !linux - -package ipv4 - -const sysSizeofICMPFilter = 0x0 - -type sysICMPFilter struct { -} - -func (f *sysICMPFilter) accept(typ ICMPType) { -} - -func (f *sysICMPFilter) block(typ ICMPType) { -} - -func (f *sysICMPFilter) setAll(block bool) { -} - -func (f *sysICMPFilter) willBlock(typ ICMPType) bool { - return false -} diff --git a/vendor/golang.org/x/net/ipv4/icmp_test.go b/vendor/golang.org/x/net/ipv4/icmp_test.go deleted file mode 100644 index 3324b54d..00000000 --- a/vendor/golang.org/x/net/ipv4/icmp_test.go +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "net" - "reflect" - "runtime" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -var icmpStringTests = []struct { - in ipv4.ICMPType - out string -}{ - {ipv4.ICMPTypeDestinationUnreachable, "destination unreachable"}, - - {256, "<nil>"}, -} - -func TestICMPString(t *testing.T) { - for _, tt := range icmpStringTests { - s := tt.in.String() - if s != tt.out { - t.Errorf("got %s; want %s", s, tt.out) - } - } -} - -func TestICMPFilter(t *testing.T) { - switch runtime.GOOS { - case "linux": - default: - t.Skipf("not supported on %s", runtime.GOOS) - } - - var f ipv4.ICMPFilter - for _, toggle := range []bool{false, true} { - f.SetAll(toggle) - for _, typ := range []ipv4.ICMPType{ - ipv4.ICMPTypeDestinationUnreachable, - ipv4.ICMPTypeEchoReply, - ipv4.ICMPTypeTimeExceeded, - ipv4.ICMPTypeParameterProblem, - } { - f.Accept(typ) - if f.WillBlock(typ) { - t.Errorf("ipv4.ICMPFilter.Set(%v, false) failed", typ) - } - f.Block(typ) - if !f.WillBlock(typ) { - t.Errorf("ipv4.ICMPFilter.Set(%v, true) failed", typ) - } - } - } -} - -func TestSetICMPFilter(t *testing.T) { - switch runtime.GOOS { - case "linux": - default: - t.Skipf("not supported on %s", runtime.GOOS) - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv4.NewPacketConn(c) - - var f ipv4.ICMPFilter - f.SetAll(true) - f.Accept(ipv4.ICMPTypeEcho) - f.Accept(ipv4.ICMPTypeEchoReply) - if err := p.SetICMPFilter(&f); err != nil { - t.Fatal(err) - } - kf, err := p.ICMPFilter() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(kf, &f) { - t.Fatalf("got %#v; want %#v", kf, f) - } -} diff --git a/vendor/golang.org/x/net/ipv4/mocktransponder_test.go b/vendor/golang.org/x/net/ipv4/mocktransponder_test.go deleted file mode 100644 index e55aaee9..00000000 --- a/vendor/golang.org/x/net/ipv4/mocktransponder_test.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "net" - "testing" -) - -func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { - defer func() { done <- true }() - - c, err := ln.Accept() - if err != nil { - t.Error(err) - return - } - c.Close() -} diff --git a/vendor/golang.org/x/net/ipv4/multicast_test.go b/vendor/golang.org/x/net/ipv4/multicast_test.go deleted file mode 100644 index 3f030483..00000000 --- a/vendor/golang.org/x/net/ipv4/multicast_test.go +++ /dev/null @@ -1,334 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "bytes" - "net" - "os" - "runtime" - "testing" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -var packetConnReadWriteMulticastUDPTests = []struct { - addr string - grp, src *net.UDPAddr -}{ - {"224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 - - {"232.0.1.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 -} - -func TestPacketConnReadWriteMulticastUDP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - for _, tt := range packetConnReadWriteMulticastUDPTests { - c, err := net.ListenPacket("udp4", tt.addr) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - grp := *tt.grp - grp.Port = c.LocalAddr().(*net.UDPAddr).Port - p := ipv4.NewPacketConn(c) - defer p.Close() - if tt.src == nil { - if err := p.JoinGroup(ifi, &grp); err != nil { - t.Fatal(err) - } - defer p.LeaveGroup(ifi, &grp) - } else { - if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support IGMPv2/3 fail here - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) - } - if err := p.SetMulticastInterface(ifi); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastInterface(); err != nil { - t.Fatal(err) - } - if err := p.SetMulticastLoopback(true); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastLoopback(); err != nil { - t.Fatal(err) - } - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface - wb := []byte("HELLO-R-U-THERE") - - for i, toggle := range []bool{true, false, true} { - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { - t.Fatal(err) - } - p.SetMulticastTTL(i + 1) - if n, err := p.WriteTo(wb, nil, &grp); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Fatal(err) - } else if !bytes.Equal(rb[:n], wb) { - t.Fatalf("got %v; want %v", rb[:n], wb) - } else { - t.Logf("rcvd cmsg: %v", cm) - } - } - } -} - -var packetConnReadWriteMulticastICMPTests = []struct { - grp, src *net.IPAddr -}{ - {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 - - {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 -} - -func TestPacketConnReadWriteMulticastICMP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - for _, tt := range packetConnReadWriteMulticastICMPTests { - c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv4.NewPacketConn(c) - defer p.Close() - if tt.src == nil { - if err := p.JoinGroup(ifi, tt.grp); err != nil { - t.Fatal(err) - } - defer p.LeaveGroup(ifi, tt.grp) - } else { - if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support IGMPv2/3 fail here - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) - } - if err := p.SetMulticastInterface(ifi); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastInterface(); err != nil { - t.Fatal(err) - } - if err := p.SetMulticastLoopback(true); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastLoopback(); err != nil { - t.Fatal(err) - } - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface - - for i, toggle := range []bool{true, false, true} { - wb, err := (&icmp.Message{ - Type: ipv4.ICMPTypeEcho, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: i + 1, - Data: []byte("HELLO-R-U-THERE"), - }, - }).Marshal(nil) - if err != nil { - t.Fatal(err) - } - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { - t.Fatal(err) - } - p.SetMulticastTTL(i + 1) - if n, err := p.WriteTo(wb, nil, tt.grp); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Fatal(err) - } else { - t.Logf("rcvd cmsg: %v", cm) - m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) - if err != nil { - t.Fatal(err) - } - switch { - case m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 - case m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 - default: - t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) - } - } - } - } -} - -var rawConnReadWriteMulticastICMPTests = []struct { - grp, src *net.IPAddr -}{ - {&net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727 - - {&net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 -} - -func TestRawConnReadWriteMulticastICMP(t *testing.T) { - if testing.Short() { - t.Skip("to avoid external network") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - for _, tt := range rawConnReadWriteMulticastICMPTests { - c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - r, err := ipv4.NewRawConn(c) - if err != nil { - t.Fatal(err) - } - defer r.Close() - if tt.src == nil { - if err := r.JoinGroup(ifi, tt.grp); err != nil { - t.Fatal(err) - } - defer r.LeaveGroup(ifi, tt.grp) - } else { - if err := r.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support IGMPv2/3 fail here - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - defer r.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) - } - if err := r.SetMulticastInterface(ifi); err != nil { - t.Fatal(err) - } - if _, err := r.MulticastInterface(); err != nil { - t.Fatal(err) - } - if err := r.SetMulticastLoopback(true); err != nil { - t.Fatal(err) - } - if _, err := r.MulticastLoopback(); err != nil { - t.Fatal(err) - } - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface - - for i, toggle := range []bool{true, false, true} { - wb, err := (&icmp.Message{ - Type: ipv4.ICMPTypeEcho, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: i + 1, - Data: []byte("HELLO-R-U-THERE"), - }, - }).Marshal(nil) - if err != nil { - t.Fatal(err) - } - wh := &ipv4.Header{ - Version: ipv4.Version, - Len: ipv4.HeaderLen, - TOS: i + 1, - TotalLen: ipv4.HeaderLen + len(wb), - Protocol: 1, - Dst: tt.grp.IP, - } - if err := r.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - if err := r.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { - t.Fatal(err) - } - r.SetMulticastTTL(i + 1) - if err := r.WriteTo(wh, wb, nil); err != nil { - t.Fatal(err) - } - rb := make([]byte, ipv4.HeaderLen+128) - if rh, b, cm, err := r.ReadFrom(rb); err != nil { - t.Fatal(err) - } else { - t.Logf("rcvd cmsg: %v", cm) - m, err := icmp.ParseMessage(iana.ProtocolICMP, b) - if err != nil { - t.Fatal(err) - } - switch { - case (rh.Dst.IsLoopback() || rh.Dst.IsLinkLocalUnicast() || rh.Dst.IsGlobalUnicast()) && m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1 - case rh.Dst.IsMulticast() && m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0 - default: - t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) - } - } - } - } -} diff --git a/vendor/golang.org/x/net/ipv4/multicastlistener_test.go b/vendor/golang.org/x/net/ipv4/multicastlistener_test.go deleted file mode 100644 index e342bf1d..00000000 --- a/vendor/golang.org/x/net/ipv4/multicastlistener_test.go +++ /dev/null @@ -1,249 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -var udpMultipleGroupListenerTests = []net.Addr{ - &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, // see RFC 4727 - &net.UDPAddr{IP: net.IPv4(224, 0, 0, 250)}, - &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, -} - -func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if testing.Short() { - t.Skip("to avoid external network") - } - - for _, gaddr := range udpMultipleGroupListenerTests { - c, err := net.ListenPacket("udp4", "0.0.0.0:0") // wildcard address with no reusable port - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv4.NewPacketConn(c) - var mift []*net.Interface - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { - continue - } - if err := p.JoinGroup(&ifi, gaddr); err != nil { - t.Fatal(err) - } - mift = append(mift, &ift[i]) - } - for _, ifi := range mift { - if err := p.LeaveGroup(ifi, gaddr); err != nil { - t.Fatal(err) - } - } - } -} - -func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if testing.Short() { - t.Skip("to avoid external network") - } - - for _, gaddr := range udpMultipleGroupListenerTests { - c1, err := net.ListenPacket("udp4", "224.0.0.0:1024") // wildcard address with reusable port - if err != nil { - t.Fatal(err) - } - defer c1.Close() - - c2, err := net.ListenPacket("udp4", "224.0.0.0:1024") // wildcard address with reusable port - if err != nil { - t.Fatal(err) - } - defer c2.Close() - - var ps [2]*ipv4.PacketConn - ps[0] = ipv4.NewPacketConn(c1) - ps[1] = ipv4.NewPacketConn(c2) - var mift []*net.Interface - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { - continue - } - for _, p := range ps { - if err := p.JoinGroup(&ifi, gaddr); err != nil { - t.Fatal(err) - } - } - mift = append(mift, &ift[i]) - } - for _, ifi := range mift { - for _, p := range ps { - if err := p.LeaveGroup(ifi, gaddr); err != nil { - t.Fatal(err) - } - } - } - } -} - -func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if testing.Short() { - t.Skip("to avoid external network") - } - - gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 - type ml struct { - c *ipv4.PacketConn - ifi *net.Interface - } - var mlt []*ml - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - ip, ok := nettest.IsMulticastCapable("ip4", &ifi) - if !ok { - continue - } - c, err := net.ListenPacket("udp4", ip.String()+":"+"1024") // unicast address with non-reusable port - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv4.NewPacketConn(c) - if err := p.JoinGroup(&ifi, &gaddr); err != nil { - t.Fatal(err) - } - mlt = append(mlt, &ml{p, &ift[i]}) - } - for _, m := range mlt { - if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { - t.Fatal(err) - } - } -} - -func TestIPSingleRawConnWithSingleGroupListener(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if testing.Short() { - t.Skip("to avoid external network") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") // wildcard address - if err != nil { - t.Fatal(err) - } - defer c.Close() - - r, err := ipv4.NewRawConn(c) - if err != nil { - t.Fatal(err) - } - gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 - var mift []*net.Interface - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - if _, ok := nettest.IsMulticastCapable("ip4", &ifi); !ok { - continue - } - if err := r.JoinGroup(&ifi, &gaddr); err != nil { - t.Fatal(err) - } - mift = append(mift, &ift[i]) - } - for _, ifi := range mift { - if err := r.LeaveGroup(ifi, &gaddr); err != nil { - t.Fatal(err) - } - } -} - -func TestIPPerInterfaceSingleRawConnWithSingleGroupListener(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if testing.Short() { - t.Skip("to avoid external network") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - gaddr := net.IPAddr{IP: net.IPv4(224, 0, 0, 254)} // see RFC 4727 - type ml struct { - c *ipv4.RawConn - ifi *net.Interface - } - var mlt []*ml - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - ip, ok := nettest.IsMulticastCapable("ip4", &ifi) - if !ok { - continue - } - c, err := net.ListenPacket("ip4:253", ip.String()) // unicast address - if err != nil { - t.Fatal(err) - } - defer c.Close() - r, err := ipv4.NewRawConn(c) - if err != nil { - t.Fatal(err) - } - if err := r.JoinGroup(&ifi, &gaddr); err != nil { - t.Fatal(err) - } - mlt = append(mlt, &ml{r, &ift[i]}) - } - for _, m := range mlt { - if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { - t.Fatal(err) - } - } -} diff --git a/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go b/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go deleted file mode 100644 index c76dbe4d..00000000 --- a/vendor/golang.org/x/net/ipv4/multicastsockopt_test.go +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -var packetConnMulticastSocketOptionTests = []struct { - net, proto, addr string - grp, src net.Addr -}{ - {"udp4", "", "224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 249)}, nil}, // see RFC 4727 - {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 - - {"udp4", "", "232.0.0.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 249)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 - {"ip4", ":icmp", "0.0.0.0", &net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 -} - -func TestPacketConnMulticastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris": - t.Skipf("not supported on %s", runtime.GOOS) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - m, ok := nettest.SupportsRawIPSocket() - for _, tt := range packetConnMulticastSocketOptionTests { - if tt.net == "ip4" && !ok { - t.Log(m) - continue - } - c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv4.NewPacketConn(c) - defer p.Close() - - if tt.src == nil { - testMulticastSocketOptions(t, p, ifi, tt.grp) - } else { - testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) - } - } -} - -var rawConnMulticastSocketOptionTests = []struct { - grp, src net.Addr -}{ - {&net.IPAddr{IP: net.IPv4(224, 0, 0, 250)}, nil}, // see RFC 4727 - - {&net.IPAddr{IP: net.IPv4(232, 0, 1, 250)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771 -} - -func TestRawConnMulticastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris": - t.Skipf("not supported on %s", runtime.GOOS) - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - for _, tt := range rawConnMulticastSocketOptionTests { - c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - r, err := ipv4.NewRawConn(c) - if err != nil { - t.Fatal(err) - } - defer r.Close() - - if tt.src == nil { - testMulticastSocketOptions(t, r, ifi, tt.grp) - } else { - testSourceSpecificMulticastSocketOptions(t, r, ifi, tt.grp, tt.src) - } - } -} - -type testIPv4MulticastConn interface { - MulticastTTL() (int, error) - SetMulticastTTL(ttl int) error - MulticastLoopback() (bool, error) - SetMulticastLoopback(bool) error - JoinGroup(*net.Interface, net.Addr) error - LeaveGroup(*net.Interface, net.Addr) error - JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error - LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error - ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error - IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error -} - -func testMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp net.Addr) { - const ttl = 255 - if err := c.SetMulticastTTL(ttl); err != nil { - t.Error(err) - return - } - if v, err := c.MulticastTTL(); err != nil { - t.Error(err) - return - } else if v != ttl { - t.Errorf("got %v; want %v", v, ttl) - return - } - - for _, toggle := range []bool{true, false} { - if err := c.SetMulticastLoopback(toggle); err != nil { - t.Error(err) - return - } - if v, err := c.MulticastLoopback(); err != nil { - t.Error(err) - return - } else if v != toggle { - t.Errorf("got %v; want %v", v, toggle) - return - } - } - - if err := c.JoinGroup(ifi, grp); err != nil { - t.Error(err) - return - } - if err := c.LeaveGroup(ifi, grp); err != nil { - t.Error(err) - return - } -} - -func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv4MulticastConn, ifi *net.Interface, grp, src net.Addr) { - // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP - if err := c.JoinGroup(ifi, grp); err != nil { - t.Error(err) - return - } - if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support IGMPv2/3 fail here - t.Logf("not supported on %s", runtime.GOOS) - return - } - t.Error(err) - return - } - if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - if err := c.LeaveGroup(ifi, grp); err != nil { - t.Error(err) - return - } - - // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP - if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - - // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP - if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - if err := c.LeaveGroup(ifi, grp); err != nil { - t.Error(err) - return - } -} diff --git a/vendor/golang.org/x/net/ipv4/packet.go b/vendor/golang.org/x/net/ipv4/packet.go deleted file mode 100644 index 09864314..00000000 --- a/vendor/golang.org/x/net/ipv4/packet.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "syscall" -) - -// A packetHandler represents the IPv4 datagram handler. -type packetHandler struct { - c *net.IPConn - rawOpt -} - -func (c *packetHandler) ok() bool { return c != nil && c.c != nil } - -// ReadFrom reads an IPv4 datagram from the endpoint c, copying the -// datagram into b. It returns the received datagram as the IPv4 -// header h, the payload p and the control message cm. -func (c *packetHandler) ReadFrom(b []byte) (h *Header, p []byte, cm *ControlMessage, err error) { - if !c.ok() { - return nil, nil, nil, syscall.EINVAL - } - oob := newControlMessage(&c.rawOpt) - n, oobn, _, src, err := c.c.ReadMsgIP(b, oob) - if err != nil { - return nil, nil, nil, err - } - var hs []byte - if hs, p, err = slicePacket(b[:n]); err != nil { - return nil, nil, nil, err - } - if h, err = ParseHeader(hs); err != nil { - return nil, nil, nil, err - } - if cm, err = parseControlMessage(oob[:oobn]); err != nil { - return nil, nil, nil, err - } - if src != nil && cm != nil { - cm.Src = src.IP - } - return -} - -func slicePacket(b []byte) (h, p []byte, err error) { - if len(b) < HeaderLen { - return nil, nil, errHeaderTooShort - } - hdrlen := int(b[0]&0x0f) << 2 - return b[:hdrlen], b[hdrlen:], nil -} - -// WriteTo writes an IPv4 datagram through the endpoint c, copying the -// datagram from the IPv4 header h and the payload p. The control -// message cm allows the datagram path and the outgoing interface to be -// specified. Currently only Darwin and Linux support this. The cm -// may be nil if control of the outgoing datagram is not required. -// -// The IPv4 header h must contain appropriate fields that include: -// -// Version = ipv4.Version -// Len = <must be specified> -// TOS = <must be specified> -// TotalLen = <must be specified> -// ID = platform sets an appropriate value if ID is zero -// FragOff = <must be specified> -// TTL = <must be specified> -// Protocol = <must be specified> -// Checksum = platform sets an appropriate value if Checksum is zero -// Src = platform sets an appropriate value if Src is nil -// Dst = <must be specified> -// Options = optional -func (c *packetHandler) WriteTo(h *Header, p []byte, cm *ControlMessage) error { - if !c.ok() { - return syscall.EINVAL - } - oob := marshalControlMessage(cm) - wh, err := h.Marshal() - if err != nil { - return err - } - dst := &net.IPAddr{} - if cm != nil { - if ip := cm.Dst.To4(); ip != nil { - dst.IP = ip - } - } - if dst.IP == nil { - dst.IP = h.Dst - } - wh = append(wh, p...) - _, _, err = c.c.WriteMsgIP(wh, oob, dst) - return err -} diff --git a/vendor/golang.org/x/net/ipv4/payload.go b/vendor/golang.org/x/net/ipv4/payload.go deleted file mode 100644 index d7698cbd..00000000 --- a/vendor/golang.org/x/net/ipv4/payload.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import "net" - -// A payloadHandler represents the IPv4 datagram payload handler. -type payloadHandler struct { - net.PacketConn - rawOpt -} - -func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil } diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go deleted file mode 100644 index d358fc3a..00000000 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !plan9,!solaris,!windows - -package ipv4 - -import ( - "net" - "syscall" -) - -// ReadFrom reads a payload of the received IPv4 datagram, from the -// endpoint c, copying the payload into b. It returns the number of -// bytes copied into b, the control message cm and the source address -// src of the received datagram. -func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { - if !c.ok() { - return 0, nil, nil, syscall.EINVAL - } - oob := newControlMessage(&c.rawOpt) - var oobn int - switch c := c.PacketConn.(type) { - case *net.UDPConn: - if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { - return 0, nil, nil, err - } - case *net.IPConn: - if sockOpts[ssoStripHeader].name > 0 { - if n, oobn, _, src, err = c.ReadMsgIP(b, oob); err != nil { - return 0, nil, nil, err - } - } else { - nb := make([]byte, maxHeaderLen+len(b)) - if n, oobn, _, src, err = c.ReadMsgIP(nb, oob); err != nil { - return 0, nil, nil, err - } - hdrlen := int(nb[0]&0x0f) << 2 - copy(b, nb[hdrlen:]) - n -= hdrlen - } - default: - return 0, nil, nil, errInvalidConnType - } - if cm, err = parseControlMessage(oob[:oobn]); err != nil { - return 0, nil, nil, err - } - if cm != nil { - cm.Src = netAddrToIP4(src) - } - return -} - -// WriteTo writes a payload of the IPv4 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows -// the datagram path and the outgoing interface to be specified. -// Currently only Darwin and Linux support this. The cm may be nil if -// control of the outgoing datagram is not required. -func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { - if !c.ok() { - return 0, syscall.EINVAL - } - oob := marshalControlMessage(cm) - if dst == nil { - return 0, errMissingAddress - } - switch c := c.PacketConn.(type) { - case *net.UDPConn: - n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) - case *net.IPConn: - n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) - default: - return 0, errInvalidConnType - } - if err != nil { - return 0, err - } - return -} diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go deleted file mode 100644 index d128c9c2..00000000 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build plan9 solaris windows - -package ipv4 - -import ( - "net" - "syscall" -) - -// ReadFrom reads a payload of the received IPv4 datagram, from the -// endpoint c, copying the payload into b. It returns the number of -// bytes copied into b, the control message cm and the source address -// src of the received datagram. -func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { - if !c.ok() { - return 0, nil, nil, syscall.EINVAL - } - if n, src, err = c.PacketConn.ReadFrom(b); err != nil { - return 0, nil, nil, err - } - return -} - -// WriteTo writes a payload of the IPv4 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows -// the datagram path and the outgoing interface to be specified. -// Currently only Darwin and Linux support this. The cm may be nil if -// control of the outgoing datagram is not required. -func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { - if !c.ok() { - return 0, syscall.EINVAL - } - if dst == nil { - return 0, errMissingAddress - } - return c.PacketConn.WriteTo(b, dst) -} diff --git a/vendor/golang.org/x/net/ipv4/readwrite_test.go b/vendor/golang.org/x/net/ipv4/readwrite_test.go deleted file mode 100644 index 5e6533ef..00000000 --- a/vendor/golang.org/x/net/ipv4/readwrite_test.go +++ /dev/null @@ -1,170 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "bytes" - "net" - "runtime" - "sync" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -func benchmarkUDPListener() (net.PacketConn, net.Addr, error) { - c, err := net.ListenPacket("udp4", "127.0.0.1:0") - if err != nil { - return nil, nil, err - } - dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) - if err != nil { - c.Close() - return nil, nil, err - } - return c, dst, nil -} - -func BenchmarkReadWriteNetUDP(b *testing.B) { - c, dst, err := benchmarkUDPListener() - if err != nil { - b.Fatal(err) - } - defer c.Close() - - wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) - b.ResetTimer() - for i := 0; i < b.N; i++ { - benchmarkReadWriteNetUDP(b, c, wb, rb, dst) - } -} - -func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) { - if _, err := c.WriteTo(wb, dst); err != nil { - b.Fatal(err) - } - if _, _, err := c.ReadFrom(rb); err != nil { - b.Fatal(err) - } -} - -func BenchmarkReadWriteIPv4UDP(b *testing.B) { - c, dst, err := benchmarkUDPListener() - if err != nil { - b.Fatal(err) - } - defer c.Close() - - p := ipv4.NewPacketConn(c) - defer p.Close() - cf := ipv4.FlagTTL | ipv4.FlagInterface - if err := p.SetControlMessage(cf, true); err != nil { - b.Fatal(err) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - - wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) - b.ResetTimer() - for i := 0; i < b.N; i++ { - benchmarkReadWriteIPv4UDP(b, p, wb, rb, dst, ifi) - } -} - -func benchmarkReadWriteIPv4UDP(b *testing.B, p *ipv4.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { - cm := ipv4.ControlMessage{TTL: 1} - if ifi != nil { - cm.IfIndex = ifi.Index - } - if n, err := p.WriteTo(wb, &cm, dst); err != nil { - b.Fatal(err) - } else if n != len(wb) { - b.Fatalf("got %v; want %v", n, len(wb)) - } - if _, _, _, err := p.ReadFrom(rb); err != nil { - b.Fatal(err) - } -} - -func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - - c, err := net.ListenPacket("udp4", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv4.NewPacketConn(c) - defer p.Close() - - dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) - if err != nil { - t.Fatal(err) - } - - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - cf := ipv4.FlagTTL | ipv4.FlagSrc | ipv4.FlagDst | ipv4.FlagInterface - wb := []byte("HELLO-R-U-THERE") - - if err := p.SetControlMessage(cf, true); err != nil { // probe before test - if nettest.ProtocolNotSupported(err) { - t.Skipf("not supported on %s", runtime.GOOS) - } - t.Fatal(err) - } - - var wg sync.WaitGroup - reader := func() { - defer wg.Done() - rb := make([]byte, 128) - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Error(err) - return - } else if !bytes.Equal(rb[:n], wb) { - t.Errorf("got %v; want %v", rb[:n], wb) - return - } else { - t.Logf("rcvd cmsg: %v", cm) - } - } - writer := func(toggle bool) { - defer wg.Done() - cm := ipv4.ControlMessage{ - Src: net.IPv4(127, 0, 0, 1), - } - if ifi != nil { - cm.IfIndex = ifi.Index - } - if err := p.SetControlMessage(cf, toggle); err != nil { - t.Error(err) - return - } - if n, err := p.WriteTo(wb, &cm, dst); err != nil { - t.Error(err) - return - } else if n != len(wb) { - t.Errorf("short write: %v", n) - return - } - } - - const N = 10 - wg.Add(N) - for i := 0; i < N; i++ { - go reader() - } - wg.Add(2 * N) - for i := 0; i < 2*N; i++ { - go writer(i%2 != 0) - } - wg.Add(N) - for i := 0; i < N; i++ { - go reader() - } - wg.Wait() -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt.go b/vendor/golang.org/x/net/ipv4/sockopt.go deleted file mode 100644 index ace37d30..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -// Sticky socket options -const ( - ssoTOS = iota // header field for unicast packet - ssoTTL // header field for unicast packet - ssoMulticastTTL // header field for multicast packet - ssoMulticastInterface // outbound interface for multicast packet - ssoMulticastLoopback // loopback for multicast packet - ssoReceiveTTL // header field on received packet - ssoReceiveDst // header field on received packet - ssoReceiveInterface // inbound interface on received packet - ssoPacketInfo // incbound or outbound packet path - ssoHeaderPrepend // ipv4 header prepend - ssoStripHeader // strip ipv4 header - ssoICMPFilter // icmp filter - ssoJoinGroup // any-source multicast - ssoLeaveGroup // any-source multicast - ssoJoinSourceGroup // source-specific multicast - ssoLeaveSourceGroup // source-specific multicast - ssoBlockSourceGroup // any-source or source-specific multicast - ssoUnblockSourceGroup // any-source or source-specific multicast - ssoMax -) - -// Sticky socket option value types -const ( - ssoTypeByte = iota + 1 - ssoTypeInt - ssoTypeInterface - ssoTypeICMPFilter - ssoTypeIPMreq - ssoTypeIPMreqn - ssoTypeGroupReq - ssoTypeGroupSourceReq -) - -// A sockOpt represents a binding for sticky socket option. -type sockOpt struct { - name int // option name, must be equal or greater than 1 - typ int // option value type, must be equal or greater than 1 -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go deleted file mode 100644 index 4a6aa78e..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd windows - -package ipv4 - -import "net" - -func setIPMreqInterface(mreq *sysIPMreq, ifi *net.Interface) error { - if ifi == nil { - return nil - } - ifat, err := ifi.Addrs() - if err != nil { - return err - } - for _, ifa := range ifat { - switch ifa := ifa.(type) { - case *net.IPAddr: - if ip := ifa.IP.To4(); ip != nil { - copy(mreq.Interface[:], ip) - return nil - } - case *net.IPNet: - if ip := ifa.IP.To4(); ip != nil { - copy(mreq.Interface[:], ip) - return nil - } - } - } - return errNoSuchInterface -} - -func netIP4ToInterface(ip net.IP) (*net.Interface, error) { - ift, err := net.Interfaces() - if err != nil { - return nil, err - } - for _, ifi := range ift { - ifat, err := ifi.Addrs() - if err != nil { - return nil, err - } - for _, ifa := range ifat { - switch ifa := ifa.(type) { - case *net.IPAddr: - if ip.Equal(ifa.IP) { - return &ifi, nil - } - case *net.IPNet: - if ip.Equal(ifa.IP) { - return &ifi, nil - } - } - } - } - return nil, errNoSuchInterface -} - -func netInterfaceToIP4(ifi *net.Interface) (net.IP, error) { - if ifi == nil { - return net.IPv4zero.To4(), nil - } - ifat, err := ifi.Addrs() - if err != nil { - return nil, err - } - for _, ifa := range ifat { - switch ifa := ifa.(type) { - case *net.IPAddr: - if ip := ifa.IP.To4(); ip != nil { - return ip, nil - } - case *net.IPNet: - if ip := ifa.IP.To4(); ip != nil { - return ip, nil - } - } - } - return nil, errNoSuchInterface -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go deleted file mode 100644 index 45551528..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_stub.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!windows - -package ipv4 - -import "net" - -func setsockoptIPMreq(fd, name int, ifi *net.Interface, grp net.IP) error { - return errOpNoSupport -} - -func getsockoptInterface(fd, name int) (*net.Interface, error) { - return nil, errOpNoSupport -} - -func setsockoptInterface(fd, name int, ifi *net.Interface) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_unix.go deleted file mode 100644 index fefa901e..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_unix.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd - -package ipv4 - -import ( - "net" - "os" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func setsockoptIPMreq(fd, name int, ifi *net.Interface, grp net.IP) error { - mreq := sysIPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} - if err := setIPMreqInterface(&mreq, ifi); err != nil { - return err - } - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreq), sysSizeofIPMreq)) -} - -func getsockoptInterface(fd, name int) (*net.Interface, error) { - var b [4]byte - l := sysSockoptLen(4) - if err := getsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&b[0]), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) - if err != nil { - return nil, err - } - return ifi, nil -} - -func setsockoptInterface(fd, name int, ifi *net.Interface) error { - ip, err := netInterfaceToIP4(ifi) - if err != nil { - return err - } - var b [4]byte - copy(b[:], ip) - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&b[0]), sysSockoptLen(4))) -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_windows.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreq_windows.go deleted file mode 100644 index 431930df..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreq_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "os" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func setsockoptIPMreq(fd syscall.Handle, name int, ifi *net.Interface, grp net.IP) error { - mreq := sysIPMreq{Multiaddr: [4]byte{grp[0], grp[1], grp[2], grp[3]}} - if err := setIPMreqInterface(&mreq, ifi); err != nil { - return err - } - return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, iana.ProtocolIP, int32(name), (*byte)(unsafe.Pointer(&mreq)), int32(sysSizeofIPMreq))) -} - -func getsockoptInterface(fd syscall.Handle, name int) (*net.Interface, error) { - var b [4]byte - l := int32(4) - if err := syscall.Getsockopt(fd, iana.ProtocolIP, int32(name), (*byte)(unsafe.Pointer(&b[0])), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - ifi, err := netIP4ToInterface(net.IPv4(b[0], b[1], b[2], b[3])) - if err != nil { - return nil, err - } - return ifi, nil -} - -func setsockoptInterface(fd syscall.Handle, name int, ifi *net.Interface) error { - ip, err := netInterfaceToIP4(ifi) - if err != nil { - return err - } - var b [4]byte - copy(b[:], ip) - return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, iana.ProtocolIP, int32(name), (*byte)(unsafe.Pointer(&b[0])), 4)) -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_stub.go deleted file mode 100644 index 332f403e..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_stub.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !darwin,!freebsd,!linux,!windows - -package ipv4 - -import "net" - -func getsockoptIPMreqn(fd, name int) (*net.Interface, error) { - return nil, errOpNoSupport -} - -func setsockoptIPMreqn(fd, name int, ifi *net.Interface, grp net.IP) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go deleted file mode 100644 index 92c8e34c..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_asmreqn_unix.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin freebsd linux - -package ipv4 - -import ( - "net" - "os" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func getsockoptIPMreqn(fd, name int) (*net.Interface, error) { - var mreqn sysIPMreqn - l := sysSockoptLen(sysSizeofIPMreqn) - if err := getsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - if mreqn.Ifindex == 0 { - return nil, nil - } - ifi, err := net.InterfaceByIndex(int(mreqn.Ifindex)) - if err != nil { - return nil, err - } - return ifi, nil -} - -func setsockoptIPMreqn(fd, name int, ifi *net.Interface, grp net.IP) error { - var mreqn sysIPMreqn - if ifi != nil { - mreqn.Ifindex = int32(ifi.Index) - } - if grp != nil { - mreqn.Multiaddr = [4]byte{grp[0], grp[1], grp[2], grp[3]} - } - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, unsafe.Pointer(&mreqn), sysSizeofIPMreqn)) -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go deleted file mode 100644 index 85465244..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_stub.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !darwin,!freebsd,!linux - -package ipv4 - -import "net" - -func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error { - return errOpNoSupport -} - -func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go deleted file mode 100644 index 6f647bc5..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_ssmreq_unix.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin freebsd linux - -package ipv4 - -import ( - "net" - "os" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -var freebsd32o64 bool - -func setsockoptGroupReq(fd, name int, ifi *net.Interface, grp net.IP) error { - var gr sysGroupReq - if ifi != nil { - gr.Interface = uint32(ifi.Index) - } - gr.setGroup(grp) - var p unsafe.Pointer - var l sysSockoptLen - if freebsd32o64 { - var d [sysSizeofGroupReq + 4]byte - s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) - copy(d[:4], s[:4]) - copy(d[8:], s[4:]) - p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupReq + 4 - } else { - p = unsafe.Pointer(&gr) - l = sysSizeofGroupReq - } - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l)) -} - -func setsockoptGroupSourceReq(fd, name int, ifi *net.Interface, grp, src net.IP) error { - var gsr sysGroupSourceReq - if ifi != nil { - gsr.Interface = uint32(ifi.Index) - } - gsr.setSourceGroup(grp, src) - var p unsafe.Pointer - var l sysSockoptLen - if freebsd32o64 { - var d [sysSizeofGroupSourceReq + 4]byte - s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) - copy(d[:4], s[:4]) - copy(d[8:], s[4:]) - p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupSourceReq + 4 - } else { - p = unsafe.Pointer(&gsr) - l = sysSizeofGroupSourceReq - } - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, name, p, l)) -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go deleted file mode 100644 index 9d19f5df..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_stub.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv4 - -func setInt(fd int, opt *sockOpt, v int) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_unix.go b/vendor/golang.org/x/net/ipv4/sockopt_unix.go deleted file mode 100644 index 50cdbd81..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_unix.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv4 - -import ( - "net" - "os" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func getInt(fd int, opt *sockOpt) (int, error) { - if opt.name < 1 || (opt.typ != ssoTypeByte && opt.typ != ssoTypeInt) { - return 0, errOpNoSupport - } - var i int32 - var b byte - p := unsafe.Pointer(&i) - l := sysSockoptLen(4) - if opt.typ == ssoTypeByte { - p = unsafe.Pointer(&b) - l = sysSockoptLen(1) - } - if err := getsockopt(fd, iana.ProtocolIP, opt.name, p, &l); err != nil { - return 0, os.NewSyscallError("getsockopt", err) - } - if opt.typ == ssoTypeByte { - return int(b), nil - } - return int(i), nil -} - -func setInt(fd int, opt *sockOpt, v int) error { - if opt.name < 1 || (opt.typ != ssoTypeByte && opt.typ != ssoTypeInt) { - return errOpNoSupport - } - i := int32(v) - var b byte - p := unsafe.Pointer(&i) - l := sysSockoptLen(4) - if opt.typ == ssoTypeByte { - b = byte(v) - p = unsafe.Pointer(&b) - l = sysSockoptLen(1) - } - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolIP, opt.name, p, l)) -} - -func getInterface(fd int, opt *sockOpt) (*net.Interface, error) { - if opt.name < 1 { - return nil, errOpNoSupport - } - switch opt.typ { - case ssoTypeInterface: - return getsockoptInterface(fd, opt.name) - case ssoTypeIPMreqn: - return getsockoptIPMreqn(fd, opt.name) - default: - return nil, errOpNoSupport - } -} - -func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error { - if opt.name < 1 { - return errOpNoSupport - } - switch opt.typ { - case ssoTypeInterface: - return setsockoptInterface(fd, opt.name, ifi) - case ssoTypeIPMreqn: - return setsockoptIPMreqn(fd, opt.name, ifi, nil) - default: - return errOpNoSupport - } -} - -func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) { - if opt.name < 1 || opt.typ != ssoTypeICMPFilter { - return nil, errOpNoSupport - } - var f ICMPFilter - l := sysSockoptLen(sysSizeofICMPFilter) - if err := getsockopt(fd, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - return &f, nil -} - -func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error { - if opt.name < 1 || opt.typ != ssoTypeICMPFilter { - return errOpNoSupport - } - return os.NewSyscallError("setsockopt", setsockopt(fd, iana.ProtocolReserved, opt.name, unsafe.Pointer(&f.sysICMPFilter), sysSizeofICMPFilter)) -} - -func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - if opt.name < 1 { - return errOpNoSupport - } - switch opt.typ { - case ssoTypeIPMreq: - return setsockoptIPMreq(fd, opt.name, ifi, grp) - case ssoTypeIPMreqn: - return setsockoptIPMreqn(fd, opt.name, ifi, grp) - case ssoTypeGroupReq: - return setsockoptGroupReq(fd, opt.name, ifi, grp) - default: - return errOpNoSupport - } -} - -func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq { - return errOpNoSupport - } - return setsockoptGroupSourceReq(fd, opt.name, ifi, grp, src) -} diff --git a/vendor/golang.org/x/net/ipv4/sockopt_windows.go b/vendor/golang.org/x/net/ipv4/sockopt_windows.go deleted file mode 100644 index c4c2441e..00000000 --- a/vendor/golang.org/x/net/ipv4/sockopt_windows.go +++ /dev/null @@ -1,68 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "os" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func getInt(fd syscall.Handle, opt *sockOpt) (int, error) { - if opt.name < 1 || opt.typ != ssoTypeInt { - return 0, errOpNoSupport - } - var i int32 - l := int32(4) - if err := syscall.Getsockopt(fd, iana.ProtocolIP, int32(opt.name), (*byte)(unsafe.Pointer(&i)), &l); err != nil { - return 0, os.NewSyscallError("getsockopt", err) - } - return int(i), nil -} - -func setInt(fd syscall.Handle, opt *sockOpt, v int) error { - if opt.name < 1 || opt.typ != ssoTypeInt { - return errOpNoSupport - } - i := int32(v) - return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, iana.ProtocolIP, int32(opt.name), (*byte)(unsafe.Pointer(&i)), 4)) -} - -func getInterface(fd syscall.Handle, opt *sockOpt) (*net.Interface, error) { - if opt.name < 1 || opt.typ != ssoTypeInterface { - return nil, errOpNoSupport - } - return getsockoptInterface(fd, opt.name) -} - -func setInterface(fd syscall.Handle, opt *sockOpt, ifi *net.Interface) error { - if opt.name < 1 || opt.typ != ssoTypeInterface { - return errOpNoSupport - } - return setsockoptInterface(fd, opt.name, ifi) -} - -func getICMPFilter(fd syscall.Handle, opt *sockOpt) (*ICMPFilter, error) { - return nil, errOpNoSupport -} - -func setICMPFilter(fd syscall.Handle, opt *sockOpt, f *ICMPFilter) error { - return errOpNoSupport -} - -func setGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - if opt.name < 1 || opt.typ != ssoTypeIPMreq { - return errOpNoSupport - } - return setsockoptIPMreq(fd, opt.name, ifi, grp) -} - -func setSourceGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - // TODO(mikio): implement this - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv4/sys_bsd.go b/vendor/golang.org/x/net/ipv4/sys_bsd.go deleted file mode 100644 index a669a440..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_bsd.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build dragonfly netbsd - -package ipv4 - -import ( - "net" - "syscall" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, - ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, - ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTOS: {sysIP_TOS, ssoTypeInt}, - ssoTTL: {sysIP_TTL, ssoTypeInt}, - ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, - ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, - ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, - ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, - ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, - ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, - ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, - } -) diff --git a/vendor/golang.org/x/net/ipv4/sys_darwin.go b/vendor/golang.org/x/net/ipv4/sys_darwin.go deleted file mode 100644 index 3f347348..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_darwin.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "syscall" - "unsafe" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, - ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, - ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTOS: {sysIP_TOS, ssoTypeInt}, - ssoTTL: {sysIP_TTL, ssoTypeInt}, - ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, - ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, - ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, - ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, - ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, - ssoStripHeader: {sysIP_STRIPHDR, ssoTypeInt}, - ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, - ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, - } -) - -func init() { - // Seems like kern.osreldate is veiled on latest OS X. We use - // kern.osrelease instead. - osver, err := syscall.Sysctl("kern.osrelease") - if err != nil { - return - } - var i int - for i = range osver { - if osver[i] == '.' { - break - } - } - // The IP_PKTINFO and protocol-independent multicast API were - // introduced in OS X 10.7 (Darwin 11.0.0). But it looks like - // those features require OS X 10.8 (Darwin 12.0.0) and above. - // See http://support.apple.com/kb/HT1633. - if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' { - ctlOpts[ctlPacketInfo].name = sysIP_PKTINFO - ctlOpts[ctlPacketInfo].length = sysSizeofInetPktinfo - ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo - ctlOpts[ctlPacketInfo].parse = parsePacketInfo - sockOpts[ssoPacketInfo].name = sysIP_RECVPKTINFO - sockOpts[ssoPacketInfo].typ = ssoTypeInt - sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn - sockOpts[ssoJoinGroup].name = sysMCAST_JOIN_GROUP - sockOpts[ssoJoinGroup].typ = ssoTypeGroupReq - sockOpts[ssoLeaveGroup].name = sysMCAST_LEAVE_GROUP - sockOpts[ssoLeaveGroup].typ = ssoTypeGroupReq - sockOpts[ssoJoinSourceGroup].name = sysMCAST_JOIN_SOURCE_GROUP - sockOpts[ssoJoinSourceGroup].typ = ssoTypeGroupSourceReq - sockOpts[ssoLeaveSourceGroup].name = sysMCAST_LEAVE_SOURCE_GROUP - sockOpts[ssoLeaveSourceGroup].typ = ssoTypeGroupSourceReq - sockOpts[ssoBlockSourceGroup].name = sysMCAST_BLOCK_SOURCE - sockOpts[ssoBlockSourceGroup].typ = ssoTypeGroupSourceReq - sockOpts[ssoUnblockSourceGroup].name = sysMCAST_UNBLOCK_SOURCE - sockOpts[ssoUnblockSourceGroup].typ = ssoTypeGroupSourceReq - } -} - -func (pi *sysInetPktinfo) setIfindex(i int) { - pi.Ifindex = uint32(i) -} - -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet - sa.Family = syscall.AF_INET - copy(sa.Addr[:], grp) -} - -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet - sa.Family = syscall.AF_INET - copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Pad_cgo_1[0])) - sa.Len = sysSizeofSockaddrInet - sa.Family = syscall.AF_INET - copy(sa.Addr[:], src) -} diff --git a/vendor/golang.org/x/net/ipv4/sys_freebsd.go b/vendor/golang.org/x/net/ipv4/sys_freebsd.go deleted file mode 100644 index 09ef4910..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_freebsd.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "runtime" - "strings" - "syscall" - "unsafe" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, - ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, - ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTOS: {sysIP_TOS, ssoTypeInt}, - ssoTTL: {sysIP_TTL, ssoTypeInt}, - ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, - ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, - ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, - ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, - ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, - ssoJoinGroup: {sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, - ssoLeaveGroup: {sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, - ssoJoinSourceGroup: {sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoLeaveSourceGroup: {sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoBlockSourceGroup: {sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, - ssoUnblockSourceGroup: {sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, - } -) - -func init() { - freebsdVersion, _ = syscall.SysctlUint32("kern.osreldate") - if freebsdVersion >= 1000000 { - sockOpts[ssoMulticastInterface].typ = ssoTypeIPMreqn - } - if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { - archs, _ := syscall.Sysctl("kern.supported_archs") - for _, s := range strings.Fields(archs) { - if s == "amd64" { - freebsd32o64 = true - break - } - } - } -} - -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group)) - sa.Len = sysSizeofSockaddrInet - sa.Family = syscall.AF_INET - copy(sa.Addr[:], grp) -} - -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group)) - sa.Len = sysSizeofSockaddrInet - sa.Family = syscall.AF_INET - copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source)) - sa.Len = sysSizeofSockaddrInet - sa.Family = syscall.AF_INET - copy(sa.Addr[:], src) -} diff --git a/vendor/golang.org/x/net/ipv4/sys_linux.go b/vendor/golang.org/x/net/ipv4/sys_linux.go deleted file mode 100644 index b1f38789..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_linux.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "syscall" - "unsafe" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTTL: {sysIP_TTL, 1, marshalTTL, parseTTL}, - ctlPacketInfo: {sysIP_PKTINFO, sysSizeofInetPktinfo, marshalPacketInfo, parsePacketInfo}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTOS: {sysIP_TOS, ssoTypeInt}, - ssoTTL: {sysIP_TTL, ssoTypeInt}, - ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeInt}, - ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeIPMreqn}, - ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, - ssoPacketInfo: {sysIP_PKTINFO, ssoTypeInt}, - ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, - ssoICMPFilter: {sysICMP_FILTER, ssoTypeICMPFilter}, - ssoJoinGroup: {sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, - ssoLeaveGroup: {sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, - ssoJoinSourceGroup: {sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoLeaveSourceGroup: {sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoBlockSourceGroup: {sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, - ssoUnblockSourceGroup: {sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, - } -) - -func (pi *sysInetPktinfo) setIfindex(i int) { - pi.Ifindex = int32(i) -} - -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gr.Group)) - sa.Family = syscall.AF_INET - copy(sa.Addr[:], grp) -} - -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet)(unsafe.Pointer(&gsr.Group)) - sa.Family = syscall.AF_INET - copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet)(unsafe.Pointer(&gsr.Source)) - sa.Family = syscall.AF_INET - copy(sa.Addr[:], src) -} diff --git a/vendor/golang.org/x/net/ipv4/sys_openbsd.go b/vendor/golang.org/x/net/ipv4/sys_openbsd.go deleted file mode 100644 index 550f2081..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_openbsd.go +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "net" - "syscall" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTTL: {sysIP_RECVTTL, 1, marshalTTL, parseTTL}, - ctlDst: {sysIP_RECVDSTADDR, net.IPv4len, marshalDst, parseDst}, - ctlInterface: {sysIP_RECVIF, syscall.SizeofSockaddrDatalink, marshalInterface, parseInterface}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTOS: {sysIP_TOS, ssoTypeInt}, - ssoTTL: {sysIP_TTL, ssoTypeInt}, - ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeByte}, - ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeByte}, - ssoReceiveTTL: {sysIP_RECVTTL, ssoTypeInt}, - ssoReceiveDst: {sysIP_RECVDSTADDR, ssoTypeInt}, - ssoReceiveInterface: {sysIP_RECVIF, ssoTypeInt}, - ssoHeaderPrepend: {sysIP_HDRINCL, ssoTypeInt}, - ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, - ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, - } -) diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go deleted file mode 100644 index efbcc479..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_stub.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv4 - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{} - - sockOpts = [ssoMax]sockOpt{} -) diff --git a/vendor/golang.org/x/net/ipv4/sys_windows.go b/vendor/golang.org/x/net/ipv4/sys_windows.go deleted file mode 100644 index 466489fe..00000000 --- a/vendor/golang.org/x/net/ipv4/sys_windows.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -const ( - // See ws2tcpip.h. - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - sysIP_DONTFRAGMENT = 0xe - sysIP_ADD_SOURCE_MEMBERSHIP = 0xf - sysIP_DROP_SOURCE_MEMBERSHIP = 0x10 - sysIP_PKTINFO = 0x13 - - sysSizeofInetPktinfo = 0x8 - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqSource = 0xc -) - -type sysInetPktinfo struct { - Addr [4]byte - Ifindex int32 -} - -type sysIPMreq struct { - Multiaddr [4]byte - Interface [4]byte -} - -type sysIPMreqSource struct { - Multiaddr [4]byte - Sourceaddr [4]byte - Interface [4]byte -} - -// See http://msdn.microsoft.com/en-us/library/windows/desktop/ms738586(v=vs.85).aspx -var ( - ctlOpts = [ctlMax]ctlOpt{} - - sockOpts = [ssoMax]sockOpt{ - ssoTOS: {sysIP_TOS, ssoTypeInt}, - ssoTTL: {sysIP_TTL, ssoTypeInt}, - ssoMulticastTTL: {sysIP_MULTICAST_TTL, ssoTypeInt}, - ssoMulticastInterface: {sysIP_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastLoopback: {sysIP_MULTICAST_LOOP, ssoTypeInt}, - ssoJoinGroup: {sysIP_ADD_MEMBERSHIP, ssoTypeIPMreq}, - ssoLeaveGroup: {sysIP_DROP_MEMBERSHIP, ssoTypeIPMreq}, - } -) - -func (pi *sysInetPktinfo) setIfindex(i int) { - pi.Ifindex = int32(i) -} diff --git a/vendor/golang.org/x/net/ipv4/syscall_linux_386.go b/vendor/golang.org/x/net/ipv4/syscall_linux_386.go deleted file mode 100644 index ab4ad045..00000000 --- a/vendor/golang.org/x/net/ipv4/syscall_linux_386.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4 - -import ( - "syscall" - "unsafe" -) - -const ( - sysGETSOCKOPT = 0xf - sysSETSOCKOPT = 0xe -) - -func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) - -func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { - if _, errno := socketcall(sysGETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { - return error(errno) - } - return nil -} - -func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { - if _, errno := socketcall(sysSETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { - return error(errno) - } - return nil -} diff --git a/vendor/golang.org/x/net/ipv4/syscall_unix.go b/vendor/golang.org/x/net/ipv4/syscall_unix.go deleted file mode 100644 index 5fe8e83b..00000000 --- a/vendor/golang.org/x/net/ipv4/syscall_unix.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux,!386 netbsd openbsd - -package ipv4 - -import ( - "syscall" - "unsafe" -) - -func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { - if _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { - return error(errno) - } - return nil -} - -func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { - if _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { - return error(errno) - } - return nil -} diff --git a/vendor/golang.org/x/net/ipv4/thunk_linux_386.s b/vendor/golang.org/x/net/ipv4/thunk_linux_386.s deleted file mode 100644 index daa78bc0..00000000 --- a/vendor/golang.org/x/net/ipv4/thunk_linux_386.s +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.2 - -TEXT ·socketcall(SB),4,$0-36 - JMP syscall·socketcall(SB) diff --git a/vendor/golang.org/x/net/ipv4/unicast_test.go b/vendor/golang.org/x/net/ipv4/unicast_test.go deleted file mode 100644 index 255096a8..00000000 --- a/vendor/golang.org/x/net/ipv4/unicast_test.go +++ /dev/null @@ -1,250 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "bytes" - "net" - "os" - "runtime" - "testing" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -func TestPacketConnReadWriteUnicastUDP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - c, err := net.ListenPacket("udp4", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - dst, err := net.ResolveUDPAddr("udp4", c.LocalAddr().String()) - if err != nil { - t.Fatal(err) - } - p := ipv4.NewPacketConn(c) - defer p.Close() - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface - wb := []byte("HELLO-R-U-THERE") - - for i, toggle := range []bool{true, false, true} { - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - p.SetTTL(i + 1) - if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, err := p.WriteTo(wb, nil, dst); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Fatal(err) - } else if !bytes.Equal(rb[:n], wb) { - t.Fatalf("got %v; want %v", rb[:n], wb) - } else { - t.Logf("rcvd cmsg: %v", cm) - } - } -} - -func TestPacketConnReadWriteUnicastICMP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") - if err != nil { - t.Fatal(err) - } - p := ipv4.NewPacketConn(c) - defer p.Close() - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface - - for i, toggle := range []bool{true, false, true} { - wb, err := (&icmp.Message{ - Type: ipv4.ICMPTypeEcho, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: i + 1, - Data: []byte("HELLO-R-U-THERE"), - }, - }).Marshal(nil) - if err != nil { - t.Fatal(err) - } - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - p.SetTTL(i + 1) - if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, err := p.WriteTo(wb, nil, dst); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - loop: - if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, cm, _, err := p.ReadFrom(rb); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } else { - t.Logf("rcvd cmsg: %v", cm) - m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n]) - if err != nil { - t.Fatal(err) - } - if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { - // On Linux we must handle own sent packets. - goto loop - } - if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { - t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) - } - } - } -} - -func TestRawConnReadWriteUnicastICMP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - c, err := net.ListenPacket("ip4:icmp", "0.0.0.0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - dst, err := net.ResolveIPAddr("ip4", "127.0.0.1") - if err != nil { - t.Fatal(err) - } - r, err := ipv4.NewRawConn(c) - if err != nil { - t.Fatal(err) - } - defer r.Close() - cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface - - for i, toggle := range []bool{true, false, true} { - wb, err := (&icmp.Message{ - Type: ipv4.ICMPTypeEcho, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: i + 1, - Data: []byte("HELLO-R-U-THERE"), - }, - }).Marshal(nil) - if err != nil { - t.Fatal(err) - } - wh := &ipv4.Header{ - Version: ipv4.Version, - Len: ipv4.HeaderLen, - TOS: i + 1, - TotalLen: ipv4.HeaderLen + len(wb), - TTL: i + 1, - Protocol: 1, - Dst: dst.IP, - } - if err := r.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - if err := r.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if err := r.WriteTo(wh, wb, nil); err != nil { - t.Fatal(err) - } - rb := make([]byte, ipv4.HeaderLen+128) - loop: - if err := r.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if _, b, cm, err := r.ReadFrom(rb); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } else { - t.Logf("rcvd cmsg: %v", cm) - m, err := icmp.ParseMessage(iana.ProtocolICMP, b) - if err != nil { - t.Fatal(err) - } - if runtime.GOOS == "linux" && m.Type == ipv4.ICMPTypeEcho { - // On Linux we must handle own sent packets. - goto loop - } - if m.Type != ipv4.ICMPTypeEchoReply || m.Code != 0 { - t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0) - } - } - } -} diff --git a/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go b/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go deleted file mode 100644 index 25606f21..00000000 --- a/vendor/golang.org/x/net/ipv4/unicastsockopt_test.go +++ /dev/null @@ -1,139 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv4_test - -import ( - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv4" -) - -func TestConnUnicastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris": - t.Skipf("not supported on %s", runtime.GOOS) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - ln, err := net.Listen("tcp4", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - defer ln.Close() - - done := make(chan bool) - go acceptor(t, ln, done) - - c, err := net.Dial("tcp4", ln.Addr().String()) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - testUnicastSocketOptions(t, ipv4.NewConn(c)) - - <-done -} - -var packetConnUnicastSocketOptionTests = []struct { - net, proto, addr string -}{ - {"udp4", "", "127.0.0.1:0"}, - {"ip4", ":icmp", "127.0.0.1"}, -} - -func TestPacketConnUnicastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris": - t.Skipf("not supported on %s", runtime.GOOS) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - m, ok := nettest.SupportsRawIPSocket() - for _, tt := range packetConnUnicastSocketOptionTests { - if tt.net == "ip4" && !ok { - t.Log(m) - continue - } - c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - testUnicastSocketOptions(t, ipv4.NewPacketConn(c)) - } -} - -func TestRawConnUnicastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris": - t.Skipf("not supported on %s", runtime.GOOS) - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - c, err := net.ListenPacket("ip4:icmp", "127.0.0.1") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - r, err := ipv4.NewRawConn(c) - if err != nil { - t.Fatal(err) - } - - testUnicastSocketOptions(t, r) -} - -type testIPv4UnicastConn interface { - TOS() (int, error) - SetTOS(int) error - TTL() (int, error) - SetTTL(int) error -} - -func testUnicastSocketOptions(t *testing.T, c testIPv4UnicastConn) { - tos := iana.DiffServCS0 | iana.NotECNTransport - switch runtime.GOOS { - case "windows": - // IP_TOS option is supported on Windows 8 and beyond. - t.Skipf("not supported on %s", runtime.GOOS) - } - - if err := c.SetTOS(tos); err != nil { - t.Fatal(err) - } - if v, err := c.TOS(); err != nil { - t.Fatal(err) - } else if v != tos { - t.Fatalf("got %v; want %v", v, tos) - } - const ttl = 255 - if err := c.SetTTL(ttl); err != nil { - t.Fatal(err) - } - if v, err := c.TTL(); err != nil { - t.Fatal(err) - } else if v != ttl { - t.Fatalf("got %v; want %v", v, ttl) - } -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_darwin.go b/vendor/golang.org/x/net/ipv4/zsys_darwin.go deleted file mode 100644 index 087c6390..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_darwin.go +++ /dev/null @@ -1,99 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_darwin.go - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x14 - sysIP_STRIPHDR = 0x17 - sysIP_RECVTTL = 0x18 - sysIP_BOUND_IF = 0x19 - sysIP_PKTINFO = 0x1a - sysIP_RECVPKTINFO = 0x1a - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - sysIP_MULTICAST_VIF = 0xe - sysIP_MULTICAST_IFINDEX = 0x42 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 - sysIP_BLOCK_SOURCE = 0x48 - sysIP_UNBLOCK_SOURCE = 0x49 - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet struct { - Len uint8 - Family uint8 - Port uint16 - Addr [4]byte /* in_addr */ - Zero [8]int8 -} - -type sysInetPktinfo struct { - Ifindex uint32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr [4]byte /* in_addr */ - Sourceaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [128]byte -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [128]byte - Pad_cgo_1 [128]byte -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go deleted file mode 100644 index f5c9ccec..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_dragonfly.go +++ /dev/null @@ -1,33 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_dragonfly.go - -// +build dragonfly - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x14 - sysIP_RECVTTL = 0x41 - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_MULTICAST_VIF = 0xe - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - - sysSizeofIPMreq = 0x8 -) - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go deleted file mode 100644 index 6fd67e1e..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_386.go +++ /dev/null @@ -1,93 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_freebsd.go - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_SENDSRCADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x14 - sysIP_ONESBCAST = 0x17 - sysIP_BINDANY = 0x18 - sysIP_RECVTTL = 0x41 - sysIP_MINTTL = 0x42 - sysIP_DONTFRAG = 0x43 - sysIP_RECVTOS = 0x44 - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - sysIP_MULTICAST_VIF = 0xe - sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 - sysIP_BLOCK_SOURCE = 0x48 - sysIP_UNBLOCK_SOURCE = 0x49 - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet struct { - Len uint8 - Family uint8 - Port uint16 - Addr [4]byte /* in_addr */ - Zero [8]int8 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr [4]byte /* in_addr */ - Sourceaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysGroupReq struct { - Interface uint32 - Group sysSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Group sysSockaddrStorage - Source sysSockaddrStorage -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go deleted file mode 100644 index ebac6d79..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_amd64.go +++ /dev/null @@ -1,95 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_freebsd.go - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_SENDSRCADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x14 - sysIP_ONESBCAST = 0x17 - sysIP_BINDANY = 0x18 - sysIP_RECVTTL = 0x41 - sysIP_MINTTL = 0x42 - sysIP_DONTFRAG = 0x43 - sysIP_RECVTOS = 0x44 - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - sysIP_MULTICAST_VIF = 0xe - sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 - sysIP_BLOCK_SOURCE = 0x48 - sysIP_UNBLOCK_SOURCE = 0x49 - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet struct { - Len uint8 - Family uint8 - Port uint16 - Addr [4]byte /* in_addr */ - Zero [8]int8 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr [4]byte /* in_addr */ - Sourceaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go deleted file mode 100644 index ebac6d79..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_freebsd_arm.go +++ /dev/null @@ -1,95 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_freebsd.go - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_SENDSRCADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x14 - sysIP_ONESBCAST = 0x17 - sysIP_BINDANY = 0x18 - sysIP_RECVTTL = 0x41 - sysIP_MINTTL = 0x42 - sysIP_DONTFRAG = 0x43 - sysIP_RECVTOS = 0x44 - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - sysIP_MULTICAST_VIF = 0xe - sysIP_ADD_SOURCE_MEMBERSHIP = 0x46 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x47 - sysIP_BLOCK_SOURCE = 0x48 - sysIP_UNBLOCK_SOURCE = 0x49 - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet struct { - Len uint8 - Family uint8 - Port uint16 - Addr [4]byte /* in_addr */ - Zero [8]int8 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr [4]byte /* in_addr */ - Sourceaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go b/vendor/golang.org/x/net/ipv4/zsys_linux_386.go deleted file mode 100644 index fc7a9ebf..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_386.go +++ /dev/null @@ -1,130 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -package ipv4 - -const ( - sysIP_TOS = 0x1 - sysIP_TTL = 0x2 - sysIP_HDRINCL = 0x3 - sysIP_OPTIONS = 0x4 - sysIP_ROUTER_ALERT = 0x5 - sysIP_RECVOPTS = 0x6 - sysIP_RETOPTS = 0x7 - sysIP_PKTINFO = 0x8 - sysIP_PKTOPTIONS = 0x9 - sysIP_MTU_DISCOVER = 0xa - sysIP_RECVERR = 0xb - sysIP_RECVTTL = 0xc - sysIP_RECVTOS = 0xd - sysIP_MTU = 0xe - sysIP_FREEBIND = 0xf - sysIP_TRANSPARENT = 0x13 - sysIP_RECVRETOPTS = 0x7 - sysIP_ORIGDSTADDR = 0x14 - sysIP_RECVORIGDSTADDR = 0x14 - sysIP_MINTTL = 0x15 - sysIP_NODEFRAG = 0x16 - sysIP_UNICAST_IF = 0x32 - - sysIP_MULTICAST_IF = 0x20 - sysIP_MULTICAST_TTL = 0x21 - sysIP_MULTICAST_LOOP = 0x22 - sysIP_ADD_MEMBERSHIP = 0x23 - sysIP_DROP_MEMBERSHIP = 0x24 - sysIP_UNBLOCK_SOURCE = 0x25 - sysIP_BLOCK_SOURCE = 0x26 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 - sysIP_MSFILTER = 0x29 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIP_MULTICAST_ALL = 0x31 - - sysICMP_FILTER = 0x1 - - sysSO_EE_ORIGIN_NONE = 0x0 - sysSO_EE_ORIGIN_LOCAL = 0x1 - sysSO_EE_ORIGIN_ICMP = 0x2 - sysSO_EE_ORIGIN_ICMP6 = 0x3 - sysSO_EE_ORIGIN_TXSTATUS = 0x4 - sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPFilter = 0x4 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet struct { - Family uint16 - Port uint16 - Addr [4]byte /* in_addr */ - X__pad [8]uint8 -} - -type sysInetPktinfo struct { - Ifindex int32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysSockExtendedErr struct { - Errno uint32 - Origin uint8 - Type uint8 - Code uint8 - Pad uint8 - Info uint32 - Data uint32 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr uint32 - Interface uint32 - Sourceaddr uint32 -} - -type sysGroupReq struct { - Interface uint32 - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPFilter struct { - Data uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go deleted file mode 100644 index e324b81b..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_amd64.go +++ /dev/null @@ -1,132 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -package ipv4 - -const ( - sysIP_TOS = 0x1 - sysIP_TTL = 0x2 - sysIP_HDRINCL = 0x3 - sysIP_OPTIONS = 0x4 - sysIP_ROUTER_ALERT = 0x5 - sysIP_RECVOPTS = 0x6 - sysIP_RETOPTS = 0x7 - sysIP_PKTINFO = 0x8 - sysIP_PKTOPTIONS = 0x9 - sysIP_MTU_DISCOVER = 0xa - sysIP_RECVERR = 0xb - sysIP_RECVTTL = 0xc - sysIP_RECVTOS = 0xd - sysIP_MTU = 0xe - sysIP_FREEBIND = 0xf - sysIP_TRANSPARENT = 0x13 - sysIP_RECVRETOPTS = 0x7 - sysIP_ORIGDSTADDR = 0x14 - sysIP_RECVORIGDSTADDR = 0x14 - sysIP_MINTTL = 0x15 - sysIP_NODEFRAG = 0x16 - sysIP_UNICAST_IF = 0x32 - - sysIP_MULTICAST_IF = 0x20 - sysIP_MULTICAST_TTL = 0x21 - sysIP_MULTICAST_LOOP = 0x22 - sysIP_ADD_MEMBERSHIP = 0x23 - sysIP_DROP_MEMBERSHIP = 0x24 - sysIP_UNBLOCK_SOURCE = 0x25 - sysIP_BLOCK_SOURCE = 0x26 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 - sysIP_MSFILTER = 0x29 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIP_MULTICAST_ALL = 0x31 - - sysICMP_FILTER = 0x1 - - sysSO_EE_ORIGIN_NONE = 0x0 - sysSO_EE_ORIGIN_LOCAL = 0x1 - sysSO_EE_ORIGIN_ICMP = 0x2 - sysSO_EE_ORIGIN_ICMP6 = 0x3 - sysSO_EE_ORIGIN_TXSTATUS = 0x4 - sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPFilter = 0x4 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet struct { - Family uint16 - Port uint16 - Addr [4]byte /* in_addr */ - X__pad [8]uint8 -} - -type sysInetPktinfo struct { - Ifindex int32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysSockExtendedErr struct { - Errno uint32 - Origin uint8 - Type uint8 - Code uint8 - Pad uint8 - Info uint32 - Data uint32 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr uint32 - Interface uint32 - Sourceaddr uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPFilter struct { - Data uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go deleted file mode 100644 index fc7a9ebf..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm.go +++ /dev/null @@ -1,130 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -package ipv4 - -const ( - sysIP_TOS = 0x1 - sysIP_TTL = 0x2 - sysIP_HDRINCL = 0x3 - sysIP_OPTIONS = 0x4 - sysIP_ROUTER_ALERT = 0x5 - sysIP_RECVOPTS = 0x6 - sysIP_RETOPTS = 0x7 - sysIP_PKTINFO = 0x8 - sysIP_PKTOPTIONS = 0x9 - sysIP_MTU_DISCOVER = 0xa - sysIP_RECVERR = 0xb - sysIP_RECVTTL = 0xc - sysIP_RECVTOS = 0xd - sysIP_MTU = 0xe - sysIP_FREEBIND = 0xf - sysIP_TRANSPARENT = 0x13 - sysIP_RECVRETOPTS = 0x7 - sysIP_ORIGDSTADDR = 0x14 - sysIP_RECVORIGDSTADDR = 0x14 - sysIP_MINTTL = 0x15 - sysIP_NODEFRAG = 0x16 - sysIP_UNICAST_IF = 0x32 - - sysIP_MULTICAST_IF = 0x20 - sysIP_MULTICAST_TTL = 0x21 - sysIP_MULTICAST_LOOP = 0x22 - sysIP_ADD_MEMBERSHIP = 0x23 - sysIP_DROP_MEMBERSHIP = 0x24 - sysIP_UNBLOCK_SOURCE = 0x25 - sysIP_BLOCK_SOURCE = 0x26 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 - sysIP_MSFILTER = 0x29 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIP_MULTICAST_ALL = 0x31 - - sysICMP_FILTER = 0x1 - - sysSO_EE_ORIGIN_NONE = 0x0 - sysSO_EE_ORIGIN_LOCAL = 0x1 - sysSO_EE_ORIGIN_ICMP = 0x2 - sysSO_EE_ORIGIN_ICMP6 = 0x3 - sysSO_EE_ORIGIN_TXSTATUS = 0x4 - sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPFilter = 0x4 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet struct { - Family uint16 - Port uint16 - Addr [4]byte /* in_addr */ - X__pad [8]uint8 -} - -type sysInetPktinfo struct { - Ifindex int32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysSockExtendedErr struct { - Errno uint32 - Origin uint8 - Type uint8 - Code uint8 - Pad uint8 - Info uint32 - Data uint32 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr uint32 - Interface uint32 - Sourceaddr uint32 -} - -type sysGroupReq struct { - Interface uint32 - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPFilter struct { - Data uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go deleted file mode 100644 index ce4194a6..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_arm64.go +++ /dev/null @@ -1,134 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -// +build linux,arm64 - -package ipv4 - -const ( - sysIP_TOS = 0x1 - sysIP_TTL = 0x2 - sysIP_HDRINCL = 0x3 - sysIP_OPTIONS = 0x4 - sysIP_ROUTER_ALERT = 0x5 - sysIP_RECVOPTS = 0x6 - sysIP_RETOPTS = 0x7 - sysIP_PKTINFO = 0x8 - sysIP_PKTOPTIONS = 0x9 - sysIP_MTU_DISCOVER = 0xa - sysIP_RECVERR = 0xb - sysIP_RECVTTL = 0xc - sysIP_RECVTOS = 0xd - sysIP_MTU = 0xe - sysIP_FREEBIND = 0xf - sysIP_TRANSPARENT = 0x13 - sysIP_RECVRETOPTS = 0x7 - sysIP_ORIGDSTADDR = 0x14 - sysIP_RECVORIGDSTADDR = 0x14 - sysIP_MINTTL = 0x15 - sysIP_NODEFRAG = 0x16 - sysIP_UNICAST_IF = 0x32 - - sysIP_MULTICAST_IF = 0x20 - sysIP_MULTICAST_TTL = 0x21 - sysIP_MULTICAST_LOOP = 0x22 - sysIP_ADD_MEMBERSHIP = 0x23 - sysIP_DROP_MEMBERSHIP = 0x24 - sysIP_UNBLOCK_SOURCE = 0x25 - sysIP_BLOCK_SOURCE = 0x26 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 - sysIP_MSFILTER = 0x29 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIP_MULTICAST_ALL = 0x31 - - sysICMP_FILTER = 0x1 - - sysSO_EE_ORIGIN_NONE = 0x0 - sysSO_EE_ORIGIN_LOCAL = 0x1 - sysSO_EE_ORIGIN_ICMP = 0x2 - sysSO_EE_ORIGIN_ICMP6 = 0x3 - sysSO_EE_ORIGIN_TXSTATUS = 0x4 - sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPFilter = 0x4 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet struct { - Family uint16 - Port uint16 - Addr [4]byte /* in_addr */ - X__pad [8]uint8 -} - -type sysInetPktinfo struct { - Ifindex int32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysSockExtendedErr struct { - Errno uint32 - Origin uint8 - Type uint8 - Code uint8 - Pad uint8 - Info uint32 - Data uint32 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr uint32 - Interface uint32 - Sourceaddr uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPFilter struct { - Data uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go deleted file mode 100644 index 9fe5ee2b..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64.go +++ /dev/null @@ -1,134 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -// +build linux,ppc64 - -package ipv4 - -const ( - sysIP_TOS = 0x1 - sysIP_TTL = 0x2 - sysIP_HDRINCL = 0x3 - sysIP_OPTIONS = 0x4 - sysIP_ROUTER_ALERT = 0x5 - sysIP_RECVOPTS = 0x6 - sysIP_RETOPTS = 0x7 - sysIP_PKTINFO = 0x8 - sysIP_PKTOPTIONS = 0x9 - sysIP_MTU_DISCOVER = 0xa - sysIP_RECVERR = 0xb - sysIP_RECVTTL = 0xc - sysIP_RECVTOS = 0xd - sysIP_MTU = 0xe - sysIP_FREEBIND = 0xf - sysIP_TRANSPARENT = 0x13 - sysIP_RECVRETOPTS = 0x7 - sysIP_ORIGDSTADDR = 0x14 - sysIP_RECVORIGDSTADDR = 0x14 - sysIP_MINTTL = 0x15 - sysIP_NODEFRAG = 0x16 - sysIP_UNICAST_IF = 0x32 - - sysIP_MULTICAST_IF = 0x20 - sysIP_MULTICAST_TTL = 0x21 - sysIP_MULTICAST_LOOP = 0x22 - sysIP_ADD_MEMBERSHIP = 0x23 - sysIP_DROP_MEMBERSHIP = 0x24 - sysIP_UNBLOCK_SOURCE = 0x25 - sysIP_BLOCK_SOURCE = 0x26 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 - sysIP_MSFILTER = 0x29 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIP_MULTICAST_ALL = 0x31 - - sysICMP_FILTER = 0x1 - - sysSO_EE_ORIGIN_NONE = 0x0 - sysSO_EE_ORIGIN_LOCAL = 0x1 - sysSO_EE_ORIGIN_ICMP = 0x2 - sysSO_EE_ORIGIN_ICMP6 = 0x3 - sysSO_EE_ORIGIN_TXSTATUS = 0x4 - sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPFilter = 0x4 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet struct { - Family uint16 - Port uint16 - Addr [4]byte /* in_addr */ - X__pad [8]uint8 -} - -type sysInetPktinfo struct { - Ifindex int32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysSockExtendedErr struct { - Errno uint32 - Origin uint8 - Type uint8 - Code uint8 - Pad uint8 - Info uint32 - Data uint32 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr uint32 - Interface uint32 - Sourceaddr uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPFilter struct { - Data uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go deleted file mode 100644 index 3891f54e..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_ppc64le.go +++ /dev/null @@ -1,134 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -// +build linux,ppc64le - -package ipv4 - -const ( - sysIP_TOS = 0x1 - sysIP_TTL = 0x2 - sysIP_HDRINCL = 0x3 - sysIP_OPTIONS = 0x4 - sysIP_ROUTER_ALERT = 0x5 - sysIP_RECVOPTS = 0x6 - sysIP_RETOPTS = 0x7 - sysIP_PKTINFO = 0x8 - sysIP_PKTOPTIONS = 0x9 - sysIP_MTU_DISCOVER = 0xa - sysIP_RECVERR = 0xb - sysIP_RECVTTL = 0xc - sysIP_RECVTOS = 0xd - sysIP_MTU = 0xe - sysIP_FREEBIND = 0xf - sysIP_TRANSPARENT = 0x13 - sysIP_RECVRETOPTS = 0x7 - sysIP_ORIGDSTADDR = 0x14 - sysIP_RECVORIGDSTADDR = 0x14 - sysIP_MINTTL = 0x15 - sysIP_NODEFRAG = 0x16 - sysIP_UNICAST_IF = 0x32 - - sysIP_MULTICAST_IF = 0x20 - sysIP_MULTICAST_TTL = 0x21 - sysIP_MULTICAST_LOOP = 0x22 - sysIP_ADD_MEMBERSHIP = 0x23 - sysIP_DROP_MEMBERSHIP = 0x24 - sysIP_UNBLOCK_SOURCE = 0x25 - sysIP_BLOCK_SOURCE = 0x26 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x27 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x28 - sysIP_MSFILTER = 0x29 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIP_MULTICAST_ALL = 0x31 - - sysICMP_FILTER = 0x1 - - sysSO_EE_ORIGIN_NONE = 0x0 - sysSO_EE_ORIGIN_LOCAL = 0x1 - sysSO_EE_ORIGIN_ICMP = 0x2 - sysSO_EE_ORIGIN_ICMP6 = 0x3 - sysSO_EE_ORIGIN_TXSTATUS = 0x4 - sysSO_EE_ORIGIN_TIMESTAMPING = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet = 0x10 - sysSizeofInetPktinfo = 0xc - sysSizeofSockExtendedErr = 0x10 - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqn = 0xc - sysSizeofIPMreqSource = 0xc - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPFilter = 0x4 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet struct { - Family uint16 - Port uint16 - Addr [4]byte /* in_addr */ - X__pad [8]uint8 -} - -type sysInetPktinfo struct { - Ifindex int32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysSockExtendedErr struct { - Errno uint32 - Origin uint8 - Type uint8 - Code uint8 - Pad uint8 - Info uint32 - Data uint32 -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqn struct { - Multiaddr [4]byte /* in_addr */ - Address [4]byte /* in_addr */ - Ifindex int32 -} - -type sysIPMreqSource struct { - Multiaddr uint32 - Interface uint32 - Sourceaddr uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPFilter struct { - Data uint32 -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go b/vendor/golang.org/x/net/ipv4/zsys_netbsd.go deleted file mode 100644 index 8a440eb6..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_netbsd.go +++ /dev/null @@ -1,30 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_netbsd.go - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x14 - sysIP_RECVTTL = 0x17 - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - - sysSizeofIPMreq = 0x8 -) - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go b/vendor/golang.org/x/net/ipv4/zsys_openbsd.go deleted file mode 100644 index fd522b57..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_openbsd.go +++ /dev/null @@ -1,30 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_openbsd.go - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x1e - sysIP_RECVTTL = 0x1f - - sysIP_MULTICAST_IF = 0x9 - sysIP_MULTICAST_TTL = 0xa - sysIP_MULTICAST_LOOP = 0xb - sysIP_ADD_MEMBERSHIP = 0xc - sysIP_DROP_MEMBERSHIP = 0xd - - sysSizeofIPMreq = 0x8 -) - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} diff --git a/vendor/golang.org/x/net/ipv4/zsys_solaris.go b/vendor/golang.org/x/net/ipv4/zsys_solaris.go deleted file mode 100644 index d7c23349..00000000 --- a/vendor/golang.org/x/net/ipv4/zsys_solaris.go +++ /dev/null @@ -1,60 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_solaris.go - -// +build solaris - -package ipv4 - -const ( - sysIP_OPTIONS = 0x1 - sysIP_HDRINCL = 0x2 - sysIP_TOS = 0x3 - sysIP_TTL = 0x4 - sysIP_RECVOPTS = 0x5 - sysIP_RECVRETOPTS = 0x6 - sysIP_RECVDSTADDR = 0x7 - sysIP_RETOPTS = 0x8 - sysIP_RECVIF = 0x9 - sysIP_RECVSLLA = 0xa - sysIP_RECVTTL = 0xb - sysIP_NEXTHOP = 0x19 - sysIP_PKTINFO = 0x1a - sysIP_RECVPKTINFO = 0x1a - sysIP_DONTFRAG = 0x1b - sysIP_BOUND_IF = 0x41 - sysIP_UNSPEC_SRC = 0x42 - sysIP_BROADCAST_TTL = 0x43 - sysIP_DHCPINIT_IF = 0x45 - - sysIP_MULTICAST_IF = 0x10 - sysIP_MULTICAST_TTL = 0x11 - sysIP_MULTICAST_LOOP = 0x12 - sysIP_ADD_MEMBERSHIP = 0x13 - sysIP_DROP_MEMBERSHIP = 0x14 - sysIP_BLOCK_SOURCE = 0x15 - sysIP_UNBLOCK_SOURCE = 0x16 - sysIP_ADD_SOURCE_MEMBERSHIP = 0x17 - sysIP_DROP_SOURCE_MEMBERSHIP = 0x18 - - sysSizeofInetPktinfo = 0xc - - sysSizeofIPMreq = 0x8 - sysSizeofIPMreqSource = 0xc -) - -type sysInetPktinfo struct { - Ifindex uint32 - Spec_dst [4]byte /* in_addr */ - Addr [4]byte /* in_addr */ -} - -type sysIPMreq struct { - Multiaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} - -type sysIPMreqSource struct { - Multiaddr [4]byte /* in_addr */ - Sourceaddr [4]byte /* in_addr */ - Interface [4]byte /* in_addr */ -} diff --git a/vendor/golang.org/x/net/ipv6/control.go b/vendor/golang.org/x/net/ipv6/control.go deleted file mode 100644 index 27f1d2f8..00000000 --- a/vendor/golang.org/x/net/ipv6/control.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "errors" - "fmt" - "net" - "sync" -) - -var ( - errMissingAddress = errors.New("missing address") - errInvalidConnType = errors.New("invalid conn type") - errNoSuchInterface = errors.New("no such interface") -) - -// Note that RFC 3542 obsoletes RFC 2292 but OS X Snow Leopard and the -// former still support RFC 2292 only. Please be aware that almost -// all protocol implementations prohibit using a combination of RFC -// 2292 and RFC 3542 for some practical reasons. - -type rawOpt struct { - sync.RWMutex - cflags ControlFlags -} - -func (c *rawOpt) set(f ControlFlags) { c.cflags |= f } -func (c *rawOpt) clear(f ControlFlags) { c.cflags &^= f } -func (c *rawOpt) isset(f ControlFlags) bool { return c.cflags&f != 0 } - -// A ControlFlags represents per packet basis IP-level socket option -// control flags. -type ControlFlags uint - -const ( - FlagTrafficClass ControlFlags = 1 << iota // pass the traffic class on the received packet - FlagHopLimit // pass the hop limit on the received packet - FlagSrc // pass the source address on the received packet - FlagDst // pass the destination address on the received packet - FlagInterface // pass the interface index on the received packet - FlagPathMTU // pass the path MTU on the received packet path -) - -const flagPacketInfo = FlagDst | FlagInterface - -// A ControlMessage represents per packet basis IP-level socket -// options. -type ControlMessage struct { - // Receiving socket options: SetControlMessage allows to - // receive the options from the protocol stack using ReadFrom - // method of PacketConn. - // - // Specifying socket options: ControlMessage for WriteTo - // method of PacketConn allows to send the options to the - // protocol stack. - // - TrafficClass int // traffic class, must be 1 <= value <= 255 when specifying - HopLimit int // hop limit, must be 1 <= value <= 255 when specifying - Src net.IP // source address, specifying only - Dst net.IP // destination address, receiving only - IfIndex int // interface index, must be 1 <= value when specifying - NextHop net.IP // next hop address, specifying only - MTU int // path MTU, receiving only -} - -func (cm *ControlMessage) String() string { - if cm == nil { - return "<nil>" - } - return fmt.Sprintf("tclass: %#x, hoplim: %v, src: %v, dst: %v, ifindex: %v, nexthop: %v, mtu: %v", cm.TrafficClass, cm.HopLimit, cm.Src, cm.Dst, cm.IfIndex, cm.NextHop, cm.MTU) -} - -// Ancillary data socket options -const ( - ctlTrafficClass = iota // header field - ctlHopLimit // header field - ctlPacketInfo // inbound or outbound packet path - ctlNextHop // nexthop - ctlPathMTU // path mtu - ctlMax -) - -// A ctlOpt represents a binding for ancillary data socket option. -type ctlOpt struct { - name int // option name, must be equal or greater than 1 - length int // option length - marshal func([]byte, *ControlMessage) []byte - parse func(*ControlMessage, []byte) -} diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go deleted file mode 100644 index ce201ce3..00000000 --- a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin - -package ipv6 - -import ( - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func marshal2292HopLimit(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_2292HOPLIMIT - m.SetLen(syscall.CmsgLen(4)) - if cm != nil { - data := b[syscall.CmsgLen(0):] - // TODO(mikio): fix potential misaligned memory access - *(*int32)(unsafe.Pointer(&data[:4][0])) = int32(cm.HopLimit) - } - return b[syscall.CmsgSpace(4):] -} - -func marshal2292PacketInfo(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_2292PKTINFO - m.SetLen(syscall.CmsgLen(sysSizeofInet6Pktinfo)) - if cm != nil { - pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) - if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { - copy(pi.Addr[:], ip) - } - if cm.IfIndex > 0 { - pi.setIfindex(cm.IfIndex) - } - } - return b[syscall.CmsgSpace(sysSizeofInet6Pktinfo):] -} - -func marshal2292NextHop(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_2292NEXTHOP - m.SetLen(syscall.CmsgLen(sysSizeofSockaddrInet6)) - if cm != nil { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) - sa.setSockaddr(cm.NextHop, cm.IfIndex) - } - return b[syscall.CmsgSpace(sysSizeofSockaddrInet6):] -} diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go deleted file mode 100644 index e55c4aa9..00000000 --- a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv6 - -import ( - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -func marshalTrafficClass(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_TCLASS - m.SetLen(syscall.CmsgLen(4)) - if cm != nil { - data := b[syscall.CmsgLen(0):] - // TODO(mikio): fix potential misaligned memory access - *(*int32)(unsafe.Pointer(&data[:4][0])) = int32(cm.TrafficClass) - } - return b[syscall.CmsgSpace(4):] -} - -func parseTrafficClass(cm *ControlMessage, b []byte) { - // TODO(mikio): fix potential misaligned memory access - cm.TrafficClass = int(*(*int32)(unsafe.Pointer(&b[:4][0]))) -} - -func marshalHopLimit(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_HOPLIMIT - m.SetLen(syscall.CmsgLen(4)) - if cm != nil { - data := b[syscall.CmsgLen(0):] - // TODO(mikio): fix potential misaligned memory access - *(*int32)(unsafe.Pointer(&data[:4][0])) = int32(cm.HopLimit) - } - return b[syscall.CmsgSpace(4):] -} - -func parseHopLimit(cm *ControlMessage, b []byte) { - // TODO(mikio): fix potential misaligned memory access - cm.HopLimit = int(*(*int32)(unsafe.Pointer(&b[:4][0]))) -} - -func marshalPacketInfo(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_PKTINFO - m.SetLen(syscall.CmsgLen(sysSizeofInet6Pktinfo)) - if cm != nil { - pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) - if ip := cm.Src.To16(); ip != nil && ip.To4() == nil { - copy(pi.Addr[:], ip) - } - if cm.IfIndex > 0 { - pi.setIfindex(cm.IfIndex) - } - } - return b[syscall.CmsgSpace(sysSizeofInet6Pktinfo):] -} - -func parsePacketInfo(cm *ControlMessage, b []byte) { - pi := (*sysInet6Pktinfo)(unsafe.Pointer(&b[0])) - cm.Dst = pi.Addr[:] - cm.IfIndex = int(pi.Ifindex) -} - -func marshalNextHop(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_NEXTHOP - m.SetLen(syscall.CmsgLen(sysSizeofSockaddrInet6)) - if cm != nil { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&b[syscall.CmsgLen(0)])) - sa.setSockaddr(cm.NextHop, cm.IfIndex) - } - return b[syscall.CmsgSpace(sysSizeofSockaddrInet6):] -} - -func parseNextHop(cm *ControlMessage, b []byte) { -} - -func marshalPathMTU(b []byte, cm *ControlMessage) []byte { - m := (*syscall.Cmsghdr)(unsafe.Pointer(&b[0])) - m.Level = iana.ProtocolIPv6 - m.Type = sysIPV6_PATHMTU - m.SetLen(syscall.CmsgLen(sysSizeofIPv6Mtuinfo)) - return b[syscall.CmsgSpace(sysSizeofIPv6Mtuinfo):] -} - -func parsePathMTU(cm *ControlMessage, b []byte) { - mi := (*sysIPv6Mtuinfo)(unsafe.Pointer(&b[0])) - cm.Dst = mi.Addr.Addr[:] - cm.IfIndex = int(mi.Addr.Scope_id) - cm.MTU = int(mi.Mtu) -} diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go deleted file mode 100644 index 2fecf7e5..00000000 --- a/vendor/golang.org/x/net/ipv6/control_stub.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv6 - -func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { - return errOpNoSupport -} - -func newControlMessage(opt *rawOpt) (oob []byte) { - return nil -} - -func parseControlMessage(b []byte) (*ControlMessage, error) { - return nil, errOpNoSupport -} - -func marshalControlMessage(cm *ControlMessage) (oob []byte) { - return nil -} diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go deleted file mode 100644 index 2af5beb4..00000000 --- a/vendor/golang.org/x/net/ipv6/control_unix.go +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv6 - -import ( - "os" - "syscall" - - "golang.org/x/net/internal/iana" -) - -func setControlMessage(fd int, opt *rawOpt, cf ControlFlags, on bool) error { - opt.Lock() - defer opt.Unlock() - if cf&FlagTrafficClass != 0 && sockOpts[ssoReceiveTrafficClass].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceiveTrafficClass], boolint(on)); err != nil { - return err - } - if on { - opt.set(FlagTrafficClass) - } else { - opt.clear(FlagTrafficClass) - } - } - if cf&FlagHopLimit != 0 && sockOpts[ssoReceiveHopLimit].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceiveHopLimit], boolint(on)); err != nil { - return err - } - if on { - opt.set(FlagHopLimit) - } else { - opt.clear(FlagHopLimit) - } - } - if cf&flagPacketInfo != 0 && sockOpts[ssoReceivePacketInfo].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceivePacketInfo], boolint(on)); err != nil { - return err - } - if on { - opt.set(cf & flagPacketInfo) - } else { - opt.clear(cf & flagPacketInfo) - } - } - if cf&FlagPathMTU != 0 && sockOpts[ssoReceivePathMTU].name > 0 { - if err := setInt(fd, &sockOpts[ssoReceivePathMTU], boolint(on)); err != nil { - return err - } - if on { - opt.set(FlagPathMTU) - } else { - opt.clear(FlagPathMTU) - } - } - return nil -} - -func newControlMessage(opt *rawOpt) (oob []byte) { - opt.RLock() - var l int - if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlTrafficClass].length) - } - if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlHopLimit].length) - } - if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) - } - if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { - l += syscall.CmsgSpace(ctlOpts[ctlPathMTU].length) - } - if l > 0 { - oob = make([]byte, l) - b := oob - if opt.isset(FlagTrafficClass) && ctlOpts[ctlTrafficClass].name > 0 { - b = ctlOpts[ctlTrafficClass].marshal(b, nil) - } - if opt.isset(FlagHopLimit) && ctlOpts[ctlHopLimit].name > 0 { - b = ctlOpts[ctlHopLimit].marshal(b, nil) - } - if opt.isset(flagPacketInfo) && ctlOpts[ctlPacketInfo].name > 0 { - b = ctlOpts[ctlPacketInfo].marshal(b, nil) - } - if opt.isset(FlagPathMTU) && ctlOpts[ctlPathMTU].name > 0 { - b = ctlOpts[ctlPathMTU].marshal(b, nil) - } - } - opt.RUnlock() - return -} - -func parseControlMessage(b []byte) (*ControlMessage, error) { - if len(b) == 0 { - return nil, nil - } - cmsgs, err := syscall.ParseSocketControlMessage(b) - if err != nil { - return nil, os.NewSyscallError("parse socket control message", err) - } - cm := &ControlMessage{} - for _, m := range cmsgs { - if m.Header.Level != iana.ProtocolIPv6 { - continue - } - switch int(m.Header.Type) { - case ctlOpts[ctlTrafficClass].name: - ctlOpts[ctlTrafficClass].parse(cm, m.Data[:]) - case ctlOpts[ctlHopLimit].name: - ctlOpts[ctlHopLimit].parse(cm, m.Data[:]) - case ctlOpts[ctlPacketInfo].name: - ctlOpts[ctlPacketInfo].parse(cm, m.Data[:]) - case ctlOpts[ctlPathMTU].name: - ctlOpts[ctlPathMTU].parse(cm, m.Data[:]) - } - } - return cm, nil -} - -func marshalControlMessage(cm *ControlMessage) (oob []byte) { - if cm == nil { - return - } - var l int - tclass := false - if ctlOpts[ctlTrafficClass].name > 0 && cm.TrafficClass > 0 { - tclass = true - l += syscall.CmsgSpace(ctlOpts[ctlTrafficClass].length) - } - hoplimit := false - if ctlOpts[ctlHopLimit].name > 0 && cm.HopLimit > 0 { - hoplimit = true - l += syscall.CmsgSpace(ctlOpts[ctlHopLimit].length) - } - pktinfo := false - if ctlOpts[ctlPacketInfo].name > 0 && (cm.Src.To16() != nil && cm.Src.To4() == nil || cm.IfIndex > 0) { - pktinfo = true - l += syscall.CmsgSpace(ctlOpts[ctlPacketInfo].length) - } - nexthop := false - if ctlOpts[ctlNextHop].name > 0 && cm.NextHop.To16() != nil && cm.NextHop.To4() == nil { - nexthop = true - l += syscall.CmsgSpace(ctlOpts[ctlNextHop].length) - } - if l > 0 { - oob = make([]byte, l) - b := oob - if tclass { - b = ctlOpts[ctlTrafficClass].marshal(b, cm) - } - if hoplimit { - b = ctlOpts[ctlHopLimit].marshal(b, cm) - } - if pktinfo { - b = ctlOpts[ctlPacketInfo].marshal(b, cm) - } - if nexthop { - b = ctlOpts[ctlNextHop].marshal(b, cm) - } - } - return -} diff --git a/vendor/golang.org/x/net/ipv6/control_windows.go b/vendor/golang.org/x/net/ipv6/control_windows.go deleted file mode 100644 index 72fdc1b0..00000000 --- a/vendor/golang.org/x/net/ipv6/control_windows.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import "syscall" - -func setControlMessage(fd syscall.Handle, opt *rawOpt, cf ControlFlags, on bool) error { - // TODO(mikio): implement this - return syscall.EWINDOWS -} - -func newControlMessage(opt *rawOpt) (oob []byte) { - // TODO(mikio): implement this - return nil -} - -func parseControlMessage(b []byte) (*ControlMessage, error) { - // TODO(mikio): implement this - return nil, syscall.EWINDOWS -} - -func marshalControlMessage(cm *ControlMessage) (oob []byte) { - // TODO(mikio): implement this - return nil -} diff --git a/vendor/golang.org/x/net/ipv6/defs_darwin.go b/vendor/golang.org/x/net/ipv6/defs_darwin.go deleted file mode 100644 index 4c7f476a..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_darwin.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#define __APPLE_USE_RFC_3542 -#include <netinet/in.h> -#include <netinet/icmp6.h> -*/ -import "C" - -const ( - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP - sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP - - sysIPV6_PORTRANGE = C.IPV6_PORTRANGE - sysICMP6_FILTER = C.ICMP6_FILTER - sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO - sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT - sysIPV6_2292NEXTHOP = C.IPV6_2292NEXTHOP - sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS - sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS - sysIPV6_2292RTHDR = C.IPV6_2292RTHDR - - sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS - - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_V6ONLY = C.IPV6_V6ONLY - - sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY - - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - sysIPV6_TCLASS = C.IPV6_TCLASS - - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - - sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - - sysIPV6_PATHMTU = C.IPV6_PATHMTU - - sysIPV6_PKTINFO = C.IPV6_PKTINFO - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - sysIPV6_RTHDR = C.IPV6_RTHDR - - sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL - - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - - sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR - - sysIPV6_MSFILTER = C.IPV6_MSFILTER - sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP - sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP - sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP - sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP - sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE - sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - - sysIPV6_BOUND_IF = C.IPV6_BOUND_IF - - sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT - sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH - sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysSockaddrStorage C.struct_sockaddr_storage - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysICMPv6Filter C.struct_icmp6_filter - -type sysGroupReq C.struct_group_req - -type sysGroupSourceReq C.struct_group_source_req diff --git a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go b/vendor/golang.org/x/net/ipv6/defs_dragonfly.go deleted file mode 100644 index c72487ce..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_dragonfly.go +++ /dev/null @@ -1,84 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netinet/icmp6.h> -*/ -import "C" - -const ( - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP - sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP - sysIPV6_PORTRANGE = C.IPV6_PORTRANGE - sysICMP6_FILTER = C.ICMP6_FILTER - - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_V6ONLY = C.IPV6_V6ONLY - - sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY - - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - - sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - - sysIPV6_PATHMTU = C.IPV6_PATHMTU - - sysIPV6_PKTINFO = C.IPV6_PKTINFO - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - sysIPV6_RTHDR = C.IPV6_RTHDR - - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - - sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL - - sysIPV6_TCLASS = C.IPV6_TCLASS - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - - sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR - - sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT - sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH - sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_freebsd.go b/vendor/golang.org/x/net/ipv6/defs_freebsd.go deleted file mode 100644 index de199ec6..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_freebsd.go +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netinet/icmp6.h> -*/ -import "C" - -const ( - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP - sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP - sysIPV6_PORTRANGE = C.IPV6_PORTRANGE - sysICMP6_FILTER = C.ICMP6_FILTER - - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_V6ONLY = C.IPV6_V6ONLY - - sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY - - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - - sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - - sysIPV6_PATHMTU = C.IPV6_PATHMTU - - sysIPV6_PKTINFO = C.IPV6_PKTINFO - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - sysIPV6_RTHDR = C.IPV6_RTHDR - - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - - sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL - - sysIPV6_TCLASS = C.IPV6_TCLASS - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - - sysIPV6_PREFER_TEMPADDR = C.IPV6_PREFER_TEMPADDR - - sysIPV6_BINDANY = C.IPV6_BINDANY - - sysIPV6_MSFILTER = C.IPV6_MSFILTER - - sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP - sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP - sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP - sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP - sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE - sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - - sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT - sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH - sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - - sysSizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysSockaddrStorage C.struct_sockaddr_storage - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysGroupReq C.struct_group_req - -type sysGroupSourceReq C.struct_group_source_req - -type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_linux.go b/vendor/golang.org/x/net/ipv6/defs_linux.go deleted file mode 100644 index d83abce3..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_linux.go +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#include <linux/in.h> -#include <linux/in6.h> -#include <linux/ipv6.h> -#include <linux/icmpv6.h> -*/ -import "C" - -const ( - sysIPV6_ADDRFORM = C.IPV6_ADDRFORM - sysIPV6_2292PKTINFO = C.IPV6_2292PKTINFO - sysIPV6_2292HOPOPTS = C.IPV6_2292HOPOPTS - sysIPV6_2292DSTOPTS = C.IPV6_2292DSTOPTS - sysIPV6_2292RTHDR = C.IPV6_2292RTHDR - sysIPV6_2292PKTOPTIONS = C.IPV6_2292PKTOPTIONS - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_2292HOPLIMIT = C.IPV6_2292HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_FLOWINFO = C.IPV6_FLOWINFO - - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_ADD_MEMBERSHIP = C.IPV6_ADD_MEMBERSHIP - sysIPV6_DROP_MEMBERSHIP = C.IPV6_DROP_MEMBERSHIP - sysMCAST_JOIN_GROUP = C.MCAST_JOIN_GROUP - sysMCAST_LEAVE_GROUP = C.MCAST_LEAVE_GROUP - sysMCAST_JOIN_SOURCE_GROUP = C.MCAST_JOIN_SOURCE_GROUP - sysMCAST_LEAVE_SOURCE_GROUP = C.MCAST_LEAVE_SOURCE_GROUP - sysMCAST_BLOCK_SOURCE = C.MCAST_BLOCK_SOURCE - sysMCAST_UNBLOCK_SOURCE = C.MCAST_UNBLOCK_SOURCE - sysMCAST_MSFILTER = C.MCAST_MSFILTER - sysIPV6_ROUTER_ALERT = C.IPV6_ROUTER_ALERT - sysIPV6_MTU_DISCOVER = C.IPV6_MTU_DISCOVER - sysIPV6_MTU = C.IPV6_MTU - sysIPV6_RECVERR = C.IPV6_RECVERR - sysIPV6_V6ONLY = C.IPV6_V6ONLY - sysIPV6_JOIN_ANYCAST = C.IPV6_JOIN_ANYCAST - sysIPV6_LEAVE_ANYCAST = C.IPV6_LEAVE_ANYCAST - - //sysIPV6_PMTUDISC_DONT = C.IPV6_PMTUDISC_DONT - //sysIPV6_PMTUDISC_WANT = C.IPV6_PMTUDISC_WANT - //sysIPV6_PMTUDISC_DO = C.IPV6_PMTUDISC_DO - //sysIPV6_PMTUDISC_PROBE = C.IPV6_PMTUDISC_PROBE - //sysIPV6_PMTUDISC_INTERFACE = C.IPV6_PMTUDISC_INTERFACE - //sysIPV6_PMTUDISC_OMIT = C.IPV6_PMTUDISC_OMIT - - sysIPV6_FLOWLABEL_MGR = C.IPV6_FLOWLABEL_MGR - sysIPV6_FLOWINFO_SEND = C.IPV6_FLOWINFO_SEND - - sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY - sysIPV6_XFRM_POLICY = C.IPV6_XFRM_POLICY - - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - sysIPV6_PKTINFO = C.IPV6_PKTINFO - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - sysIPV6_RTHDR = C.IPV6_RTHDR - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - sysIPV6_PATHMTU = C.IPV6_PATHMTU - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - sysIPV6_TCLASS = C.IPV6_TCLASS - - sysIPV6_ADDR_PREFERENCES = C.IPV6_ADDR_PREFERENCES - - sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP - sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = C.IPV6_PREFER_SRC_PUBTMP_DEFAULT - sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA - sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME - sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA - sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA - - sysIPV6_MINHOPCOUNT = C.IPV6_MINHOPCOUNT - - sysIPV6_ORIGDSTADDR = C.IPV6_ORIGDSTADDR - sysIPV6_RECVORIGDSTADDR = C.IPV6_RECVORIGDSTADDR - sysIPV6_TRANSPARENT = C.IPV6_TRANSPARENT - sysIPV6_UNICAST_IF = C.IPV6_UNICAST_IF - - sysICMPV6_FILTER = C.ICMPV6_FILTER - - sysICMPV6_FILTER_BLOCK = C.ICMPV6_FILTER_BLOCK - sysICMPV6_FILTER_PASS = C.ICMPV6_FILTER_PASS - sysICMPV6_FILTER_BLOCKOTHERS = C.ICMPV6_FILTER_BLOCKOTHERS - sysICMPV6_FILTER_PASSONLY = C.ICMPV6_FILTER_PASSONLY - - sysSizeofKernelSockaddrStorage = C.sizeof_struct___kernel_sockaddr_storage - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - sysSizeofIPv6FlowlabelReq = C.sizeof_struct_in6_flowlabel_req - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - sysSizeofGroupReq = C.sizeof_struct_group_req - sysSizeofGroupSourceReq = C.sizeof_struct_group_source_req - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysKernelSockaddrStorage C.struct___kernel_sockaddr_storage - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6FlowlabelReq C.struct_in6_flowlabel_req - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysGroupReq C.struct_group_req - -type sysGroupSourceReq C.struct_group_source_req - -type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_netbsd.go b/vendor/golang.org/x/net/ipv6/defs_netbsd.go deleted file mode 100644 index 7bd09e8e..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_netbsd.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netinet/icmp6.h> -*/ -import "C" - -const ( - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP - sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP - sysIPV6_PORTRANGE = C.IPV6_PORTRANGE - sysICMP6_FILTER = C.ICMP6_FILTER - - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_V6ONLY = C.IPV6_V6ONLY - - sysIPV6_IPSEC_POLICY = C.IPV6_IPSEC_POLICY - - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - - sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - sysIPV6_PATHMTU = C.IPV6_PATHMTU - - sysIPV6_PKTINFO = C.IPV6_PKTINFO - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - sysIPV6_RTHDR = C.IPV6_RTHDR - - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - - sysIPV6_TCLASS = C.IPV6_TCLASS - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - - sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT - sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH - sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_openbsd.go b/vendor/golang.org/x/net/ipv6/defs_openbsd.go deleted file mode 100644 index 6796d9b2..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_openbsd.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#include <sys/param.h> -#include <sys/socket.h> - -#include <netinet/in.h> -#include <netinet/icmp6.h> -*/ -import "C" - -const ( - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP - sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP - sysIPV6_PORTRANGE = C.IPV6_PORTRANGE - sysICMP6_FILTER = C.ICMP6_FILTER - - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_V6ONLY = C.IPV6_V6ONLY - - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - - sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - - sysIPV6_PATHMTU = C.IPV6_PATHMTU - - sysIPV6_PKTINFO = C.IPV6_PKTINFO - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - sysIPV6_RTHDR = C.IPV6_RTHDR - - sysIPV6_AUTH_LEVEL = C.IPV6_AUTH_LEVEL - sysIPV6_ESP_TRANS_LEVEL = C.IPV6_ESP_TRANS_LEVEL - sysIPV6_ESP_NETWORK_LEVEL = C.IPV6_ESP_NETWORK_LEVEL - sysIPSEC6_OUTSA = C.IPSEC6_OUTSA - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - - sysIPV6_AUTOFLOWLABEL = C.IPV6_AUTOFLOWLABEL - sysIPV6_IPCOMP_LEVEL = C.IPV6_IPCOMP_LEVEL - - sysIPV6_TCLASS = C.IPV6_TCLASS - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - sysIPV6_PIPEX = C.IPV6_PIPEX - - sysIPV6_RTABLE = C.IPV6_RTABLE - - sysIPV6_PORTRANGE_DEFAULT = C.IPV6_PORTRANGE_DEFAULT - sysIPV6_PORTRANGE_HIGH = C.IPV6_PORTRANGE_HIGH - sysIPV6_PORTRANGE_LOW = C.IPV6_PORTRANGE_LOW - - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/defs_solaris.go b/vendor/golang.org/x/net/ipv6/defs_solaris.go deleted file mode 100644 index 972b1712..00000000 --- a/vendor/golang.org/x/net/ipv6/defs_solaris.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -// +godefs map struct_in6_addr [16]byte /* in6_addr */ - -package ipv6 - -/* -#include <netinet/in.h> -#include <netinet/icmp6.h> -*/ -import "C" - -const ( - sysIPV6_UNICAST_HOPS = C.IPV6_UNICAST_HOPS - sysIPV6_MULTICAST_IF = C.IPV6_MULTICAST_IF - sysIPV6_MULTICAST_HOPS = C.IPV6_MULTICAST_HOPS - sysIPV6_MULTICAST_LOOP = C.IPV6_MULTICAST_LOOP - sysIPV6_JOIN_GROUP = C.IPV6_JOIN_GROUP - sysIPV6_LEAVE_GROUP = C.IPV6_LEAVE_GROUP - - sysIPV6_PKTINFO = C.IPV6_PKTINFO - - sysIPV6_HOPLIMIT = C.IPV6_HOPLIMIT - sysIPV6_NEXTHOP = C.IPV6_NEXTHOP - sysIPV6_HOPOPTS = C.IPV6_HOPOPTS - sysIPV6_DSTOPTS = C.IPV6_DSTOPTS - - sysIPV6_RTHDR = C.IPV6_RTHDR - sysIPV6_RTHDRDSTOPTS = C.IPV6_RTHDRDSTOPTS - - sysIPV6_RECVPKTINFO = C.IPV6_RECVPKTINFO - sysIPV6_RECVHOPLIMIT = C.IPV6_RECVHOPLIMIT - sysIPV6_RECVHOPOPTS = C.IPV6_RECVHOPOPTS - - sysIPV6_RECVRTHDR = C.IPV6_RECVRTHDR - - sysIPV6_RECVRTHDRDSTOPTS = C.IPV6_RECVRTHDRDSTOPTS - - sysIPV6_CHECKSUM = C.IPV6_CHECKSUM - sysIPV6_RECVTCLASS = C.IPV6_RECVTCLASS - sysIPV6_USE_MIN_MTU = C.IPV6_USE_MIN_MTU - sysIPV6_DONTFRAG = C.IPV6_DONTFRAG - sysIPV6_SEC_OPT = C.IPV6_SEC_OPT - sysIPV6_SRC_PREFERENCES = C.IPV6_SRC_PREFERENCES - sysIPV6_RECVPATHMTU = C.IPV6_RECVPATHMTU - sysIPV6_PATHMTU = C.IPV6_PATHMTU - sysIPV6_TCLASS = C.IPV6_TCLASS - sysIPV6_V6ONLY = C.IPV6_V6ONLY - - sysIPV6_RECVDSTOPTS = C.IPV6_RECVDSTOPTS - - sysIPV6_PREFER_SRC_HOME = C.IPV6_PREFER_SRC_HOME - sysIPV6_PREFER_SRC_COA = C.IPV6_PREFER_SRC_COA - sysIPV6_PREFER_SRC_PUBLIC = C.IPV6_PREFER_SRC_PUBLIC - sysIPV6_PREFER_SRC_TMP = C.IPV6_PREFER_SRC_TMP - sysIPV6_PREFER_SRC_NONCGA = C.IPV6_PREFER_SRC_NONCGA - sysIPV6_PREFER_SRC_CGA = C.IPV6_PREFER_SRC_CGA - - sysIPV6_PREFER_SRC_MIPMASK = C.IPV6_PREFER_SRC_MIPMASK - sysIPV6_PREFER_SRC_MIPDEFAULT = C.IPV6_PREFER_SRC_MIPDEFAULT - sysIPV6_PREFER_SRC_TMPMASK = C.IPV6_PREFER_SRC_TMPMASK - sysIPV6_PREFER_SRC_TMPDEFAULT = C.IPV6_PREFER_SRC_TMPDEFAULT - sysIPV6_PREFER_SRC_CGAMASK = C.IPV6_PREFER_SRC_CGAMASK - sysIPV6_PREFER_SRC_CGADEFAULT = C.IPV6_PREFER_SRC_CGADEFAULT - - sysIPV6_PREFER_SRC_MASK = C.IPV6_PREFER_SRC_MASK - - sysIPV6_PREFER_SRC_DEFAULT = C.IPV6_PREFER_SRC_DEFAULT - - sysIPV6_BOUND_IF = C.IPV6_BOUND_IF - sysIPV6_UNSPEC_SRC = C.IPV6_UNSPEC_SRC - - sysICMP6_FILTER = C.ICMP6_FILTER - - sysSizeofSockaddrInet6 = C.sizeof_struct_sockaddr_in6 - sysSizeofInet6Pktinfo = C.sizeof_struct_in6_pktinfo - sysSizeofIPv6Mtuinfo = C.sizeof_struct_ip6_mtuinfo - - sysSizeofIPv6Mreq = C.sizeof_struct_ipv6_mreq - - sysSizeofICMPv6Filter = C.sizeof_struct_icmp6_filter -) - -type sysSockaddrInet6 C.struct_sockaddr_in6 - -type sysInet6Pktinfo C.struct_in6_pktinfo - -type sysIPv6Mtuinfo C.struct_ip6_mtuinfo - -type sysIPv6Mreq C.struct_ipv6_mreq - -type sysICMPv6Filter C.struct_icmp6_filter diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go b/vendor/golang.org/x/net/ipv6/dgramopt_posix.go deleted file mode 100644 index 93ff2f1a..00000000 --- a/vendor/golang.org/x/net/ipv6/dgramopt_posix.go +++ /dev/null @@ -1,288 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd windows - -package ipv6 - -import ( - "net" - "syscall" -) - -// MulticastHopLimit returns the hop limit field value for outgoing -// multicast packets. -func (c *dgramOpt) MulticastHopLimit() (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return 0, err - } - return getInt(fd, &sockOpts[ssoMulticastHopLimit]) -} - -// SetMulticastHopLimit sets the hop limit field value for future -// outgoing multicast packets. -func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoMulticastHopLimit], hoplim) -} - -// MulticastInterface returns the default interface for multicast -// packet transmissions. -func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { - if !c.ok() { - return nil, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return nil, err - } - return getInterface(fd, &sockOpts[ssoMulticastInterface]) -} - -// SetMulticastInterface sets the default interface for future -// multicast packet transmissions. -func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInterface(fd, &sockOpts[ssoMulticastInterface], ifi) -} - -// MulticastLoopback reports whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) MulticastLoopback() (bool, error) { - if !c.ok() { - return false, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return false, err - } - on, err := getInt(fd, &sockOpts[ssoMulticastLoopback]) - if err != nil { - return false, err - } - return on == 1, nil -} - -// SetMulticastLoopback sets whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) SetMulticastLoopback(on bool) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoMulticastLoopback], boolint(on)) -} - -// JoinGroup joins the group address group on the interface ifi. -// By default all sources that can cast data to group are accepted. -// It's possible to mute and unmute data transmission from a specific -// source by using ExcludeSourceSpecificGroup and -// IncludeSourceSpecificGroup. -// JoinGroup uses the system assigned multicast interface when ifi is -// nil, although this is not recommended because the assignment -// depends on platforms and sometimes it might require routing -// configuration. -func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP16(group) - if grp == nil { - return errMissingAddress - } - return setGroup(fd, &sockOpts[ssoJoinGroup], ifi, grp) -} - -// LeaveGroup leaves the group address group on the interface ifi -// regardless of whether the group is any-source group or -// source-specific group. -func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP16(group) - if grp == nil { - return errMissingAddress - } - return setGroup(fd, &sockOpts[ssoLeaveGroup], ifi, grp) -} - -// JoinSourceSpecificGroup joins the source-specific group comprising -// group and source on the interface ifi. -// JoinSourceSpecificGroup uses the system assigned multicast -// interface when ifi is nil, although this is not recommended because -// the assignment depends on platforms and sometimes it might require -// routing configuration. -func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP16(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP16(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoJoinSourceGroup], ifi, grp, src) -} - -// LeaveSourceSpecificGroup leaves the source-specific group on the -// interface ifi. -func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP16(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP16(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoLeaveSourceGroup], ifi, grp, src) -} - -// ExcludeSourceSpecificGroup excludes the source-specific group from -// the already joined any-source groups by JoinGroup on the interface -// ifi. -func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP16(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP16(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoBlockSourceGroup], ifi, grp, src) -} - -// IncludeSourceSpecificGroup includes the excluded source-specific -// group by ExcludeSourceSpecificGroup again on the interface ifi. -func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - grp := netAddrToIP16(group) - if grp == nil { - return errMissingAddress - } - src := netAddrToIP16(source) - if src == nil { - return errMissingAddress - } - return setSourceGroup(fd, &sockOpts[ssoUnblockSourceGroup], ifi, grp, src) -} - -// Checksum reports whether the kernel will compute, store or verify a -// checksum for both incoming and outgoing packets. If on is true, it -// returns an offset in bytes into the data of where the checksum -// field is located. -func (c *dgramOpt) Checksum() (on bool, offset int, err error) { - if !c.ok() { - return false, 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return false, 0, err - } - offset, err = getInt(fd, &sockOpts[ssoChecksum]) - if err != nil { - return false, 0, err - } - if offset < 0 { - return false, 0, nil - } - return true, offset, nil -} - -// SetChecksum enables the kernel checksum processing. If on is ture, -// the offset should be an offset in bytes into the data of where the -// checksum field is located. -func (c *dgramOpt) SetChecksum(on bool, offset int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - if !on { - offset = -1 - } - return setInt(fd, &sockOpts[ssoChecksum], offset) -} - -// ICMPFilter returns an ICMP filter. -func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { - if !c.ok() { - return nil, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return nil, err - } - return getICMPFilter(fd, &sockOpts[ssoICMPFilter]) -} - -// SetICMPFilter deploys the ICMP filter. -func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setICMPFilter(fd, &sockOpts[ssoICMPFilter], f) -} diff --git a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go b/vendor/golang.org/x/net/ipv6/dgramopt_stub.go deleted file mode 100644 index fb067fb2..00000000 --- a/vendor/golang.org/x/net/ipv6/dgramopt_stub.go +++ /dev/null @@ -1,119 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv6 - -import "net" - -// MulticastHopLimit returns the hop limit field value for outgoing -// multicast packets. -func (c *dgramOpt) MulticastHopLimit() (int, error) { - return 0, errOpNoSupport -} - -// SetMulticastHopLimit sets the hop limit field value for future -// outgoing multicast packets. -func (c *dgramOpt) SetMulticastHopLimit(hoplim int) error { - return errOpNoSupport -} - -// MulticastInterface returns the default interface for multicast -// packet transmissions. -func (c *dgramOpt) MulticastInterface() (*net.Interface, error) { - return nil, errOpNoSupport -} - -// SetMulticastInterface sets the default interface for future -// multicast packet transmissions. -func (c *dgramOpt) SetMulticastInterface(ifi *net.Interface) error { - return errOpNoSupport -} - -// MulticastLoopback reports whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) MulticastLoopback() (bool, error) { - return false, errOpNoSupport -} - -// SetMulticastLoopback sets whether transmitted multicast packets -// should be copied and send back to the originator. -func (c *dgramOpt) SetMulticastLoopback(on bool) error { - return errOpNoSupport -} - -// JoinGroup joins the group address group on the interface ifi. -// By default all sources that can cast data to group are accepted. -// It's possible to mute and unmute data transmission from a specific -// source by using ExcludeSourceSpecificGroup and -// IncludeSourceSpecificGroup. -// JoinGroup uses the system assigned multicast interface when ifi is -// nil, although this is not recommended because the assignment -// depends on platforms and sometimes it might require routing -// configuration. -func (c *dgramOpt) JoinGroup(ifi *net.Interface, group net.Addr) error { - return errOpNoSupport -} - -// LeaveGroup leaves the group address group on the interface ifi -// regardless of whether the group is any-source group or -// source-specific group. -func (c *dgramOpt) LeaveGroup(ifi *net.Interface, group net.Addr) error { - return errOpNoSupport -} - -// JoinSourceSpecificGroup joins the source-specific group comprising -// group and source on the interface ifi. -// JoinSourceSpecificGroup uses the system assigned multicast -// interface when ifi is nil, although this is not recommended because -// the assignment depends on platforms and sometimes it might require -// routing configuration. -func (c *dgramOpt) JoinSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// LeaveSourceSpecificGroup leaves the source-specific group on the -// interface ifi. -func (c *dgramOpt) LeaveSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// ExcludeSourceSpecificGroup excludes the source-specific group from -// the already joined any-source groups by JoinGroup on the interface -// ifi. -func (c *dgramOpt) ExcludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// IncludeSourceSpecificGroup includes the excluded source-specific -// group by ExcludeSourceSpecificGroup again on the interface ifi. -func (c *dgramOpt) IncludeSourceSpecificGroup(ifi *net.Interface, group, source net.Addr) error { - return errOpNoSupport -} - -// Checksum reports whether the kernel will compute, store or verify a -// checksum for both incoming and outgoing packets. If on is true, it -// returns an offset in bytes into the data of where the checksum -// field is located. -func (c *dgramOpt) Checksum() (on bool, offset int, err error) { - return false, 0, errOpNoSupport -} - -// SetChecksum enables the kernel checksum processing. If on is ture, -// the offset should be an offset in bytes into the data of where the -// checksum field is located. -func (c *dgramOpt) SetChecksum(on bool, offset int) error { - return errOpNoSupport -} - -// ICMPFilter returns an ICMP filter. -func (c *dgramOpt) ICMPFilter() (*ICMPFilter, error) { - return nil, errOpNoSupport -} - -// SetICMPFilter deploys the ICMP filter. -func (c *dgramOpt) SetICMPFilter(f *ICMPFilter) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv6/doc.go b/vendor/golang.org/x/net/ipv6/doc.go deleted file mode 100644 index 3c15c21f..00000000 --- a/vendor/golang.org/x/net/ipv6/doc.go +++ /dev/null @@ -1,240 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package ipv6 implements IP-level socket options for the Internet -// Protocol version 6. -// -// The package provides IP-level socket options that allow -// manipulation of IPv6 facilities. -// -// The IPv6 protocol is defined in RFC 2460. -// Basic and advanced socket interface extensions are defined in RFC -// 3493 and RFC 3542. -// Socket interface extensions for multicast source filters are -// defined in RFC 3678. -// MLDv1 and MLDv2 are defined in RFC 2710 and RFC 3810. -// Source-specific multicast is defined in RFC 4607. -// -// -// Unicasting -// -// The options for unicasting are available for net.TCPConn, -// net.UDPConn and net.IPConn which are created as network connections -// that use the IPv6 transport. When a single TCP connection carrying -// a data flow of multiple packets needs to indicate the flow is -// important, ipv6.Conn is used to set the traffic class field on the -// IPv6 header for each packet. -// -// ln, err := net.Listen("tcp6", "[::]:1024") -// if err != nil { -// // error handling -// } -// defer ln.Close() -// for { -// c, err := ln.Accept() -// if err != nil { -// // error handling -// } -// go func(c net.Conn) { -// defer c.Close() -// -// The outgoing packets will be labeled DiffServ assured forwarding -// class 1 low drop precedence, known as AF11 packets. -// -// if err := ipv6.NewConn(c).SetTrafficClass(0x28); err != nil { -// // error handling -// } -// if _, err := c.Write(data); err != nil { -// // error handling -// } -// }(c) -// } -// -// -// Multicasting -// -// The options for multicasting are available for net.UDPConn and -// net.IPconn which are created as network connections that use the -// IPv6 transport. A few network facilities must be prepared before -// you begin multicasting, at a minimum joining network interfaces and -// multicast groups. -// -// en0, err := net.InterfaceByName("en0") -// if err != nil { -// // error handling -// } -// en1, err := net.InterfaceByIndex(911) -// if err != nil { -// // error handling -// } -// group := net.ParseIP("ff02::114") -// -// First, an application listens to an appropriate address with an -// appropriate service port. -// -// c, err := net.ListenPacket("udp6", "[::]:1024") -// if err != nil { -// // error handling -// } -// defer c.Close() -// -// Second, the application joins multicast groups, starts listening to -// the groups on the specified network interfaces. Note that the -// service port for transport layer protocol does not matter with this -// operation as joining groups affects only network and link layer -// protocols, such as IPv6 and Ethernet. -// -// p := ipv6.NewPacketConn(c) -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: group}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en1, &net.UDPAddr{IP: group}); err != nil { -// // error handling -// } -// -// The application might set per packet control message transmissions -// between the protocol stack within the kernel. When the application -// needs a destination address on an incoming packet, -// SetControlMessage of ipv6.PacketConn is used to enable control -// message transmissons. -// -// if err := p.SetControlMessage(ipv6.FlagDst, true); err != nil { -// // error handling -// } -// -// The application could identify whether the received packets are -// of interest by using the control message that contains the -// destination address of the received packet. -// -// b := make([]byte, 1500) -// for { -// n, rcm, src, err := p.ReadFrom(b) -// if err != nil { -// // error handling -// } -// if rcm.Dst.IsMulticast() { -// if rcm.Dst.Equal(group) { -// // joined group, do something -// } else { -// // unknown group, discard -// continue -// } -// } -// -// The application can also send both unicast and multicast packets. -// -// p.SetTrafficClass(0x0) -// p.SetHopLimit(16) -// if _, err := p.WriteTo(data[:n], nil, src); err != nil { -// // error handling -// } -// dst := &net.UDPAddr{IP: group, Port: 1024} -// wcm := ipv6.ControlMessage{TrafficClass: DiffServCS7, HopLimit: 1} -// for _, ifi := range []*net.Interface{en0, en1} { -// wcm.IfIndex = ifi.Index -// if _, err := p.WriteTo(data[:n], &wcm, dst); err != nil { -// // error handling -// } -// } -// } -// -// -// More multicasting -// -// An application that uses PacketConn may join multiple multicast -// groups. For example, a UDP listener with port 1024 might join two -// different groups across over two different network interfaces by -// using: -// -// c, err := net.ListenPacket("udp6", "[::]:1024") -// if err != nil { -// // error handling -// } -// defer c.Close() -// p := ipv6.NewPacketConn(c) -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en1, &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}); err != nil { -// // error handling -// } -// -// It is possible for multiple UDP listeners that listen on the same -// UDP port to join the same multicast group. The net package will -// provide a socket that listens to a wildcard address with reusable -// UDP port when an appropriate multicast address prefix is passed to -// the net.ListenPacket or net.ListenUDP. -// -// c1, err := net.ListenPacket("udp6", "[ff02::]:1024") -// if err != nil { -// // error handling -// } -// defer c1.Close() -// c2, err := net.ListenPacket("udp6", "[ff02::]:1024") -// if err != nil { -// // error handling -// } -// defer c2.Close() -// p1 := ipv6.NewPacketConn(c1) -// if err := p1.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { -// // error handling -// } -// p2 := ipv6.NewPacketConn(c2) -// if err := p2.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { -// // error handling -// } -// -// Also it is possible for the application to leave or rejoin a -// multicast group on the network interface. -// -// if err := p.LeaveGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff02::114")}); err != nil { -// // error handling -// } -// if err := p.JoinGroup(en0, &net.UDPAddr{IP: net.ParseIP("ff01::114")}); err != nil { -// // error handling -// } -// -// -// Source-specific multicasting -// -// An application that uses PacketConn on MLDv2 supported platform is -// able to join source-specific multicast groups. -// The application may use JoinSourceSpecificGroup and -// LeaveSourceSpecificGroup for the operation known as "include" mode, -// -// ssmgroup := net.UDPAddr{IP: net.ParseIP("ff32::8000:9")} -// ssmsource := net.UDPAddr{IP: net.ParseIP("fe80::cafe")} -// if err := p.JoinSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { -// // error handling -// } -// if err := p.LeaveSourceSpecificGroup(en0, &ssmgroup, &ssmsource); err != nil { -// // error handling -// } -// -// or JoinGroup, ExcludeSourceSpecificGroup, -// IncludeSourceSpecificGroup and LeaveGroup for the operation known -// as "exclude" mode. -// -// exclsource := net.UDPAddr{IP: net.ParseIP("fe80::dead")} -// if err := p.JoinGroup(en0, &ssmgroup); err != nil { -// // error handling -// } -// if err := p.ExcludeSourceSpecificGroup(en0, &ssmgroup, &exclsource); err != nil { -// // error handling -// } -// if err := p.LeaveGroup(en0, &ssmgroup); err != nil { -// // error handling -// } -// -// Note that it depends on each platform implementation what happens -// when an application which runs on MLDv2 unsupported platform uses -// JoinSourceSpecificGroup and LeaveSourceSpecificGroup. -// In general the platform tries to fall back to conversations using -// MLDv1 and starts to listen to multicast traffic. -// In the fallback case, ExcludeSourceSpecificGroup and -// IncludeSourceSpecificGroup may return an error. -package ipv6 // import "golang.org/x/net/ipv6" diff --git a/vendor/golang.org/x/net/ipv6/endpoint.go b/vendor/golang.org/x/net/ipv6/endpoint.go deleted file mode 100644 index 966eaa89..00000000 --- a/vendor/golang.org/x/net/ipv6/endpoint.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "syscall" - "time" -) - -// A Conn represents a network endpoint that uses IPv6 transport. -// It allows to set basic IP-level socket options such as traffic -// class and hop limit. -type Conn struct { - genericOpt -} - -type genericOpt struct { - net.Conn -} - -func (c *genericOpt) ok() bool { return c != nil && c.Conn != nil } - -// PathMTU returns a path MTU value for the destination associated -// with the endpoint. -func (c *Conn) PathMTU() (int, error) { - if !c.genericOpt.ok() { - return 0, syscall.EINVAL - } - fd, err := c.genericOpt.sysfd() - if err != nil { - return 0, err - } - _, mtu, err := getMTUInfo(fd, &sockOpts[ssoPathMTU]) - if err != nil { - return 0, err - } - return mtu, nil -} - -// NewConn returns a new Conn. -func NewConn(c net.Conn) *Conn { - return &Conn{ - genericOpt: genericOpt{Conn: c}, - } -} - -// A PacketConn represents a packet network endpoint that uses IPv6 -// transport. It is used to control several IP-level socket options -// including IPv6 header manipulation. It also provides datagram -// based network I/O methods specific to the IPv6 and higher layer -// protocols such as OSPF, GRE, and UDP. -type PacketConn struct { - genericOpt - dgramOpt - payloadHandler -} - -type dgramOpt struct { - net.PacketConn -} - -func (c *dgramOpt) ok() bool { return c != nil && c.PacketConn != nil } - -// SetControlMessage allows to receive the per packet basis IP-level -// socket options. -func (c *PacketConn) SetControlMessage(cf ControlFlags, on bool) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - fd, err := c.payloadHandler.sysfd() - if err != nil { - return err - } - return setControlMessage(fd, &c.payloadHandler.rawOpt, cf, on) -} - -// SetDeadline sets the read and write deadlines associated with the -// endpoint. -func (c *PacketConn) SetDeadline(t time.Time) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.SetDeadline(t) -} - -// SetReadDeadline sets the read deadline associated with the -// endpoint. -func (c *PacketConn) SetReadDeadline(t time.Time) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.SetReadDeadline(t) -} - -// SetWriteDeadline sets the write deadline associated with the -// endpoint. -func (c *PacketConn) SetWriteDeadline(t time.Time) error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.SetWriteDeadline(t) -} - -// Close closes the endpoint. -func (c *PacketConn) Close() error { - if !c.payloadHandler.ok() { - return syscall.EINVAL - } - return c.payloadHandler.Close() -} - -// NewPacketConn returns a new PacketConn using c as its underlying -// transport. -func NewPacketConn(c net.PacketConn) *PacketConn { - return &PacketConn{ - genericOpt: genericOpt{Conn: c.(net.Conn)}, - dgramOpt: dgramOpt{PacketConn: c}, - payloadHandler: payloadHandler{PacketConn: c}, - } -} diff --git a/vendor/golang.org/x/net/ipv6/example_test.go b/vendor/golang.org/x/net/ipv6/example_test.go deleted file mode 100644 index a2a3030c..00000000 --- a/vendor/golang.org/x/net/ipv6/example_test.go +++ /dev/null @@ -1,214 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "fmt" - "log" - "net" - "os" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/ipv6" -) - -func ExampleConn_markingTCP() { - ln, err := net.Listen("tcp6", "[::]:1024") - if err != nil { - log.Fatal(err) - } - defer ln.Close() - - for { - c, err := ln.Accept() - if err != nil { - log.Fatal(err) - } - go func(c net.Conn) { - defer c.Close() - p := ipv6.NewConn(c) - if err := p.SetTrafficClass(0x28); err != nil { // DSCP AF11 - log.Fatal(err) - } - if err := p.SetHopLimit(128); err != nil { - log.Fatal(err) - } - if _, err := c.Write([]byte("HELLO-R-U-THERE-ACK")); err != nil { - log.Fatal(err) - } - }(c) - } -} - -func ExamplePacketConn_servingOneShotMulticastDNS() { - c, err := net.ListenPacket("udp6", "[::]:5353") // mDNS over UDP - if err != nil { - log.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - - en0, err := net.InterfaceByName("en0") - if err != nil { - log.Fatal(err) - } - mDNSLinkLocal := net.UDPAddr{IP: net.ParseIP("ff02::fb")} - if err := p.JoinGroup(en0, &mDNSLinkLocal); err != nil { - log.Fatal(err) - } - defer p.LeaveGroup(en0, &mDNSLinkLocal) - if err := p.SetControlMessage(ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { - log.Fatal(err) - } - - var wcm ipv6.ControlMessage - b := make([]byte, 1500) - for { - _, rcm, peer, err := p.ReadFrom(b) - if err != nil { - log.Fatal(err) - } - if !rcm.Dst.IsMulticast() || !rcm.Dst.Equal(mDNSLinkLocal.IP) { - continue - } - wcm.IfIndex = rcm.IfIndex - answers := []byte("FAKE-MDNS-ANSWERS") // fake mDNS answers, you need to implement this - if _, err := p.WriteTo(answers, &wcm, peer); err != nil { - log.Fatal(err) - } - } -} - -func ExamplePacketConn_tracingIPPacketRoute() { - // Tracing an IP packet route to www.google.com. - - const host = "www.google.com" - ips, err := net.LookupIP(host) - if err != nil { - log.Fatal(err) - } - var dst net.IPAddr - for _, ip := range ips { - if ip.To16() != nil && ip.To4() == nil { - dst.IP = ip - fmt.Printf("using %v for tracing an IP packet route to %s\n", dst.IP, host) - break - } - } - if dst.IP == nil { - log.Fatal("no AAAA record found") - } - - c, err := net.ListenPacket("ip6:58", "::") // ICMP for IPv6 - if err != nil { - log.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - - if err := p.SetControlMessage(ipv6.FlagHopLimit|ipv6.FlagSrc|ipv6.FlagDst|ipv6.FlagInterface, true); err != nil { - log.Fatal(err) - } - wm := icmp.Message{ - Type: ipv6.ICMPTypeEchoRequest, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, - Data: []byte("HELLO-R-U-THERE"), - }, - } - var f ipv6.ICMPFilter - f.SetAll(true) - f.Accept(ipv6.ICMPTypeTimeExceeded) - f.Accept(ipv6.ICMPTypeEchoReply) - if err := p.SetICMPFilter(&f); err != nil { - log.Fatal(err) - } - - var wcm ipv6.ControlMessage - rb := make([]byte, 1500) - for i := 1; i <= 64; i++ { // up to 64 hops - wm.Body.(*icmp.Echo).Seq = i - wb, err := wm.Marshal(nil) - if err != nil { - log.Fatal(err) - } - - // In the real world usually there are several - // multiple traffic-engineered paths for each hop. - // You may need to probe a few times to each hop. - begin := time.Now() - wcm.HopLimit = i - if _, err := p.WriteTo(wb, &wcm, &dst); err != nil { - log.Fatal(err) - } - if err := p.SetReadDeadline(time.Now().Add(3 * time.Second)); err != nil { - log.Fatal(err) - } - n, rcm, peer, err := p.ReadFrom(rb) - if err != nil { - if err, ok := err.(net.Error); ok && err.Timeout() { - fmt.Printf("%v\t*\n", i) - continue - } - log.Fatal(err) - } - rm, err := icmp.ParseMessage(58, rb[:n]) - if err != nil { - log.Fatal(err) - } - rtt := time.Since(begin) - - // In the real world you need to determine whether the - // received message is yours using ControlMessage.Src, - // ControlMesage.Dst, icmp.Echo.ID and icmp.Echo.Seq. - switch rm.Type { - case ipv6.ICMPTypeTimeExceeded: - names, _ := net.LookupAddr(peer.String()) - fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) - case ipv6.ICMPTypeEchoReply: - names, _ := net.LookupAddr(peer.String()) - fmt.Printf("%d\t%v %+v %v\n\t%+v\n", i, peer, names, rtt, rcm) - return - } - } -} - -func ExamplePacketConn_advertisingOSPFHello() { - c, err := net.ListenPacket("ip6:89", "::") // OSPF for IPv6 - if err != nil { - log.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - - en0, err := net.InterfaceByName("en0") - if err != nil { - log.Fatal(err) - } - allSPFRouters := net.IPAddr{IP: net.ParseIP("ff02::5")} - if err := p.JoinGroup(en0, &allSPFRouters); err != nil { - log.Fatal(err) - } - defer p.LeaveGroup(en0, &allSPFRouters) - - hello := make([]byte, 24) // fake hello data, you need to implement this - ospf := make([]byte, 16) // fake ospf header, you need to implement this - ospf[0] = 3 // version 3 - ospf[1] = 1 // hello packet - ospf = append(ospf, hello...) - if err := p.SetChecksum(true, 12); err != nil { - log.Fatal(err) - } - - cm := ipv6.ControlMessage{ - TrafficClass: 0xc0, // DSCP CS6 - HopLimit: 1, - IfIndex: en0.Index, - } - if _, err := p.WriteTo(ospf, &cm, &allSPFRouters); err != nil { - log.Fatal(err) - } -} diff --git a/vendor/golang.org/x/net/ipv6/gen.go b/vendor/golang.org/x/net/ipv6/gen.go deleted file mode 100644 index d9186c55..00000000 --- a/vendor/golang.org/x/net/ipv6/gen.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -//go:generate go run gen.go - -// This program generates system adaptation constants and types, -// internet protocol constants and tables by reading template files -// and IANA protocol registries. -package main - -import ( - "bytes" - "encoding/xml" - "fmt" - "go/format" - "io" - "io/ioutil" - "net/http" - "os" - "os/exec" - "runtime" - "strconv" - "strings" -) - -func main() { - if err := genzsys(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } - if err := geniana(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func genzsys() error { - defs := "defs_" + runtime.GOOS + ".go" - f, err := os.Open(defs) - if err != nil { - if os.IsNotExist(err) { - return nil - } - return err - } - f.Close() - cmd := exec.Command("go", "tool", "cgo", "-godefs", defs) - b, err := cmd.Output() - if err != nil { - return err - } - // The ipv6 pacakge still supports go1.2, and so we need to - // take care of additional platforms in go1.3 and above for - // working with go1.2. - switch { - case runtime.GOOS == "dragonfly" || runtime.GOOS == "solaris": - b = bytes.Replace(b, []byte("package ipv6\n"), []byte("// +build "+runtime.GOOS+"\n\npackage ipv6\n"), 1) - case runtime.GOOS == "linux" && (runtime.GOARCH == "arm64" || runtime.GOARCH == "ppc64" || runtime.GOARCH == "ppc64le"): - b = bytes.Replace(b, []byte("package ipv6\n"), []byte("// +build "+runtime.GOOS+","+runtime.GOARCH+"\n\npackage ipv6\n"), 1) - } - b, err = format.Source(b) - if err != nil { - return err - } - zsys := "zsys_" + runtime.GOOS + ".go" - switch runtime.GOOS { - case "freebsd", "linux": - zsys = "zsys_" + runtime.GOOS + "_" + runtime.GOARCH + ".go" - } - if err := ioutil.WriteFile(zsys, b, 0644); err != nil { - return err - } - return nil -} - -var registries = []struct { - url string - parse func(io.Writer, io.Reader) error -}{ - { - "http://www.iana.org/assignments/icmpv6-parameters/icmpv6-parameters.xml", - parseICMPv6Parameters, - }, -} - -func geniana() error { - var bb bytes.Buffer - fmt.Fprintf(&bb, "// go generate gen.go\n") - fmt.Fprintf(&bb, "// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n") - fmt.Fprintf(&bb, "package ipv6\n\n") - for _, r := range registries { - resp, err := http.Get(r.url) - if err != nil { - return err - } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("got HTTP status code %v for %v\n", resp.StatusCode, r.url) - } - if err := r.parse(&bb, resp.Body); err != nil { - return err - } - fmt.Fprintf(&bb, "\n") - } - b, err := format.Source(bb.Bytes()) - if err != nil { - return err - } - if err := ioutil.WriteFile("iana.go", b, 0644); err != nil { - return err - } - return nil -} - -func parseICMPv6Parameters(w io.Writer, r io.Reader) error { - dec := xml.NewDecoder(r) - var icp icmpv6Parameters - if err := dec.Decode(&icp); err != nil { - return err - } - prs := icp.escape() - fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) - fmt.Fprintf(w, "const (\n") - for _, pr := range prs { - if pr.Name == "" { - continue - } - fmt.Fprintf(w, "ICMPType%s ICMPType = %d", pr.Name, pr.Value) - fmt.Fprintf(w, "// %s\n", pr.OrigName) - } - fmt.Fprintf(w, ")\n\n") - fmt.Fprintf(w, "// %s, Updated: %s\n", icp.Title, icp.Updated) - fmt.Fprintf(w, "var icmpTypes = map[ICMPType]string{\n") - for _, pr := range prs { - if pr.Name == "" { - continue - } - fmt.Fprintf(w, "%d: %q,\n", pr.Value, strings.ToLower(pr.OrigName)) - } - fmt.Fprintf(w, "}\n") - return nil -} - -type icmpv6Parameters struct { - XMLName xml.Name `xml:"registry"` - Title string `xml:"title"` - Updated string `xml:"updated"` - Registries []struct { - Title string `xml:"title"` - Records []struct { - Value string `xml:"value"` - Name string `xml:"name"` - } `xml:"record"` - } `xml:"registry"` -} - -type canonICMPv6ParamRecord struct { - OrigName string - Name string - Value int -} - -func (icp *icmpv6Parameters) escape() []canonICMPv6ParamRecord { - id := -1 - for i, r := range icp.Registries { - if strings.Contains(r.Title, "Type") || strings.Contains(r.Title, "type") { - id = i - break - } - } - if id < 0 { - return nil - } - prs := make([]canonICMPv6ParamRecord, len(icp.Registries[id].Records)) - sr := strings.NewReplacer( - "Messages", "", - "Message", "", - "ICMP", "", - "+", "P", - "-", "", - "/", "", - ".", "", - " ", "", - ) - for i, pr := range icp.Registries[id].Records { - if strings.Contains(pr.Name, "Reserved") || - strings.Contains(pr.Name, "Unassigned") || - strings.Contains(pr.Name, "Deprecated") || - strings.Contains(pr.Name, "Experiment") || - strings.Contains(pr.Name, "experiment") { - continue - } - ss := strings.Split(pr.Name, "\n") - if len(ss) > 1 { - prs[i].Name = strings.Join(ss, " ") - } else { - prs[i].Name = ss[0] - } - s := strings.TrimSpace(prs[i].Name) - prs[i].OrigName = s - prs[i].Name = sr.Replace(s) - prs[i].Value, _ = strconv.Atoi(pr.Value) - } - return prs -} diff --git a/vendor/golang.org/x/net/ipv6/genericopt_posix.go b/vendor/golang.org/x/net/ipv6/genericopt_posix.go deleted file mode 100644 index dd77a016..00000000 --- a/vendor/golang.org/x/net/ipv6/genericopt_posix.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd windows - -package ipv6 - -import "syscall" - -// TrafficClass returns the traffic class field value for outgoing -// packets. -func (c *genericOpt) TrafficClass() (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return 0, err - } - return getInt(fd, &sockOpts[ssoTrafficClass]) -} - -// SetTrafficClass sets the traffic class field value for future -// outgoing packets. -func (c *genericOpt) SetTrafficClass(tclass int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoTrafficClass], tclass) -} - -// HopLimit returns the hop limit field value for outgoing packets. -func (c *genericOpt) HopLimit() (int, error) { - if !c.ok() { - return 0, syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return 0, err - } - return getInt(fd, &sockOpts[ssoHopLimit]) -} - -// SetHopLimit sets the hop limit field value for future outgoing -// packets. -func (c *genericOpt) SetHopLimit(hoplim int) error { - if !c.ok() { - return syscall.EINVAL - } - fd, err := c.sysfd() - if err != nil { - return err - } - return setInt(fd, &sockOpts[ssoHopLimit], hoplim) -} diff --git a/vendor/golang.org/x/net/ipv6/genericopt_stub.go b/vendor/golang.org/x/net/ipv6/genericopt_stub.go deleted file mode 100644 index f5c37224..00000000 --- a/vendor/golang.org/x/net/ipv6/genericopt_stub.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv6 - -// TrafficClass returns the traffic class field value for outgoing -// packets. -func (c *genericOpt) TrafficClass() (int, error) { - return 0, errOpNoSupport -} - -// SetTrafficClass sets the traffic class field value for future -// outgoing packets. -func (c *genericOpt) SetTrafficClass(tclass int) error { - return errOpNoSupport -} - -// HopLimit returns the hop limit field value for outgoing packets. -func (c *genericOpt) HopLimit() (int, error) { - return 0, errOpNoSupport -} - -// SetHopLimit sets the hop limit field value for future outgoing -// packets. -func (c *genericOpt) SetHopLimit(hoplim int) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv6/header.go b/vendor/golang.org/x/net/ipv6/header.go deleted file mode 100644 index 3c38b99c..00000000 --- a/vendor/golang.org/x/net/ipv6/header.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "errors" - "fmt" - "net" -) - -const ( - Version = 6 // protocol version - HeaderLen = 40 // header length -) - -// A Header represents an IPv6 base header. -type Header struct { - Version int // protocol version - TrafficClass int // traffic class - FlowLabel int // flow label - PayloadLen int // payload length - NextHeader int // next header - HopLimit int // hop limit - Src net.IP // source address - Dst net.IP // destination address -} - -func (h *Header) String() string { - if h == nil { - return "<nil>" - } - return fmt.Sprintf("ver: %v, tclass: %#x, flowlbl: %#x, payloadlen: %v, nxthdr: %v, hoplim: %v, src: %v, dst: %v", h.Version, h.TrafficClass, h.FlowLabel, h.PayloadLen, h.NextHeader, h.HopLimit, h.Src, h.Dst) -} - -// ParseHeader parses b as an IPv6 base header. -func ParseHeader(b []byte) (*Header, error) { - if len(b) < HeaderLen { - return nil, errors.New("header too short") - } - h := &Header{ - Version: int(b[0]) >> 4, - TrafficClass: int(b[0]&0x0f)<<4 | int(b[1])>>4, - FlowLabel: int(b[1]&0x0f)<<16 | int(b[2])<<8 | int(b[3]), - PayloadLen: int(b[4])<<8 | int(b[5]), - NextHeader: int(b[6]), - HopLimit: int(b[7]), - } - h.Src = make(net.IP, net.IPv6len) - copy(h.Src, b[8:24]) - h.Dst = make(net.IP, net.IPv6len) - copy(h.Dst, b[24:40]) - return h, nil -} diff --git a/vendor/golang.org/x/net/ipv6/header_test.go b/vendor/golang.org/x/net/ipv6/header_test.go deleted file mode 100644 index 18e0023e..00000000 --- a/vendor/golang.org/x/net/ipv6/header_test.go +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "net" - "reflect" - "testing" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/ipv6" -) - -var ( - wireHeaderFromKernel = [ipv6.HeaderLen]byte{ - 0x69, 0x8b, 0xee, 0xf1, - 0xca, 0xfe, 0x2c, 0x01, - 0x20, 0x01, 0x0d, 0xb8, - 0x00, 0x01, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - 0x20, 0x01, 0x0d, 0xb8, - 0x00, 0x02, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, - } - - testHeader = &ipv6.Header{ - Version: ipv6.Version, - TrafficClass: iana.DiffServAF43, - FlowLabel: 0xbeef1, - PayloadLen: 0xcafe, - NextHeader: iana.ProtocolIPv6Frag, - HopLimit: 1, - Src: net.ParseIP("2001:db8:1::1"), - Dst: net.ParseIP("2001:db8:2::1"), - } -) - -func TestParseHeader(t *testing.T) { - h, err := ipv6.ParseHeader(wireHeaderFromKernel[:]) - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(h, testHeader) { - t.Fatalf("got %#v; want %#v", h, testHeader) - } -} diff --git a/vendor/golang.org/x/net/ipv6/helper.go b/vendor/golang.org/x/net/ipv6/helper.go deleted file mode 100644 index 64934848..00000000 --- a/vendor/golang.org/x/net/ipv6/helper.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "errors" - "net" -) - -var errOpNoSupport = errors.New("operation not supported") - -func boolint(b bool) int { - if b { - return 1 - } - return 0 -} - -func netAddrToIP16(a net.Addr) net.IP { - switch v := a.(type) { - case *net.UDPAddr: - if ip := v.IP.To16(); ip != nil && ip.To4() == nil { - return ip - } - case *net.IPAddr: - if ip := v.IP.To16(); ip != nil && ip.To4() == nil { - return ip - } - } - return nil -} diff --git a/vendor/golang.org/x/net/ipv6/helper_stub.go b/vendor/golang.org/x/net/ipv6/helper_stub.go deleted file mode 100644 index 20354ab2..00000000 --- a/vendor/golang.org/x/net/ipv6/helper_stub.go +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv6 - -func (c *genericOpt) sysfd() (int, error) { - return 0, errOpNoSupport -} - -func (c *dgramOpt) sysfd() (int, error) { - return 0, errOpNoSupport -} - -func (c *payloadHandler) sysfd() (int, error) { - return 0, errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv6/helper_unix.go b/vendor/golang.org/x/net/ipv6/helper_unix.go deleted file mode 100644 index 92868ed2..00000000 --- a/vendor/golang.org/x/net/ipv6/helper_unix.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv6 - -import ( - "net" - "reflect" -) - -func (c *genericOpt) sysfd() (int, error) { - switch p := c.Conn.(type) { - case *net.TCPConn, *net.UDPConn, *net.IPConn: - return sysfd(p) - } - return 0, errInvalidConnType -} - -func (c *dgramOpt) sysfd() (int, error) { - switch p := c.PacketConn.(type) { - case *net.UDPConn, *net.IPConn: - return sysfd(p.(net.Conn)) - } - return 0, errInvalidConnType -} - -func (c *payloadHandler) sysfd() (int, error) { - return sysfd(c.PacketConn.(net.Conn)) -} - -func sysfd(c net.Conn) (int, error) { - cv := reflect.ValueOf(c) - switch ce := cv.Elem(); ce.Kind() { - case reflect.Struct: - nfd := ce.FieldByName("conn").FieldByName("fd") - switch fe := nfd.Elem(); fe.Kind() { - case reflect.Struct: - fd := fe.FieldByName("sysfd") - return int(fd.Int()), nil - } - } - return 0, errInvalidConnType -} diff --git a/vendor/golang.org/x/net/ipv6/helper_windows.go b/vendor/golang.org/x/net/ipv6/helper_windows.go deleted file mode 100644 index 28c401b5..00000000 --- a/vendor/golang.org/x/net/ipv6/helper_windows.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "reflect" - "syscall" -) - -func (c *genericOpt) sysfd() (syscall.Handle, error) { - switch p := c.Conn.(type) { - case *net.TCPConn, *net.UDPConn, *net.IPConn: - return sysfd(p) - } - return syscall.InvalidHandle, errInvalidConnType -} - -func (c *dgramOpt) sysfd() (syscall.Handle, error) { - switch p := c.PacketConn.(type) { - case *net.UDPConn, *net.IPConn: - return sysfd(p.(net.Conn)) - } - return syscall.InvalidHandle, errInvalidConnType -} - -func (c *payloadHandler) sysfd() (syscall.Handle, error) { - return sysfd(c.PacketConn.(net.Conn)) -} - -func sysfd(c net.Conn) (syscall.Handle, error) { - cv := reflect.ValueOf(c) - switch ce := cv.Elem(); ce.Kind() { - case reflect.Struct: - netfd := ce.FieldByName("conn").FieldByName("fd") - switch fe := netfd.Elem(); fe.Kind() { - case reflect.Struct: - fd := fe.FieldByName("sysfd") - return syscall.Handle(fd.Uint()), nil - } - } - return syscall.InvalidHandle, errInvalidConnType -} diff --git a/vendor/golang.org/x/net/ipv6/iana.go b/vendor/golang.org/x/net/ipv6/iana.go deleted file mode 100644 index 3c6214fb..00000000 --- a/vendor/golang.org/x/net/ipv6/iana.go +++ /dev/null @@ -1,82 +0,0 @@ -// go generate gen.go -// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT - -package ipv6 - -// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2015-07-07 -const ( - ICMPTypeDestinationUnreachable ICMPType = 1 // Destination Unreachable - ICMPTypePacketTooBig ICMPType = 2 // Packet Too Big - ICMPTypeTimeExceeded ICMPType = 3 // Time Exceeded - ICMPTypeParameterProblem ICMPType = 4 // Parameter Problem - ICMPTypeEchoRequest ICMPType = 128 // Echo Request - ICMPTypeEchoReply ICMPType = 129 // Echo Reply - ICMPTypeMulticastListenerQuery ICMPType = 130 // Multicast Listener Query - ICMPTypeMulticastListenerReport ICMPType = 131 // Multicast Listener Report - ICMPTypeMulticastListenerDone ICMPType = 132 // Multicast Listener Done - ICMPTypeRouterSolicitation ICMPType = 133 // Router Solicitation - ICMPTypeRouterAdvertisement ICMPType = 134 // Router Advertisement - ICMPTypeNeighborSolicitation ICMPType = 135 // Neighbor Solicitation - ICMPTypeNeighborAdvertisement ICMPType = 136 // Neighbor Advertisement - ICMPTypeRedirect ICMPType = 137 // Redirect Message - ICMPTypeRouterRenumbering ICMPType = 138 // Router Renumbering - ICMPTypeNodeInformationQuery ICMPType = 139 // ICMP Node Information Query - ICMPTypeNodeInformationResponse ICMPType = 140 // ICMP Node Information Response - ICMPTypeInverseNeighborDiscoverySolicitation ICMPType = 141 // Inverse Neighbor Discovery Solicitation Message - ICMPTypeInverseNeighborDiscoveryAdvertisement ICMPType = 142 // Inverse Neighbor Discovery Advertisement Message - ICMPTypeVersion2MulticastListenerReport ICMPType = 143 // Version 2 Multicast Listener Report - ICMPTypeHomeAgentAddressDiscoveryRequest ICMPType = 144 // Home Agent Address Discovery Request Message - ICMPTypeHomeAgentAddressDiscoveryReply ICMPType = 145 // Home Agent Address Discovery Reply Message - ICMPTypeMobilePrefixSolicitation ICMPType = 146 // Mobile Prefix Solicitation - ICMPTypeMobilePrefixAdvertisement ICMPType = 147 // Mobile Prefix Advertisement - ICMPTypeCertificationPathSolicitation ICMPType = 148 // Certification Path Solicitation Message - ICMPTypeCertificationPathAdvertisement ICMPType = 149 // Certification Path Advertisement Message - ICMPTypeMulticastRouterAdvertisement ICMPType = 151 // Multicast Router Advertisement - ICMPTypeMulticastRouterSolicitation ICMPType = 152 // Multicast Router Solicitation - ICMPTypeMulticastRouterTermination ICMPType = 153 // Multicast Router Termination - ICMPTypeFMIPv6 ICMPType = 154 // FMIPv6 Messages - ICMPTypeRPLControl ICMPType = 155 // RPL Control Message - ICMPTypeILNPv6LocatorUpdate ICMPType = 156 // ILNPv6 Locator Update Message - ICMPTypeDuplicateAddressRequest ICMPType = 157 // Duplicate Address Request - ICMPTypeDuplicateAddressConfirmation ICMPType = 158 // Duplicate Address Confirmation - ICMPTypeMPLControl ICMPType = 159 // MPL Control Message -) - -// Internet Control Message Protocol version 6 (ICMPv6) Parameters, Updated: 2015-07-07 -var icmpTypes = map[ICMPType]string{ - 1: "destination unreachable", - 2: "packet too big", - 3: "time exceeded", - 4: "parameter problem", - 128: "echo request", - 129: "echo reply", - 130: "multicast listener query", - 131: "multicast listener report", - 132: "multicast listener done", - 133: "router solicitation", - 134: "router advertisement", - 135: "neighbor solicitation", - 136: "neighbor advertisement", - 137: "redirect message", - 138: "router renumbering", - 139: "icmp node information query", - 140: "icmp node information response", - 141: "inverse neighbor discovery solicitation message", - 142: "inverse neighbor discovery advertisement message", - 143: "version 2 multicast listener report", - 144: "home agent address discovery request message", - 145: "home agent address discovery reply message", - 146: "mobile prefix solicitation", - 147: "mobile prefix advertisement", - 148: "certification path solicitation message", - 149: "certification path advertisement message", - 151: "multicast router advertisement", - 152: "multicast router solicitation", - 153: "multicast router termination", - 154: "fmipv6 messages", - 155: "rpl control message", - 156: "ilnpv6 locator update message", - 157: "duplicate address request", - 158: "duplicate address confirmation", - 159: "mpl control message", -} diff --git a/vendor/golang.org/x/net/ipv6/icmp.go b/vendor/golang.org/x/net/ipv6/icmp.go deleted file mode 100644 index a2de65a0..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp.go +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import "golang.org/x/net/internal/iana" - -// An ICMPType represents a type of ICMP message. -type ICMPType int - -func (typ ICMPType) String() string { - s, ok := icmpTypes[typ] - if !ok { - return "<nil>" - } - return s -} - -// Protocol returns the ICMPv6 protocol number. -func (typ ICMPType) Protocol() int { - return iana.ProtocolIPv6ICMP -} - -// An ICMPFilter represents an ICMP message filter for incoming -// packets. The filter belongs to a packet delivery path on a host and -// it cannot interact with forwarding packets or tunnel-outer packets. -// -// Note: RFC 2460 defines a reasonable role model. A node means a -// device that implements IP. A router means a node that forwards IP -// packets not explicitly addressed to itself, and a host means a node -// that is not a router. -type ICMPFilter struct { - sysICMPv6Filter -} - -// Accept accepts incoming ICMP packets including the type field value -// typ. -func (f *ICMPFilter) Accept(typ ICMPType) { - f.accept(typ) -} - -// Block blocks incoming ICMP packets including the type field value -// typ. -func (f *ICMPFilter) Block(typ ICMPType) { - f.block(typ) -} - -// SetAll sets the filter action to the filter. -func (f *ICMPFilter) SetAll(block bool) { - f.setAll(block) -} - -// WillBlock reports whether the ICMP type will be blocked. -func (f *ICMPFilter) WillBlock(typ ICMPType) bool { - return f.willBlock(typ) -} diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go deleted file mode 100644 index 30e3ce42..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp_bsd.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd netbsd openbsd - -package ipv6 - -func (f *sysICMPv6Filter) accept(typ ICMPType) { - f.Filt[typ>>5] |= 1 << (uint32(typ) & 31) -} - -func (f *sysICMPv6Filter) block(typ ICMPType) { - f.Filt[typ>>5] &^= 1 << (uint32(typ) & 31) -} - -func (f *sysICMPv6Filter) setAll(block bool) { - for i := range f.Filt { - if block { - f.Filt[i] = 0 - } else { - f.Filt[i] = 1<<32 - 1 - } - } -} - -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { - return f.Filt[typ>>5]&(1<<(uint32(typ)&31)) == 0 -} diff --git a/vendor/golang.org/x/net/ipv6/icmp_linux.go b/vendor/golang.org/x/net/ipv6/icmp_linux.go deleted file mode 100644 index a67ecf69..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp_linux.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -func (f *sysICMPv6Filter) accept(typ ICMPType) { - f.Data[typ>>5] &^= 1 << (uint32(typ) & 31) -} - -func (f *sysICMPv6Filter) block(typ ICMPType) { - f.Data[typ>>5] |= 1 << (uint32(typ) & 31) -} - -func (f *sysICMPv6Filter) setAll(block bool) { - for i := range f.Data { - if block { - f.Data[i] = 1<<32 - 1 - } else { - f.Data[i] = 0 - } - } -} - -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { - return f.Data[typ>>5]&(1<<(uint32(typ)&31)) != 0 -} diff --git a/vendor/golang.org/x/net/ipv6/icmp_solaris.go b/vendor/golang.org/x/net/ipv6/icmp_solaris.go deleted file mode 100644 index a942f354..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp_solaris.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build solaris - -package ipv6 - -func (f *sysICMPv6Filter) accept(typ ICMPType) { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) block(typ ICMPType) { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) setAll(block bool) { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { - // TODO(mikio): implement this - return false -} diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go deleted file mode 100644 index c1263eca..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp_stub.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 - -package ipv6 - -type sysICMPv6Filter struct { -} - -func (f *sysICMPv6Filter) accept(typ ICMPType) { -} - -func (f *sysICMPv6Filter) block(typ ICMPType) { -} - -func (f *sysICMPv6Filter) setAll(block bool) { -} - -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { - return false -} diff --git a/vendor/golang.org/x/net/ipv6/icmp_test.go b/vendor/golang.org/x/net/ipv6/icmp_test.go deleted file mode 100644 index e192d6d8..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "net" - "reflect" - "runtime" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -var icmpStringTests = []struct { - in ipv6.ICMPType - out string -}{ - {ipv6.ICMPTypeDestinationUnreachable, "destination unreachable"}, - - {256, "<nil>"}, -} - -func TestICMPString(t *testing.T) { - for _, tt := range icmpStringTests { - s := tt.in.String() - if s != tt.out { - t.Errorf("got %s; want %s", s, tt.out) - } - } -} - -func TestICMPFilter(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - - var f ipv6.ICMPFilter - for _, toggle := range []bool{false, true} { - f.SetAll(toggle) - for _, typ := range []ipv6.ICMPType{ - ipv6.ICMPTypeDestinationUnreachable, - ipv6.ICMPTypeEchoReply, - ipv6.ICMPTypeNeighborSolicitation, - ipv6.ICMPTypeDuplicateAddressConfirmation, - } { - f.Accept(typ) - if f.WillBlock(typ) { - t.Errorf("ipv6.ICMPFilter.Set(%v, false) failed", typ) - } - f.Block(typ) - if !f.WillBlock(typ) { - t.Errorf("ipv6.ICMPFilter.Set(%v, true) failed", typ) - } - } - } -} - -func TestSetICMPFilter(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv6.NewPacketConn(c) - - var f ipv6.ICMPFilter - f.SetAll(true) - f.Accept(ipv6.ICMPTypeEchoRequest) - f.Accept(ipv6.ICMPTypeEchoReply) - if err := p.SetICMPFilter(&f); err != nil { - t.Fatal(err) - } - kf, err := p.ICMPFilter() - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(kf, &f) { - t.Fatalf("got %#v; want %#v", kf, f) - } -} diff --git a/vendor/golang.org/x/net/ipv6/icmp_windows.go b/vendor/golang.org/x/net/ipv6/icmp_windows.go deleted file mode 100644 index 9dcfb810..00000000 --- a/vendor/golang.org/x/net/ipv6/icmp_windows.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -type sysICMPv6Filter struct { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) accept(typ ICMPType) { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) block(typ ICMPType) { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) setAll(block bool) { - // TODO(mikio): implement this -} - -func (f *sysICMPv6Filter) willBlock(typ ICMPType) bool { - // TODO(mikio): implement this - return false -} diff --git a/vendor/golang.org/x/net/ipv6/mocktransponder_test.go b/vendor/golang.org/x/net/ipv6/mocktransponder_test.go deleted file mode 100644 index d587922a..00000000 --- a/vendor/golang.org/x/net/ipv6/mocktransponder_test.go +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "net" - "testing" -) - -func connector(t *testing.T, network, addr string, done chan<- bool) { - defer func() { done <- true }() - - c, err := net.Dial(network, addr) - if err != nil { - t.Error(err) - return - } - c.Close() -} - -func acceptor(t *testing.T, ln net.Listener, done chan<- bool) { - defer func() { done <- true }() - - c, err := ln.Accept() - if err != nil { - t.Error(err) - return - } - c.Close() -} diff --git a/vendor/golang.org/x/net/ipv6/multicast_test.go b/vendor/golang.org/x/net/ipv6/multicast_test.go deleted file mode 100644 index fc10ce10..00000000 --- a/vendor/golang.org/x/net/ipv6/multicast_test.go +++ /dev/null @@ -1,263 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "bytes" - "net" - "os" - "runtime" - "testing" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -var packetConnReadWriteMulticastUDPTests = []struct { - addr string - grp, src *net.UDPAddr -}{ - {"[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 - - {"[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 -} - -func TestPacketConnReadWriteMulticastUDP(t *testing.T) { - switch runtime.GOOS { - case "freebsd": // due to a bug on loopback marking - // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. - t.Skipf("not supported on %s", runtime.GOOS) - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - for _, tt := range packetConnReadWriteMulticastUDPTests { - c, err := net.ListenPacket("udp6", tt.addr) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - grp := *tt.grp - grp.Port = c.LocalAddr().(*net.UDPAddr).Port - p := ipv6.NewPacketConn(c) - defer p.Close() - if tt.src == nil { - if err := p.JoinGroup(ifi, &grp); err != nil { - t.Fatal(err) - } - defer p.LeaveGroup(ifi, &grp) - } else { - if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support MLDv2 fail here - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src) - } - if err := p.SetMulticastInterface(ifi); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastInterface(); err != nil { - t.Fatal(err) - } - if err := p.SetMulticastLoopback(true); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastLoopback(); err != nil { - t.Fatal(err) - } - - cm := ipv6.ControlMessage{ - TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, - Src: net.IPv6loopback, - IfIndex: ifi.Index, - } - cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU - wb := []byte("HELLO-R-U-THERE") - - for i, toggle := range []bool{true, false, true} { - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { - t.Fatal(err) - } - cm.HopLimit = i + 1 - if n, err := p.WriteTo(wb, &cm, &grp); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatal(err) - } - rb := make([]byte, 128) - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Fatal(err) - } else if !bytes.Equal(rb[:n], wb) { - t.Fatalf("got %v; want %v", rb[:n], wb) - } else { - t.Logf("rcvd cmsg: %v", cm) - } - } - } -} - -var packetConnReadWriteMulticastICMPTests = []struct { - grp, src *net.IPAddr -}{ - {&net.IPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 - - {&net.IPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 -} - -func TestPacketConnReadWriteMulticastICMP(t *testing.T) { - switch runtime.GOOS { - case "freebsd": // due to a bug on loopback marking - // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. - t.Skipf("not supported on %s", runtime.GOOS) - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - for _, tt := range packetConnReadWriteMulticastICMPTests { - c, err := net.ListenPacket("ip6:ipv6-icmp", "::") - if err != nil { - t.Fatal(err) - } - defer c.Close() - - pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, tt.grp.IP) - p := ipv6.NewPacketConn(c) - defer p.Close() - if tt.src == nil { - if err := p.JoinGroup(ifi, tt.grp); err != nil { - t.Fatal(err) - } - defer p.LeaveGroup(ifi, tt.grp) - } else { - if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support MLDv2 fail here - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src) - } - if err := p.SetMulticastInterface(ifi); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastInterface(); err != nil { - t.Fatal(err) - } - if err := p.SetMulticastLoopback(true); err != nil { - t.Fatal(err) - } - if _, err := p.MulticastLoopback(); err != nil { - t.Fatal(err) - } - - cm := ipv6.ControlMessage{ - TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, - Src: net.IPv6loopback, - IfIndex: ifi.Index, - } - cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU - - var f ipv6.ICMPFilter - f.SetAll(true) - f.Accept(ipv6.ICMPTypeEchoReply) - if err := p.SetICMPFilter(&f); err != nil { - t.Fatal(err) - } - - var psh []byte - for i, toggle := range []bool{true, false, true} { - if toggle { - psh = nil - if err := p.SetChecksum(true, 2); err != nil { - t.Fatal(err) - } - } else { - psh = pshicmp - // Some platforms never allow to - // disable the kernel checksum - // processing. - p.SetChecksum(false, -1) - } - wb, err := (&icmp.Message{ - Type: ipv6.ICMPTypeEchoRequest, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: i + 1, - Data: []byte("HELLO-R-U-THERE"), - }, - }).Marshal(psh) - if err != nil { - t.Fatal(err) - } - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } - if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil { - t.Fatal(err) - } - cm.HopLimit = i + 1 - if n, err := p.WriteTo(wb, &cm, tt.grp); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - if n, cm, _, err := p.ReadFrom(rb); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } else { - t.Logf("rcvd cmsg: %v", cm) - if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { - t.Fatal(err) - } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { - t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) - } - } - } - } -} diff --git a/vendor/golang.org/x/net/ipv6/multicastlistener_test.go b/vendor/golang.org/x/net/ipv6/multicastlistener_test.go deleted file mode 100644 index 9711f751..00000000 --- a/vendor/golang.org/x/net/ipv6/multicastlistener_test.go +++ /dev/null @@ -1,246 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "fmt" - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -var udpMultipleGroupListenerTests = []net.Addr{ - &net.UDPAddr{IP: net.ParseIP("ff02::114")}, // see RFC 4727 - &net.UDPAddr{IP: net.ParseIP("ff02::1:114")}, - &net.UDPAddr{IP: net.ParseIP("ff02::2:114")}, -} - -func TestUDPSinglePacketConnWithMultipleGroupListeners(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - for _, gaddr := range udpMultipleGroupListenerTests { - c, err := net.ListenPacket("udp6", "[::]:0") // wildcard address with non-reusable port - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv6.NewPacketConn(c) - var mift []*net.Interface - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { - continue - } - if err := p.JoinGroup(&ifi, gaddr); err != nil { - t.Fatal(err) - } - mift = append(mift, &ift[i]) - } - for _, ifi := range mift { - if err := p.LeaveGroup(ifi, gaddr); err != nil { - t.Fatal(err) - } - } - } -} - -func TestUDPMultiplePacketConnWithMultipleGroupListeners(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - for _, gaddr := range udpMultipleGroupListenerTests { - c1, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port - if err != nil { - t.Fatal(err) - } - defer c1.Close() - - c2, err := net.ListenPacket("udp6", "[ff02::]:1024") // wildcard address with reusable port - if err != nil { - t.Fatal(err) - } - defer c2.Close() - - var ps [2]*ipv6.PacketConn - ps[0] = ipv6.NewPacketConn(c1) - ps[1] = ipv6.NewPacketConn(c2) - var mift []*net.Interface - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { - continue - } - for _, p := range ps { - if err := p.JoinGroup(&ifi, gaddr); err != nil { - t.Fatal(err) - } - } - mift = append(mift, &ift[i]) - } - for _, ifi := range mift { - for _, p := range ps { - if err := p.LeaveGroup(ifi, gaddr); err != nil { - t.Fatal(err) - } - } - } - } -} - -func TestUDPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 - type ml struct { - c *ipv6.PacketConn - ifi *net.Interface - } - var mlt []*ml - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - ip, ok := nettest.IsMulticastCapable("ip6", &ifi) - if !ok { - continue - } - c, err := net.ListenPacket("udp6", fmt.Sprintf("[%s%%%s]:1024", ip.String(), ifi.Name)) // unicast address with non-reusable port - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - if err := p.JoinGroup(&ifi, &gaddr); err != nil { - t.Fatal(err) - } - mlt = append(mlt, &ml{p, &ift[i]}) - } - for _, m := range mlt { - if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { - t.Fatal(err) - } - } -} - -func TestIPSinglePacketConnWithSingleGroupListener(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - c, err := net.ListenPacket("ip6:ipv6-icmp", "::") // wildcard address - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv6.NewPacketConn(c) - gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 - var mift []*net.Interface - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - if _, ok := nettest.IsMulticastCapable("ip6", &ifi); !ok { - continue - } - if err := p.JoinGroup(&ifi, &gaddr); err != nil { - t.Fatal(err) - } - mift = append(mift, &ift[i]) - } - for _, ifi := range mift { - if err := p.LeaveGroup(ifi, &gaddr); err != nil { - t.Fatal(err) - } - } -} - -func TestIPPerInterfaceSinglePacketConnWithSingleGroupListener(t *testing.T) { - switch runtime.GOOS { - case "darwin", "dragonfly", "openbsd": // platforms that return fe80::1%lo0: bind: can't assign requested address - t.Skipf("not supported on %s", runtime.GOOS) - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - gaddr := net.IPAddr{IP: net.ParseIP("ff02::114")} // see RFC 4727 - type ml struct { - c *ipv6.PacketConn - ifi *net.Interface - } - var mlt []*ml - - ift, err := net.Interfaces() - if err != nil { - t.Fatal(err) - } - for i, ifi := range ift { - ip, ok := nettest.IsMulticastCapable("ip6", &ifi) - if !ok { - continue - } - c, err := net.ListenPacket("ip6:ipv6-icmp", fmt.Sprintf("%s%%%s", ip.String(), ifi.Name)) // unicast address - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - if err := p.JoinGroup(&ifi, &gaddr); err != nil { - t.Fatal(err) - } - mlt = append(mlt, &ml{p, &ift[i]}) - } - for _, m := range mlt { - if err := m.c.LeaveGroup(m.ifi, &gaddr); err != nil { - t.Fatal(err) - } - } -} diff --git a/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go b/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go deleted file mode 100644 index fe0e6e1b..00000000 --- a/vendor/golang.org/x/net/ipv6/multicastsockopt_test.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -var packetConnMulticastSocketOptionTests = []struct { - net, proto, addr string - grp, src net.Addr -}{ - {"udp6", "", "[ff02::]:0", &net.UDPAddr{IP: net.ParseIP("ff02::114")}, nil}, // see RFC 4727 - {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff02::115")}, nil}, // see RFC 4727 - - {"udp6", "", "[ff30::8000:0]:0", &net.UDPAddr{IP: net.ParseIP("ff30::8000:1")}, &net.UDPAddr{IP: net.IPv6loopback}}, // see RFC 5771 - {"ip6", ":ipv6-icmp", "::", &net.IPAddr{IP: net.ParseIP("ff30::8000:2")}, &net.IPAddr{IP: net.IPv6loopback}}, // see RFC 5771 -} - -func TestPacketConnMulticastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagMulticast|net.FlagLoopback) - if ifi == nil { - t.Skipf("not available on %s", runtime.GOOS) - } - - m, ok := nettest.SupportsRawIPSocket() - for _, tt := range packetConnMulticastSocketOptionTests { - if tt.net == "ip6" && !ok { - t.Log(m) - continue - } - c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - defer p.Close() - - if tt.src == nil { - testMulticastSocketOptions(t, p, ifi, tt.grp) - } else { - testSourceSpecificMulticastSocketOptions(t, p, ifi, tt.grp, tt.src) - } - } -} - -type testIPv6MulticastConn interface { - MulticastHopLimit() (int, error) - SetMulticastHopLimit(ttl int) error - MulticastLoopback() (bool, error) - SetMulticastLoopback(bool) error - JoinGroup(*net.Interface, net.Addr) error - LeaveGroup(*net.Interface, net.Addr) error - JoinSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error - LeaveSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error - ExcludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error - IncludeSourceSpecificGroup(*net.Interface, net.Addr, net.Addr) error -} - -func testMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp net.Addr) { - const hoplim = 255 - if err := c.SetMulticastHopLimit(hoplim); err != nil { - t.Error(err) - return - } - if v, err := c.MulticastHopLimit(); err != nil { - t.Error(err) - return - } else if v != hoplim { - t.Errorf("got %v; want %v", v, hoplim) - return - } - - for _, toggle := range []bool{true, false} { - if err := c.SetMulticastLoopback(toggle); err != nil { - t.Error(err) - return - } - if v, err := c.MulticastLoopback(); err != nil { - t.Error(err) - return - } else if v != toggle { - t.Errorf("got %v; want %v", v, toggle) - return - } - } - - if err := c.JoinGroup(ifi, grp); err != nil { - t.Error(err) - return - } - if err := c.LeaveGroup(ifi, grp); err != nil { - t.Error(err) - return - } -} - -func testSourceSpecificMulticastSocketOptions(t *testing.T, c testIPv6MulticastConn, ifi *net.Interface, grp, src net.Addr) { - // MCAST_JOIN_GROUP -> MCAST_BLOCK_SOURCE -> MCAST_UNBLOCK_SOURCE -> MCAST_LEAVE_GROUP - if err := c.JoinGroup(ifi, grp); err != nil { - t.Error(err) - return - } - if err := c.ExcludeSourceSpecificGroup(ifi, grp, src); err != nil { - switch runtime.GOOS { - case "freebsd", "linux": - default: // platforms that don't support MLDv2 fail here - t.Logf("not supported on %s", runtime.GOOS) - return - } - t.Error(err) - return - } - if err := c.IncludeSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - if err := c.LeaveGroup(ifi, grp); err != nil { - t.Error(err) - return - } - - // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_SOURCE_GROUP - if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - if err := c.LeaveSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - - // MCAST_JOIN_SOURCE_GROUP -> MCAST_LEAVE_GROUP - if err := c.JoinSourceSpecificGroup(ifi, grp, src); err != nil { - t.Error(err) - return - } - if err := c.LeaveGroup(ifi, grp); err != nil { - t.Error(err) - return - } -} diff --git a/vendor/golang.org/x/net/ipv6/payload.go b/vendor/golang.org/x/net/ipv6/payload.go deleted file mode 100644 index 529b20bc..00000000 --- a/vendor/golang.org/x/net/ipv6/payload.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import "net" - -// A payloadHandler represents the IPv6 datagram payload handler. -type payloadHandler struct { - net.PacketConn - rawOpt -} - -func (c *payloadHandler) ok() bool { return c != nil && c.PacketConn != nil } diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go deleted file mode 100644 index 8e90d324..00000000 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !nacl,!plan9,!windows - -package ipv6 - -import ( - "net" - "syscall" -) - -// ReadFrom reads a payload of the received IPv6 datagram, from the -// endpoint c, copying the payload into b. It returns the number of -// bytes copied into b, the control message cm and the source address -// src of the received datagram. -func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { - if !c.ok() { - return 0, nil, nil, syscall.EINVAL - } - oob := newControlMessage(&c.rawOpt) - var oobn int - switch c := c.PacketConn.(type) { - case *net.UDPConn: - if n, oobn, _, src, err = c.ReadMsgUDP(b, oob); err != nil { - return 0, nil, nil, err - } - case *net.IPConn: - if n, oobn, _, src, err = c.ReadMsgIP(b, oob); err != nil { - return 0, nil, nil, err - } - default: - return 0, nil, nil, errInvalidConnType - } - if cm, err = parseControlMessage(oob[:oobn]); err != nil { - return 0, nil, nil, err - } - if cm != nil { - cm.Src = netAddrToIP16(src) - } - return -} - -// WriteTo writes a payload of the IPv6 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows -// the IPv6 header fields and the datagram path to be specified. The -// cm may be nil if control of the outgoing datagram is not required. -func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { - if !c.ok() { - return 0, syscall.EINVAL - } - oob := marshalControlMessage(cm) - if dst == nil { - return 0, errMissingAddress - } - switch c := c.PacketConn.(type) { - case *net.UDPConn: - n, _, err = c.WriteMsgUDP(b, oob, dst.(*net.UDPAddr)) - case *net.IPConn: - n, _, err = c.WriteMsgIP(b, oob, dst.(*net.IPAddr)) - default: - return 0, errInvalidConnType - } - if err != nil { - return 0, err - } - return -} diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go deleted file mode 100644 index 499204d0..00000000 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 windows - -package ipv6 - -import ( - "net" - "syscall" -) - -// ReadFrom reads a payload of the received IPv6 datagram, from the -// endpoint c, copying the payload into b. It returns the number of -// bytes copied into b, the control message cm and the source address -// src of the received datagram. -func (c *payloadHandler) ReadFrom(b []byte) (n int, cm *ControlMessage, src net.Addr, err error) { - if !c.ok() { - return 0, nil, nil, syscall.EINVAL - } - if n, src, err = c.PacketConn.ReadFrom(b); err != nil { - return 0, nil, nil, err - } - return -} - -// WriteTo writes a payload of the IPv6 datagram, to the destination -// address dst through the endpoint c, copying the payload from b. It -// returns the number of bytes written. The control message cm allows -// the IPv6 header fields and the datagram path to be specified. The -// cm may be nil if control of the outgoing datagram is not required. -func (c *payloadHandler) WriteTo(b []byte, cm *ControlMessage, dst net.Addr) (n int, err error) { - if !c.ok() { - return 0, syscall.EINVAL - } - if dst == nil { - return 0, errMissingAddress - } - return c.PacketConn.WriteTo(b, dst) -} diff --git a/vendor/golang.org/x/net/ipv6/readwrite_test.go b/vendor/golang.org/x/net/ipv6/readwrite_test.go deleted file mode 100644 index ff4ea2b5..00000000 --- a/vendor/golang.org/x/net/ipv6/readwrite_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "bytes" - "net" - "runtime" - "sync" - "testing" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -func benchmarkUDPListener() (net.PacketConn, net.Addr, error) { - c, err := net.ListenPacket("udp6", "[::1]:0") - if err != nil { - return nil, nil, err - } - dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) - if err != nil { - c.Close() - return nil, nil, err - } - return c, dst, nil -} - -func BenchmarkReadWriteNetUDP(b *testing.B) { - if !supportsIPv6 { - b.Skip("ipv6 is not supported") - } - - c, dst, err := benchmarkUDPListener() - if err != nil { - b.Fatal(err) - } - defer c.Close() - - wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) - b.ResetTimer() - for i := 0; i < b.N; i++ { - benchmarkReadWriteNetUDP(b, c, wb, rb, dst) - } -} - -func benchmarkReadWriteNetUDP(b *testing.B, c net.PacketConn, wb, rb []byte, dst net.Addr) { - if _, err := c.WriteTo(wb, dst); err != nil { - b.Fatal(err) - } - if _, _, err := c.ReadFrom(rb); err != nil { - b.Fatal(err) - } -} - -func BenchmarkReadWriteIPv6UDP(b *testing.B) { - if !supportsIPv6 { - b.Skip("ipv6 is not supported") - } - - c, dst, err := benchmarkUDPListener() - if err != nil { - b.Fatal(err) - } - defer c.Close() - - p := ipv6.NewPacketConn(c) - cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU - if err := p.SetControlMessage(cf, true); err != nil { - b.Fatal(err) - } - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) - - wb, rb := []byte("HELLO-R-U-THERE"), make([]byte, 128) - b.ResetTimer() - for i := 0; i < b.N; i++ { - benchmarkReadWriteIPv6UDP(b, p, wb, rb, dst, ifi) - } -} - -func benchmarkReadWriteIPv6UDP(b *testing.B, p *ipv6.PacketConn, wb, rb []byte, dst net.Addr, ifi *net.Interface) { - cm := ipv6.ControlMessage{ - TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, - HopLimit: 1, - } - if ifi != nil { - cm.IfIndex = ifi.Index - } - if n, err := p.WriteTo(wb, &cm, dst); err != nil { - b.Fatal(err) - } else if n != len(wb) { - b.Fatalf("got %v; want %v", n, len(wb)) - } - if _, _, _, err := p.ReadFrom(rb); err != nil { - b.Fatal(err) - } -} - -func TestPacketConnConcurrentReadWriteUnicastUDP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - c, err := net.ListenPacket("udp6", "[::1]:0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - defer p.Close() - - dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) - if err != nil { - t.Fatal(err) - } - - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) - cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU - wb := []byte("HELLO-R-U-THERE") - - if err := p.SetControlMessage(cf, true); err != nil { // probe before test - if nettest.ProtocolNotSupported(err) { - t.Skipf("not supported on %s", runtime.GOOS) - } - t.Fatal(err) - } - - var wg sync.WaitGroup - reader := func() { - defer wg.Done() - rb := make([]byte, 128) - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Error(err) - return - } else if !bytes.Equal(rb[:n], wb) { - t.Errorf("got %v; want %v", rb[:n], wb) - return - } else { - t.Logf("rcvd cmsg: %v", cm) - } - } - writer := func(toggle bool) { - defer wg.Done() - cm := ipv6.ControlMessage{ - TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, - Src: net.IPv6loopback, - } - if ifi != nil { - cm.IfIndex = ifi.Index - } - if err := p.SetControlMessage(cf, toggle); err != nil { - t.Error(err) - return - } - if n, err := p.WriteTo(wb, &cm, dst); err != nil { - t.Error(err) - return - } else if n != len(wb) { - t.Errorf("got %v; want %v", n, len(wb)) - return - } - } - - const N = 10 - wg.Add(N) - for i := 0; i < N; i++ { - go reader() - } - wg.Add(2 * N) - for i := 0; i < 2*N; i++ { - go writer(i%2 != 0) - } - wg.Add(N) - for i := 0; i < N; i++ { - go reader() - } - wg.Wait() -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt.go b/vendor/golang.org/x/net/ipv6/sockopt.go deleted file mode 100644 index f0cfc2f9..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -// Sticky socket options -const ( - ssoTrafficClass = iota // header field for unicast packet, RFC 3542 - ssoHopLimit // header field for unicast packet, RFC 3493 - ssoMulticastInterface // outbound interface for multicast packet, RFC 3493 - ssoMulticastHopLimit // header field for multicast packet, RFC 3493 - ssoMulticastLoopback // loopback for multicast packet, RFC 3493 - ssoReceiveTrafficClass // header field on received packet, RFC 3542 - ssoReceiveHopLimit // header field on received packet, RFC 2292 or 3542 - ssoReceivePacketInfo // incbound or outbound packet path, RFC 2292 or 3542 - ssoReceivePathMTU // path mtu, RFC 3542 - ssoPathMTU // path mtu, RFC 3542 - ssoChecksum // packet checksum, RFC 2292 or 3542 - ssoICMPFilter // icmp filter, RFC 2292 or 3542 - ssoJoinGroup // any-source multicast, RFC 3493 - ssoLeaveGroup // any-source multicast, RFC 3493 - ssoJoinSourceGroup // source-specific multicast - ssoLeaveSourceGroup // source-specific multicast - ssoBlockSourceGroup // any-source or source-specific multicast - ssoUnblockSourceGroup // any-source or source-specific multicast - ssoMax -) - -// Sticky socket option value types -const ( - ssoTypeInt = iota + 1 - ssoTypeInterface - ssoTypeICMPFilter - ssoTypeMTUInfo - ssoTypeIPMreq - ssoTypeGroupReq - ssoTypeGroupSourceReq -) - -// A sockOpt represents a binding for sticky socket option. -type sockOpt struct { - level int // option level - name int // option name, must be equal or greater than 1 - typ int // option value type, must be equal or greater than 1 -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_unix.go deleted file mode 100644 index b7fd4fe6..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_unix.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv6 - -import ( - "net" - "os" - "unsafe" -) - -func setsockoptIPMreq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - var mreq sysIPv6Mreq - copy(mreq.Multiaddr[:], grp) - if ifi != nil { - mreq.setIfindex(ifi.Index) - } - return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&mreq), sysSizeofIPv6Mreq)) -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_windows.go b/vendor/golang.org/x/net/ipv6/sockopt_asmreq_windows.go deleted file mode 100644 index c03c7313..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_asmreq_windows.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "os" - "syscall" - "unsafe" -) - -func setsockoptIPMreq(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - var mreq sysIPv6Mreq - copy(mreq.Multiaddr[:], grp) - if ifi != nil { - mreq.setIfindex(ifi.Index) - } - return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&mreq)), sysSizeofIPv6Mreq)) -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go deleted file mode 100644 index 7732e49f..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_stub.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !darwin,!freebsd,!linux - -package ipv6 - -import "net" - -func setsockoptGroupReq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - return errOpNoSupport -} - -func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go deleted file mode 100644 index c64d6d58..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_ssmreq_unix.go +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin freebsd linux - -package ipv6 - -import ( - "net" - "os" - "unsafe" -) - -var freebsd32o64 bool - -func setsockoptGroupReq(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - var gr sysGroupReq - if ifi != nil { - gr.Interface = uint32(ifi.Index) - } - gr.setGroup(grp) - var p unsafe.Pointer - var l sysSockoptLen - if freebsd32o64 { - var d [sysSizeofGroupReq + 4]byte - s := (*[sysSizeofGroupReq]byte)(unsafe.Pointer(&gr)) - copy(d[:4], s[:4]) - copy(d[8:], s[4:]) - p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupReq + 4 - } else { - p = unsafe.Pointer(&gr) - l = sysSizeofGroupReq - } - return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l)) -} - -func setsockoptGroupSourceReq(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - var gsr sysGroupSourceReq - if ifi != nil { - gsr.Interface = uint32(ifi.Index) - } - gsr.setSourceGroup(grp, src) - var p unsafe.Pointer - var l sysSockoptLen - if freebsd32o64 { - var d [sysSizeofGroupSourceReq + 4]byte - s := (*[sysSizeofGroupSourceReq]byte)(unsafe.Pointer(&gsr)) - copy(d[:4], s[:4]) - copy(d[8:], s[4:]) - p = unsafe.Pointer(&d[0]) - l = sysSizeofGroupSourceReq + 4 - } else { - p = unsafe.Pointer(&gsr) - l = sysSizeofGroupSourceReq - } - return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, p, l)) -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go deleted file mode 100644 index b8dacfde..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_stub.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv6 - -import "net" - -func getMTUInfo(fd int, opt *sockOpt) (*net.Interface, int, error) { - return nil, 0, errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_test.go b/vendor/golang.org/x/net/ipv6/sockopt_test.go deleted file mode 100644 index 9c219031..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_test.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "fmt" - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -var supportsIPv6 bool = nettest.SupportsIPv6() - -func TestConnInitiatorPathMTU(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - ln, err := net.Listen("tcp6", "[::1]:0") - if err != nil { - t.Fatal(err) - } - defer ln.Close() - - done := make(chan bool) - go acceptor(t, ln, done) - - c, err := net.Dial("tcp6", ln.Addr().String()) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels don't support IPV6_PATHMTU option - t.Logf("not supported on %s", runtime.GOOS) - default: - t.Fatal(err) - } - } else { - t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) - } - - <-done -} - -func TestConnResponderPathMTU(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - ln, err := net.Listen("tcp6", "[::1]:0") - if err != nil { - t.Fatal(err) - } - defer ln.Close() - - done := make(chan bool) - go connector(t, "tcp6", ln.Addr().String(), done) - - c, err := ln.Accept() - if err != nil { - t.Fatal(err) - } - defer c.Close() - - if pmtu, err := ipv6.NewConn(c).PathMTU(); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels don't support IPV6_PATHMTU option - t.Logf("not supported on %s", runtime.GOOS) - default: - t.Fatal(err) - } - } else { - t.Logf("path mtu for %v: %v", c.RemoteAddr(), pmtu) - } - - <-done -} - -func TestPacketConnChecksum(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - c, err := net.ListenPacket(fmt.Sprintf("ip6:%d", iana.ProtocolOSPFIGP), "::") // OSPF for IPv6 - if err != nil { - t.Fatal(err) - } - defer c.Close() - - p := ipv6.NewPacketConn(c) - offset := 12 // see RFC 5340 - - for _, toggle := range []bool{false, true} { - if err := p.SetChecksum(toggle, offset); err != nil { - if toggle { - t.Fatalf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) - } else { - // Some platforms never allow to disable the kernel - // checksum processing. - t.Logf("ipv6.PacketConn.SetChecksum(%v, %v) failed: %v", toggle, offset, err) - } - } - if on, offset, err := p.Checksum(); err != nil { - t.Fatal(err) - } else { - t.Logf("kernel checksum processing enabled=%v, offset=%v", on, offset) - } - } -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_unix.go b/vendor/golang.org/x/net/ipv6/sockopt_unix.go deleted file mode 100644 index 25ea545f..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_unix.go +++ /dev/null @@ -1,122 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux netbsd openbsd - -package ipv6 - -import ( - "net" - "os" - "unsafe" -) - -func getInt(fd int, opt *sockOpt) (int, error) { - if opt.name < 1 || opt.typ != ssoTypeInt { - return 0, errOpNoSupport - } - var i int32 - l := sysSockoptLen(4) - if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil { - return 0, os.NewSyscallError("getsockopt", err) - } - return int(i), nil -} - -func setInt(fd int, opt *sockOpt, v int) error { - if opt.name < 1 || opt.typ != ssoTypeInt { - return errOpNoSupport - } - i := int32(v) - return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4))) -} - -func getInterface(fd int, opt *sockOpt) (*net.Interface, error) { - if opt.name < 1 || opt.typ != ssoTypeInterface { - return nil, errOpNoSupport - } - var i int32 - l := sysSockoptLen(4) - if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - if i == 0 { - return nil, nil - } - ifi, err := net.InterfaceByIndex(int(i)) - if err != nil { - return nil, err - } - return ifi, nil -} - -func setInterface(fd int, opt *sockOpt, ifi *net.Interface) error { - if opt.name < 1 || opt.typ != ssoTypeInterface { - return errOpNoSupport - } - var i int32 - if ifi != nil { - i = int32(ifi.Index) - } - return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&i), sysSockoptLen(4))) -} - -func getICMPFilter(fd int, opt *sockOpt) (*ICMPFilter, error) { - if opt.name < 1 || opt.typ != ssoTypeICMPFilter { - return nil, errOpNoSupport - } - var f ICMPFilter - l := sysSockoptLen(sysSizeofICMPv6Filter) - if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - return &f, nil -} - -func setICMPFilter(fd int, opt *sockOpt, f *ICMPFilter) error { - if opt.name < 1 || opt.typ != ssoTypeICMPFilter { - return errOpNoSupport - } - return os.NewSyscallError("setsockopt", setsockopt(fd, opt.level, opt.name, unsafe.Pointer(&f.sysICMPv6Filter), sysSizeofICMPv6Filter)) -} - -func getMTUInfo(fd int, opt *sockOpt) (*net.Interface, int, error) { - if opt.name < 1 || opt.typ != ssoTypeMTUInfo { - return nil, 0, errOpNoSupport - } - var mi sysIPv6Mtuinfo - l := sysSockoptLen(sysSizeofIPv6Mtuinfo) - if err := getsockopt(fd, opt.level, opt.name, unsafe.Pointer(&mi), &l); err != nil { - return nil, 0, os.NewSyscallError("getsockopt", err) - } - if mi.Addr.Scope_id == 0 { - return nil, int(mi.Mtu), nil - } - ifi, err := net.InterfaceByIndex(int(mi.Addr.Scope_id)) - if err != nil { - return nil, 0, err - } - return ifi, int(mi.Mtu), nil -} - -func setGroup(fd int, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - if opt.name < 1 { - return errOpNoSupport - } - switch opt.typ { - case ssoTypeIPMreq: - return setsockoptIPMreq(fd, opt, ifi, grp) - case ssoTypeGroupReq: - return setsockoptGroupReq(fd, opt, ifi, grp) - default: - return errOpNoSupport - } -} - -func setSourceGroup(fd int, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - if opt.name < 1 || opt.typ != ssoTypeGroupSourceReq { - return errOpNoSupport - } - return setsockoptGroupSourceReq(fd, opt, ifi, grp, src) -} diff --git a/vendor/golang.org/x/net/ipv6/sockopt_windows.go b/vendor/golang.org/x/net/ipv6/sockopt_windows.go deleted file mode 100644 index 32c73b72..00000000 --- a/vendor/golang.org/x/net/ipv6/sockopt_windows.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "os" - "syscall" - "unsafe" -) - -func getInt(fd syscall.Handle, opt *sockOpt) (int, error) { - if opt.name < 1 || opt.typ != ssoTypeInt { - return 0, errOpNoSupport - } - var i int32 - l := int32(4) - if err := syscall.Getsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), &l); err != nil { - return 0, os.NewSyscallError("getsockopt", err) - } - return int(i), nil -} - -func setInt(fd syscall.Handle, opt *sockOpt, v int) error { - if opt.name < 1 || opt.typ != ssoTypeInt { - return errOpNoSupport - } - i := int32(v) - return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), 4)) -} - -func getInterface(fd syscall.Handle, opt *sockOpt) (*net.Interface, error) { - if opt.name < 1 || opt.typ != ssoTypeInterface { - return nil, errOpNoSupport - } - var i int32 - l := int32(4) - if err := syscall.Getsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), &l); err != nil { - return nil, os.NewSyscallError("getsockopt", err) - } - if i == 0 { - return nil, nil - } - ifi, err := net.InterfaceByIndex(int(i)) - if err != nil { - return nil, err - } - return ifi, nil -} - -func setInterface(fd syscall.Handle, opt *sockOpt, ifi *net.Interface) error { - if opt.name < 1 || opt.typ != ssoTypeInterface { - return errOpNoSupport - } - var i int32 - if ifi != nil { - i = int32(ifi.Index) - } - return os.NewSyscallError("setsockopt", syscall.Setsockopt(fd, int32(opt.level), int32(opt.name), (*byte)(unsafe.Pointer(&i)), 4)) -} - -func getICMPFilter(fd syscall.Handle, opt *sockOpt) (*ICMPFilter, error) { - return nil, errOpNoSupport -} - -func setICMPFilter(fd syscall.Handle, opt *sockOpt, f *ICMPFilter) error { - return errOpNoSupport -} - -func getMTUInfo(fd syscall.Handle, opt *sockOpt) (*net.Interface, int, error) { - return nil, 0, errOpNoSupport -} - -func setGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp net.IP) error { - if opt.name < 1 || opt.typ != ssoTypeIPMreq { - return errOpNoSupport - } - return setsockoptIPMreq(fd, opt, ifi, grp) -} - -func setSourceGroup(fd syscall.Handle, opt *sockOpt, ifi *net.Interface, grp, src net.IP) error { - // TODO(mikio): implement this - return errOpNoSupport -} diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go deleted file mode 100644 index 75a8863b..00000000 --- a/vendor/golang.org/x/net/ipv6/sys_bsd.go +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build dragonfly netbsd openbsd - -package ipv6 - -import ( - "net" - "syscall" - - "golang.org/x/net/internal/iana" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, - ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, - ctlNextHop: {sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop}, - ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, - ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, - ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, - ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, - ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, - ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, - ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, - ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, - ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, - ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, - ssoJoinGroup: {iana.ProtocolIPv6, sysIPV6_JOIN_GROUP, ssoTypeIPMreq}, - ssoLeaveGroup: {iana.ProtocolIPv6, sysIPV6_LEAVE_GROUP, ssoTypeIPMreq}, - } -) - -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], ip) - sa.Scope_id = uint32(i) -} - -func (pi *sysInet6Pktinfo) setIfindex(i int) { - pi.Ifindex = uint32(i) -} - -func (mreq *sysIPv6Mreq) setIfindex(i int) { - mreq.Interface = uint32(i) -} diff --git a/vendor/golang.org/x/net/ipv6/sys_darwin.go b/vendor/golang.org/x/net/ipv6/sys_darwin.go deleted file mode 100644 index 411fb498..00000000 --- a/vendor/golang.org/x/net/ipv6/sys_darwin.go +++ /dev/null @@ -1,135 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlHopLimit: {sysIPV6_2292HOPLIMIT, 4, marshal2292HopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_2292PKTINFO, sysSizeofInet6Pktinfo, marshal2292PacketInfo, parsePacketInfo}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, - ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, - ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_2292HOPLIMIT, ssoTypeInt}, - ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_2292PKTINFO, ssoTypeInt}, - ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, - ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, - ssoJoinGroup: {iana.ProtocolIPv6, sysIPV6_JOIN_GROUP, ssoTypeIPMreq}, - ssoLeaveGroup: {iana.ProtocolIPv6, sysIPV6_LEAVE_GROUP, ssoTypeIPMreq}, - } -) - -func init() { - // Seems like kern.osreldate is veiled on latest OS X. We use - // kern.osrelease instead. - osver, err := syscall.Sysctl("kern.osrelease") - if err != nil { - return - } - var i int - for i = range osver { - if osver[i] == '.' { - break - } - } - // The IP_PKTINFO and protocol-independent multicast API were - // introduced in OS X 10.7 (Darwin 11.0.0). But it looks like - // those features require OS X 10.8 (Darwin 12.0.0) and above. - // See http://support.apple.com/kb/HT1633. - if i > 2 || i == 2 && osver[0] >= '1' && osver[1] >= '2' { - ctlOpts[ctlTrafficClass].name = sysIPV6_TCLASS - ctlOpts[ctlTrafficClass].length = 4 - ctlOpts[ctlTrafficClass].marshal = marshalTrafficClass - ctlOpts[ctlTrafficClass].parse = parseTrafficClass - ctlOpts[ctlHopLimit].name = sysIPV6_HOPLIMIT - ctlOpts[ctlHopLimit].marshal = marshalHopLimit - ctlOpts[ctlPacketInfo].name = sysIPV6_PKTINFO - ctlOpts[ctlPacketInfo].marshal = marshalPacketInfo - ctlOpts[ctlNextHop].name = sysIPV6_NEXTHOP - ctlOpts[ctlNextHop].length = sysSizeofSockaddrInet6 - ctlOpts[ctlNextHop].marshal = marshalNextHop - ctlOpts[ctlNextHop].parse = parseNextHop - ctlOpts[ctlPathMTU].name = sysIPV6_PATHMTU - ctlOpts[ctlPathMTU].length = sysSizeofIPv6Mtuinfo - ctlOpts[ctlPathMTU].marshal = marshalPathMTU - ctlOpts[ctlPathMTU].parse = parsePathMTU - sockOpts[ssoTrafficClass].level = iana.ProtocolIPv6 - sockOpts[ssoTrafficClass].name = sysIPV6_TCLASS - sockOpts[ssoTrafficClass].typ = ssoTypeInt - sockOpts[ssoReceiveTrafficClass].level = iana.ProtocolIPv6 - sockOpts[ssoReceiveTrafficClass].name = sysIPV6_RECVTCLASS - sockOpts[ssoReceiveTrafficClass].typ = ssoTypeInt - sockOpts[ssoReceiveHopLimit].name = sysIPV6_RECVHOPLIMIT - sockOpts[ssoReceivePacketInfo].name = sysIPV6_RECVPKTINFO - sockOpts[ssoReceivePathMTU].level = iana.ProtocolIPv6 - sockOpts[ssoReceivePathMTU].name = sysIPV6_RECVPATHMTU - sockOpts[ssoReceivePathMTU].typ = ssoTypeInt - sockOpts[ssoPathMTU].level = iana.ProtocolIPv6 - sockOpts[ssoPathMTU].name = sysIPV6_PATHMTU - sockOpts[ssoPathMTU].typ = ssoTypeMTUInfo - sockOpts[ssoJoinGroup].name = sysMCAST_JOIN_GROUP - sockOpts[ssoJoinGroup].typ = ssoTypeGroupReq - sockOpts[ssoLeaveGroup].name = sysMCAST_LEAVE_GROUP - sockOpts[ssoLeaveGroup].typ = ssoTypeGroupReq - sockOpts[ssoJoinSourceGroup].level = iana.ProtocolIPv6 - sockOpts[ssoJoinSourceGroup].name = sysMCAST_JOIN_SOURCE_GROUP - sockOpts[ssoJoinSourceGroup].typ = ssoTypeGroupSourceReq - sockOpts[ssoLeaveSourceGroup].level = iana.ProtocolIPv6 - sockOpts[ssoLeaveSourceGroup].name = sysMCAST_LEAVE_SOURCE_GROUP - sockOpts[ssoLeaveSourceGroup].typ = ssoTypeGroupSourceReq - sockOpts[ssoBlockSourceGroup].level = iana.ProtocolIPv6 - sockOpts[ssoBlockSourceGroup].name = sysMCAST_BLOCK_SOURCE - sockOpts[ssoBlockSourceGroup].typ = ssoTypeGroupSourceReq - sockOpts[ssoUnblockSourceGroup].level = iana.ProtocolIPv6 - sockOpts[ssoUnblockSourceGroup].name = sysMCAST_UNBLOCK_SOURCE - sockOpts[ssoUnblockSourceGroup].typ = ssoTypeGroupSourceReq - } -} - -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], ip) - sa.Scope_id = uint32(i) -} - -func (pi *sysInet6Pktinfo) setIfindex(i int) { - pi.Ifindex = uint32(i) -} - -func (mreq *sysIPv6Mreq) setIfindex(i int) { - mreq.Interface = uint32(i) -} - -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], grp) -} - -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Pad_cgo_0[0])) - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Pad_cgo_1[0])) - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], src) -} diff --git a/vendor/golang.org/x/net/ipv6/sys_freebsd.go b/vendor/golang.org/x/net/ipv6/sys_freebsd.go deleted file mode 100644 index b68725cb..00000000 --- a/vendor/golang.org/x/net/ipv6/sys_freebsd.go +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "runtime" - "strings" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, - ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, - ctlNextHop: {sysIPV6_NEXTHOP, sysSizeofSockaddrInet6, marshalNextHop, parseNextHop}, - ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, - ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, - ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, - ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, - ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, - ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, - ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, - ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, - ssoChecksum: {iana.ProtocolIPv6, sysIPV6_CHECKSUM, ssoTypeInt}, - ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMP6_FILTER, ssoTypeICMPFilter}, - ssoJoinGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, - ssoLeaveGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, - ssoJoinSourceGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoLeaveSourceGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoBlockSourceGroup: {iana.ProtocolIPv6, sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, - ssoUnblockSourceGroup: {iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, - } -) - -func init() { - if runtime.GOOS == "freebsd" && runtime.GOARCH == "386" { - archs, _ := syscall.Sysctl("kern.supported_archs") - for _, s := range strings.Fields(archs) { - if s == "amd64" { - freebsd32o64 = true - break - } - } - } -} - -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], ip) - sa.Scope_id = uint32(i) -} - -func (pi *sysInet6Pktinfo) setIfindex(i int) { - pi.Ifindex = uint32(i) -} - -func (mreq *sysIPv6Mreq) setIfindex(i int) { - mreq.Interface = uint32(i) -} - -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], grp) -} - -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) - sa.Len = sysSizeofSockaddrInet6 - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], src) -} diff --git a/vendor/golang.org/x/net/ipv6/sys_linux.go b/vendor/golang.org/x/net/ipv6/sys_linux.go deleted file mode 100644 index 2fa6088d..00000000 --- a/vendor/golang.org/x/net/ipv6/sys_linux.go +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "syscall" - "unsafe" - - "golang.org/x/net/internal/iana" -) - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{ - ctlTrafficClass: {sysIPV6_TCLASS, 4, marshalTrafficClass, parseTrafficClass}, - ctlHopLimit: {sysIPV6_HOPLIMIT, 4, marshalHopLimit, parseHopLimit}, - ctlPacketInfo: {sysIPV6_PKTINFO, sysSizeofInet6Pktinfo, marshalPacketInfo, parsePacketInfo}, - ctlPathMTU: {sysIPV6_PATHMTU, sysSizeofIPv6Mtuinfo, marshalPathMTU, parsePathMTU}, - } - - sockOpts = [ssoMax]sockOpt{ - ssoTrafficClass: {iana.ProtocolIPv6, sysIPV6_TCLASS, ssoTypeInt}, - ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, - ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, - ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, - ssoReceiveTrafficClass: {iana.ProtocolIPv6, sysIPV6_RECVTCLASS, ssoTypeInt}, - ssoReceiveHopLimit: {iana.ProtocolIPv6, sysIPV6_RECVHOPLIMIT, ssoTypeInt}, - ssoReceivePacketInfo: {iana.ProtocolIPv6, sysIPV6_RECVPKTINFO, ssoTypeInt}, - ssoReceivePathMTU: {iana.ProtocolIPv6, sysIPV6_RECVPATHMTU, ssoTypeInt}, - ssoPathMTU: {iana.ProtocolIPv6, sysIPV6_PATHMTU, ssoTypeMTUInfo}, - ssoChecksum: {iana.ProtocolReserved, sysIPV6_CHECKSUM, ssoTypeInt}, - ssoICMPFilter: {iana.ProtocolIPv6ICMP, sysICMPV6_FILTER, ssoTypeICMPFilter}, - ssoJoinGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_GROUP, ssoTypeGroupReq}, - ssoLeaveGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_GROUP, ssoTypeGroupReq}, - ssoJoinSourceGroup: {iana.ProtocolIPv6, sysMCAST_JOIN_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoLeaveSourceGroup: {iana.ProtocolIPv6, sysMCAST_LEAVE_SOURCE_GROUP, ssoTypeGroupSourceReq}, - ssoBlockSourceGroup: {iana.ProtocolIPv6, sysMCAST_BLOCK_SOURCE, ssoTypeGroupSourceReq}, - ssoUnblockSourceGroup: {iana.ProtocolIPv6, sysMCAST_UNBLOCK_SOURCE, ssoTypeGroupSourceReq}, - } -) - -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], ip) - sa.Scope_id = uint32(i) -} - -func (pi *sysInet6Pktinfo) setIfindex(i int) { - pi.Ifindex = int32(i) -} - -func (mreq *sysIPv6Mreq) setIfindex(i int) { - mreq.Ifindex = int32(i) -} - -func (gr *sysGroupReq) setGroup(grp net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gr.Group)) - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], grp) -} - -func (gsr *sysGroupSourceReq) setSourceGroup(grp, src net.IP) { - sa := (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Group)) - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], grp) - sa = (*sysSockaddrInet6)(unsafe.Pointer(&gsr.Source)) - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], src) -} diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go deleted file mode 100644 index 6c9a1430..00000000 --- a/vendor/golang.org/x/net/ipv6/sys_stub.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build nacl plan9 solaris - -package ipv6 - -type sysSockoptLen int32 - -var ( - ctlOpts = [ctlMax]ctlOpt{} - - sockOpts = [ssoMax]sockOpt{} -) diff --git a/vendor/golang.org/x/net/ipv6/sys_windows.go b/vendor/golang.org/x/net/ipv6/sys_windows.go deleted file mode 100644 index fda87573..00000000 --- a/vendor/golang.org/x/net/ipv6/sys_windows.go +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "net" - "syscall" - - "golang.org/x/net/internal/iana" -) - -const ( - // See ws2tcpip.h. - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PKTINFO = 0x13 - - sysSizeofSockaddrInet6 = 0x1c - - sysSizeofIPv6Mreq = 0x14 -) - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -var ( - ctlOpts = [ctlMax]ctlOpt{} - - sockOpts = [ssoMax]sockOpt{ - ssoHopLimit: {iana.ProtocolIPv6, sysIPV6_UNICAST_HOPS, ssoTypeInt}, - ssoMulticastInterface: {iana.ProtocolIPv6, sysIPV6_MULTICAST_IF, ssoTypeInterface}, - ssoMulticastHopLimit: {iana.ProtocolIPv6, sysIPV6_MULTICAST_HOPS, ssoTypeInt}, - ssoMulticastLoopback: {iana.ProtocolIPv6, sysIPV6_MULTICAST_LOOP, ssoTypeInt}, - ssoJoinGroup: {iana.ProtocolIPv6, sysIPV6_JOIN_GROUP, ssoTypeIPMreq}, - ssoLeaveGroup: {iana.ProtocolIPv6, sysIPV6_LEAVE_GROUP, ssoTypeIPMreq}, - } -) - -func (sa *sysSockaddrInet6) setSockaddr(ip net.IP, i int) { - sa.Family = syscall.AF_INET6 - copy(sa.Addr[:], ip) - sa.Scope_id = uint32(i) -} - -func (mreq *sysIPv6Mreq) setIfindex(i int) { - mreq.Interface = uint32(i) -} diff --git a/vendor/golang.org/x/net/ipv6/syscall_linux_386.go b/vendor/golang.org/x/net/ipv6/syscall_linux_386.go deleted file mode 100644 index 82633a56..00000000 --- a/vendor/golang.org/x/net/ipv6/syscall_linux_386.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6 - -import ( - "syscall" - "unsafe" -) - -const ( - sysGETSOCKOPT = 0xf - sysSETSOCKOPT = 0xe -) - -func socketcall(call int, a0, a1, a2, a3, a4, a5 uintptr) (int, syscall.Errno) - -func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { - if _, errno := socketcall(sysGETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { - return error(errno) - } - return nil -} - -func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { - if _, errno := socketcall(sysSETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { - return error(errno) - } - return nil -} diff --git a/vendor/golang.org/x/net/ipv6/syscall_unix.go b/vendor/golang.org/x/net/ipv6/syscall_unix.go deleted file mode 100644 index a2bd8363..00000000 --- a/vendor/golang.org/x/net/ipv6/syscall_unix.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin dragonfly freebsd linux,!386 netbsd openbsd - -package ipv6 - -import ( - "syscall" - "unsafe" -) - -func getsockopt(fd, level, name int, v unsafe.Pointer, l *sysSockoptLen) error { - if _, _, errno := syscall.Syscall6(syscall.SYS_GETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(unsafe.Pointer(l)), 0); errno != 0 { - return error(errno) - } - return nil -} - -func setsockopt(fd, level, name int, v unsafe.Pointer, l sysSockoptLen) error { - if _, _, errno := syscall.Syscall6(syscall.SYS_SETSOCKOPT, uintptr(fd), uintptr(level), uintptr(name), uintptr(v), uintptr(l), 0); errno != 0 { - return error(errno) - } - return nil -} diff --git a/vendor/golang.org/x/net/ipv6/thunk_linux_386.s b/vendor/golang.org/x/net/ipv6/thunk_linux_386.s deleted file mode 100644 index daa78bc0..00000000 --- a/vendor/golang.org/x/net/ipv6/thunk_linux_386.s +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.2 - -TEXT ·socketcall(SB),4,$0-36 - JMP syscall·socketcall(SB) diff --git a/vendor/golang.org/x/net/ipv6/unicast_test.go b/vendor/golang.org/x/net/ipv6/unicast_test.go deleted file mode 100644 index 61656983..00000000 --- a/vendor/golang.org/x/net/ipv6/unicast_test.go +++ /dev/null @@ -1,185 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "bytes" - "net" - "os" - "runtime" - "testing" - "time" - - "golang.org/x/net/icmp" - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -func TestPacketConnReadWriteUnicastUDP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - c, err := net.ListenPacket("udp6", "[::1]:0") - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - defer p.Close() - - dst, err := net.ResolveUDPAddr("udp6", c.LocalAddr().String()) - if err != nil { - t.Fatal(err) - } - - cm := ipv6.ControlMessage{ - TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, - Src: net.IPv6loopback, - } - cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) - if ifi != nil { - cm.IfIndex = ifi.Index - } - wb := []byte("HELLO-R-U-THERE") - - for i, toggle := range []bool{true, false, true} { - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Skipf("not supported on %s", runtime.GOOS) - } - t.Fatal(err) - } - cm.HopLimit = i + 1 - if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, err := p.WriteTo(wb, &cm, dst); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, cm, _, err := p.ReadFrom(rb); err != nil { - t.Fatal(err) - } else if !bytes.Equal(rb[:n], wb) { - t.Fatalf("got %v; want %v", rb[:n], wb) - } else { - t.Logf("rcvd cmsg: %v", cm) - } - } -} - -func TestPacketConnReadWriteUnicastICMP(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - if m, ok := nettest.SupportsRawIPSocket(); !ok { - t.Skip(m) - } - - c, err := net.ListenPacket("ip6:ipv6-icmp", "::1") - if err != nil { - t.Fatal(err) - } - defer c.Close() - p := ipv6.NewPacketConn(c) - defer p.Close() - - dst, err := net.ResolveIPAddr("ip6", "::1") - if err != nil { - t.Fatal(err) - } - - pshicmp := icmp.IPv6PseudoHeader(c.LocalAddr().(*net.IPAddr).IP, dst.IP) - cm := ipv6.ControlMessage{ - TrafficClass: iana.DiffServAF11 | iana.CongestionExperienced, - Src: net.IPv6loopback, - } - cf := ipv6.FlagTrafficClass | ipv6.FlagHopLimit | ipv6.FlagSrc | ipv6.FlagDst | ipv6.FlagInterface | ipv6.FlagPathMTU - ifi := nettest.RoutedInterface("ip6", net.FlagUp|net.FlagLoopback) - if ifi != nil { - cm.IfIndex = ifi.Index - } - - var f ipv6.ICMPFilter - f.SetAll(true) - f.Accept(ipv6.ICMPTypeEchoReply) - if err := p.SetICMPFilter(&f); err != nil { - t.Fatal(err) - } - - var psh []byte - for i, toggle := range []bool{true, false, true} { - if toggle { - psh = nil - if err := p.SetChecksum(true, 2); err != nil { - t.Fatal(err) - } - } else { - psh = pshicmp - // Some platforms never allow to disable the - // kernel checksum processing. - p.SetChecksum(false, -1) - } - wb, err := (&icmp.Message{ - Type: ipv6.ICMPTypeEchoRequest, Code: 0, - Body: &icmp.Echo{ - ID: os.Getpid() & 0xffff, Seq: i + 1, - Data: []byte("HELLO-R-U-THERE"), - }, - }).Marshal(psh) - if err != nil { - t.Fatal(err) - } - if err := p.SetControlMessage(cf, toggle); err != nil { - if nettest.ProtocolNotSupported(err) { - t.Skipf("not supported on %s", runtime.GOOS) - } - t.Fatal(err) - } - cm.HopLimit = i + 1 - if err := p.SetWriteDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, err := p.WriteTo(wb, &cm, dst); err != nil { - t.Fatal(err) - } else if n != len(wb) { - t.Fatalf("got %v; want %v", n, len(wb)) - } - rb := make([]byte, 128) - if err := p.SetReadDeadline(time.Now().Add(100 * time.Millisecond)); err != nil { - t.Fatal(err) - } - if n, cm, _, err := p.ReadFrom(rb); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels have some limitation on receiving icmp packet through raw socket - t.Logf("not supported on %s", runtime.GOOS) - continue - } - t.Fatal(err) - } else { - t.Logf("rcvd cmsg: %v", cm) - if m, err := icmp.ParseMessage(iana.ProtocolIPv6ICMP, rb[:n]); err != nil { - t.Fatal(err) - } else if m.Type != ipv6.ICMPTypeEchoReply || m.Code != 0 { - t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv6.ICMPTypeEchoReply, 0) - } - } - } -} diff --git a/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go b/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go deleted file mode 100644 index 7bb2e440..00000000 --- a/vendor/golang.org/x/net/ipv6/unicastsockopt_test.go +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package ipv6_test - -import ( - "net" - "runtime" - "testing" - - "golang.org/x/net/internal/iana" - "golang.org/x/net/internal/nettest" - "golang.org/x/net/ipv6" -) - -func TestConnUnicastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - ln, err := net.Listen("tcp6", "[::1]:0") - if err != nil { - t.Fatal(err) - } - defer ln.Close() - - done := make(chan bool) - go acceptor(t, ln, done) - - c, err := net.Dial("tcp6", ln.Addr().String()) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - testUnicastSocketOptions(t, ipv6.NewConn(c)) - - <-done -} - -var packetConnUnicastSocketOptionTests = []struct { - net, proto, addr string -}{ - {"udp6", "", "[::1]:0"}, - {"ip6", ":ipv6-icmp", "::1"}, -} - -func TestPacketConnUnicastSocketOptions(t *testing.T) { - switch runtime.GOOS { - case "nacl", "plan9", "solaris", "windows": - t.Skipf("not supported on %s", runtime.GOOS) - } - if !supportsIPv6 { - t.Skip("ipv6 is not supported") - } - - m, ok := nettest.SupportsRawIPSocket() - for _, tt := range packetConnUnicastSocketOptionTests { - if tt.net == "ip6" && !ok { - t.Log(m) - continue - } - c, err := net.ListenPacket(tt.net+tt.proto, tt.addr) - if err != nil { - t.Fatal(err) - } - defer c.Close() - - testUnicastSocketOptions(t, ipv6.NewPacketConn(c)) - } -} - -type testIPv6UnicastConn interface { - TrafficClass() (int, error) - SetTrafficClass(int) error - HopLimit() (int, error) - SetHopLimit(int) error -} - -func testUnicastSocketOptions(t *testing.T, c testIPv6UnicastConn) { - tclass := iana.DiffServCS0 | iana.NotECNTransport - if err := c.SetTrafficClass(tclass); err != nil { - switch runtime.GOOS { - case "darwin": // older darwin kernels don't support IPV6_TCLASS option - t.Logf("not supported on %s", runtime.GOOS) - goto next - } - t.Fatal(err) - } - if v, err := c.TrafficClass(); err != nil { - t.Fatal(err) - } else if v != tclass { - t.Fatalf("got %v; want %v", v, tclass) - } - -next: - hoplim := 255 - if err := c.SetHopLimit(hoplim); err != nil { - t.Fatal(err) - } - if v, err := c.HopLimit(); err != nil { - t.Fatal(err) - } else if v != hoplim { - t.Fatalf("got %v; want %v", v, hoplim) - } -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_darwin.go b/vendor/golang.org/x/net/ipv6/zsys_darwin.go deleted file mode 100644 index cb044b03..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_darwin.go +++ /dev/null @@ -1,131 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_darwin.go - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - sysIPV6_2292PKTINFO = 0x13 - sysIPV6_2292HOPLIMIT = 0x14 - sysIPV6_2292NEXTHOP = 0x15 - sysIPV6_2292HOPOPTS = 0x16 - sysIPV6_2292DSTOPTS = 0x17 - sysIPV6_2292RTHDR = 0x18 - - sysIPV6_2292PKTOPTIONS = 0x19 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_IPSEC_POLICY = 0x1c - - sysIPV6_RECVTCLASS = 0x23 - sysIPV6_TCLASS = 0x24 - - sysIPV6_RTHDRDSTOPTS = 0x39 - - sysIPV6_RECVPKTINFO = 0x3d - - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_AUTOFLOWLABEL = 0x3b - - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_PREFER_TEMPADDR = 0x3f - - sysIPV6_MSFILTER = 0x4a - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysIPV6_BOUND_IF = 0x7d - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [128]byte -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [128]byte - Pad_cgo_1 [128]byte -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go b/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go deleted file mode 100644 index 5a03ab73..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_dragonfly.go +++ /dev/null @@ -1,90 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_dragonfly.go - -// +build dragonfly - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_IPSEC_POLICY = 0x1c - - sysIPV6_RTHDRDSTOPTS = 0x23 - sysIPV6_RECVPKTINFO = 0x24 - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_RECVTCLASS = 0x39 - - sysIPV6_AUTOFLOWLABEL = 0x3b - - sysIPV6_TCLASS = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_PREFER_TEMPADDR = 0x3f - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go deleted file mode 100644 index 4ace96f0..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_386.go +++ /dev/null @@ -1,122 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_freebsd.go - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_IPSEC_POLICY = 0x1c - - sysIPV6_RTHDRDSTOPTS = 0x23 - - sysIPV6_RECVPKTINFO = 0x24 - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_RECVTCLASS = 0x39 - - sysIPV6_AUTOFLOWLABEL = 0x3b - - sysIPV6_TCLASS = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_PREFER_TEMPADDR = 0x3f - - sysIPV6_BINDANY = 0x40 - - sysIPV6_MSFILTER = 0x4a - - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysGroupReq struct { - Interface uint32 - Group sysSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Group sysSockaddrStorage - Source sysSockaddrStorage -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go deleted file mode 100644 index 4a62c2d5..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_amd64.go +++ /dev/null @@ -1,124 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_freebsd.go - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_IPSEC_POLICY = 0x1c - - sysIPV6_RTHDRDSTOPTS = 0x23 - - sysIPV6_RECVPKTINFO = 0x24 - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_RECVTCLASS = 0x39 - - sysIPV6_AUTOFLOWLABEL = 0x3b - - sysIPV6_TCLASS = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_PREFER_TEMPADDR = 0x3f - - sysIPV6_BINDANY = 0x40 - - sysIPV6_MSFILTER = 0x4a - - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go b/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go deleted file mode 100644 index 4a62c2d5..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_freebsd_arm.go +++ /dev/null @@ -1,124 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_freebsd.go - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_IPSEC_POLICY = 0x1c - - sysIPV6_RTHDRDSTOPTS = 0x23 - - sysIPV6_RECVPKTINFO = 0x24 - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_RECVTCLASS = 0x39 - - sysIPV6_AUTOFLOWLABEL = 0x3b - - sysIPV6_TCLASS = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_PREFER_TEMPADDR = 0x3f - - sysIPV6_BINDANY = 0x40 - - sysIPV6_MSFILTER = 0x4a - - sysMCAST_JOIN_GROUP = 0x50 - sysMCAST_LEAVE_GROUP = 0x51 - sysMCAST_JOIN_SOURCE_GROUP = 0x52 - sysMCAST_LEAVE_SOURCE_GROUP = 0x53 - sysMCAST_BLOCK_SOURCE = 0x54 - sysMCAST_UNBLOCK_SOURCE = 0x55 - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrStorage struct { - Len uint8 - Family uint8 - X__ss_pad1 [6]int8 - X__ss_align int64 - X__ss_pad2 [112]int8 -} - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysSockaddrStorage - Source sysSockaddrStorage -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go b/vendor/golang.org/x/net/ipv6/zsys_linux_386.go deleted file mode 100644 index 27279292..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_386.go +++ /dev/null @@ -1,152 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -package ipv6 - -const ( - sysIPV6_ADDRFORM = 0x1 - sysIPV6_2292PKTINFO = 0x2 - sysIPV6_2292HOPOPTS = 0x3 - sysIPV6_2292DSTOPTS = 0x4 - sysIPV6_2292RTHDR = 0x5 - sysIPV6_2292PKTOPTIONS = 0x6 - sysIPV6_CHECKSUM = 0x7 - sysIPV6_2292HOPLIMIT = 0x8 - sysIPV6_NEXTHOP = 0x9 - sysIPV6_FLOWINFO = 0xb - - sysIPV6_UNICAST_HOPS = 0x10 - sysIPV6_MULTICAST_IF = 0x11 - sysIPV6_MULTICAST_HOPS = 0x12 - sysIPV6_MULTICAST_LOOP = 0x13 - sysIPV6_ADD_MEMBERSHIP = 0x14 - sysIPV6_DROP_MEMBERSHIP = 0x15 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIPV6_ROUTER_ALERT = 0x16 - sysIPV6_MTU_DISCOVER = 0x17 - sysIPV6_MTU = 0x18 - sysIPV6_RECVERR = 0x19 - sysIPV6_V6ONLY = 0x1a - sysIPV6_JOIN_ANYCAST = 0x1b - sysIPV6_LEAVE_ANYCAST = 0x1c - - sysIPV6_FLOWLABEL_MGR = 0x20 - sysIPV6_FLOWINFO_SEND = 0x21 - - sysIPV6_IPSEC_POLICY = 0x22 - sysIPV6_XFRM_POLICY = 0x23 - - sysIPV6_RECVPKTINFO = 0x31 - sysIPV6_PKTINFO = 0x32 - sysIPV6_RECVHOPLIMIT = 0x33 - sysIPV6_HOPLIMIT = 0x34 - sysIPV6_RECVHOPOPTS = 0x35 - sysIPV6_HOPOPTS = 0x36 - sysIPV6_RTHDRDSTOPTS = 0x37 - sysIPV6_RECVRTHDR = 0x38 - sysIPV6_RTHDR = 0x39 - sysIPV6_RECVDSTOPTS = 0x3a - sysIPV6_DSTOPTS = 0x3b - sysIPV6_RECVPATHMTU = 0x3c - sysIPV6_PATHMTU = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_RECVTCLASS = 0x42 - sysIPV6_TCLASS = 0x43 - - sysIPV6_ADDR_PREFERENCES = 0x48 - - sysIPV6_PREFER_SRC_TMP = 0x1 - sysIPV6_PREFER_SRC_PUBLIC = 0x2 - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 - sysIPV6_PREFER_SRC_COA = 0x4 - sysIPV6_PREFER_SRC_HOME = 0x400 - sysIPV6_PREFER_SRC_CGA = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x800 - - sysIPV6_MINHOPCOUNT = 0x49 - - sysIPV6_ORIGDSTADDR = 0x4a - sysIPV6_RECVORIGDSTADDR = 0x4a - sysIPV6_TRANSPARENT = 0x4b - sysIPV6_UNICAST_IF = 0x4c - - sysICMPV6_FILTER = 0x1 - - sysICMPV6_FILTER_BLOCK = 0x1 - sysICMPV6_FILTER_PASS = 0x2 - sysICMPV6_FILTER_BLOCKOTHERS = 0x3 - sysICMPV6_FILTER_PASSONLY = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6FlowlabelReq struct { - Dst [16]byte /* in6_addr */ - Label uint32 - Action uint8 - Share uint8 - Flags uint16 - Expires uint16 - Linger uint16 - X__flr_pad uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysGroupReq struct { - Interface uint32 - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPv6Filter struct { - Data [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go deleted file mode 100644 index 2f742e95..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_amd64.go +++ /dev/null @@ -1,154 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -package ipv6 - -const ( - sysIPV6_ADDRFORM = 0x1 - sysIPV6_2292PKTINFO = 0x2 - sysIPV6_2292HOPOPTS = 0x3 - sysIPV6_2292DSTOPTS = 0x4 - sysIPV6_2292RTHDR = 0x5 - sysIPV6_2292PKTOPTIONS = 0x6 - sysIPV6_CHECKSUM = 0x7 - sysIPV6_2292HOPLIMIT = 0x8 - sysIPV6_NEXTHOP = 0x9 - sysIPV6_FLOWINFO = 0xb - - sysIPV6_UNICAST_HOPS = 0x10 - sysIPV6_MULTICAST_IF = 0x11 - sysIPV6_MULTICAST_HOPS = 0x12 - sysIPV6_MULTICAST_LOOP = 0x13 - sysIPV6_ADD_MEMBERSHIP = 0x14 - sysIPV6_DROP_MEMBERSHIP = 0x15 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIPV6_ROUTER_ALERT = 0x16 - sysIPV6_MTU_DISCOVER = 0x17 - sysIPV6_MTU = 0x18 - sysIPV6_RECVERR = 0x19 - sysIPV6_V6ONLY = 0x1a - sysIPV6_JOIN_ANYCAST = 0x1b - sysIPV6_LEAVE_ANYCAST = 0x1c - - sysIPV6_FLOWLABEL_MGR = 0x20 - sysIPV6_FLOWINFO_SEND = 0x21 - - sysIPV6_IPSEC_POLICY = 0x22 - sysIPV6_XFRM_POLICY = 0x23 - - sysIPV6_RECVPKTINFO = 0x31 - sysIPV6_PKTINFO = 0x32 - sysIPV6_RECVHOPLIMIT = 0x33 - sysIPV6_HOPLIMIT = 0x34 - sysIPV6_RECVHOPOPTS = 0x35 - sysIPV6_HOPOPTS = 0x36 - sysIPV6_RTHDRDSTOPTS = 0x37 - sysIPV6_RECVRTHDR = 0x38 - sysIPV6_RTHDR = 0x39 - sysIPV6_RECVDSTOPTS = 0x3a - sysIPV6_DSTOPTS = 0x3b - sysIPV6_RECVPATHMTU = 0x3c - sysIPV6_PATHMTU = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_RECVTCLASS = 0x42 - sysIPV6_TCLASS = 0x43 - - sysIPV6_ADDR_PREFERENCES = 0x48 - - sysIPV6_PREFER_SRC_TMP = 0x1 - sysIPV6_PREFER_SRC_PUBLIC = 0x2 - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 - sysIPV6_PREFER_SRC_COA = 0x4 - sysIPV6_PREFER_SRC_HOME = 0x400 - sysIPV6_PREFER_SRC_CGA = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x800 - - sysIPV6_MINHOPCOUNT = 0x49 - - sysIPV6_ORIGDSTADDR = 0x4a - sysIPV6_RECVORIGDSTADDR = 0x4a - sysIPV6_TRANSPARENT = 0x4b - sysIPV6_UNICAST_IF = 0x4c - - sysICMPV6_FILTER = 0x1 - - sysICMPV6_FILTER_BLOCK = 0x1 - sysICMPV6_FILTER_PASS = 0x2 - sysICMPV6_FILTER_BLOCKOTHERS = 0x3 - sysICMPV6_FILTER_PASSONLY = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6FlowlabelReq struct { - Dst [16]byte /* in6_addr */ - Label uint32 - Action uint8 - Share uint8 - Flags uint16 - Expires uint16 - Linger uint16 - X__flr_pad uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPv6Filter struct { - Data [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go deleted file mode 100644 index 27279292..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm.go +++ /dev/null @@ -1,152 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -package ipv6 - -const ( - sysIPV6_ADDRFORM = 0x1 - sysIPV6_2292PKTINFO = 0x2 - sysIPV6_2292HOPOPTS = 0x3 - sysIPV6_2292DSTOPTS = 0x4 - sysIPV6_2292RTHDR = 0x5 - sysIPV6_2292PKTOPTIONS = 0x6 - sysIPV6_CHECKSUM = 0x7 - sysIPV6_2292HOPLIMIT = 0x8 - sysIPV6_NEXTHOP = 0x9 - sysIPV6_FLOWINFO = 0xb - - sysIPV6_UNICAST_HOPS = 0x10 - sysIPV6_MULTICAST_IF = 0x11 - sysIPV6_MULTICAST_HOPS = 0x12 - sysIPV6_MULTICAST_LOOP = 0x13 - sysIPV6_ADD_MEMBERSHIP = 0x14 - sysIPV6_DROP_MEMBERSHIP = 0x15 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIPV6_ROUTER_ALERT = 0x16 - sysIPV6_MTU_DISCOVER = 0x17 - sysIPV6_MTU = 0x18 - sysIPV6_RECVERR = 0x19 - sysIPV6_V6ONLY = 0x1a - sysIPV6_JOIN_ANYCAST = 0x1b - sysIPV6_LEAVE_ANYCAST = 0x1c - - sysIPV6_FLOWLABEL_MGR = 0x20 - sysIPV6_FLOWINFO_SEND = 0x21 - - sysIPV6_IPSEC_POLICY = 0x22 - sysIPV6_XFRM_POLICY = 0x23 - - sysIPV6_RECVPKTINFO = 0x31 - sysIPV6_PKTINFO = 0x32 - sysIPV6_RECVHOPLIMIT = 0x33 - sysIPV6_HOPLIMIT = 0x34 - sysIPV6_RECVHOPOPTS = 0x35 - sysIPV6_HOPOPTS = 0x36 - sysIPV6_RTHDRDSTOPTS = 0x37 - sysIPV6_RECVRTHDR = 0x38 - sysIPV6_RTHDR = 0x39 - sysIPV6_RECVDSTOPTS = 0x3a - sysIPV6_DSTOPTS = 0x3b - sysIPV6_RECVPATHMTU = 0x3c - sysIPV6_PATHMTU = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_RECVTCLASS = 0x42 - sysIPV6_TCLASS = 0x43 - - sysIPV6_ADDR_PREFERENCES = 0x48 - - sysIPV6_PREFER_SRC_TMP = 0x1 - sysIPV6_PREFER_SRC_PUBLIC = 0x2 - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 - sysIPV6_PREFER_SRC_COA = 0x4 - sysIPV6_PREFER_SRC_HOME = 0x400 - sysIPV6_PREFER_SRC_CGA = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x800 - - sysIPV6_MINHOPCOUNT = 0x49 - - sysIPV6_ORIGDSTADDR = 0x4a - sysIPV6_RECVORIGDSTADDR = 0x4a - sysIPV6_TRANSPARENT = 0x4b - sysIPV6_UNICAST_IF = 0x4c - - sysICMPV6_FILTER = 0x1 - - sysICMPV6_FILTER_BLOCK = 0x1 - sysICMPV6_FILTER_PASS = 0x2 - sysICMPV6_FILTER_BLOCKOTHERS = 0x3 - sysICMPV6_FILTER_PASSONLY = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x84 - sysSizeofGroupSourceReq = 0x104 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6FlowlabelReq struct { - Dst [16]byte /* in6_addr */ - Label uint32 - Action uint8 - Share uint8 - Flags uint16 - Expires uint16 - Linger uint16 - X__flr_pad uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysGroupReq struct { - Interface uint32 - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPv6Filter struct { - Data [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go deleted file mode 100644 index ab104645..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_arm64.go +++ /dev/null @@ -1,156 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -// +build linux,arm64 - -package ipv6 - -const ( - sysIPV6_ADDRFORM = 0x1 - sysIPV6_2292PKTINFO = 0x2 - sysIPV6_2292HOPOPTS = 0x3 - sysIPV6_2292DSTOPTS = 0x4 - sysIPV6_2292RTHDR = 0x5 - sysIPV6_2292PKTOPTIONS = 0x6 - sysIPV6_CHECKSUM = 0x7 - sysIPV6_2292HOPLIMIT = 0x8 - sysIPV6_NEXTHOP = 0x9 - sysIPV6_FLOWINFO = 0xb - - sysIPV6_UNICAST_HOPS = 0x10 - sysIPV6_MULTICAST_IF = 0x11 - sysIPV6_MULTICAST_HOPS = 0x12 - sysIPV6_MULTICAST_LOOP = 0x13 - sysIPV6_ADD_MEMBERSHIP = 0x14 - sysIPV6_DROP_MEMBERSHIP = 0x15 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIPV6_ROUTER_ALERT = 0x16 - sysIPV6_MTU_DISCOVER = 0x17 - sysIPV6_MTU = 0x18 - sysIPV6_RECVERR = 0x19 - sysIPV6_V6ONLY = 0x1a - sysIPV6_JOIN_ANYCAST = 0x1b - sysIPV6_LEAVE_ANYCAST = 0x1c - - sysIPV6_FLOWLABEL_MGR = 0x20 - sysIPV6_FLOWINFO_SEND = 0x21 - - sysIPV6_IPSEC_POLICY = 0x22 - sysIPV6_XFRM_POLICY = 0x23 - - sysIPV6_RECVPKTINFO = 0x31 - sysIPV6_PKTINFO = 0x32 - sysIPV6_RECVHOPLIMIT = 0x33 - sysIPV6_HOPLIMIT = 0x34 - sysIPV6_RECVHOPOPTS = 0x35 - sysIPV6_HOPOPTS = 0x36 - sysIPV6_RTHDRDSTOPTS = 0x37 - sysIPV6_RECVRTHDR = 0x38 - sysIPV6_RTHDR = 0x39 - sysIPV6_RECVDSTOPTS = 0x3a - sysIPV6_DSTOPTS = 0x3b - sysIPV6_RECVPATHMTU = 0x3c - sysIPV6_PATHMTU = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_RECVTCLASS = 0x42 - sysIPV6_TCLASS = 0x43 - - sysIPV6_ADDR_PREFERENCES = 0x48 - - sysIPV6_PREFER_SRC_TMP = 0x1 - sysIPV6_PREFER_SRC_PUBLIC = 0x2 - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 - sysIPV6_PREFER_SRC_COA = 0x4 - sysIPV6_PREFER_SRC_HOME = 0x400 - sysIPV6_PREFER_SRC_CGA = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x800 - - sysIPV6_MINHOPCOUNT = 0x49 - - sysIPV6_ORIGDSTADDR = 0x4a - sysIPV6_RECVORIGDSTADDR = 0x4a - sysIPV6_TRANSPARENT = 0x4b - sysIPV6_UNICAST_IF = 0x4c - - sysICMPV6_FILTER = 0x1 - - sysICMPV6_FILTER_BLOCK = 0x1 - sysICMPV6_FILTER_PASS = 0x2 - sysICMPV6_FILTER_BLOCKOTHERS = 0x3 - sysICMPV6_FILTER_PASSONLY = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6FlowlabelReq struct { - Dst [16]byte /* in6_addr */ - Label uint32 - Action uint8 - Share uint8 - Flags uint16 - Expires uint16 - Linger uint16 - X__flr_pad uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPv6Filter struct { - Data [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go deleted file mode 100644 index b99b8a51..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64.go +++ /dev/null @@ -1,156 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -// +build linux,ppc64 - -package ipv6 - -const ( - sysIPV6_ADDRFORM = 0x1 - sysIPV6_2292PKTINFO = 0x2 - sysIPV6_2292HOPOPTS = 0x3 - sysIPV6_2292DSTOPTS = 0x4 - sysIPV6_2292RTHDR = 0x5 - sysIPV6_2292PKTOPTIONS = 0x6 - sysIPV6_CHECKSUM = 0x7 - sysIPV6_2292HOPLIMIT = 0x8 - sysIPV6_NEXTHOP = 0x9 - sysIPV6_FLOWINFO = 0xb - - sysIPV6_UNICAST_HOPS = 0x10 - sysIPV6_MULTICAST_IF = 0x11 - sysIPV6_MULTICAST_HOPS = 0x12 - sysIPV6_MULTICAST_LOOP = 0x13 - sysIPV6_ADD_MEMBERSHIP = 0x14 - sysIPV6_DROP_MEMBERSHIP = 0x15 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIPV6_ROUTER_ALERT = 0x16 - sysIPV6_MTU_DISCOVER = 0x17 - sysIPV6_MTU = 0x18 - sysIPV6_RECVERR = 0x19 - sysIPV6_V6ONLY = 0x1a - sysIPV6_JOIN_ANYCAST = 0x1b - sysIPV6_LEAVE_ANYCAST = 0x1c - - sysIPV6_FLOWLABEL_MGR = 0x20 - sysIPV6_FLOWINFO_SEND = 0x21 - - sysIPV6_IPSEC_POLICY = 0x22 - sysIPV6_XFRM_POLICY = 0x23 - - sysIPV6_RECVPKTINFO = 0x31 - sysIPV6_PKTINFO = 0x32 - sysIPV6_RECVHOPLIMIT = 0x33 - sysIPV6_HOPLIMIT = 0x34 - sysIPV6_RECVHOPOPTS = 0x35 - sysIPV6_HOPOPTS = 0x36 - sysIPV6_RTHDRDSTOPTS = 0x37 - sysIPV6_RECVRTHDR = 0x38 - sysIPV6_RTHDR = 0x39 - sysIPV6_RECVDSTOPTS = 0x3a - sysIPV6_DSTOPTS = 0x3b - sysIPV6_RECVPATHMTU = 0x3c - sysIPV6_PATHMTU = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_RECVTCLASS = 0x42 - sysIPV6_TCLASS = 0x43 - - sysIPV6_ADDR_PREFERENCES = 0x48 - - sysIPV6_PREFER_SRC_TMP = 0x1 - sysIPV6_PREFER_SRC_PUBLIC = 0x2 - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 - sysIPV6_PREFER_SRC_COA = 0x4 - sysIPV6_PREFER_SRC_HOME = 0x400 - sysIPV6_PREFER_SRC_CGA = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x800 - - sysIPV6_MINHOPCOUNT = 0x49 - - sysIPV6_ORIGDSTADDR = 0x4a - sysIPV6_RECVORIGDSTADDR = 0x4a - sysIPV6_TRANSPARENT = 0x4b - sysIPV6_UNICAST_IF = 0x4c - - sysICMPV6_FILTER = 0x1 - - sysICMPV6_FILTER_BLOCK = 0x1 - sysICMPV6_FILTER_PASS = 0x2 - sysICMPV6_FILTER_BLOCKOTHERS = 0x3 - sysICMPV6_FILTER_PASSONLY = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6FlowlabelReq struct { - Dst [16]byte /* in6_addr */ - Label uint32 - Action uint8 - Share uint8 - Flags uint16 - Expires uint16 - Linger uint16 - X__flr_pad uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPv6Filter struct { - Data [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go b/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go deleted file mode 100644 index 992b56e2..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_ppc64le.go +++ /dev/null @@ -1,156 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_linux.go - -// +build linux,ppc64le - -package ipv6 - -const ( - sysIPV6_ADDRFORM = 0x1 - sysIPV6_2292PKTINFO = 0x2 - sysIPV6_2292HOPOPTS = 0x3 - sysIPV6_2292DSTOPTS = 0x4 - sysIPV6_2292RTHDR = 0x5 - sysIPV6_2292PKTOPTIONS = 0x6 - sysIPV6_CHECKSUM = 0x7 - sysIPV6_2292HOPLIMIT = 0x8 - sysIPV6_NEXTHOP = 0x9 - sysIPV6_FLOWINFO = 0xb - - sysIPV6_UNICAST_HOPS = 0x10 - sysIPV6_MULTICAST_IF = 0x11 - sysIPV6_MULTICAST_HOPS = 0x12 - sysIPV6_MULTICAST_LOOP = 0x13 - sysIPV6_ADD_MEMBERSHIP = 0x14 - sysIPV6_DROP_MEMBERSHIP = 0x15 - sysMCAST_JOIN_GROUP = 0x2a - sysMCAST_LEAVE_GROUP = 0x2d - sysMCAST_JOIN_SOURCE_GROUP = 0x2e - sysMCAST_LEAVE_SOURCE_GROUP = 0x2f - sysMCAST_BLOCK_SOURCE = 0x2b - sysMCAST_UNBLOCK_SOURCE = 0x2c - sysMCAST_MSFILTER = 0x30 - sysIPV6_ROUTER_ALERT = 0x16 - sysIPV6_MTU_DISCOVER = 0x17 - sysIPV6_MTU = 0x18 - sysIPV6_RECVERR = 0x19 - sysIPV6_V6ONLY = 0x1a - sysIPV6_JOIN_ANYCAST = 0x1b - sysIPV6_LEAVE_ANYCAST = 0x1c - - sysIPV6_FLOWLABEL_MGR = 0x20 - sysIPV6_FLOWINFO_SEND = 0x21 - - sysIPV6_IPSEC_POLICY = 0x22 - sysIPV6_XFRM_POLICY = 0x23 - - sysIPV6_RECVPKTINFO = 0x31 - sysIPV6_PKTINFO = 0x32 - sysIPV6_RECVHOPLIMIT = 0x33 - sysIPV6_HOPLIMIT = 0x34 - sysIPV6_RECVHOPOPTS = 0x35 - sysIPV6_HOPOPTS = 0x36 - sysIPV6_RTHDRDSTOPTS = 0x37 - sysIPV6_RECVRTHDR = 0x38 - sysIPV6_RTHDR = 0x39 - sysIPV6_RECVDSTOPTS = 0x3a - sysIPV6_DSTOPTS = 0x3b - sysIPV6_RECVPATHMTU = 0x3c - sysIPV6_PATHMTU = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_RECVTCLASS = 0x42 - sysIPV6_TCLASS = 0x43 - - sysIPV6_ADDR_PREFERENCES = 0x48 - - sysIPV6_PREFER_SRC_TMP = 0x1 - sysIPV6_PREFER_SRC_PUBLIC = 0x2 - sysIPV6_PREFER_SRC_PUBTMP_DEFAULT = 0x100 - sysIPV6_PREFER_SRC_COA = 0x4 - sysIPV6_PREFER_SRC_HOME = 0x400 - sysIPV6_PREFER_SRC_CGA = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x800 - - sysIPV6_MINHOPCOUNT = 0x49 - - sysIPV6_ORIGDSTADDR = 0x4a - sysIPV6_RECVORIGDSTADDR = 0x4a - sysIPV6_TRANSPARENT = 0x4b - sysIPV6_UNICAST_IF = 0x4c - - sysICMPV6_FILTER = 0x1 - - sysICMPV6_FILTER_BLOCK = 0x1 - sysICMPV6_FILTER_PASS = 0x2 - sysICMPV6_FILTER_BLOCKOTHERS = 0x3 - sysICMPV6_FILTER_PASSONLY = 0x4 - - sysSizeofKernelSockaddrStorage = 0x80 - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - sysSizeofIPv6FlowlabelReq = 0x20 - - sysSizeofIPv6Mreq = 0x14 - sysSizeofGroupReq = 0x88 - sysSizeofGroupSourceReq = 0x108 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysKernelSockaddrStorage struct { - Family uint16 - X__data [126]int8 -} - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6FlowlabelReq struct { - Dst [16]byte /* in6_addr */ - Label uint32 - Action uint8 - Share uint8 - Flags uint16 - Expires uint16 - Linger uint16 - X__flr_pad uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Ifindex int32 -} - -type sysGroupReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage -} - -type sysGroupSourceReq struct { - Interface uint32 - Pad_cgo_0 [4]byte - Group sysKernelSockaddrStorage - Source sysKernelSockaddrStorage -} - -type sysICMPv6Filter struct { - Data [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go b/vendor/golang.org/x/net/ipv6/zsys_netbsd.go deleted file mode 100644 index d6ec88e3..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_netbsd.go +++ /dev/null @@ -1,84 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_netbsd.go - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_IPSEC_POLICY = 0x1c - - sysIPV6_RTHDRDSTOPTS = 0x23 - - sysIPV6_RECVPKTINFO = 0x24 - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_RECVTCLASS = 0x39 - - sysIPV6_TCLASS = 0x3d - sysIPV6_DONTFRAG = 0x3e - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go b/vendor/golang.org/x/net/ipv6/zsys_openbsd.go deleted file mode 100644 index 3e080b78..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_openbsd.go +++ /dev/null @@ -1,93 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_openbsd.go - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x4 - sysIPV6_MULTICAST_IF = 0x9 - sysIPV6_MULTICAST_HOPS = 0xa - sysIPV6_MULTICAST_LOOP = 0xb - sysIPV6_JOIN_GROUP = 0xc - sysIPV6_LEAVE_GROUP = 0xd - sysIPV6_PORTRANGE = 0xe - sysICMP6_FILTER = 0x12 - - sysIPV6_CHECKSUM = 0x1a - sysIPV6_V6ONLY = 0x1b - - sysIPV6_RTHDRDSTOPTS = 0x23 - - sysIPV6_RECVPKTINFO = 0x24 - sysIPV6_RECVHOPLIMIT = 0x25 - sysIPV6_RECVRTHDR = 0x26 - sysIPV6_RECVHOPOPTS = 0x27 - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_USE_MIN_MTU = 0x2a - sysIPV6_RECVPATHMTU = 0x2b - - sysIPV6_PATHMTU = 0x2c - - sysIPV6_PKTINFO = 0x2e - sysIPV6_HOPLIMIT = 0x2f - sysIPV6_NEXTHOP = 0x30 - sysIPV6_HOPOPTS = 0x31 - sysIPV6_DSTOPTS = 0x32 - sysIPV6_RTHDR = 0x33 - - sysIPV6_AUTH_LEVEL = 0x35 - sysIPV6_ESP_TRANS_LEVEL = 0x36 - sysIPV6_ESP_NETWORK_LEVEL = 0x37 - sysIPSEC6_OUTSA = 0x38 - sysIPV6_RECVTCLASS = 0x39 - - sysIPV6_AUTOFLOWLABEL = 0x3b - sysIPV6_IPCOMP_LEVEL = 0x3c - - sysIPV6_TCLASS = 0x3d - sysIPV6_DONTFRAG = 0x3e - sysIPV6_PIPEX = 0x3f - - sysIPV6_RTABLE = 0x1021 - - sysIPV6_PORTRANGE_DEFAULT = 0x0 - sysIPV6_PORTRANGE_HIGH = 0x1 - sysIPV6_PORTRANGE_LOW = 0x2 - - sysSizeofSockaddrInet6 = 0x1c - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x20 - - sysSizeofIPv6Mreq = 0x14 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrInet6 struct { - Len uint8 - Family uint8 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysICMPv6Filter struct { - Filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/ipv6/zsys_solaris.go b/vendor/golang.org/x/net/ipv6/zsys_solaris.go deleted file mode 100644 index cdf00c25..00000000 --- a/vendor/golang.org/x/net/ipv6/zsys_solaris.go +++ /dev/null @@ -1,105 +0,0 @@ -// Created by cgo -godefs - DO NOT EDIT -// cgo -godefs defs_solaris.go - -// +build solaris - -package ipv6 - -const ( - sysIPV6_UNICAST_HOPS = 0x5 - sysIPV6_MULTICAST_IF = 0x6 - sysIPV6_MULTICAST_HOPS = 0x7 - sysIPV6_MULTICAST_LOOP = 0x8 - sysIPV6_JOIN_GROUP = 0x9 - sysIPV6_LEAVE_GROUP = 0xa - - sysIPV6_PKTINFO = 0xb - - sysIPV6_HOPLIMIT = 0xc - sysIPV6_NEXTHOP = 0xd - sysIPV6_HOPOPTS = 0xe - sysIPV6_DSTOPTS = 0xf - - sysIPV6_RTHDR = 0x10 - sysIPV6_RTHDRDSTOPTS = 0x11 - - sysIPV6_RECVPKTINFO = 0x12 - sysIPV6_RECVHOPLIMIT = 0x13 - sysIPV6_RECVHOPOPTS = 0x14 - - sysIPV6_RECVRTHDR = 0x16 - - sysIPV6_RECVRTHDRDSTOPTS = 0x17 - - sysIPV6_CHECKSUM = 0x18 - sysIPV6_RECVTCLASS = 0x19 - sysIPV6_USE_MIN_MTU = 0x20 - sysIPV6_DONTFRAG = 0x21 - sysIPV6_SEC_OPT = 0x22 - sysIPV6_SRC_PREFERENCES = 0x23 - sysIPV6_RECVPATHMTU = 0x24 - sysIPV6_PATHMTU = 0x25 - sysIPV6_TCLASS = 0x26 - sysIPV6_V6ONLY = 0x27 - - sysIPV6_RECVDSTOPTS = 0x28 - - sysIPV6_PREFER_SRC_HOME = 0x1 - sysIPV6_PREFER_SRC_COA = 0x2 - sysIPV6_PREFER_SRC_PUBLIC = 0x4 - sysIPV6_PREFER_SRC_TMP = 0x8 - sysIPV6_PREFER_SRC_NONCGA = 0x10 - sysIPV6_PREFER_SRC_CGA = 0x20 - - sysIPV6_PREFER_SRC_MIPMASK = 0x3 - sysIPV6_PREFER_SRC_MIPDEFAULT = 0x1 - sysIPV6_PREFER_SRC_TMPMASK = 0xc - sysIPV6_PREFER_SRC_TMPDEFAULT = 0x4 - sysIPV6_PREFER_SRC_CGAMASK = 0x30 - sysIPV6_PREFER_SRC_CGADEFAULT = 0x10 - - sysIPV6_PREFER_SRC_MASK = 0x3f - - sysIPV6_PREFER_SRC_DEFAULT = 0x15 - - sysIPV6_BOUND_IF = 0x41 - sysIPV6_UNSPEC_SRC = 0x42 - - sysICMP6_FILTER = 0x1 - - sysSizeofSockaddrInet6 = 0x20 - sysSizeofInet6Pktinfo = 0x14 - sysSizeofIPv6Mtuinfo = 0x24 - - sysSizeofIPv6Mreq = 0x14 - - sysSizeofICMPv6Filter = 0x20 -) - -type sysSockaddrInet6 struct { - Family uint16 - Port uint16 - Flowinfo uint32 - Addr [16]byte /* in6_addr */ - Scope_id uint32 - X__sin6_src_id uint32 -} - -type sysInet6Pktinfo struct { - Addr [16]byte /* in6_addr */ - Ifindex uint32 -} - -type sysIPv6Mtuinfo struct { - Addr sysSockaddrInet6 - Mtu uint32 -} - -type sysIPv6Mreq struct { - Multiaddr [16]byte /* in6_addr */ - Interface uint32 -} - -type sysICMPv6Filter struct { - X__icmp6_filt [8]uint32 -} diff --git a/vendor/golang.org/x/net/netutil/listen.go b/vendor/golang.org/x/net/netutil/listen.go deleted file mode 100644 index b317ba2e..00000000 --- a/vendor/golang.org/x/net/netutil/listen.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package netutil provides network utility functions, complementing the more -// common ones in the net package. -package netutil // import "golang.org/x/net/netutil" - -import ( - "net" - "sync" -) - -// LimitListener returns a Listener that accepts at most n simultaneous -// connections from the provided Listener. -func LimitListener(l net.Listener, n int) net.Listener { - return &limitListener{l, make(chan struct{}, n)} -} - -type limitListener struct { - net.Listener - sem chan struct{} -} - -func (l *limitListener) acquire() { l.sem <- struct{}{} } -func (l *limitListener) release() { <-l.sem } - -func (l *limitListener) Accept() (net.Conn, error) { - l.acquire() - c, err := l.Listener.Accept() - if err != nil { - l.release() - return nil, err - } - return &limitListenerConn{Conn: c, release: l.release}, nil -} - -type limitListenerConn struct { - net.Conn - releaseOnce sync.Once - release func() -} - -func (l *limitListenerConn) Close() error { - err := l.Conn.Close() - l.releaseOnce.Do(l.release) - return err -} diff --git a/vendor/golang.org/x/net/netutil/listen_test.go b/vendor/golang.org/x/net/netutil/listen_test.go deleted file mode 100644 index c0d5bc2a..00000000 --- a/vendor/golang.org/x/net/netutil/listen_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.3 - -// (We only run this test on Go 1.3 because the HTTP client timeout behavior -// was bad in previous releases, causing occasional deadlocks.) - -package netutil - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "net" - "net/http" - "sync" - "sync/atomic" - "testing" - "time" - - "golang.org/x/net/internal/nettest" -) - -func TestLimitListener(t *testing.T) { - const max = 5 - attempts := (nettest.MaxOpenFiles() - max) / 2 - if attempts > 256 { // maximum length of accept queue is 128 by default - attempts = 256 - } - - l, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatal(err) - } - defer l.Close() - l = LimitListener(l, max) - - var open int32 - go http.Serve(l, http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if n := atomic.AddInt32(&open, 1); n > max { - t.Errorf("%d open connections, want <= %d", n, max) - } - defer atomic.AddInt32(&open, -1) - time.Sleep(10 * time.Millisecond) - fmt.Fprint(w, "some body") - })) - - var wg sync.WaitGroup - var failed int32 - for i := 0; i < attempts; i++ { - wg.Add(1) - go func() { - defer wg.Done() - c := http.Client{Timeout: 3 * time.Second} - r, err := c.Get("http://" + l.Addr().String()) - if err != nil { - t.Log(err) - atomic.AddInt32(&failed, 1) - return - } - defer r.Body.Close() - io.Copy(ioutil.Discard, r.Body) - }() - } - wg.Wait() - - // We expect some Gets to fail as the kernel's accept queue is filled, - // but most should succeed. - if int(failed) >= attempts/2 { - t.Errorf("%d requests failed within %d attempts", failed, attempts) - } -} - -type errorListener struct { - net.Listener -} - -func (errorListener) Accept() (net.Conn, error) { - return nil, errFake -} - -var errFake = errors.New("fake error from errorListener") - -// This used to hang. -func TestLimitListenerError(t *testing.T) { - donec := make(chan bool, 1) - go func() { - const n = 2 - ll := LimitListener(errorListener{}, n) - for i := 0; i < n+1; i++ { - _, err := ll.Accept() - if err != errFake { - t.Fatalf("Accept error = %v; want errFake", err) - } - } - donec <- true - }() - select { - case <-donec: - case <-time.After(5 * time.Second): - t.Fatal("timeout. deadlock?") - } -} diff --git a/vendor/golang.org/x/net/proxy/direct.go b/vendor/golang.org/x/net/proxy/direct.go deleted file mode 100644 index 4c5ad88b..00000000 --- a/vendor/golang.org/x/net/proxy/direct.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "net" -) - -type direct struct{} - -// Direct is a direct proxy: one that makes network connections directly. -var Direct = direct{} - -func (direct) Dial(network, addr string) (net.Conn, error) { - return net.Dial(network, addr) -} diff --git a/vendor/golang.org/x/net/proxy/per_host.go b/vendor/golang.org/x/net/proxy/per_host.go deleted file mode 100644 index f540b196..00000000 --- a/vendor/golang.org/x/net/proxy/per_host.go +++ /dev/null @@ -1,140 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "net" - "strings" -) - -// A PerHost directs connections to a default Dialer unless the hostname -// requested matches one of a number of exceptions. -type PerHost struct { - def, bypass Dialer - - bypassNetworks []*net.IPNet - bypassIPs []net.IP - bypassZones []string - bypassHosts []string -} - -// NewPerHost returns a PerHost Dialer that directs connections to either -// defaultDialer or bypass, depending on whether the connection matches one of -// the configured rules. -func NewPerHost(defaultDialer, bypass Dialer) *PerHost { - return &PerHost{ - def: defaultDialer, - bypass: bypass, - } -} - -// Dial connects to the address addr on the given network through either -// defaultDialer or bypass. -func (p *PerHost) Dial(network, addr string) (c net.Conn, err error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - return p.dialerForRequest(host).Dial(network, addr) -} - -func (p *PerHost) dialerForRequest(host string) Dialer { - if ip := net.ParseIP(host); ip != nil { - for _, net := range p.bypassNetworks { - if net.Contains(ip) { - return p.bypass - } - } - for _, bypassIP := range p.bypassIPs { - if bypassIP.Equal(ip) { - return p.bypass - } - } - return p.def - } - - for _, zone := range p.bypassZones { - if strings.HasSuffix(host, zone) { - return p.bypass - } - if host == zone[1:] { - // For a zone "example.com", we match "example.com" - // too. - return p.bypass - } - } - for _, bypassHost := range p.bypassHosts { - if bypassHost == host { - return p.bypass - } - } - return p.def -} - -// AddFromString parses a string that contains comma-separated values -// specifying hosts that should use the bypass proxy. Each value is either an -// IP address, a CIDR range, a zone (*.example.com) or a hostname -// (localhost). A best effort is made to parse the string and errors are -// ignored. -func (p *PerHost) AddFromString(s string) { - hosts := strings.Split(s, ",") - for _, host := range hosts { - host = strings.TrimSpace(host) - if len(host) == 0 { - continue - } - if strings.Contains(host, "/") { - // We assume that it's a CIDR address like 127.0.0.0/8 - if _, net, err := net.ParseCIDR(host); err == nil { - p.AddNetwork(net) - } - continue - } - if ip := net.ParseIP(host); ip != nil { - p.AddIP(ip) - continue - } - if strings.HasPrefix(host, "*.") { - p.AddZone(host[1:]) - continue - } - p.AddHost(host) - } -} - -// AddIP specifies an IP address that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match an IP. -func (p *PerHost) AddIP(ip net.IP) { - p.bypassIPs = append(p.bypassIPs, ip) -} - -// AddNetwork specifies an IP range that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match. -func (p *PerHost) AddNetwork(net *net.IPNet) { - p.bypassNetworks = append(p.bypassNetworks, net) -} - -// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of -// "example.com" matches "example.com" and all of its subdomains. -func (p *PerHost) AddZone(zone string) { - if strings.HasSuffix(zone, ".") { - zone = zone[:len(zone)-1] - } - if !strings.HasPrefix(zone, ".") { - zone = "." + zone - } - p.bypassZones = append(p.bypassZones, zone) -} - -// AddHost specifies a hostname that will use the bypass proxy. -func (p *PerHost) AddHost(host string) { - if strings.HasSuffix(host, ".") { - host = host[:len(host)-1] - } - p.bypassHosts = append(p.bypassHosts, host) -} diff --git a/vendor/golang.org/x/net/proxy/per_host_test.go b/vendor/golang.org/x/net/proxy/per_host_test.go deleted file mode 100644 index a7d80957..00000000 --- a/vendor/golang.org/x/net/proxy/per_host_test.go +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "errors" - "net" - "reflect" - "testing" -) - -type recordingProxy struct { - addrs []string -} - -func (r *recordingProxy) Dial(network, addr string) (net.Conn, error) { - r.addrs = append(r.addrs, addr) - return nil, errors.New("recordingProxy") -} - -func TestPerHost(t *testing.T) { - var def, bypass recordingProxy - perHost := NewPerHost(&def, &bypass) - perHost.AddFromString("localhost,*.zone,127.0.0.1,10.0.0.1/8,1000::/16") - - expectedDef := []string{ - "example.com:123", - "1.2.3.4:123", - "[1001::]:123", - } - expectedBypass := []string{ - "localhost:123", - "zone:123", - "foo.zone:123", - "127.0.0.1:123", - "10.1.2.3:123", - "[1000::]:123", - } - - for _, addr := range expectedDef { - perHost.Dial("tcp", addr) - } - for _, addr := range expectedBypass { - perHost.Dial("tcp", addr) - } - - if !reflect.DeepEqual(expectedDef, def.addrs) { - t.Errorf("Hosts which went to the default proxy didn't match. Got %v, want %v", def.addrs, expectedDef) - } - if !reflect.DeepEqual(expectedBypass, bypass.addrs) { - t.Errorf("Hosts which went to the bypass proxy didn't match. Got %v, want %v", bypass.addrs, expectedBypass) - } -} diff --git a/vendor/golang.org/x/net/proxy/proxy.go b/vendor/golang.org/x/net/proxy/proxy.go deleted file mode 100644 index 78a8b7be..00000000 --- a/vendor/golang.org/x/net/proxy/proxy.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package proxy provides support for a variety of protocols to proxy network -// data. -package proxy // import "golang.org/x/net/proxy" - -import ( - "errors" - "net" - "net/url" - "os" -) - -// A Dialer is a means to establish a connection. -type Dialer interface { - // Dial connects to the given address via the proxy. - Dial(network, addr string) (c net.Conn, err error) -} - -// Auth contains authentication parameters that specific Dialers may require. -type Auth struct { - User, Password string -} - -// FromEnvironment returns the dialer specified by the proxy related variables in -// the environment. -func FromEnvironment() Dialer { - allProxy := os.Getenv("all_proxy") - if len(allProxy) == 0 { - return Direct - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return Direct - } - proxy, err := FromURL(proxyURL, Direct) - if err != nil { - return Direct - } - - noProxy := os.Getenv("no_proxy") - if len(noProxy) == 0 { - return proxy - } - - perHost := NewPerHost(proxy, Direct) - perHost.AddFromString(noProxy) - return perHost -} - -// proxySchemes is a map from URL schemes to a function that creates a Dialer -// from a URL with such a scheme. -var proxySchemes map[string]func(*url.URL, Dialer) (Dialer, error) - -// RegisterDialerType takes a URL scheme and a function to generate Dialers from -// a URL with that scheme and a forwarding Dialer. Registered schemes are used -// by FromURL. -func RegisterDialerType(scheme string, f func(*url.URL, Dialer) (Dialer, error)) { - if proxySchemes == nil { - proxySchemes = make(map[string]func(*url.URL, Dialer) (Dialer, error)) - } - proxySchemes[scheme] = f -} - -// FromURL returns a Dialer given a URL specification and an underlying -// Dialer for it to make network requests. -func FromURL(u *url.URL, forward Dialer) (Dialer, error) { - var auth *Auth - if u.User != nil { - auth = new(Auth) - auth.User = u.User.Username() - if p, ok := u.User.Password(); ok { - auth.Password = p - } - } - - switch u.Scheme { - case "socks5": - return SOCKS5("tcp", u.Host, auth, forward) - } - - // If the scheme doesn't match any of the built-in schemes, see if it - // was registered by another package. - if proxySchemes != nil { - if f, ok := proxySchemes[u.Scheme]; ok { - return f(u, forward) - } - } - - return nil, errors.New("proxy: unknown scheme: " + u.Scheme) -} diff --git a/vendor/golang.org/x/net/proxy/proxy_test.go b/vendor/golang.org/x/net/proxy/proxy_test.go deleted file mode 100644 index c19a5c06..00000000 --- a/vendor/golang.org/x/net/proxy/proxy_test.go +++ /dev/null @@ -1,142 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "io" - "net" - "net/url" - "strconv" - "sync" - "testing" -) - -func TestFromURL(t *testing.T) { - endSystem, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatalf("net.Listen failed: %v", err) - } - defer endSystem.Close() - gateway, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatalf("net.Listen failed: %v", err) - } - defer gateway.Close() - - var wg sync.WaitGroup - wg.Add(1) - go socks5Gateway(t, gateway, endSystem, socks5Domain, &wg) - - url, err := url.Parse("socks5://user:password@" + gateway.Addr().String()) - if err != nil { - t.Fatalf("url.Parse failed: %v", err) - } - proxy, err := FromURL(url, Direct) - if err != nil { - t.Fatalf("FromURL failed: %v", err) - } - _, port, err := net.SplitHostPort(endSystem.Addr().String()) - if err != nil { - t.Fatalf("net.SplitHostPort failed: %v", err) - } - if c, err := proxy.Dial("tcp", "localhost:"+port); err != nil { - t.Fatalf("FromURL.Dial failed: %v", err) - } else { - c.Close() - } - - wg.Wait() -} - -func TestSOCKS5(t *testing.T) { - endSystem, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatalf("net.Listen failed: %v", err) - } - defer endSystem.Close() - gateway, err := net.Listen("tcp", "127.0.0.1:0") - if err != nil { - t.Fatalf("net.Listen failed: %v", err) - } - defer gateway.Close() - - var wg sync.WaitGroup - wg.Add(1) - go socks5Gateway(t, gateway, endSystem, socks5IP4, &wg) - - proxy, err := SOCKS5("tcp", gateway.Addr().String(), nil, Direct) - if err != nil { - t.Fatalf("SOCKS5 failed: %v", err) - } - if c, err := proxy.Dial("tcp", endSystem.Addr().String()); err != nil { - t.Fatalf("SOCKS5.Dial failed: %v", err) - } else { - c.Close() - } - - wg.Wait() -} - -func socks5Gateway(t *testing.T, gateway, endSystem net.Listener, typ byte, wg *sync.WaitGroup) { - defer wg.Done() - - c, err := gateway.Accept() - if err != nil { - t.Errorf("net.Listener.Accept failed: %v", err) - return - } - defer c.Close() - - b := make([]byte, 32) - var n int - if typ == socks5Domain { - n = 4 - } else { - n = 3 - } - if _, err := io.ReadFull(c, b[:n]); err != nil { - t.Errorf("io.ReadFull failed: %v", err) - return - } - if _, err := c.Write([]byte{socks5Version, socks5AuthNone}); err != nil { - t.Errorf("net.Conn.Write failed: %v", err) - return - } - if typ == socks5Domain { - n = 16 - } else { - n = 10 - } - if _, err := io.ReadFull(c, b[:n]); err != nil { - t.Errorf("io.ReadFull failed: %v", err) - return - } - if b[0] != socks5Version || b[1] != socks5Connect || b[2] != 0x00 || b[3] != typ { - t.Errorf("got an unexpected packet: %#02x %#02x %#02x %#02x", b[0], b[1], b[2], b[3]) - return - } - if typ == socks5Domain { - copy(b[:5], []byte{socks5Version, 0x00, 0x00, socks5Domain, 9}) - b = append(b, []byte("localhost")...) - } else { - copy(b[:4], []byte{socks5Version, 0x00, 0x00, socks5IP4}) - } - host, port, err := net.SplitHostPort(endSystem.Addr().String()) - if err != nil { - t.Errorf("net.SplitHostPort failed: %v", err) - return - } - b = append(b, []byte(net.ParseIP(host).To4())...) - p, err := strconv.Atoi(port) - if err != nil { - t.Errorf("strconv.Atoi failed: %v", err) - return - } - b = append(b, []byte{byte(p >> 8), byte(p)}...) - if _, err := c.Write(b); err != nil { - t.Errorf("net.Conn.Write failed: %v", err) - return - } -} diff --git a/vendor/golang.org/x/net/proxy/socks5.go b/vendor/golang.org/x/net/proxy/socks5.go deleted file mode 100644 index 9b962823..00000000 --- a/vendor/golang.org/x/net/proxy/socks5.go +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package proxy - -import ( - "errors" - "io" - "net" - "strconv" -) - -// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address -// with an optional username and password. See RFC 1928. -func SOCKS5(network, addr string, auth *Auth, forward Dialer) (Dialer, error) { - s := &socks5{ - network: network, - addr: addr, - forward: forward, - } - if auth != nil { - s.user = auth.User - s.password = auth.Password - } - - return s, nil -} - -type socks5 struct { - user, password string - network, addr string - forward Dialer -} - -const socks5Version = 5 - -const ( - socks5AuthNone = 0 - socks5AuthPassword = 2 -) - -const socks5Connect = 1 - -const ( - socks5IP4 = 1 - socks5Domain = 3 - socks5IP6 = 4 -) - -var socks5Errors = []string{ - "", - "general failure", - "connection forbidden", - "network unreachable", - "host unreachable", - "connection refused", - "TTL expired", - "command not supported", - "address type not supported", -} - -// Dial connects to the address addr on the network net via the SOCKS5 proxy. -func (s *socks5) Dial(network, addr string) (net.Conn, error) { - switch network { - case "tcp", "tcp6", "tcp4": - default: - return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) - } - - conn, err := s.forward.Dial(s.network, s.addr) - if err != nil { - return nil, err - } - closeConn := &conn - defer func() { - if closeConn != nil { - (*closeConn).Close() - } - }() - - host, portStr, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - port, err := strconv.Atoi(portStr) - if err != nil { - return nil, errors.New("proxy: failed to parse port number: " + portStr) - } - if port < 1 || port > 0xffff { - return nil, errors.New("proxy: port number out of range: " + portStr) - } - - // the size here is just an estimate - buf := make([]byte, 0, 6+len(host)) - - buf = append(buf, socks5Version) - if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { - buf = append(buf, 2 /* num auth methods */, socks5AuthNone, socks5AuthPassword) - } else { - buf = append(buf, 1 /* num auth methods */, socks5AuthNone) - } - - if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - if buf[0] != 5 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) - } - if buf[1] == 0xff { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") - } - - if buf[1] == socks5AuthPassword { - buf = buf[:0] - buf = append(buf, 1 /* password protocol version */) - buf = append(buf, uint8(len(s.user))) - buf = append(buf, s.user...) - buf = append(buf, uint8(len(s.password))) - buf = append(buf, s.password...) - - if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if buf[1] != 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") - } - } - - buf = buf[:0] - buf = append(buf, socks5Version, socks5Connect, 0 /* reserved */) - - if ip := net.ParseIP(host); ip != nil { - if ip4 := ip.To4(); ip4 != nil { - buf = append(buf, socks5IP4) - ip = ip4 - } else { - buf = append(buf, socks5IP6) - } - buf = append(buf, ip...) - } else { - if len(host) > 255 { - return nil, errors.New("proxy: destination hostname too long: " + host) - } - buf = append(buf, socks5Domain) - buf = append(buf, byte(len(host))) - buf = append(buf, host...) - } - buf = append(buf, byte(port>>8), byte(port)) - - if _, err := conn.Write(buf); err != nil { - return nil, errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:4]); err != nil { - return nil, errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - failure := "unknown error" - if int(buf[1]) < len(socks5Errors) { - failure = socks5Errors[buf[1]] - } - - if len(failure) > 0 { - return nil, errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) - } - - bytesToDiscard := 0 - switch buf[3] { - case socks5IP4: - bytesToDiscard = net.IPv4len - case socks5IP6: - bytesToDiscard = net.IPv6len - case socks5Domain: - _, err := io.ReadFull(conn, buf[:1]) - if err != nil { - return nil, errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - bytesToDiscard = int(buf[0]) - default: - return nil, errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) - } - - if cap(buf) < bytesToDiscard { - buf = make([]byte, bytesToDiscard) - } else { - buf = buf[:bytesToDiscard] - } - if _, err := io.ReadFull(conn, buf); err != nil { - return nil, errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - // Also need to discard the port number - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return nil, errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - closeConn = nil - return conn, nil -} diff --git a/vendor/golang.org/x/net/publicsuffix/gen.go b/vendor/golang.org/x/net/publicsuffix/gen.go deleted file mode 100644 index ee2598c3..00000000 --- a/vendor/golang.org/x/net/publicsuffix/gen.go +++ /dev/null @@ -1,608 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -package main - -// This program generates table.go and table_test.go. -// Invoke as: -// -// go run gen.go -version "xxx" >table.go -// go run gen.go -version "xxx" -test >table_test.go -// -// The version is derived from information found at -// https://github.com/publicsuffix/list/commits/master/public_suffix_list.dat -// -// To fetch a particular git revision, such as 5c70ccd250, pass -// -url "https://raw.githubusercontent.com/publicsuffix/list/5c70ccd250/public_suffix_list.dat" - -import ( - "bufio" - "bytes" - "flag" - "fmt" - "go/format" - "io" - "net/http" - "os" - "regexp" - "sort" - "strings" - - "golang.org/x/net/idna" -) - -const ( - nodesBitsChildren = 9 - nodesBitsICANN = 1 - nodesBitsTextOffset = 15 - nodesBitsTextLength = 6 - - childrenBitsWildcard = 1 - childrenBitsNodeType = 2 - childrenBitsHi = 14 - childrenBitsLo = 14 -) - -var ( - maxChildren int - maxTextOffset int - maxTextLength int - maxHi uint32 - maxLo uint32 -) - -func max(a, b int) int { - if a < b { - return b - } - return a -} - -func u32max(a, b uint32) uint32 { - if a < b { - return b - } - return a -} - -const ( - nodeTypeNormal = 0 - nodeTypeException = 1 - nodeTypeParentOnly = 2 - numNodeType = 3 -) - -func nodeTypeStr(n int) string { - switch n { - case nodeTypeNormal: - return "+" - case nodeTypeException: - return "!" - case nodeTypeParentOnly: - return "o" - } - panic("unreachable") -} - -var ( - labelEncoding = map[string]uint32{} - labelsList = []string{} - labelsMap = map[string]bool{} - rules = []string{} - - // validSuffix is used to check that the entries in the public suffix list - // are in canonical form (after Punycode encoding). Specifically, capital - // letters are not allowed. - validSuffix = regexp.MustCompile(`^[a-z0-9_\!\*\-\.]+$`) - - crush = flag.Bool("crush", true, "make the generated node text as small as possible") - subset = flag.Bool("subset", false, "generate only a subset of the full table, for debugging") - url = flag.String("url", - "https://publicsuffix.org/list/effective_tld_names.dat", - "URL of the publicsuffix.org list. If empty, stdin is read instead") - v = flag.Bool("v", false, "verbose output (to stderr)") - version = flag.String("version", "", "the effective_tld_names.dat version") - test = flag.Bool("test", false, "generate table_test.go") -) - -func main() { - if err := main1(); err != nil { - fmt.Fprintln(os.Stderr, err) - os.Exit(1) - } -} - -func main1() error { - flag.Parse() - if nodesBitsTextLength+nodesBitsTextOffset+nodesBitsICANN+nodesBitsChildren > 32 { - return fmt.Errorf("not enough bits to encode the nodes table") - } - if childrenBitsLo+childrenBitsHi+childrenBitsNodeType+childrenBitsWildcard > 32 { - return fmt.Errorf("not enough bits to encode the children table") - } - if *version == "" { - return fmt.Errorf("-version was not specified") - } - var r io.Reader = os.Stdin - if *url != "" { - res, err := http.Get(*url) - if err != nil { - return err - } - if res.StatusCode != http.StatusOK { - return fmt.Errorf("bad GET status for %s: %d", *url, res.Status) - } - r = res.Body - defer res.Body.Close() - } - - var root node - icann := false - buf := new(bytes.Buffer) - br := bufio.NewReader(r) - for { - s, err := br.ReadString('\n') - if err != nil { - if err == io.EOF { - break - } - return err - } - s = strings.TrimSpace(s) - if strings.Contains(s, "BEGIN ICANN DOMAINS") { - icann = true - continue - } - if strings.Contains(s, "END ICANN DOMAINS") { - icann = false - continue - } - if s == "" || strings.HasPrefix(s, "//") { - continue - } - s, err = idna.ToASCII(s) - if err != nil { - return err - } - if !validSuffix.MatchString(s) { - return fmt.Errorf("bad publicsuffix.org list data: %q", s) - } - - if *subset { - switch { - case s == "ac.jp" || strings.HasSuffix(s, ".ac.jp"): - case s == "ak.us" || strings.HasSuffix(s, ".ak.us"): - case s == "ao" || strings.HasSuffix(s, ".ao"): - case s == "ar" || strings.HasSuffix(s, ".ar"): - case s == "arpa" || strings.HasSuffix(s, ".arpa"): - case s == "cy" || strings.HasSuffix(s, ".cy"): - case s == "dyndns.org" || strings.HasSuffix(s, ".dyndns.org"): - case s == "jp": - case s == "kobe.jp" || strings.HasSuffix(s, ".kobe.jp"): - case s == "kyoto.jp" || strings.HasSuffix(s, ".kyoto.jp"): - case s == "om" || strings.HasSuffix(s, ".om"): - case s == "uk" || strings.HasSuffix(s, ".uk"): - case s == "uk.com" || strings.HasSuffix(s, ".uk.com"): - case s == "tw" || strings.HasSuffix(s, ".tw"): - case s == "zw" || strings.HasSuffix(s, ".zw"): - case s == "xn--p1ai" || strings.HasSuffix(s, ".xn--p1ai"): - // xn--p1ai is Russian-Cyrillic "рф". - default: - continue - } - } - - rules = append(rules, s) - - nt, wildcard := nodeTypeNormal, false - switch { - case strings.HasPrefix(s, "*."): - s, nt = s[2:], nodeTypeParentOnly - wildcard = true - case strings.HasPrefix(s, "!"): - s, nt = s[1:], nodeTypeException - } - labels := strings.Split(s, ".") - for n, i := &root, len(labels)-1; i >= 0; i-- { - label := labels[i] - n = n.child(label) - if i == 0 { - if nt != nodeTypeParentOnly && n.nodeType == nodeTypeParentOnly { - n.nodeType = nt - } - n.icann = n.icann && icann - n.wildcard = n.wildcard || wildcard - } - labelsMap[label] = true - } - } - labelsList = make([]string, 0, len(labelsMap)) - for label := range labelsMap { - labelsList = append(labelsList, label) - } - sort.Strings(labelsList) - - p := printReal - if *test { - p = printTest - } - if err := p(buf, &root); err != nil { - return err - } - - b, err := format.Source(buf.Bytes()) - if err != nil { - return err - } - _, err = os.Stdout.Write(b) - return err -} - -func printTest(w io.Writer, n *node) error { - fmt.Fprintf(w, "// generated by go run gen.go; DO NOT EDIT\n\n") - fmt.Fprintf(w, "package publicsuffix\n\nvar rules = [...]string{\n") - for _, rule := range rules { - fmt.Fprintf(w, "%q,\n", rule) - } - fmt.Fprintf(w, "}\n\nvar nodeLabels = [...]string{\n") - if err := n.walk(w, printNodeLabel); err != nil { - return err - } - fmt.Fprintf(w, "}\n") - return nil -} - -func printReal(w io.Writer, n *node) error { - const header = `// generated by go run gen.go; DO NOT EDIT - -package publicsuffix - -const version = %q - -const ( - nodesBitsChildren = %d - nodesBitsICANN = %d - nodesBitsTextOffset = %d - nodesBitsTextLength = %d - - childrenBitsWildcard = %d - childrenBitsNodeType = %d - childrenBitsHi = %d - childrenBitsLo = %d -) - -const ( - nodeTypeNormal = %d - nodeTypeException = %d - nodeTypeParentOnly = %d -) - -// numTLD is the number of top level domains. -const numTLD = %d - -` - fmt.Fprintf(w, header, *version, - nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength, - childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo, - nodeTypeNormal, nodeTypeException, nodeTypeParentOnly, len(n.children)) - - text := makeText() - if text == "" { - return fmt.Errorf("internal error: makeText returned no text") - } - for _, label := range labelsList { - offset, length := strings.Index(text, label), len(label) - if offset < 0 { - return fmt.Errorf("internal error: could not find %q in text %q", label, text) - } - maxTextOffset, maxTextLength = max(maxTextOffset, offset), max(maxTextLength, length) - if offset >= 1<<nodesBitsTextOffset || length >= 1<<nodesBitsTextLength { - return fmt.Errorf("text offset/length is too large: %d/%d", offset, length) - } - labelEncoding[label] = uint32(offset)<<nodesBitsTextLength | uint32(length) - } - fmt.Fprintf(w, "// Text is the combined text of all labels.\nconst text = ") - for len(text) > 0 { - n, plus := len(text), "" - if n > 64 { - n, plus = 64, " +" - } - fmt.Fprintf(w, "%q%s\n", text[:n], plus) - text = text[n:] - } - - n.walk(w, assignIndexes) - - fmt.Fprintf(w, ` - -// nodes is the list of nodes. Each node is represented as a uint32, which -// encodes the node's children, wildcard bit and node type (as an index into -// the children array), ICANN bit and text. -// -// In the //-comment after each node's data, the nodes indexes of the children -// are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The -// nodeType is printed as + for normal, ! for exception, and o for parent-only -// nodes that have children but don't match a domain label in their own right. -// An I denotes an ICANN domain. -// -// The layout within the uint32, from MSB to LSB, is: -// [%2d bits] unused -// [%2d bits] children index -// [%2d bits] ICANN bit -// [%2d bits] text index -// [%2d bits] text length -var nodes = [...]uint32{ -`, - 32-nodesBitsChildren-nodesBitsICANN-nodesBitsTextOffset-nodesBitsTextLength, - nodesBitsChildren, nodesBitsICANN, nodesBitsTextOffset, nodesBitsTextLength) - if err := n.walk(w, printNode); err != nil { - return err - } - fmt.Fprintf(w, `} - -// children is the list of nodes' children, the parent's wildcard bit and the -// parent's node type. If a node has no children then their children index -// will be in the range [0, 6), depending on the wildcard bit and node type. -// -// The layout within the uint32, from MSB to LSB, is: -// [%2d bits] unused -// [%2d bits] wildcard bit -// [%2d bits] node type -// [%2d bits] high nodes index (exclusive) of children -// [%2d bits] low nodes index (inclusive) of children -var children=[...]uint32{ -`, - 32-childrenBitsWildcard-childrenBitsNodeType-childrenBitsHi-childrenBitsLo, - childrenBitsWildcard, childrenBitsNodeType, childrenBitsHi, childrenBitsLo) - for i, c := range childrenEncoding { - s := "---------------" - lo := c & (1<<childrenBitsLo - 1) - hi := (c >> childrenBitsLo) & (1<<childrenBitsHi - 1) - if lo != hi { - s = fmt.Sprintf("n0x%04x-n0x%04x", lo, hi) - } - nodeType := int(c>>(childrenBitsLo+childrenBitsHi)) & (1<<childrenBitsNodeType - 1) - wildcard := c>>(childrenBitsLo+childrenBitsHi+childrenBitsNodeType) != 0 - fmt.Fprintf(w, "0x%08x, // c0x%04x (%s)%s %s\n", - c, i, s, wildcardStr(wildcard), nodeTypeStr(nodeType)) - } - fmt.Fprintf(w, "}\n\n") - fmt.Fprintf(w, "// max children %d (capacity %d)\n", maxChildren, 1<<nodesBitsChildren-1) - fmt.Fprintf(w, "// max text offset %d (capacity %d)\n", maxTextOffset, 1<<nodesBitsTextOffset-1) - fmt.Fprintf(w, "// max text length %d (capacity %d)\n", maxTextLength, 1<<nodesBitsTextLength-1) - fmt.Fprintf(w, "// max hi %d (capacity %d)\n", maxHi, 1<<childrenBitsHi-1) - fmt.Fprintf(w, "// max lo %d (capacity %d)\n", maxLo, 1<<childrenBitsLo-1) - return nil -} - -type node struct { - label string - nodeType int - icann bool - wildcard bool - // nodesIndex and childrenIndex are the index of this node in the nodes - // and the index of its children offset/length in the children arrays. - nodesIndex, childrenIndex int - // firstChild is the index of this node's first child, or zero if this - // node has no children. - firstChild int - // children are the node's children, in strictly increasing node label order. - children []*node -} - -func (n *node) walk(w io.Writer, f func(w1 io.Writer, n1 *node) error) error { - if err := f(w, n); err != nil { - return err - } - for _, c := range n.children { - if err := c.walk(w, f); err != nil { - return err - } - } - return nil -} - -// child returns the child of n with the given label. The child is created if -// it did not exist beforehand. -func (n *node) child(label string) *node { - for _, c := range n.children { - if c.label == label { - return c - } - } - c := &node{ - label: label, - nodeType: nodeTypeParentOnly, - icann: true, - } - n.children = append(n.children, c) - sort.Sort(byLabel(n.children)) - return c -} - -type byLabel []*node - -func (b byLabel) Len() int { return len(b) } -func (b byLabel) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byLabel) Less(i, j int) bool { return b[i].label < b[j].label } - -var nextNodesIndex int - -// childrenEncoding are the encoded entries in the generated children array. -// All these pre-defined entries have no children. -var childrenEncoding = []uint32{ - 0 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeNormal. - 1 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeException. - 2 << (childrenBitsLo + childrenBitsHi), // Without wildcard bit, nodeTypeParentOnly. - 4 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeNormal. - 5 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeException. - 6 << (childrenBitsLo + childrenBitsHi), // With wildcard bit, nodeTypeParentOnly. -} - -var firstCallToAssignIndexes = true - -func assignIndexes(w io.Writer, n *node) error { - if len(n.children) != 0 { - // Assign nodesIndex. - n.firstChild = nextNodesIndex - for _, c := range n.children { - c.nodesIndex = nextNodesIndex - nextNodesIndex++ - } - - // The root node's children is implicit. - if firstCallToAssignIndexes { - firstCallToAssignIndexes = false - return nil - } - - // Assign childrenIndex. - maxChildren = max(maxChildren, len(childrenEncoding)) - if len(childrenEncoding) >= 1<<nodesBitsChildren { - return fmt.Errorf("children table is too large") - } - n.childrenIndex = len(childrenEncoding) - lo := uint32(n.firstChild) - hi := lo + uint32(len(n.children)) - maxLo, maxHi = u32max(maxLo, lo), u32max(maxHi, hi) - if lo >= 1<<childrenBitsLo || hi >= 1<<childrenBitsHi { - return fmt.Errorf("children lo/hi is too large: %d/%d", lo, hi) - } - enc := hi<<childrenBitsLo | lo - enc |= uint32(n.nodeType) << (childrenBitsLo + childrenBitsHi) - if n.wildcard { - enc |= 1 << (childrenBitsLo + childrenBitsHi + childrenBitsNodeType) - } - childrenEncoding = append(childrenEncoding, enc) - } else { - n.childrenIndex = n.nodeType - if n.wildcard { - n.childrenIndex += numNodeType - } - } - return nil -} - -func printNode(w io.Writer, n *node) error { - for _, c := range n.children { - s := "---------------" - if len(c.children) != 0 { - s = fmt.Sprintf("n0x%04x-n0x%04x", c.firstChild, c.firstChild+len(c.children)) - } - encoding := labelEncoding[c.label] - if c.icann { - encoding |= 1 << (nodesBitsTextLength + nodesBitsTextOffset) - } - encoding |= uint32(c.childrenIndex) << (nodesBitsTextLength + nodesBitsTextOffset + nodesBitsICANN) - fmt.Fprintf(w, "0x%08x, // n0x%04x c0x%04x (%s)%s %s %s %s\n", - encoding, c.nodesIndex, c.childrenIndex, s, wildcardStr(c.wildcard), - nodeTypeStr(c.nodeType), icannStr(c.icann), c.label, - ) - } - return nil -} - -func printNodeLabel(w io.Writer, n *node) error { - for _, c := range n.children { - fmt.Fprintf(w, "%q,\n", c.label) - } - return nil -} - -func icannStr(icann bool) string { - if icann { - return "I" - } - return " " -} - -func wildcardStr(wildcard bool) string { - if wildcard { - return "*" - } - return " " -} - -// makeText combines all the strings in labelsList to form one giant string. -// If the crush flag is true, then overlapping strings will be merged: "arpa" -// and "parliament" could yield "arparliament". -func makeText() string { - if !*crush { - return strings.Join(labelsList, "") - } - - beforeLength := 0 - for _, s := range labelsList { - beforeLength += len(s) - } - - // Make a copy of labelsList. - ss := append(make([]string, 0, len(labelsList)), labelsList...) - - // Remove strings that are substrings of other strings. - for changed := true; changed; { - changed = false - for i, s := range ss { - if s == "" { - continue - } - for j, t := range ss { - if i != j && t != "" && strings.Contains(s, t) { - changed = true - ss[j] = "" - } - } - } - } - - // Remove the empty strings. - sort.Strings(ss) - for len(ss) > 0 && ss[0] == "" { - ss = ss[1:] - } - - // Join strings where one suffix matches another prefix. - for { - // Find best i, j, k such that ss[i][len-k:] == ss[j][:k], - // maximizing overlap length k. - besti := -1 - bestj := -1 - bestk := 0 - for i, s := range ss { - if s == "" { - continue - } - for j, t := range ss { - if i == j { - continue - } - for k := bestk + 1; k <= len(s) && k <= len(t); k++ { - if s[len(s)-k:] == t[:k] { - besti = i - bestj = j - bestk = k - } - } - } - } - if bestk > 0 { - if *v { - fmt.Fprintf(os.Stderr, "%d-length overlap at (%4d,%4d) out of (%4d,%4d): %q and %q\n", - bestk, besti, bestj, len(ss), len(ss), ss[besti], ss[bestj]) - } - ss[besti] += ss[bestj][bestk:] - ss[bestj] = "" - continue - } - break - } - - text := strings.Join(ss, "") - if *v { - fmt.Fprintf(os.Stderr, "crushed %d bytes to become %d bytes\n", beforeLength, len(text)) - } - return text -} diff --git a/vendor/golang.org/x/net/publicsuffix/list.go b/vendor/golang.org/x/net/publicsuffix/list.go deleted file mode 100644 index 9419ca99..00000000 --- a/vendor/golang.org/x/net/publicsuffix/list.go +++ /dev/null @@ -1,133 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package publicsuffix provides a public suffix list based on data from -// http://publicsuffix.org/. A public suffix is one under which Internet users -// can directly register names. -package publicsuffix // import "golang.org/x/net/publicsuffix" - -// TODO: specify case sensitivity and leading/trailing dot behavior for -// func PublicSuffix and func EffectiveTLDPlusOne. - -import ( - "fmt" - "net/http/cookiejar" - "strings" -) - -// List implements the cookiejar.PublicSuffixList interface by calling the -// PublicSuffix function. -var List cookiejar.PublicSuffixList = list{} - -type list struct{} - -func (list) PublicSuffix(domain string) string { - ps, _ := PublicSuffix(domain) - return ps -} - -func (list) String() string { - return version -} - -// PublicSuffix returns the public suffix of the domain using a copy of the -// publicsuffix.org database compiled into the library. -// -// icann is whether the public suffix is managed by the Internet Corporation -// for Assigned Names and Numbers. If not, the public suffix is privately -// managed. For example, foo.org and foo.co.uk are ICANN domains, -// foo.dyndns.org and foo.blogspot.co.uk are private domains. -// -// Use cases for distinguishing ICANN domains like foo.com from private -// domains like foo.appspot.com can be found at -// https://wiki.mozilla.org/Public_Suffix_List/Use_Cases -func PublicSuffix(domain string) (publicSuffix string, icann bool) { - lo, hi := uint32(0), uint32(numTLD) - s, suffix, wildcard := domain, len(domain), false -loop: - for { - dot := strings.LastIndex(s, ".") - if wildcard { - suffix = 1 + dot - } - if lo == hi { - break - } - f := find(s[1+dot:], lo, hi) - if f == notFound { - break - } - - u := nodes[f] >> (nodesBitsTextOffset + nodesBitsTextLength) - icann = u&(1<<nodesBitsICANN-1) != 0 - u >>= nodesBitsICANN - u = children[u&(1<<nodesBitsChildren-1)] - lo = u & (1<<childrenBitsLo - 1) - u >>= childrenBitsLo - hi = u & (1<<childrenBitsHi - 1) - u >>= childrenBitsHi - switch u & (1<<childrenBitsNodeType - 1) { - case nodeTypeNormal: - suffix = 1 + dot - case nodeTypeException: - suffix = 1 + len(s) - break loop - } - u >>= childrenBitsNodeType - wildcard = u&(1<<childrenBitsWildcard-1) != 0 - - if dot == -1 { - break - } - s = s[:dot] - } - if suffix == len(domain) { - // If no rules match, the prevailing rule is "*". - return domain[1+strings.LastIndex(domain, "."):], icann - } - return domain[suffix:], icann -} - -const notFound uint32 = 1<<32 - 1 - -// find returns the index of the node in the range [lo, hi) whose label equals -// label, or notFound if there is no such node. The range is assumed to be in -// strictly increasing node label order. -func find(label string, lo, hi uint32) uint32 { - for lo < hi { - mid := lo + (hi-lo)/2 - s := nodeLabel(mid) - if s < label { - lo = mid + 1 - } else if s == label { - return mid - } else { - hi = mid - } - } - return notFound -} - -// nodeLabel returns the label for the i'th node. -func nodeLabel(i uint32) string { - x := nodes[i] - length := x & (1<<nodesBitsTextLength - 1) - x >>= nodesBitsTextLength - offset := x & (1<<nodesBitsTextOffset - 1) - return text[offset : offset+length] -} - -// EffectiveTLDPlusOne returns the effective top level domain plus one more -// label. For example, the eTLD+1 for "foo.bar.golang.org" is "golang.org". -func EffectiveTLDPlusOne(domain string) (string, error) { - suffix, _ := PublicSuffix(domain) - if len(domain) <= len(suffix) { - return "", fmt.Errorf("publicsuffix: cannot derive eTLD+1 for domain %q", domain) - } - i := len(domain) - len(suffix) - 1 - if domain[i] != '.' { - return "", fmt.Errorf("publicsuffix: invalid public suffix %q for domain %q", suffix, domain) - } - return domain[1+strings.LastIndex(domain[:i], "."):], nil -} diff --git a/vendor/golang.org/x/net/publicsuffix/list_test.go b/vendor/golang.org/x/net/publicsuffix/list_test.go deleted file mode 100644 index f231de4c..00000000 --- a/vendor/golang.org/x/net/publicsuffix/list_test.go +++ /dev/null @@ -1,416 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package publicsuffix - -import ( - "sort" - "strings" - "testing" -) - -func TestNodeLabel(t *testing.T) { - for i, want := range nodeLabels { - got := nodeLabel(uint32(i)) - if got != want { - t.Errorf("%d: got %q, want %q", i, got, want) - } - } -} - -func TestFind(t *testing.T) { - testCases := []string{ - "", - "a", - "a0", - "aaaa", - "ao", - "ap", - "ar", - "aro", - "arp", - "arpa", - "arpaa", - "arpb", - "az", - "b", - "b0", - "ba", - "z", - "zu", - "zv", - "zw", - "zx", - "zy", - "zz", - "zzzz", - } - for _, tc := range testCases { - got := find(tc, 0, numTLD) - want := notFound - for i := uint32(0); i < numTLD; i++ { - if tc == nodeLabel(i) { - want = i - break - } - } - if got != want { - t.Errorf("%q: got %d, want %d", tc, got, want) - } - } -} - -func TestICANN(t *testing.T) { - testCases := map[string]bool{ - "foo.org": true, - "foo.co.uk": true, - "foo.dyndns.org": false, - "foo.go.dyndns.org": false, - "foo.blogspot.co.uk": false, - "foo.intranet": false, - } - for domain, want := range testCases { - _, got := PublicSuffix(domain) - if got != want { - t.Errorf("%q: got %v, want %v", domain, got, want) - } - } -} - -var publicSuffixTestCases = []struct { - domain, want string -}{ - // Empty string. - {"", ""}, - - // The .ao rules are: - // ao - // ed.ao - // gv.ao - // og.ao - // co.ao - // pb.ao - // it.ao - {"ao", "ao"}, - {"www.ao", "ao"}, - {"pb.ao", "pb.ao"}, - {"www.pb.ao", "pb.ao"}, - {"www.xxx.yyy.zzz.pb.ao", "pb.ao"}, - - // The .ar rules are: - // ar - // com.ar - // edu.ar - // gob.ar - // gov.ar - // int.ar - // mil.ar - // net.ar - // org.ar - // tur.ar - // blogspot.com.ar - {"ar", "ar"}, - {"www.ar", "ar"}, - {"nic.ar", "ar"}, - {"www.nic.ar", "ar"}, - {"com.ar", "com.ar"}, - {"www.com.ar", "com.ar"}, - {"blogspot.com.ar", "blogspot.com.ar"}, - {"www.blogspot.com.ar", "blogspot.com.ar"}, - {"www.xxx.yyy.zzz.blogspot.com.ar", "blogspot.com.ar"}, - {"logspot.com.ar", "com.ar"}, - {"zlogspot.com.ar", "com.ar"}, - {"zblogspot.com.ar", "com.ar"}, - - // The .arpa rules are: - // arpa - // e164.arpa - // in-addr.arpa - // ip6.arpa - // iris.arpa - // uri.arpa - // urn.arpa - {"arpa", "arpa"}, - {"www.arpa", "arpa"}, - {"urn.arpa", "urn.arpa"}, - {"www.urn.arpa", "urn.arpa"}, - {"www.xxx.yyy.zzz.urn.arpa", "urn.arpa"}, - - // The relevant {kobe,kyoto}.jp rules are: - // jp - // *.kobe.jp - // !city.kobe.jp - // kyoto.jp - // ide.kyoto.jp - {"jp", "jp"}, - {"kobe.jp", "jp"}, - {"c.kobe.jp", "c.kobe.jp"}, - {"b.c.kobe.jp", "c.kobe.jp"}, - {"a.b.c.kobe.jp", "c.kobe.jp"}, - {"city.kobe.jp", "kobe.jp"}, - {"www.city.kobe.jp", "kobe.jp"}, - {"kyoto.jp", "kyoto.jp"}, - {"test.kyoto.jp", "kyoto.jp"}, - {"ide.kyoto.jp", "ide.kyoto.jp"}, - {"b.ide.kyoto.jp", "ide.kyoto.jp"}, - {"a.b.ide.kyoto.jp", "ide.kyoto.jp"}, - - // The .tw rules are: - // tw - // edu.tw - // gov.tw - // mil.tw - // com.tw - // net.tw - // org.tw - // idv.tw - // game.tw - // ebiz.tw - // club.tw - // 網路.tw (xn--zf0ao64a.tw) - // 組織.tw (xn--uc0atv.tw) - // 商業.tw (xn--czrw28b.tw) - // blogspot.tw - {"tw", "tw"}, - {"aaa.tw", "tw"}, - {"www.aaa.tw", "tw"}, - {"xn--czrw28b.aaa.tw", "tw"}, - {"edu.tw", "edu.tw"}, - {"www.edu.tw", "edu.tw"}, - {"xn--czrw28b.edu.tw", "edu.tw"}, - {"xn--czrw28b.tw", "xn--czrw28b.tw"}, - {"www.xn--czrw28b.tw", "xn--czrw28b.tw"}, - {"xn--uc0atv.xn--czrw28b.tw", "xn--czrw28b.tw"}, - {"xn--kpry57d.tw", "tw"}, - - // The .uk rules are: - // uk - // ac.uk - // co.uk - // gov.uk - // ltd.uk - // me.uk - // net.uk - // nhs.uk - // org.uk - // plc.uk - // police.uk - // *.sch.uk - // blogspot.co.uk - {"uk", "uk"}, - {"aaa.uk", "uk"}, - {"www.aaa.uk", "uk"}, - {"mod.uk", "uk"}, - {"www.mod.uk", "uk"}, - {"sch.uk", "uk"}, - {"mod.sch.uk", "mod.sch.uk"}, - {"www.sch.uk", "www.sch.uk"}, - {"blogspot.co.uk", "blogspot.co.uk"}, - {"blogspot.nic.uk", "uk"}, - {"blogspot.sch.uk", "blogspot.sch.uk"}, - - // The .рф rules are - // рф (xn--p1ai) - {"xn--p1ai", "xn--p1ai"}, - {"aaa.xn--p1ai", "xn--p1ai"}, - {"www.xxx.yyy.xn--p1ai", "xn--p1ai"}, - - // The .zw rules are: - // *.zw - {"zw", "zw"}, - {"www.zw", "www.zw"}, - {"zzz.zw", "zzz.zw"}, - {"www.zzz.zw", "zzz.zw"}, - {"www.xxx.yyy.zzz.zw", "zzz.zw"}, - - // There are no .nosuchtld rules. - {"nosuchtld", "nosuchtld"}, - {"foo.nosuchtld", "nosuchtld"}, - {"bar.foo.nosuchtld", "nosuchtld"}, -} - -func BenchmarkPublicSuffix(b *testing.B) { - for i := 0; i < b.N; i++ { - for _, tc := range publicSuffixTestCases { - List.PublicSuffix(tc.domain) - } - } -} - -func TestPublicSuffix(t *testing.T) { - for _, tc := range publicSuffixTestCases { - got := List.PublicSuffix(tc.domain) - if got != tc.want { - t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) - } - } -} - -func TestSlowPublicSuffix(t *testing.T) { - for _, tc := range publicSuffixTestCases { - got := slowPublicSuffix(tc.domain) - if got != tc.want { - t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) - } - } -} - -// slowPublicSuffix implements the canonical (but O(number of rules)) public -// suffix algorithm described at http://publicsuffix.org/list/. -// -// 1. Match domain against all rules and take note of the matching ones. -// 2. If no rules match, the prevailing rule is "*". -// 3. If more than one rule matches, the prevailing rule is the one which is an exception rule. -// 4. If there is no matching exception rule, the prevailing rule is the one with the most labels. -// 5. If the prevailing rule is a exception rule, modify it by removing the leftmost label. -// 6. The public suffix is the set of labels from the domain which directly match the labels of the prevailing rule (joined by dots). -// 7. The registered or registrable domain is the public suffix plus one additional label. -// -// This function returns the public suffix, not the registrable domain, and so -// it stops after step 6. -func slowPublicSuffix(domain string) string { - match := func(rulePart, domainPart string) bool { - switch rulePart[0] { - case '*': - return true - case '!': - return rulePart[1:] == domainPart - } - return rulePart == domainPart - } - - domainParts := strings.Split(domain, ".") - var matchingRules [][]string - -loop: - for _, rule := range rules { - ruleParts := strings.Split(rule, ".") - if len(domainParts) < len(ruleParts) { - continue - } - for i := range ruleParts { - rulePart := ruleParts[len(ruleParts)-1-i] - domainPart := domainParts[len(domainParts)-1-i] - if !match(rulePart, domainPart) { - continue loop - } - } - matchingRules = append(matchingRules, ruleParts) - } - if len(matchingRules) == 0 { - matchingRules = append(matchingRules, []string{"*"}) - } else { - sort.Sort(byPriority(matchingRules)) - } - prevailing := matchingRules[0] - if prevailing[0][0] == '!' { - prevailing = prevailing[1:] - } - if prevailing[0][0] == '*' { - replaced := domainParts[len(domainParts)-len(prevailing)] - prevailing = append([]string{replaced}, prevailing[1:]...) - } - return strings.Join(prevailing, ".") -} - -type byPriority [][]string - -func (b byPriority) Len() int { return len(b) } -func (b byPriority) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byPriority) Less(i, j int) bool { - if b[i][0][0] == '!' { - return true - } - if b[j][0][0] == '!' { - return false - } - return len(b[i]) > len(b[j]) -} - -// eTLDPlusOneTestCases come from -// https://github.com/publicsuffix/list/blob/master/tests/test_psl.txt -var eTLDPlusOneTestCases = []struct { - domain, want string -}{ - // Empty input. - {"", ""}, - // Unlisted TLD. - {"example", ""}, - {"example.example", "example.example"}, - {"b.example.example", "example.example"}, - {"a.b.example.example", "example.example"}, - // TLD with only 1 rule. - {"biz", ""}, - {"domain.biz", "domain.biz"}, - {"b.domain.biz", "domain.biz"}, - {"a.b.domain.biz", "domain.biz"}, - // TLD with some 2-level rules. - {"com", ""}, - {"example.com", "example.com"}, - {"b.example.com", "example.com"}, - {"a.b.example.com", "example.com"}, - {"uk.com", ""}, - {"example.uk.com", "example.uk.com"}, - {"b.example.uk.com", "example.uk.com"}, - {"a.b.example.uk.com", "example.uk.com"}, - {"test.ac", "test.ac"}, - // TLD with only 1 (wildcard) rule. - {"il", ""}, - {"c.il", ""}, - {"b.c.il", "b.c.il"}, - {"a.b.c.il", "b.c.il"}, - // More complex TLD. - {"jp", ""}, - {"test.jp", "test.jp"}, - {"www.test.jp", "test.jp"}, - {"ac.jp", ""}, - {"test.ac.jp", "test.ac.jp"}, - {"www.test.ac.jp", "test.ac.jp"}, - {"kyoto.jp", ""}, - {"test.kyoto.jp", "test.kyoto.jp"}, - {"ide.kyoto.jp", ""}, - {"b.ide.kyoto.jp", "b.ide.kyoto.jp"}, - {"a.b.ide.kyoto.jp", "b.ide.kyoto.jp"}, - {"c.kobe.jp", ""}, - {"b.c.kobe.jp", "b.c.kobe.jp"}, - {"a.b.c.kobe.jp", "b.c.kobe.jp"}, - {"city.kobe.jp", "city.kobe.jp"}, - {"www.city.kobe.jp", "city.kobe.jp"}, - // TLD with a wildcard rule and exceptions. - {"ck", ""}, - {"test.ck", ""}, - {"b.test.ck", "b.test.ck"}, - {"a.b.test.ck", "b.test.ck"}, - {"www.ck", "www.ck"}, - {"www.www.ck", "www.ck"}, - // US K12. - {"us", ""}, - {"test.us", "test.us"}, - {"www.test.us", "test.us"}, - {"ak.us", ""}, - {"test.ak.us", "test.ak.us"}, - {"www.test.ak.us", "test.ak.us"}, - {"k12.ak.us", ""}, - {"test.k12.ak.us", "test.k12.ak.us"}, - {"www.test.k12.ak.us", "test.k12.ak.us"}, - // Punycoded IDN labels - {"xn--85x722f.com.cn", "xn--85x722f.com.cn"}, - {"xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, - {"www.xn--85x722f.xn--55qx5d.cn", "xn--85x722f.xn--55qx5d.cn"}, - {"shishi.xn--55qx5d.cn", "shishi.xn--55qx5d.cn"}, - {"xn--55qx5d.cn", ""}, - {"xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, - {"www.xn--85x722f.xn--fiqs8s", "xn--85x722f.xn--fiqs8s"}, - {"shishi.xn--fiqs8s", "shishi.xn--fiqs8s"}, - {"xn--fiqs8s", ""}, -} - -func TestEffectiveTLDPlusOne(t *testing.T) { - for _, tc := range eTLDPlusOneTestCases { - got, _ := EffectiveTLDPlusOne(tc.domain) - if got != tc.want { - t.Errorf("%q: got %q, want %q", tc.domain, got, tc.want) - } - } -} diff --git a/vendor/golang.org/x/net/publicsuffix/table.go b/vendor/golang.org/x/net/publicsuffix/table.go deleted file mode 100644 index 9b8c7212..00000000 --- a/vendor/golang.org/x/net/publicsuffix/table.go +++ /dev/null @@ -1,8492 +0,0 @@ -// generated by go run gen.go; DO NOT EDIT - -package publicsuffix - -const version = "publicsuffix.org's public_suffix_list.dat, git revision 0de6f8e (2015-07-15)" - -const ( - nodesBitsChildren = 9 - nodesBitsICANN = 1 - nodesBitsTextOffset = 15 - nodesBitsTextLength = 6 - - childrenBitsWildcard = 1 - childrenBitsNodeType = 2 - childrenBitsHi = 14 - childrenBitsLo = 14 -) - -const ( - nodeTypeNormal = 0 - nodeTypeException = 1 - nodeTypeParentOnly = 2 -) - -// numTLD is the number of top level domains. -const numTLD = 1337 - -// Text is the combined text of all labels. -const text = "biomutashinainfoggiabirdartdecodynaliascoli-picenord-frontierbir" + - "kenesoddtangenovaravennagatorockartuzyunsakakinokiabirthplacevje" + - "-og-hornnesangostrodawarabjarkoyurihonjournalistjordalshalsenfsh" + - "ostre-totenkawabjerkreimmobilienhsanjotatsunostrolekaniepcexpose" + - "dogawarabikomaezakirunortonsbergminakamichigangwonikonantananger" + - "bjugninohelpaleostrowiecasertairabloombergbauernuorokunohealthca" + - "reerschmidtre-gauldalottokashikinuyamanouchikuhokuryugasakitaura" + - "yasudabluedatsunanjogaszkolahppiacenzachpomorskieninomiyakonojos" + - "oyrovnostrowwlkpmgmodalenirasakinvestmentsannanishiazais-a-candi" + - "datexasiabmsannohelsinkitakamiizumisanofieldyndns-freemasonryusu" + - "harabmweirbnpparibaselburgmxboxeroxjaworznobomloanswatch-and-clo" + - "ckerbondyndns-homednsanokasumigaurawa-mazowszexeterbonnishigotvs" + - "antabarbarabootsantacruzsantafedjelenia-goraboschlesischesanukis" + - "-a-catererbostikasuyakutiabostonakijinsekikogentingretajimakaneg" + - "asakitagawabotanicalgardenishiharabotanicgardenishiizunazukis-a-" + - "celticsfanishikatakayamatta-varjjatattoolsztynsettlersaotomelbou" + - "rnextraspace-to-rentalsapodhalebotanynysadoesntexistanbullensake" + - "rboutiquebecasinore-og-uvdalouvrepair-traffic-controlleyusuisser" + - "vegame-serverdalovenneslaskerrylogisticsapporobozentsujiiebrades" + - "corporationishikatsuragivingrimstadyndns-ip6brandywinevalleyuulm" + - "inamibosogndalowiczest-le-patrondheimperiabrasiljan-mayenishikaw" + - "azukaneyamaxunjargabresciabrindisiciliabristolgalsacebritishcolu" + - "mbialowiezagannakadomari-elasticbeanstalkaszubyuzawabroadcastleb" + - "timnetzgorabroadwayuzhno-sakhalinskatowicebroke-itaxihuanishimer" + - "abrokerrypropertiesaratovalleaostavropolicebronnoysundyndns-mail" + - "ubindalucaniabrothermesaverdealstahaugesundyndns-office-on-the-w" + - "ebcambridgestonewportlligatewaybrumunddaluccapetownishinomiyashi" + - "ronobrunelblagdenesnaaseralingenkainanaejrietiendaburyatiabrusse" + - "lsardegnamsosnowiecastresistancebruxellesardiniabryanskleppalerm" + - "omasvuotnakatsugawabryneuesarlucernebuyshousesarpsborgripebuzeni" + - "shinoomotegovtgorybuzzgorzeleccollegersundyndns-picsarufutsunomi" + - "yawakasaikaitakoelnishinoshimabwfarmequipmentjeldsundyndns-remot" + - "egildeskalmykiabzhitomirkutskodjeffersonishiokoppegardyndns-serv" + - "erbaniacntoyonezawacolognewjerseycolonialwilliamsburgrpanamacolo" + - "radoplateaudiocolumbusantiquest-a-la-masioncommunitydaluxembourg" + - "ruecomobaracompanycompute-1computerhistoryofscience-fictioncomse" + - "curitysfjordcondoshichikashukujitawaraconferenceconstructioncons" + - "uladollsatxn--0trq7p7nnconsultanthropologyconsultingvolluxurycon" + - "tactoyonocontemporaryartgallerybnikahokutogitsuldaluzerncontract" + - "orskenconventureshinodesashibetsuikindleikangercookingchannelver" + - "uminamiechizencoolbia-tempio-olbiatempioolbialystokkecoopocznori" + - "lskypescaravantaarparachutinguidellogliastradercopenhagencyclope" + - "dicdn77-sslattuminamidaitomangotsukisosakitagatakamoriokamikitay" + - "amatotakadacorsicamerakershus-east-1corvettelemarkazunocosenzako" + - "panerairguardcostumedio-campidano-mediocampidanomediocouncilviva" + - "no-frankivskchristiansburguitarsaudacouponsauheradcoursesavannah" + - "gacqhachinoheguris-a-democratoyookarasjohkamiokaminokawanishiaiz" + - "ubangecranbrookuwanalyticsaves-the-whalessandria-trani-barletta-" + - "andriatranibarlettaandriacreditcardcreditunioncremonashorokanaie" + - "crewiiheyaizuwakamatsubushikusakadogawacricketrzyncrimeacrotonew" + - "mexicoldwarmiamiastarnbergujolstercrowncrsavonamsskoganeis-a-des" + - "ignercruisesaxocuisinellancasterculturalcentertainmentoyosatomsk" + - "ddielddanuorrikuzentakatajirissafetysnesayokkaichirurgiens-denti" + - "stesbscholarshipschoolcuneocupcakecxn--11b4c3dcyouthdfcbankfhskh" + - "abarovskhakassiafinlandfinnoyfirebaseappspotenzamamicrolightingu" + - "nmaritimodellinguovdageaidnulsanfranciscotlandfirenzefirestonewy" + - "orkshireggio-calabriafirmdaleirfjordfishingoldpointelligencefitj" + - "arfitnessettlementoyotsukaidovre-eikerfjalerflesbergushikamifura" + - "noshiroomuraflickragerotikamchatkameokameyamashinatsukigatakahar" + - "ussiaflightschweizippodlasiellakasamatsudoosandnessjoenfloguchik" + - "uzenfloraflorencefloridafloristanohatakahashimamakirkenesciencec" + - "entersciencehistoryfloromskogxn--1ck2e1balestrandabergamoarekepn" + - "ordlandivtasvuodnakaiwamizawaugustowadaejeonbukarlsoyokote12flow" + - "erscientistor-elvdalflsmidthruhereggio-emilia-romagnakanotoddenf" + - "lynnhubalsanagochihayaakasakawagoebinagisoccertificationaturalsc" + - "iencesnaturelles3-sa-east-1fndfolldalfoodnetworkangerfor-better-" + - "thandafor-ourfor-somedizinhistorischescrapper-sitefor-theatreefo" + - "rexrothachiojiyahikobeatscrappingzjcbnlforgotdnservicesettsuppor" + - "toyouraforli-cesena-forlicesenaforliguriaforsaleirvikharkivalled" + - "-aostakinoueforsandasuolodingenfortmissoulan-udefenseljordfortwo" + - "rthachirogatakanabeauxartsandcraftsevastopoleforuminamiizukamito" + - "ndabayashiogamagoriziafosnesewildlifestylefotoystre-slidrettozaw" + - "afredrikstadtveronakamuratakahamaniwakuratelevisionfreiburgfreig" + - "htcmwilliamhillfribourgfriuli-v-giuliafriuli-ve-giuliafriuli-veg" + - "iuliafriuli-venezia-giuliafriuli-veneziagiuliafriuli-vgiuliafriu" + - "liv-giuliafriulive-giuliafriulivegiuliafriulivenezia-giuliafriul" + - "iveneziagiuliafriulivgiuliafrlfroganshakotankharkovalledaostakko" + - "fuelfrognfrolandfrom-akrehamnfrom-alfrom-arfrom-azlgfrom-capebre" + - "tonamiasakuchinotsuchiurakawassamukawataricohdavvesiidazaifudaig" + - "odoharuhrfrom-collectionfrom-ctozsdeltajimibungotakadavvenjargam" + - "vikhersonfrom-dcheltenham-radio-operaunitelefonicagliaridagawars" + - "zawashingtondclkatsushikabelaudiblebesbyglandyndns-weberlincolni" + - "shitosashimizunaminamiashigarafrom-degreefrom-flandersharis-a-ge" + - "ekhmelnitskiyamashikiyosatohoboleslawiechelyabinskydivingriwatar" + - "ailwayfrom-gausdalfrom-higashiagatsumagoizumizakirovogradoyfrom-" + - "iafrom-idfrom-ilfrom-in-the-bandaiwafunexusdecorativeartsharpara" + - "glidingfrom-kshawaiijimarylandfrom-kyknetnedalfrom-langevagrarbo" + - "retumbriafrom-mannosegawafrom-mdfrom-meereshellaspeziafrom-micro" + - "softbankhmelnytskyivallee-aosteroyfrom-mnfrom-mochizukiryuohkura" + - "from-msherbrookegawafrom-mtnfrom-nchernigovernmentjomeloyalistoc" + - "kholmestrandyndns-wikirafrom-ndfrom-nefrom-nhktranaritakurashiki" + - "s-a-greenfrom-njcparisor-fronfrom-nminamimakis-a-gurulvikhvallee" + - "aosteigenfrom-nvanylvenicefrom-nyfrom-ohtawaramotoineppugliafrom" + - "-oketogolfashionfrom-orfrom-paderbornfrom-praxis-a-anarchistoire" + - "ggiocalabriafrom-rittogurafrom-schokoladenfrom-sdnipropetrovskla" + - "businessebykleclerchernihivgucciprianiigataishinomakikugawatchan" + - "dclockatsuyamashikefrom-tnfrom-txn--1ctwolominamatamayukis-a-har" + - "d-workerfrom-utazuerichardlikes-piedmontblancashireggioemiliarom" + - "agnakasatsunairlinebraskaunbieidsvollfrom-vadsochildrensgardenfr" + - "om-vtranbyfrom-wafrom-wielunnerfrom-wvaofrom-wyfrosinonefrostalo" + - "wa-wolawafroyahabaghdadfstcgrouparliamentrani-andria-barletta-tr" + - "ani-andriafujiiderafujikawaguchikonefujiminohadanotaireshimojis-" + - "a-hunterfujinomiyadafujiokayamansionshimokawafujisatoshonairport" + - "land-4-salernogiessengerdalaskanittedallasalleaseeklogeshimokita" + - "yamafujisawafujishiroishidakabiratorideliveryggeelvinckmpspbalsf" + - "jordivttasvuotnakamagayachts3-us-gov-west-1fujiyoshidafukayabear" + - "dubaiduckdnsdojoetsurutaharaumakeupowiatmallorcafederationfukuch" + - "iyamadafukudominichernivtsicilyfukuis-a-knightraniandriabarletta" + - "traniandriafukumitsukefukuokazakisarazure-mobileitungsenfukurois" + - "higakishiwadafukusakisofukushimanxn--1lqs03nfukuyamagatakahataka" + - "ishimogosenfunabashiriuchinadafunagatakamatsukawafunahashikamiam" + - "akusatsumasendaisennangonohejis-a-landscaperugiafundaciofuoiskuj" + - "ukuriyamaoris-a-lawyerfuosskoczowinbaltimore-og-romsdalillesandi" + - "egotembaixadaukraanghkemerovodkagoshimagnitkakamigaharaholtaleni" + - "waizumiotsukumiyamazonawsaarlandgcampobassociates3-eu-west-1furn" + - "iturehabikinokawairtelecityeatshimonitayanagis-a-liberalfurubira" + - "quarelleasingleshimonosekikawafurudonostiafurukawaharafusodegaur" + - "afussagaeroclubmedecincinnativeamericanantiquesquarendalenugfuta" + - "bayamaguchinomigawafutboldlygoingnowhere-for-moregontrailroadfut" + - "tsurugashimarburgfvgfyis-a-libertarianfylkesbiblackfridayfyresda" + - "lhannanmokuizumodenakatombetsulikescandynathomebuiltranoyhannova" + - "reservebbshimotsukehanyuzenhapmirumarnardalhappounzenhareidsberg" + - "enharstadharvestcelebrationhasamarahasaminami-alpssells-for-ustk" + - "arasuyamazoehasudahasvikokonoehatogayahoooshikamaishimodatenris-" + - "a-nurseminehatoyamazakitahiroshimarriottransportrapaniimimatakas" + - "ugais-a-painteractivegaskimitsubatamicadaqueshimotsumahatsukaich" + - "iharahattfjelldalhayashimamotobunkyonanaoshimabariakehazuminobus" + - "ells-itravelchannelhembygdsforbundhemneshinichinanhemsedalheroku" + - "ssldheroyhgtvarggatravelersinsurancehigashichichibusheyhigashihi" + - "roshimanehigashiizumozakitakatakaokamikoaniikappulawyhigashikaga" + - "wahigashikagurasoedahigashikawakitaaikitakyushuaiahigashikurumee" + - "trdhigashimatsushimarugame-hostinghigashimatsuyamakitaakitadaito" + - "igawahigashimurayamalatvuopmidoris-a-patsfanhigashinarusellsyour" + - "homeftpaccesshinjournalismolanshinjukumanohigashinehigashiomihac" + - "himanchesterhigashiosakasayamamotorcycleshinkamigotoyohashimotok" + - "uyamahigashishirakawamatakarazukamiminershinshinotsurfastlyhigas" + - "hisumiyoshikawaminamiaikitamidsundhigashitsunotteroyhigashiuraus" + - "ukitamotosumidatlantichiryukyuragifuefukihabmerhigashiyamatokori" + - "yamanakakogawahigashiyodogawahigashiyoshinogaris-a-personaltrain" + - "erhiraizumisatohmarumorimachidahirakatashinagawahiranairtrafficb" + - "cghirarahiratsukagawahirayaitakasagooglecodespotrentino-a-adigeh" + - "istorichouseshinshirohitachiomiyaginowaniihamatamakawajimarcheap" + - "artmentshintokushimahitachiotagoparocherkasyzrankoshigayaltaikis" + - "-a-photographerokuapparshintomikasaharahitoyoshimifunehitradingh" + - "jartdalhjelmelandholeckobierzyceholidayhomeipartis-a-playerhomel" + - "inuxn--1lqs71dhomessinashikitanakagusukumodernhomeunixn--1qqw23a" + - "hondahonefosshinyoshitomiokanmakiwakunigamihamadahongorgehonjyoi" + - "chiropractichitachinakagawatchesasayamahornindalhorsembokukitash" + - "iobarahortendofinternetrentino-aadigehoteleshiojirishirifujiedah" + - "otmailhoyangerhoylandetroitskolobrzegyptianquanconagawakeisenbah" + - "nhurdalhurumajis-a-republicancerresearchaeologicaliforniahyogori" + - "s-a-rockstarachowicehyugawarajfkomakiyosemitejgorajlchloejlljmpa" + - "rtnershiraokanonjis-a-studentaljnjeonnamerikawauejoyoitakasakitc" + - "henjpmorganichocolatelekommunikationishiwakis-a-conservativegars" + - "heis-a-cpadoval-daostavalleyjpnchofunatorientexpressexyzgradyndn" + - "s-workshoppdalukowhalingroks-thisayamanashichinohedmarketsasebok" + - "nowsitallyngenissandvikcoromantovalle-aostatoiluroyjprshiratakah" + - "agis-a-teacherkassymantechnologyjurkredstonekristiansandefjordkr" + - "istiansundkrodsheradkrokstadelvaldaostathellewismillerkryminamio" + - "guniversitykumatorinokumejimateramoldelmenhorstalbanshisuifuette" + - "rtdasnetzwindmillkumenanyokaichibahccavuotnagareyamaintenancekun" + - "isakis-an-actresshirahamatonbetsurgeonshalloffamelhuslivinghisto" + - "rykunitachiaraisaijoshkar-olayangroupartykunitomigusukumamotoyam" + - "asudakunneppupasadenaklodzkodairakunstsammlungkunstunddesignkuok" + - "groupassagenshitaramakureitrentino-sudtirolkurgankurobellevuelos" + - "angelesjaguarchitecturebungoonomichinomiyakembuchikujobservercel" + - "liernemurorangemologicallfinanzkurogimilitarykuroisoftwaremarker" + - "ryhotelshizukuishimofusaikis-an-anarchistoricalsocietyumenkuroma" + - "tsunais-an-artistjohnkurotakikawasakis-an-engineeringerikekursko" + - "mmunalforbundkushirogawakustanais-an-entertainerkusunndalkutchan" + - "elkutnokuzbassnillfjordkuzumakis-bykvafjordkvalsundkvamlidlugole" + - "kagaminord-aurdalvdalipayufuchukotkafjordkvanangenkvinesdalkvinn" + - "heradkviteseidskogkvitsoykwpspjelkavikommunekyotobetsupersportre" + - "ntino-sued-tirolkyowariasahikawamissilexusgardenmisugitokigawami" + - "takeharamitourismolenskomorotsukamisunagawamitoyoakemiuramiyazur" + - "ewebsiteshikagamiishikarikaturindalmiyotamanomjondalenmlbarclays" + - "3-us-west-2monmouthaebaruminamiminowamonticellombardiamondshouji" + - "s-into-animegurovigorlicemontrealestatebankomvuxn--2m4a15emonza-" + - "brianzaporizhzhekinannestadmonza-e-della-brianzaporizhzhiamonzab" + - "rianzapposts-and-telecommunicationshowamonzaebrianzaramonzaedell" + - "abrianzamordoviajessheiminamisanrikubetsupplieshizuokanoyakagemo" + - "riyamatsusakahogithubusercontentrentino-suedtirolmoriyoshiokamit" + - "suemormoneymoroyamatsushigemortgagemoscowindowshriramsterdamberk" + - "eleymoseushistorymosjoenmoskenesienaplesigdalmossimbirskongsberg" + - "mosvikongsvingermoviemovistargardmtpccwioslombardyndns-at-homede" + - "potaruis-into-carshirakoenigmtrainingmuenstermugivestbytomakomai" + - "baramuikamogawamukochikushinonsenergymulhouseoullensvangmulticho" + - "icemunakatanemuncieszynmuosattemupassenger-associationmurmanskon" + - "injamisonymurotorcraftrentinoa-adigemusashimurayamatsuuramusashi" + - "noharamuseetrentinoaadigemuseumverenigingmutsuzawamutuellezajsko" + - "nskowolapyatigorskomatsushimashikokuchuomyphotoshibaikaliszczytn" + - "ordkappgmytis-a-bookkeeperminamitanephilatelyphilipsyphoenixn--3" + - "0rr7yphotographysiopiagetmyipaviancapitalpictetrentinoaltoadigep" + - "icturesirdalpiemontepilotslupskonsulatrobelgorodeopinkonyvelolku" + - "szpartshishikuis-a-techietis-a-socialistmeincheonpippupiszpittsb" + - "urghofauskedsmokorsetagayasells-for-lesschulepiwatepizzapkooris-" + - "a-therapistoiaplanetariuminamiuonumatsumotofukeplantationplantsn" + - "oasaintlouis-a-bruinsfansnzplatforminamiyamashirokawanabellunord" + - "re-landplaystationplazaplchonanbuildingrondarplomzansimagichosei" + - "kakegawawhoswhokksundyroyrvikingrongaplumbingoplusterpmnpodzonep" + - "ohlpokerpokrovskopervikomforbambleborkarpaczeladz-2polkowicepolt" + - "avalle-d-aostavangerpomorzeszowitdkoryolasitepordenonepornporsan" + - "gerporsangugeporsgrunnanpoznanprdpreservationpresidioprimeiwamat" + - "sumaebashikshacknetrentinos-tirolprincipeprivneprochowiceproduct" + - "ionsokanraprofermobilyprojectrentinostirolpromombetsupplypropert" + - "yprotectionpruszkowithgoogleapisa-hockeynutrentinosud-tirolprzew" + - "orskogptzpvtrentinosudtirolpzqldqponqslgbtrentinosued-tirolsrlsr" + - "varoystoragestordalstorenburgstorfjordstpetersburgstudiostudyndn" + - "s-blogdnsolarssonstuff-4-salestuttgartrentoshimasurgutsiracusait" + - "amatsukuris-into-cartoonshiranukannamiharusurnadalsurreysusakis-" + - "into-gameshiraois-a-soxfansusonosuzakanumazurysuzukanzakiwiensuz" + - "ukis-leetrentino-alto-adigesvalbardudinkamakurazakinkobayashikao" + - "irmincommbankomonosveiosvelvikosaigawasvizzeraswedenswidnicarbon" + - "ia-iglesias-carboniaiglesiascarboniaswiebodzindianapolis-a-blogg" + - "erswinoujscienceandhistoryswisshikis-lostfoldsxn--32vp30hagakhan" + - "amigawatuis-not-certifiedunetflixiltulaquilarvikoseis-an-account" + - "antshioyameldaltunesologneturystykarasjoksnesolundtuscanytushuma" + - "nitiesolutionsokndaltuvalle-daostavernversicherungvestfoldvestne" + - "somnarashinovestre-slidreamhostersoovestre-totennishiawakuravest" + - "vagoyvevelstadvibo-valentiavibovalentiavideovillaskvolloabathsbc" + - "ngvinnicargojomediavinnytsiavipsinaappharmacymruovatrentinoalto-" + - "adigevirginiavirtualvirtuelvistaprinternationalfirearmsopotrenti" + - "nosuedtirolviterboltrevisohuissier-justicevladikavkazanvladimirv" + - "ladivostokaizukaratevlogvoldavolgogradvolkenkunderseaportroandin" + - "osaurepbodyndns-at-workinggroupharmaciensimple-urlvolkswagentsor" + - "-odalvologdanskoshunantokamachippubetsubetsugaruvolyngdalvoronez" + - "hytomyrvossevangenvotevotingvotottoris-savedvrnwroclawloclawekos" + - "tromahabororoskolelwtchoyodobashibuyachiyodawtferrarawuozuwwwrit" + - "esthisblogspotrogstadwzmiuwajimaxn--3pxu8kosugexn--42c2d9axn--45" + - "brj9christmasakimobetsuwanouchikuseihichisobetsuitaitogakushimot" + - "oganewhampshirecreationissedalutskaufenisshinguernseyxn--45q11ch" + - "romedicaltanissettaiwanairforceoxn--4gbriminingxn--4it168dxn--4i" + - "t797kotohiradomainsureisenxn--4pvxsor-varangerxn--54b7fta0cchtra" + - "eumtgeradeatnurembergrossetouchijiwadell-ogliastrakhanawaxn--55q" + - "w42gxn--55qx5dxn--5js045dxn--5rtp49chungbukautokeinoxn--5rtq34ko" + - "touraxn--5tzm5gxn--6btw5axn--6frz82gxn--6orx2rxn--6qq986b3xlxn--" + - "7t0a264chungnamdalseidfjordxn--80adxhksorfoldxn--80ao21axn--80as" + - "ehdbargainstituteledatabaseballooningjerdrumemorialimitedownload" + - "rangedalimoliserniaustraliaisondre-landebudejjuedischesapeakebay" + - "erndigitalillehammerfest-mon-blogueurovisionasushiobaragrinetban" + - "kz-1kappleangaviikadenaamesjevuemielnoboribetsucks3-ap-northeast" + - "-1xn--80aswgxn--80audnedalnxn--8ltr62kouhokutamakizunokunimilano" + - "xn--8pvr4uxn--8y0a063axn--90a3academykolaivanovosibirskiervaapst" + - "eiermarkhangelskinderoyerimo-i-ranadexchangeiseiroumuenchendofth" + - "einternetcimdbarreauctionaturbruksgymnaturhistorischesakuraibiga" + - "waustrheimatunduhrennesoyokoze164xn--90aishobaraxn--90azhagebost" + - "adxn--9dbhblg6diethnologyxn--9dbq2axn--9et52uxn--9krt00axn--andy" + - "-iraxn--aroport-byanagawaxn--asky-iraxn--aurskog-hland-jnbarrel-" + - "of-knowledgeorgiauthordalandroidiscountysvardonnaharimamurogawag" + - "roks-theaternidds3-ap-southeast-1xn--avery-yuasakatakazakis-slic" + - "komaganexn--b-5gaxn--b4w605ferdxn--bck1b9a5dre4churchaseljejuego" + - "shikiminokamoenaircraftmpamperedchefarmsteadxn--bdddj-mrabdxn--b" + - "earalvhki-y4axn--berlevg-jxaxn--bhcavuotna-s4axn--bhccavuotna-k7" + - "axn--bidr-5nachikatsuuraxn--bievt-0qaxn--bjarky-fyanaizuxn--bjdd" + - "ar-ptambovdonskoshimizumakiyosumitakaginozawaonsenxn--blt-elabor" + - "xn--bmlo-graingerxn--bod-2naroyxn--brnny-wuaccident-investigatio" + - "njukudoyamaceratabuseat-band-campaniamallamadridvagsoygardenebak" + - "keshibechambagricaaarborteaches-yogasawaracingxn--brnnysund-m8ac" + - "cident-preventionlineat-urlxn--brum-voagatromsaitokorozawaxn--bt" + - "sfjord-9zaxn--c1avgxn--c2br7gxn--c3s14misakis-foundationxn--cck2" + - "b3barrell-of-knowledgets-itarumizusawautomotivelandiscoveryokami" + - "kawanehonbetsuruokaluganskarmoyomitanobihirosakikamijimakunecn-n" + - "orth-1xn--cg4bkis-uberleetrentino-altoadigexn--ciqpnxn--clchc0ea" + - "0b2g2a9gcdn77-securecipesaro-urbino-pesarourbinopesaromalvikouno" + - "sumypetshisognexn--comunicaes-v6a2oxn--correios-e-telecomunicaes" + - "-ghc29axn--czr694bashkiriautoscanadagestangeologyonabarudmurtiam" + - "usementargibestadevenes3-ap-southeast-2xn--czrs0tromsojavald-aos" + - "tarostwodzislawiwatsukiyonowtvbarefootballangenoamishirasatobish" + - "imaizurubtsovskjervoyageometre-experts-comptablesakuragawaustinn" + - "aspers3-external-1xn--czru2dxn--czrw28basilicataniaveroykenviron" + - "mentalconservationaturalhistorymuseumcentereportarnobrzegjemnes3" + - "-external-2xn--d1acj3batochigiftsakyotanabeneventochiokinoshimal" + - "opolskanlandrivefsncfagebizenakaniikawatanaguravocatanzarowebhop" + - "agespeedmobilizerobirasnesoddenmarketplace-burggfamilyokosukariy" + - "akumodumemerck-uralsk12xn--d1alferreroticanonoichikawamisatodayx" + - "n--d1atrusteexn--d5qv7z876chuvashiaxn--davvenjrga-y4axn--djrs72d" + - "6uyxn--djty4kouyamasoyxn--dnna-grajeworldxn--drbak-wuaxn--dyry-i" + - "raxn--eckvdtc9dxn--efvn9sorreisahayakawakamiichikaiseiyokoshibah" + - "ikariwanumataketomisatokyotangoxn--efvy88haibarakitahatakanezawa" + - "xn--ehqz56nxn--elqq16hakatanotogawaxn--estv75gxn--eveni-0qa01gax" + - "n--f6qx53axn--fct429kouzushimassa-carrara-massacarraramassabuske" + - "rudineustarhubarclaycards3-us-west-1xn--fhbeiarnxn--finny-yuaxn-" + - "-fiq228c5hsortlandxn--fiq64batsfjordrobaknoluoktainaibetsubameri" + - "canartanddesignieznogatagajobojibmdunloppacificarriereviewskrako" + - "weddingjerstadotsurugimetlifeinsurancehimejiinetatamotorsalangen" + - "atuurwetenschappenaumburgjesdalindaskoyabenorddalindesnesalatata" + - "rstanaustdalinkaruizawavoues3-fips-us-gov-west-1xn--fiqs8sorumin" + - "anoxn--fiqz9southcarolinazawaxn--fjord-lraxn--fjq720axn--fl-ziax" + - "n--flor-jraxn--flw351exn--fpcrj9c3dxn--frde-grandrapidsouthwestf" + - "alenxn--frna-woarais-very-badaddjamalborkdalxn--frya-hraxn--fzc2" + - "c9e2circlegnicahcesuolocalhistoryazannefrankfurtoyokawaxn--fzys8" + - "d69uvgmailxn--g2xx48circusculturedumbrellajollanbibaidarq-axn--g" + - "ckr3f0fetsundxn--gecrj9citicateringebuildersvpalmspringsakerxn--" + - "ggaviika-8ya47hakodatemasekmshimosuwalkis-a-linux-useranishiarit" + - "abashijonawatextilevangerxn--gildeskl-g0axn--givuotna-8yandexhib" + - "itionxn--gjvik-wuaxn--gls-elacaixaxn--gmq050is-very-evillagexn--" + - "gmqw5axn--h-2failxn--h1aeghakonexn--h2brj9civilaviationiyodogawa" + - "xn--hbmer-xqaxn--hcesuolo-7ya35bauhaustevollinzaiitatebayashiiba" + - "hcavuotnagarakkestadupontariobninskarumaifareastcoastaldefencemb" + - "roideryonagoyaxastronomyokohamamatsudaegubs3-eu-central-1xn--her" + - "y-iraxn--hgebostad-g3axn--hmmrfeasta-s4acoachampionshiphopenair-" + - "surveillancebetsukubabia-goracleaningatlantachikawakayamagadance" + - "chirealtorlandxn--hnefoss-q1axn--hobl-iraxn--holtlen-hxaxn--hpmi" + - "r-xqaxn--hxt814exn--hyanger-q1axn--hylandet-54axn--i1b6b1a6a2exn" + - "--imr513nxn--indery-fyaotsurgeryxn--io0a7is-very-goodyearthadsel" + - "fipirangaxn--j1aefgulenxn--j1amhakubanxn--j6w193gxn--jlq61u9w7bb" + - "cartierhcloudcontrolappalanakhodkanagawaxn--jlster-byaroslavlaan" + - "derenxn--jrpeland-54axn--jvr189misasaguris-gonexn--k7yn95exn--ka" + - "rmy-yuaxn--kbrq7oxn--kcrx77d1x4axn--kfjord-iuaxn--klbu-woaxn--kl" + - "t787dxn--kltp7dxn--kltx9axn--klty5xn--3bst00minnesotaketakatoris" + - "-certifieducatorahimeshimageandsoundandvisionxn--koluokta-7ya57h" + - "akuis-a-llamarylhursteinkjerusalembetsukuis-a-musicianxn--kprw13" + - "dxn--kpry57dxn--kpu716figuerestaurantoyotaris-a-doctorayxn--kput" + - "3is-very-nicexn--krager-gyasakaiminatoursowaxn--kranghke-b0axn--" + - "krdsherad-m8axn--krehamn-dxaxn--krjohka-hwab49jetztrentino-stiro" + - "lxn--ksnes-uuaxn--kvfjord-nxaxn--kvitsy-fyasugis-very-sweetrenti" + - "no-s-tirollagriculturennebudapest-a-la-maisondriodejaneirocheste" + - "rxn--kvnangen-k0axn--l-1fairwindspreadbettingxn--l1accentureklam" + - "borghinikkoebenhavnxn--laheadju-7yasuokaratsuginamikatagamihobby" + - "-sitevaksdalxn--langevg-jxaxn--lcvr32dxn--ldingen-q1axn--leagavi" + - "ika-52bbvacationsnasabaerobaticketsalondonetskasaokamisatohnosho" + - "oceanographicsaltdalipetskashibatakashimasfjordenaval-d-aosta-va" + - "lleyonagunikolaeventsalvadordalibabajddarchaeologyeongnamegawakk" + - "anaikawababydgoszczecinemailivornoceanographiquemergencyberlevag" + - "angaviikarugaulardalorenskogjovikashiharaxn--lesund-huaxn--lgbba" + - "t1ad8jevnakerxn--lgrd-poacivilisationrwifarsundxn--lhppi-xqaxn--" + - "linds-pratoyakokamishihoronobeokaminoyamatsuris-with-thebandoomd" + - "nsaliascolipicenord-odalxn--lns-qlavagiskexn--loabt-0qaxn--lrdal" + - "-sraxn--lrenskog-54axn--lt-liacivilizationxn--lten-granexn--lury" + - "-iraxn--mely-iraxn--merker-kuaxn--mgb2ddespydebergxn--mgb9awbfil" + - "ateliaxn--mgba3a3ejtrvchoshibukawaxn--mgba3a4f16axn--mgba3a4fran" + - "amizuholdingsmileksvikozagawaxn--mgba7c0bbn0axn--mgbaam7a8hakusa" + - "ndoyxn--mgbab2bdxn--mgbai9a5eva00beppubolognagasukesennumalselve" + - "ndrelloteneiiyamanobedzin-addrammenuernberglassassinationalherit" + - "agematsubarakawachinaganoharaogashimadachicagoboatsalzburgliwice" + - "mrxn--mgbai9azgqp6jewelryxn--mgbayh7gpaduaxn--mgbb9fbpobanazawax" + - "n--mgbbh1a71exn--mgbc0a9azcgxn--mgberp4a5d4a87gxn--mgberp4a5d4ar" + - "xn--mgbpl2fhvalerxn--mgbqly7c0a67fbcivilwarmanagementoyonakagyok" + - "utomobentleyxn--mgbqly7cvafranziskanerimarinextdirectoryxn--mgbt" + - "3dhdxn--mgbtf8flatangerxn--mgbtx2bernrtateshinanomachintaijindus" + - "triesteambulancepilepsykkylvenetogliattipschoenbrunnavigationavu" + - "otnakayamatsuzakinfinitiresamegawaxn--mgbx4cd0abogadocscbgxn--mi" + - "x082filminamifuranoxn--mix891finalxn--mjndalen-64axn--mk0axindia" + - "nmarketingxn--mk1bu44claimsaskatchewanggouvicenzaxn--mkru45isleo" + - "fmandalxn--mlatvuopmi-s4axn--mli-tlavangenxn--mlselv-iuaxn--more" + - "ke-juaxn--mori-qsakegawaxn--mosjen-eyatominamiawajikissmartertha" + - "nyoutubeeldengeluidxn--mot-tlazioxn--mre-og-romsdal-qqbeskidyn-o" + - "-saurlandesamnangerxn--msy-ula0haldenxn--mtta-vrjjat-k7aflakstad" + - "aokagakibichuoxn--muost-0qaxn--mxtq1misawaxn--ngbc5azdxn--ngbe9e" + - "0axn--nit225kozakis-an-actorxn--nmesjevuemie-tcbalatinabearalvah" + - "kikonaioirasebastopologyeonggiehtavuoatnagaivuotnagaokakyotambad" + - "ajozorahkkeravjudygarlandxn--nnx388axn--nodessakuhokkaidontexist" + - "eingeekpnxn--nqv7fs00emaxn--nry-yla5gxn--ntso0iqx3axn--ntsq17gxn" + - "--nttery-byaeserveftphiladelphiaareadmyblogsitexn--nvuotna-hwaxn" + - "--nyqy26axn--o1achattanooganorfolkebiblegallocuscountryestateofd" + - "elawarezzoologyxn--o3cw4halsagamiharaxn--od0algxn--od0aq3betaina" + - "boxfordealerdalottepsongdalenviknakanojohanamakinoharaxn--ogbpf8" + - "flekkefjordxn--oppegrd-ixaxn--ostery-fyatsukareliancexn--osyro-w" + - "uaxn--p1acfdxn--p1aiwchitosetoeiheijis-a-chefarmerseinewspaperxn" + - "--pbt977clickazimierz-dolnyxn--pgbs0dhammarfeastafricamagicherno" + - "vtsydneyxn--porsgu-sta26financexn--pssu33lxn--pssy2uxn--q9jyb4cl" + - "inicoffeedbackazoxn--qcka1pmclintonoshoesassaris-a-cubicle-slave" + - "llinowruzhgorodoyxn--qqqt11misconfusedxn--qxamurskjakdnepropetro" + - "vskiptveterinairealtychyllestadultrysilkosakaerodromegallupinbar" + - "celonagasakikuchikumagayagawalbrzycharternopilawalesundnpalacebi" + - "northwesternmutualimanowarudaurskog-holandroverhalla-speziaetnag" + - "ahamaroyekaterinburgdyniaeroportalaheadjudaicabbottarantomaritim" + - "ekeeping12000xn--rady-iraxn--rdal-poaxn--rde-ulaxn--rdy-0nabarix" + - "n--rennesy-v1axn--rhkkervju-01afineartschwarzgwangjuifminamiisel" + - "ectoyotomiyazakis-a-financialadvisor-aurdalxn--rholt-mragoworse-" + - "thandsoniizaxn--rhqv96gxn--rht27zxn--rht3dxn--rht61exn--risa-5na" + - "rusawaxn--risr-iraxn--rland-uuaxn--rlingen-mxaxn--rmskog-byatsus" + - "hiroxn--rny31hamurakamigoriginankokubunjis-a-nascarfanxn--rovu88" + - "bhartiffanycartoonarteducationalchikugokasejnyoriikashiwaraxn--r" + - "ros-granvindafjordxn--rskog-uuaxn--rst-0narutokonamegatakatsukix" + - "n--rsta-francaiseharaxn--ryken-vuaxn--ryrvik-byawaraxn--s-1faith" + - "eguardianxn--s9brj9clothingroundhandlingroznyxn--sandnessjen-ogb" + - "izhevskppspiegelxn--sandy-yuaxn--seral-lraxn--ses554gxn--sgne-gr" + - "atangenxn--skierv-utazasmatartcenterprisesakievenassisibenikihok" + - "umakogenglandxn--skjervy-v1axn--skjk-soaxn--sknit-yqaxn--sknland" + - "-fxaxn--slat-5narviikananporoxn--slt-elabourxn--smla-hraxn--smna" + - "-gratis-a-bulls-fanxn--snase-nraxn--sndre-land-0cbremangerxn--sn" + - "es-poaxn--snsa-roaxn--sr-aurdal-l8axn--sr-fron-q1axn--sr-odal-q1" + - "axn--sr-varanger-ggbielawallonieruchomoscienceandindustrynavyatk" + - "anazawaxn--srfold-byawatahamaxn--srreisa-q1axn--srum-grazxn--stf" + - "old-9xaxn--stjrdal-s1axn--stjrdalshalsen-sqbiellaakesvuemielecce" + - "verbankashiwazakiyokawaraxn--stre-toten-zcbieszczadygeyachimatai" + - "peigersundurbanpachigasakicks-assedicasadelamonedaxn--t60b56axn-" + - "-tckweatherchannelxn--tjme-hraxn--tn0agrigentomologyeongbukrasno" + - "darxn--tnsberg-q1axn--tor131oxn--trany-yuaxn--trgstad-r1axn--trn" + - "a-woaxn--troms-zuaxn--tysvr-vraxn--uc0atverranzanxn--uc0ay4axn--" + - "uist22hangglidingxn--uisz3gxn--unjrga-rtaobaomoriguchiharamcoalx" + - "n--unup4yxn--uuwu58axn--vads-jraxn--vard-jraxn--vegrshei-c0axn--" + - "vermgensberater-ctbievattorneyagawakuyabukijoburglobalashovhachi" + - "jorpelandurhamburglobodoes-itateyamaxn--vermgensberatung-pwbifuk" + - "agawalterxn--vestvgy-ixa6oxn--vg-yiabruzzoologicalabamagasakishi" + - "mabaragusartsaritsynxn--vgan-qoaxn--vgsy-qoa0jewishartrentino-su" + - "d-tirolxn--vgu402cloudcontrolledekakudamatsuenoharaxn--vhquversa" + - "illesomaxn--vler-qoaxn--vre-eiker-k8axn--vrggt-xqadxn--vry-yla5g" + - "xn--vuq861bihorologyukuhashimoichinosekigaharaxn--w4r85el8fhu5dn" + - "raxn--wcvs22dxn--wgbh1cloudfrontdoorxn--wgbl6axn--xhq521bikedati" + - "nglogowegroweibolzanordreisa-geekasukabeerxn--xkc2al3hye2axn--xk" + - "c2dl3a5ee0hangoutsystemscloudapparmaxn--y9a3aquariumishimatsunox" + - "n--yer-znarvikrasnoyarskomitamamuraxn--yfro4i67oxn--ygarden-p1ax" + - "n--ygbi2ammxn--3ds443gxn--ystre-slidre-ujbilbaogakidstvedestrand" + - "vrdnsamsungloppenzaokinawashirosatobamagazinedre-eikerxn--zbx025" + - "dxn--zf0ao64axn--zf0avxn--3e0b707exn--zfr164billustrationayorodd" + - "axperiaxxxn--3oq18vl8pn36axz" - -// nodes is the list of nodes. Each node is represented as a uint32, which -// encodes the node's children, wildcard bit and node type (as an index into -// the children array), ICANN bit and text. -// -// In the //-comment after each node's data, the nodes indexes of the children -// are formatted as (n0x1234-n0x1256), with * denoting the wildcard bit. The -// nodeType is printed as + for normal, ! for exception, and o for parent-only -// nodes that have children but don't match a domain label in their own right. -// An I denotes an ICANN domain. -// -// The layout within the uint32, from MSB to LSB, is: -// [ 1 bits] unused -// [ 9 bits] children index -// [ 1 bits] ICANN bit -// [15 bits] text index -// [ 6 bits] text length -var nodes = [...]uint32{ - 0x00301443, // n0x0000 c0x0000 (---------------) + I aaa - 0x002293c4, // n0x0001 c0x0000 (---------------) + I aarp - 0x0036eb43, // n0x0002 c0x0000 (---------------) + I abb - 0x0036eb46, // n0x0003 c0x0000 (---------------) + I abbott - 0x0030cb04, // n0x0004 c0x0000 (---------------) + I able - 0x00355b87, // n0x0005 c0x0000 (---------------) + I abogado - 0x01a01e82, // n0x0006 c0x0006 (n0x0539-n0x053f) + I ac - 0x002f2787, // n0x0007 c0x0000 (---------------) + I academy - 0x0033dcc9, // n0x0008 c0x0000 (---------------) + I accenture - 0x002d7e4a, // n0x0009 c0x0000 (---------------) + I accountant - 0x002d7e4b, // n0x000a c0x0000 (---------------) + I accountants - 0x00221483, // n0x000b c0x0000 (---------------) + I aco - 0x0027d3c6, // n0x000c c0x0000 (---------------) + I active - 0x00226f45, // n0x000d c0x0000 (---------------) + I actor - 0x01e10a02, // n0x000e c0x0007 (n0x053f-n0x0540) + I ad - 0x00262ac3, // n0x000f c0x0000 (---------------) + I ads - 0x0036b745, // n0x0010 c0x0000 (---------------) + I adult - 0x02204342, // n0x0011 c0x0008 (n0x0540-n0x0548) + I ae - 0x003285c3, // n0x0012 c0x0000 (---------------) + I aeg - 0x026751c4, // n0x0013 c0x0009 (n0x0548-n0x05a1) + I aero - 0x0036de85, // n0x0014 c0x0000 (---------------) + I aetna - 0x02a0c702, // n0x0015 c0x000a (n0x05a1-n0x05a6) + I af - 0x0023a2c3, // n0x0016 c0x0000 (---------------) + I afl - 0x00367c06, // n0x0017 c0x0000 (---------------) + I africa - 0x00367c0b, // n0x0018 c0x0000 (---------------) + I africamagic - 0x02e015c2, // n0x0019 c0x000b (n0x05a6-n0x05ab) + I ag - 0x002d6e47, // n0x001a c0x0000 (---------------) + I agakhan - 0x00229d46, // n0x001b c0x0000 (---------------) + I agency - 0x032002c2, // n0x001c c0x000c (n0x05ab-n0x05af) + I ai - 0x0024ef43, // n0x001d c0x0000 (---------------) + I aig - 0x002e75c8, // n0x001e c0x0000 (---------------) + I airforce - 0x00273406, // n0x001f c0x0000 (---------------) + I airtel - 0x0036acc4, // n0x0020 c0x0000 (---------------) + I akdn - 0x03600882, // n0x0021 c0x000d (n0x05af-n0x05b6) + I al - 0x00342747, // n0x0022 c0x0000 (---------------) + I alibaba - 0x002ab4c6, // n0x0023 c0x0000 (---------------) + I alipay - 0x002a6589, // n0x0024 c0x0000 (---------------) + I allfinanz - 0x0029c184, // n0x0025 c0x0000 (---------------) + I ally - 0x00215bc6, // n0x0026 c0x0000 (---------------) + I alsace - 0x03a04942, // n0x0027 c0x000e (n0x05b6-n0x05b7) + I am - 0x0027d885, // n0x0028 c0x0000 (---------------) + I amica - 0x002b6cc9, // n0x0029 c0x0000 (---------------) + I amsterdam - 0x03e01242, // n0x002a c0x000f (n0x05b7-n0x05bb) + I an - 0x0022f449, // n0x002b c0x0000 (---------------) + I analytics - 0x002f8647, // n0x002c c0x0000 (---------------) + I android - 0x00295a46, // n0x002d c0x0000 (---------------) + I anquan - 0x0420fd82, // n0x002e c0x0010 (n0x05bb-n0x05c1) + I ao - 0x0028df8a, // n0x002f c0x0000 (---------------) + I apartments - 0x00212a03, // n0x0030 c0x0000 (---------------) + I app - 0x002f0145, // n0x0031 c0x0000 (---------------) + I apple - 0x00273fc2, // n0x0032 c0x0000 (---------------) + I aq - 0x00273fc9, // n0x0033 c0x0000 (---------------) + I aquarelle - 0x04600602, // n0x0034 c0x0011 (n0x05c1-n0x05ca) + I ar - 0x00387dc6, // n0x0035 c0x0000 (---------------) + I aramco - 0x0025dd45, // n0x0036 c0x0000 (---------------) + I archi - 0x00333fc4, // n0x0037 c0x0000 (---------------) + I army - 0x04e29404, // n0x0038 c0x0013 (n0x05cb-n0x05d1) + I arpa - 0x00359e04, // n0x0039 c0x0000 (---------------) + I arte - 0x05200182, // n0x003a c0x0014 (n0x05d1-n0x05d2) + I as - 0x00209144, // n0x003b c0x0000 (---------------) + I asia - 0x002729ca, // n0x003c c0x0000 (---------------) + I associates - 0x05601642, // n0x003d c0x0015 (n0x05d2-n0x05d9) + I at - 0x00389588, // n0x003e c0x0000 (---------------) + I attorney - 0x05e05ac2, // n0x003f c0x0017 (n0x05da-n0x05ec) + I au - 0x002f4487, // n0x0040 c0x0000 (---------------) + I auction - 0x00222244, // n0x0041 c0x0000 (---------------) + I audi - 0x00251707, // n0x0042 c0x0000 (---------------) + I audible - 0x00222245, // n0x0043 c0x0000 (---------------) + I audio - 0x002f8406, // n0x0044 c0x0000 (---------------) + I author - 0x002eaac4, // n0x0045 c0x0000 (---------------) + I auto - 0x00309645, // n0x0046 c0x0000 (---------------) + I autos - 0x002c0747, // n0x0047 c0x0000 (---------------) + I avianca - 0x06e02502, // n0x0048 c0x001b (n0x05fa-n0x05fb) + I aw - 0x00272583, // n0x0049 c0x0000 (---------------) + I aws - 0x00215282, // n0x004a c0x0000 (---------------) + I ax - 0x0032b343, // n0x004b c0x0000 (---------------) + I axa - 0x07208cc2, // n0x004c c0x001c (n0x05fb-n0x0607) + I az - 0x0026c905, // n0x004d c0x0000 (---------------) + I azure - 0x07605a82, // n0x004e c0x001d (n0x0607-n0x0612) + I ba - 0x00343204, // n0x004f c0x0000 (---------------) + I baby - 0x0026a085, // n0x0050 c0x0000 (---------------) + I baidu - 0x00255704, // n0x0051 c0x0000 (---------------) + I band - 0x00235dc4, // n0x0052 c0x0000 (---------------) + I bank - 0x0020c103, // n0x0053 c0x0000 (---------------) + I bar - 0x0036bf49, // n0x0054 c0x0000 (---------------) + I barcelona - 0x0031934b, // n0x0055 c0x0000 (---------------) + I barclaycard - 0x002afe08, // n0x0056 c0x0000 (---------------) + I barclays - 0x0030b788, // n0x0057 c0x0000 (---------------) + I barefoot - 0x002ed0c8, // n0x0058 c0x0000 (---------------) + I bargains - 0x003297c7, // n0x0059 c0x0000 (---------------) + I bauhaus - 0x002eef46, // n0x005a c0x0000 (---------------) + I bayern - 0x07a791c2, // n0x005b c0x001e (n0x0612-n0x061c) + I bb - 0x00331f83, // n0x005c c0x0000 (---------------) + I bbc - 0x00340184, // n0x005d c0x0000 (---------------) + I bbva - 0x0028bfc3, // n0x005e c0x0000 (---------------) + I bcg - 0x002dbf83, // n0x005f c0x0000 (---------------) + I bcn - 0x016fbc02, // n0x0060 c0x0005 (---------------)* o I bd - 0x07e04702, // n0x0061 c0x001f (n0x061c-n0x061e) + I be - 0x00243505, // n0x0062 c0x0000 (---------------) + I beats - 0x00391984, // n0x0063 c0x0000 (---------------) + I beer - 0x00352147, // n0x0064 c0x0000 (---------------) + I bentley - 0x00251d46, // n0x0065 c0x0000 (---------------) + I berlin - 0x0030a2c4, // n0x0066 c0x0000 (---------------) + I best - 0x00227703, // n0x0067 c0x0000 (---------------) + I bet - 0x08349f02, // n0x0068 c0x0020 (n0x061e-n0x061f) + I bf - 0x08755e02, // n0x0069 c0x0021 (n0x061f-n0x0644) + I bg - 0x08af6202, // n0x006a c0x0022 (n0x0644-n0x0649) + I bh - 0x00375006, // n0x006b c0x0000 (---------------) + I bharti - 0x08e00002, // n0x006c c0x0023 (n0x0649-n0x064e) + I bi - 0x003628c5, // n0x006d c0x0000 (---------------) + I bible - 0x002fd143, // n0x006e c0x0000 (---------------) + I bid - 0x00390e04, // n0x006f c0x0000 (---------------) + I bike - 0x002c7a44, // n0x0070 c0x0000 (---------------) + I bing - 0x002c7a45, // n0x0071 c0x0000 (---------------) + I bingo - 0x00200003, // n0x0072 c0x0000 (---------------) + I bio - 0x09310603, // n0x0073 c0x0024 (n0x064e-n0x0655) + I biz - 0x09602642, // n0x0074 c0x0025 (n0x0655-n0x0659) + I bj - 0x00277b85, // n0x0075 c0x0000 (---------------) + I black - 0x00277b8b, // n0x0076 c0x0000 (---------------) + I blackfriday - 0x002d0084, // n0x0077 c0x0000 (---------------) + I blog - 0x00205849, // n0x0078 c0x0000 (---------------) + I bloomberg - 0x00207184, // n0x0079 c0x0000 (---------------) + I blue - 0x09a09242, // n0x007a c0x0026 (n0x0659-n0x065e) + I bm - 0x00209243, // n0x007b c0x0000 (---------------) + I bms - 0x0020a103, // n0x007c c0x0000 (---------------) + I bmw - 0x0160a282, // n0x007d c0x0005 (---------------)* o I bn - 0x00243903, // n0x007e c0x0000 (---------------) + I bnl - 0x0020a28a, // n0x007f c0x0000 (---------------) + I bnpparibas - 0x09e0a702, // n0x0080 c0x0027 (n0x065e-n0x0667) + I bo - 0x0034eb85, // n0x0081 c0x0000 (---------------) + I boats - 0x0020aac3, // n0x0082 c0x0000 (---------------) + I bom - 0x0020b104, // n0x0083 c0x0000 (---------------) + I bond - 0x0020c2c3, // n0x0084 c0x0000 (---------------) + I boo - 0x0020c2c5, // n0x0085 c0x0000 (---------------) + I boots - 0x0020cb05, // n0x0086 c0x0000 (---------------) + I bosch - 0x0020d286, // n0x0087 c0x0000 (---------------) + I bostik - 0x0020e2c3, // n0x0088 c0x0000 (---------------) + I bot - 0x00211048, // n0x0089 c0x0000 (---------------) + I boutique - 0x0a212e82, // n0x008a c0x0028 (n0x0667-n0x06ad) + I br - 0x00212e88, // n0x008b c0x0000 (---------------) + I bradesco - 0x0021a14b, // n0x008c c0x0000 (---------------) + I bridgestone - 0x002172c8, // n0x008d c0x0000 (---------------) + I broadway - 0x00218046, // n0x008e c0x0000 (---------------) + I broker - 0x00219347, // n0x008f c0x0000 (---------------) + I brother - 0x0021be88, // n0x0090 c0x0000 (---------------) + I brussels - 0x0aa35102, // n0x0091 c0x002a (n0x06ae-n0x06b3) + I bs - 0x0ae16fc2, // n0x0092 c0x002b (n0x06b3-n0x06b8) + I bt - 0x0033c648, // n0x0093 c0x0000 (---------------) + I budapest - 0x002c67c5, // n0x0094 c0x0000 (---------------) + I build - 0x00324908, // n0x0095 c0x0000 (---------------) + I builders - 0x0025f008, // n0x0096 c0x0000 (---------------) + I business - 0x0021d903, // n0x0097 c0x0000 (---------------) + I buy - 0x0021e484, // n0x0098 c0x0000 (---------------) + I buzz - 0x003401c2, // n0x0099 c0x0000 (---------------) + I bv - 0x0b21f782, // n0x009a c0x002c (n0x06b8-n0x06ba) + I bw - 0x0b616b42, // n0x009b c0x002d (n0x06ba-n0x06be) + I by - 0x0be203c2, // n0x009c c0x002f (n0x06bf-n0x06c5) + I bz - 0x002203c3, // n0x009d c0x0000 (---------------) + I bzh - 0x0c2055c2, // n0x009e c0x0030 (n0x06c5-n0x06d6) + I ca - 0x0036eb03, // n0x009f c0x0000 (---------------) + I cab - 0x0026ab84, // n0x00a0 c0x0000 (---------------) + I cafe - 0x0020e443, // n0x00a1 c0x0000 (---------------) + I cal - 0x002a6544, // n0x00a2 c0x0000 (---------------) + I call - 0x0022b406, // n0x00a3 c0x0000 (---------------) + I camera - 0x0022c604, // n0x00a4 c0x0000 (---------------) + I camp - 0x0029668e, // n0x00a5 c0x0000 (---------------) + I cancerresearch - 0x00312a05, // n0x00a6 c0x0000 (---------------) + I canon - 0x0021aac8, // n0x00a7 c0x0000 (---------------) + I capetown - 0x002c0887, // n0x00a8 c0x0000 (---------------) + I capital - 0x00205f83, // n0x00a9 c0x0000 (---------------) + I car - 0x002291c7, // n0x00aa c0x0000 (---------------) + I caravan - 0x00319505, // n0x00ab c0x0000 (---------------) + I cards - 0x00205f84, // n0x00ac c0x0000 (---------------) + I care - 0x00205f86, // n0x00ad c0x0000 (---------------) + I career - 0x00205f87, // n0x00ae c0x0000 (---------------) + I careers - 0x002b9384, // n0x00af c0x0000 (---------------) + I cars - 0x00332007, // n0x00b0 c0x0000 (---------------) + I cartier - 0x00383904, // n0x00b1 c0x0000 (---------------) + I casa - 0x00261b04, // n0x00b2 c0x0000 (---------------) + I cash - 0x002112c6, // n0x00b3 c0x0000 (---------------) + I casino - 0x0020d0c3, // n0x00b4 c0x0000 (---------------) + I cat - 0x003246c8, // n0x00b5 c0x0000 (---------------) + I catering - 0x00235d83, // n0x00b6 c0x0000 (---------------) + I cba - 0x002438c3, // n0x00b7 c0x0000 (---------------) + I cbn - 0x0037dc04, // n0x00b8 c0x0000 (---------------) + I cbre - 0x0c61aa82, // n0x00b9 c0x0031 (n0x06d6-n0x06da) + I cc - 0x0ca2a082, // n0x00ba c0x0032 (n0x06da-n0x06db) + I cd - 0x00215cc3, // n0x00bb c0x0000 (---------------) + I ceb - 0x00233a06, // n0x00bc c0x0000 (---------------) + I center - 0x002e7743, // n0x00bd c0x0000 (---------------) + I ceo - 0x0021d7c4, // n0x00be c0x0000 (---------------) + I cern - 0x0cf104c2, // n0x00bf c0x0033 (n0x06db-n0x06dc) + I cf - 0x003104c3, // n0x00c0 c0x0000 (---------------) + I cfa - 0x00366243, // n0x00c1 c0x0000 (---------------) + I cfd - 0x0020ea02, // n0x00c2 c0x0000 (---------------) + I cg - 0x0d204a02, // n0x00c3 c0x0034 (n0x06dc-n0x06dd) + I ch - 0x002a9f06, // n0x00c4 c0x0000 (---------------) + I chanel - 0x00227d87, // n0x00c5 c0x0000 (---------------) + I channel - 0x002facc5, // n0x00c6 c0x0000 (---------------) + I chase - 0x0023a704, // n0x00c7 c0x0000 (---------------) + I chat - 0x0028dec5, // n0x00c8 c0x0000 (---------------) + I cheap - 0x00353cc7, // n0x00c9 c0x0000 (---------------) + I chintai - 0x00297d05, // n0x00ca c0x0000 (---------------) + I chloe - 0x002e5109, // n0x00cb c0x0000 (---------------) + I christmas - 0x002e6f86, // n0x00cc c0x0000 (---------------) + I chrome - 0x002fabc6, // n0x00cd c0x0000 (---------------) + I church - 0x0d6155c2, // n0x00ce c0x0035 (n0x06dd-n0x06ec) + I ci - 0x0025f788, // n0x00cf c0x0000 (---------------) + I cipriani - 0x00322106, // n0x00d0 c0x0000 (---------------) + I circle - 0x00237905, // n0x00d1 c0x0000 (---------------) + I cisco - 0x003245c5, // n0x00d2 c0x0000 (---------------) + I citic - 0x002735c4, // n0x00d3 c0x0000 (---------------) + I city - 0x002735c8, // n0x00d4 c0x0000 (---------------) + I cityeats - 0x0da01782, // n0x00d5 c0x0036 (n0x06ec-n0x06ed)* o I ck - 0x0de0af42, // n0x00d6 c0x0037 (n0x06ed-n0x06f2) + I cl - 0x00357546, // n0x00d7 c0x0000 (---------------) + I claims - 0x0032d748, // n0x00d8 c0x0000 (---------------) + I cleaning - 0x00367205, // n0x00d9 c0x0000 (---------------) + I click - 0x00368f86, // n0x00da c0x0000 (---------------) + I clinic - 0x003784c8, // n0x00db c0x0000 (---------------) + I clothing - 0x00332205, // n0x00dc c0x0000 (---------------) + I cloud - 0x002752c4, // n0x00dd c0x0000 (---------------) + I club - 0x002752c7, // n0x00de c0x0000 (---------------) + I clubmed - 0x0e249082, // n0x00df c0x0038 (n0x06f2-n0x06f6) + I cm - 0x0e6211c2, // n0x00e0 c0x0039 (n0x06f6-n0x0723) + I cn - 0x0fe00742, // n0x00e1 c0x003f (n0x0728-n0x0735) + I co - 0x0032ca05, // n0x00e2 c0x0000 (---------------) + I coach - 0x0028ca05, // n0x00e3 c0x0000 (---------------) + I codes - 0x003690c6, // n0x00e4 c0x0000 (---------------) + I coffee - 0x0021e787, // n0x00e5 c0x0000 (---------------) + I college - 0x002214c7, // n0x00e6 c0x0000 (---------------) + I cologne - 0x10622ac3, // n0x00e7 c0x0041 (n0x0736-n0x07ff) + I com - 0x002d4148, // n0x00e8 c0x0000 (---------------) + I commbank - 0x00222ac9, // n0x00e9 c0x0000 (---------------) + I community - 0x002232c7, // n0x00ea c0x0000 (---------------) + I company - 0x002236c8, // n0x00eb c0x0000 (---------------) + I computer - 0x00223ec6, // n0x00ec c0x0000 (---------------) + I comsec - 0x00224306, // n0x00ed c0x0000 (---------------) + I condos - 0x00224c0c, // n0x00ee c0x0000 (---------------) + I construction - 0x00225a8a, // n0x00ef c0x0000 (---------------) + I consulting - 0x00225f47, // n0x00f0 c0x0000 (---------------) + I contact - 0x00226e0b, // n0x00f1 c0x0000 (---------------) + I contractors - 0x00227bc7, // n0x00f2 c0x0000 (---------------) + I cooking - 0x00227bce, // n0x00f3 c0x0000 (---------------) + I cookingchannel - 0x00228384, // n0x00f4 c0x0000 (---------------) + I cool - 0x00228d44, // n0x00f5 c0x0000 (---------------) + I coop - 0x0022b2c7, // n0x00f6 c0x0000 (---------------) + I corsica - 0x00362c07, // n0x00f7 c0x0000 (---------------) + I country - 0x0022d906, // n0x00f8 c0x0000 (---------------) + I coupon - 0x0022d907, // n0x00f9 c0x0000 (---------------) + I coupons - 0x0022dc87, // n0x00fa c0x0000 (---------------) + I courses - 0x11a0c502, // n0x00fb c0x0046 (n0x081d-n0x0824) + I cr - 0x00230646, // n0x00fc c0x0000 (---------------) + I credit - 0x0023064a, // n0x00fd c0x0000 (---------------) + I creditcard - 0x002308cb, // n0x00fe c0x0000 (---------------) + I creditunion - 0x002319c7, // n0x00ff c0x0000 (---------------) + I cricket - 0x00232885, // n0x0100 c0x0000 (---------------) + I crown - 0x002329c3, // n0x0101 c0x0000 (---------------) + I crs - 0x00233147, // n0x0102 c0x0000 (---------------) + I cruises - 0x00355d43, // n0x0103 c0x0000 (---------------) + I csc - 0x11e24002, // n0x0104 c0x0047 (n0x0824-n0x082a) + I cu - 0x002333ca, // n0x0105 c0x0000 (---------------) + I cuisinella - 0x1233f802, // n0x0106 c0x0048 (n0x082a-n0x082b) + I cv - 0x126b8942, // n0x0107 c0x0049 (n0x082b-n0x082f) + I cw - 0x12a35882, // n0x0108 c0x004a (n0x082f-n0x0831) + I cx - 0x12e29e42, // n0x0109 c0x004b (n0x0831-n0x083e) o I cy - 0x002dcac5, // n0x010a c0x0000 (---------------) + I cymru - 0x00235b84, // n0x010b c0x0000 (---------------) + I cyou - 0x13614442, // n0x010c c0x004d (n0x083f-n0x0840) + I cz - 0x0021bc05, // n0x010d c0x0000 (---------------) + I dabur - 0x00264503, // n0x010e c0x0000 (---------------) + I dad - 0x0032dec5, // n0x010f c0x0000 (---------------) + I dance - 0x00209004, // n0x0110 c0x0000 (---------------) + I date - 0x00390f06, // n0x0111 c0x0000 (---------------) + I dating - 0x00207286, // n0x0112 c0x0000 (---------------) + I datsun - 0x00277d83, // n0x0113 c0x0000 (---------------) + I day - 0x00251304, // n0x0114 c0x0000 (---------------) + I dclk - 0x002f9383, // n0x0115 c0x0000 (---------------) + I dds - 0x13a006c2, // n0x0116 c0x004e (n0x0840-n0x0848) + I de - 0x002196c4, // n0x0117 c0x0000 (---------------) + I deal - 0x00364186, // n0x0118 c0x0000 (---------------) + I dealer - 0x002196c5, // n0x0119 c0x0000 (---------------) + I deals - 0x002528c6, // n0x011a c0x0000 (---------------) + I degree - 0x00268948, // n0x011b c0x0000 (---------------) + I delivery - 0x002297c4, // n0x011c c0x0000 (---------------) + I dell - 0x0024f885, // n0x011d c0x0000 (---------------) + I delta - 0x0022e548, // n0x011e c0x0000 (---------------) + I democrat - 0x00298646, // n0x011f c0x0000 (---------------) + I dental - 0x00234ec7, // n0x0120 c0x0000 (---------------) + I dentist - 0x00232f44, // n0x0121 c0x0000 (---------------) + I desi - 0x00232f46, // n0x0122 c0x0000 (---------------) + I design - 0x0030a403, // n0x0123 c0x0000 (---------------) + I dev - 0x002b0cc8, // n0x0124 c0x0000 (---------------) + I diamonds - 0x002f6384, // n0x0125 c0x0000 (---------------) + I diet - 0x002ef0c7, // n0x0126 c0x0000 (---------------) + I digital - 0x00352bc6, // n0x0127 c0x0000 (---------------) + I direct - 0x00352bc9, // n0x0128 c0x0000 (---------------) + I directory - 0x002f87c8, // n0x0129 c0x0000 (---------------) + I discount - 0x0020c7c2, // n0x012a c0x0000 (---------------) + I dj - 0x13e71742, // n0x012b c0x004f (n0x0848-n0x0849) + I dk - 0x142618c2, // n0x012c c0x0050 (n0x0849-n0x084e) + I dm - 0x0036cd83, // n0x012d c0x0000 (---------------) + I dnp - 0x14604002, // n0x012e c0x0051 (n0x084e-n0x0858) + I do - 0x00355cc4, // n0x012f c0x0000 (---------------) + I docs - 0x00204003, // n0x0130 c0x0000 (---------------) + I dog - 0x0024f044, // n0x0131 c0x0000 (---------------) + I doha - 0x002e8307, // n0x0132 c0x0000 (---------------) + I domains - 0x0023ba06, // n0x0133 c0x0000 (---------------) + I doosan - 0x0031c343, // n0x0134 c0x0000 (---------------) + I dot - 0x002ede08, // n0x0135 c0x0000 (---------------) + I download - 0x003102c5, // n0x0136 c0x0000 (---------------) + I drive - 0x00394cc4, // n0x0137 c0x0000 (---------------) + I dstv - 0x002482c3, // n0x0138 c0x0000 (---------------) + I dtv - 0x0026a005, // n0x0139 c0x0000 (---------------) + I dubai - 0x0031b886, // n0x013a c0x0000 (---------------) + I dunlop - 0x0032a4c6, // n0x013b c0x0000 (---------------) + I dupont - 0x00383246, // n0x013c c0x0000 (---------------) + I durban - 0x00300bc4, // n0x013d c0x0000 (---------------) + I dvag - 0x14aa3602, // n0x013e c0x0052 (n0x0858-n0x0860) + I dz - 0x00330d85, // n0x013f c0x0000 (---------------) + I earth - 0x00242e03, // n0x0140 c0x0000 (---------------) + I eat - 0x14e00702, // n0x0141 c0x0053 (n0x0860-n0x086c) + I ec - 0x0038d785, // n0x0142 c0x0000 (---------------) + I edeka - 0x002d75c3, // n0x0143 c0x0000 (---------------) + I edu - 0x00375549, // n0x0144 c0x0000 (---------------) + I education - 0x15206042, // n0x0145 c0x0054 (n0x086c-n0x0876) + I ee - 0x15a0df82, // n0x0146 c0x0056 (n0x0877-n0x0880) + I eg - 0x003435c5, // n0x0147 c0x0000 (---------------) + I email - 0x00312206, // n0x0148 c0x0000 (---------------) + I emerck - 0x002ba7c6, // n0x0149 c0x0000 (---------------) + I energy - 0x002a8a88, // n0x014a c0x0000 (---------------) + I engineer - 0x002a8a8b, // n0x014b c0x0000 (---------------) + I engineering - 0x0037a7cb, // n0x014c c0x0000 (---------------) + I enterprises - 0x00364485, // n0x014d c0x0000 (---------------) + I epson - 0x0021f909, // n0x014e c0x0000 (---------------) + I equipment - 0x01600ec2, // n0x014f c0x0005 (---------------)* o I er - 0x00259904, // n0x0150 c0x0000 (---------------) + I erni - 0x162010c2, // n0x0151 c0x0058 (n0x0881-n0x0886) + I es - 0x00275b43, // n0x0152 c0x0000 (---------------) + I esq - 0x002b1846, // n0x0153 c0x0000 (---------------) + I estate - 0x16a0bbc2, // n0x0154 c0x005a (n0x0887-n0x088f) + I et - 0x0021d5c2, // n0x0155 c0x0000 (---------------) + I eu - 0x002ef88a, // n0x0156 c0x0000 (---------------) + I eurovision - 0x002b71c3, // n0x0157 c0x0000 (---------------) + I eus - 0x003423c6, // n0x0158 c0x0000 (---------------) + I events - 0x00381fc8, // n0x0159 c0x0000 (---------------) + I everbank - 0x002f3908, // n0x015a c0x0000 (---------------) + I exchange - 0x0030c7c6, // n0x015b c0x0000 (---------------) + I expert - 0x00203e87, // n0x015c c0x0000 (---------------) + I exposed - 0x0029ab47, // n0x015d c0x0000 (---------------) + I express - 0x0021008a, // n0x015e c0x0000 (---------------) + I extraspace - 0x00310504, // n0x015f c0x0000 (---------------) + I fage - 0x00328344, // n0x0160 c0x0000 (---------------) + I fail - 0x0033d609, // n0x0161 c0x0000 (---------------) + I fairwinds - 0x00377ec5, // n0x0162 c0x0000 (---------------) + I faith - 0x00311c06, // n0x0163 c0x0000 (---------------) + I family - 0x0020f1c3, // n0x0164 c0x0000 (---------------) + I fan - 0x002c5544, // n0x0165 c0x0000 (---------------) + I fans - 0x0021f804, // n0x0166 c0x0000 (---------------) + I farm - 0x0025d247, // n0x0167 c0x0000 (---------------) + I fashion - 0x00287d44, // n0x0168 c0x0000 (---------------) + I fast - 0x00369188, // n0x0169 c0x0000 (---------------) + I feedback - 0x003127c7, // n0x016a c0x0000 (---------------) + I ferrero - 0x16e099c2, // n0x016b c0x005b (n0x088f-n0x0892) + I fi - 0x00356104, // n0x016c c0x0000 (---------------) + I film - 0x00356745, // n0x016d c0x0000 (---------------) + I final - 0x00368607, // n0x016e c0x0000 (---------------) + I finance - 0x00371509, // n0x016f c0x0000 (---------------) + I financial - 0x00236744, // n0x0170 c0x0000 (---------------) + I fire - 0x00237d49, // n0x0171 c0x0000 (---------------) + I firestone - 0x00238548, // n0x0172 c0x0000 (---------------) + I firmdale - 0x00238904, // n0x0173 c0x0000 (---------------) + I fish - 0x00238907, // n0x0174 c0x0000 (---------------) + I fishing - 0x00238f03, // n0x0175 c0x0000 (---------------) + I fit - 0x00239087, // n0x0176 c0x0000 (---------------) + I fitness - 0x016241c2, // n0x0177 c0x0005 (---------------)* o I fj - 0x01697782, // n0x0178 c0x0005 (---------------)* o I fk - 0x0023a306, // n0x0179 c0x0000 (---------------) + I flickr - 0x0023b147, // n0x017a c0x0000 (---------------) + I flights - 0x0023c607, // n0x017b c0x0000 (---------------) + I florist - 0x0023ef07, // n0x017c c0x0000 (---------------) + I flowers - 0x0023f508, // n0x017d c0x0000 (---------------) + I flsmidth - 0x0023ffc3, // n0x017e c0x0000 (---------------) + I fly - 0x00358002, // n0x017f c0x0000 (---------------) + I fm - 0x00200382, // n0x0180 c0x0000 (---------------) + I fo - 0x00241943, // n0x0181 c0x0000 (---------------) + I foo - 0x0024194b, // n0x0182 c0x0000 (---------------) + I foodnetwork - 0x0030b888, // n0x0183 c0x0000 (---------------) + I football - 0x003640c4, // n0x0184 c0x0000 (---------------) + I ford - 0x00242f85, // n0x0185 c0x0000 (---------------) + I forex - 0x00244a47, // n0x0186 c0x0000 (---------------) + I forsale - 0x00246b45, // n0x0187 c0x0000 (---------------) + I forum - 0x00303b8a, // n0x0188 c0x0000 (---------------) + I foundation - 0x17200d42, // n0x0189 c0x005c (n0x0892-n0x08aa) + I fr - 0x0024c6c3, // n0x018a c0x0000 (---------------) + I frl - 0x0024c787, // n0x018b c0x0000 (---------------) + I frogans - 0x003906c9, // n0x018c c0x0000 (---------------) + I frontdoor - 0x00200d48, // n0x018d c0x0000 (---------------) + I frontier - 0x0026fc04, // n0x018e c0x0000 (---------------) + I fund - 0x00272f09, // n0x018f c0x0000 (---------------) + I furniture - 0x002764c6, // n0x0190 c0x0000 (---------------) + I futbol - 0x00277503, // n0x0191 c0x0000 (---------------) + I fyi - 0x00201602, // n0x0192 c0x0000 (---------------) + I ga - 0x00215b83, // n0x0193 c0x0000 (---------------) + I gal - 0x00226607, // n0x0194 c0x0000 (---------------) + I gallery - 0x00362a05, // n0x0195 c0x0000 (---------------) + I gallo - 0x0036bd46, // n0x0196 c0x0000 (---------------) + I gallup - 0x00212084, // n0x0197 c0x0000 (---------------) + I game - 0x002d2145, // n0x0198 c0x0000 (---------------) + I games - 0x0020e506, // n0x0199 c0x0000 (---------------) + I garden - 0x00205a42, // n0x019a c0x0000 (---------------) + I gb - 0x00378f84, // n0x019b c0x0000 (---------------) + I gbiz - 0x0021b342, // n0x019c c0x0000 (---------------) + I gd - 0x002d0143, // n0x019d c0x0000 (---------------) + I gdn - 0x176012c2, // n0x019e c0x005d (n0x08aa-n0x08b1) + I ge - 0x00237543, // n0x019f c0x0000 (---------------) + I gea - 0x0020db04, // n0x01a0 c0x0000 (---------------) + I gent - 0x0020db07, // n0x01a1 c0x0000 (---------------) + I genting - 0x00248e82, // n0x01a2 c0x0000 (---------------) + I gf - 0x17a00402, // n0x01a3 c0x005e (n0x08b1-n0x08b4) + I gg - 0x00268b44, // n0x01a4 c0x0000 (---------------) + I ggee - 0x17e36e42, // n0x01a5 c0x005f (n0x08b4-n0x08b9) + I gh - 0x18200442, // n0x01a6 c0x0060 (n0x08b9-n0x08bf) + I gi - 0x0030f704, // n0x01a7 c0x0000 (---------------) + I gift - 0x0030f705, // n0x01a8 c0x0000 (---------------) + I gifts - 0x002b9bc5, // n0x01a9 c0x0000 (---------------) + I gives - 0x00213586, // n0x01aa c0x0000 (---------------) + I giving - 0x18629902, // n0x01ab c0x0061 (n0x08bf-n0x08c4) + I gl - 0x0034da85, // n0x01ac c0x0000 (---------------) + I glass - 0x00274303, // n0x01ad c0x0000 (---------------) + I gle - 0x00389c06, // n0x01ae c0x0000 (---------------) + I global - 0x0038a445, // n0x01af c0x0000 (---------------) + I globo - 0x002047c2, // n0x01b0 c0x0000 (---------------) + I gm - 0x00323145, // n0x01b1 c0x0000 (---------------) + I gmail - 0x00208443, // n0x01b2 c0x0000 (---------------) + I gmo - 0x0020a643, // n0x01b3 c0x0000 (---------------) + I gmx - 0x18a050c2, // n0x01b4 c0x0062 (n0x08c4-n0x08ca) + I gn - 0x00238a84, // n0x01b5 c0x0000 (---------------) + I gold - 0x00238a89, // n0x01b6 c0x0000 (---------------) + I goldpoint - 0x0025d184, // n0x01b7 c0x0000 (---------------) + I golf - 0x0028c883, // n0x01b8 c0x0000 (---------------) + I goo - 0x00330c48, // n0x01b9 c0x0000 (---------------) + I goodyear - 0x0028c884, // n0x01ba c0x0000 (---------------) + I goog - 0x0028c886, // n0x01bb c0x0000 (---------------) + I google - 0x0028e783, // n0x01bc c0x0000 (---------------) + I gop - 0x0020bec3, // n0x01bd c0x0000 (---------------) + I got - 0x0020bec4, // n0x01be c0x0000 (---------------) + I gotv - 0x0021e283, // n0x01bf c0x0000 (---------------) + I gov - 0x18ece142, // n0x01c0 c0x0063 (n0x08ca-n0x08d0) + I gp - 0x0034f382, // n0x01c1 c0x0000 (---------------) + I gq - 0x1920dc82, // n0x01c2 c0x0064 (n0x08d0-n0x08d6) + I gr - 0x002ff248, // n0x01c3 c0x0000 (---------------) + I grainger - 0x00341188, // n0x01c4 c0x0000 (---------------) + I graphics - 0x0037d046, // n0x01c5 c0x0000 (---------------) + I gratis - 0x0025b105, // n0x01c6 c0x0000 (---------------) + I green - 0x0021dd45, // n0x01c7 c0x0000 (---------------) + I gripe - 0x002646c5, // n0x01c8 c0x0000 (---------------) + I group - 0x0026cd02, // n0x01c9 c0x0000 (---------------) + I gs - 0x19651202, // n0x01ca c0x0065 (n0x08d6-n0x08dd) + I gt - 0x01629702, // n0x01cb c0x0005 (---------------)* o I gu - 0x0025f6c5, // n0x01cc c0x0000 (---------------) + I gucci - 0x002ca244, // n0x01cd c0x0000 (---------------) + I guge - 0x00229705, // n0x01ce c0x0000 (---------------) + I guide - 0x0022d647, // n0x01cf c0x0000 (---------------) + I guitars - 0x0025bc44, // n0x01d0 c0x0000 (---------------) + I guru - 0x00204b82, // n0x01d1 c0x0000 (---------------) + I gw - 0x19a25a02, // n0x01d2 c0x0066 (n0x08dd-n0x08e0) + I gy - 0x0038a2c7, // n0x01d3 c0x0000 (---------------) + I hamburg - 0x00392287, // n0x01d4 c0x0000 (---------------) + I hangout - 0x00329884, // n0x01d5 c0x0000 (---------------) + I haus - 0x00235cc8, // n0x01d6 c0x0000 (---------------) + I hdfcbank - 0x00205e06, // n0x01d7 c0x0000 (---------------) + I health - 0x00205e0a, // n0x01d8 c0x0000 (---------------) + I healthcare - 0x00205204, // n0x01d9 c0x0000 (---------------) + I help - 0x00209408, // n0x01da c0x0000 (---------------) + I helsinki - 0x0023f784, // n0x01db c0x0000 (---------------) + I here - 0x00219446, // n0x01dc c0x0000 (---------------) + I hermes - 0x00280244, // n0x01dd c0x0000 (---------------) + I hgtv - 0x0032cd06, // n0x01de c0x0000 (---------------) + I hiphop - 0x0028d547, // n0x01df c0x0000 (---------------) + I hitachi - 0x0025f603, // n0x01e0 c0x0000 (---------------) + I hiv - 0x19e2ea02, // n0x01e1 c0x0067 (n0x08e0-n0x08f8) + I hk - 0x0025ab03, // n0x01e2 c0x0000 (---------------) + I hkt - 0x00206182, // n0x01e3 c0x0000 (---------------) + I hm - 0x1a217542, // n0x01e4 c0x0068 (n0x08f8-n0x08fe) + I hn - 0x002cd886, // n0x01e5 c0x0000 (---------------) + I hockey - 0x0034b148, // n0x01e6 c0x0000 (---------------) + I holdings - 0x00290807, // n0x01e7 c0x0000 (---------------) + I holiday - 0x002b8e89, // n0x01e8 c0x0000 (---------------) + I homedepot - 0x00291385, // n0x01e9 c0x0000 (---------------) + I homes - 0x00292005, // n0x01ea c0x0000 (---------------) + I honda - 0x00293c05, // n0x01eb c0x0000 (---------------) + I horse - 0x00202fc4, // n0x01ec c0x0000 (---------------) + I host - 0x002836c7, // n0x01ed c0x0000 (---------------) + I hosting - 0x00294947, // n0x01ee c0x0000 (---------------) + I hoteles - 0x00294fc7, // n0x01ef c0x0000 (---------------) + I hotmail - 0x0021da05, // n0x01f0 c0x0000 (---------------) + I house - 0x00297383, // n0x01f1 c0x0000 (---------------) + I how - 0x1a625842, // n0x01f2 c0x0069 (n0x08fe-n0x0903) + I hr - 0x002dbf04, // n0x01f3 c0x0000 (---------------) + I hsbc - 0x1aa36e82, // n0x01f4 c0x006a (n0x0903-n0x0914) + I ht - 0x00249003, // n0x01f5 c0x0000 (---------------) + I htc - 0x1ae17d42, // n0x01f6 c0x006b (n0x0914-n0x0934) + I hu - 0x0031b7c3, // n0x01f7 c0x0000 (---------------) + I ibm - 0x0028bf44, // n0x01f8 c0x0000 (---------------) + I icbc - 0x00200b43, // n0x01f9 c0x0000 (---------------) + I ice - 0x0033c383, // n0x01fa c0x0000 (---------------) + I icu - 0x1b206202, // n0x01fb c0x006c (n0x0934-n0x093f) + I id - 0x1ba00e82, // n0x01fc c0x006e (n0x0940-n0x0942) + I ie - 0x00370d03, // n0x01fd c0x0000 (---------------) + I ifm - 0x0031cac5, // n0x01fe c0x0000 (---------------) + I iinet - 0x1be036c2, // n0x01ff c0x006f (n0x0942-n0x0943)* o I il - 0x1c603582, // n0x0200 c0x0071 (n0x0944-n0x094b) + I im - 0x002f4284, // n0x0201 c0x0000 (---------------) + I imdb - 0x00203584, // n0x0202 c0x0000 (---------------) + I immo - 0x0020358a, // n0x0203 c0x0000 (---------------) + I immobilien - 0x1ce00242, // n0x0204 c0x0073 (n0x094d-n0x095a) + I in - 0x00353eca, // n0x0205 c0x0000 (---------------) + I industries - 0x00355408, // n0x0206 c0x0000 (---------------) + I infiniti - 0x1d200304, // n0x0207 c0x0074 (n0x095a-n0x0964) + I info - 0x0020dc03, // n0x0208 c0x0000 (---------------) + I ing - 0x00209503, // n0x0209 c0x0000 (---------------) + I ink - 0x002ed209, // n0x020a c0x0000 (---------------) + I institute - 0x002806c9, // n0x020b c0x0000 (---------------) + I insurance - 0x002e8406, // n0x020c c0x0000 (---------------) + I insure - 0x1d638c03, // n0x020d c0x0075 (n0x0964-n0x0965) + I int - 0x002dd88d, // n0x020e c0x0000 (---------------) + I international - 0x002087cb, // n0x020f c0x0000 (---------------) + I investments - 0x1da00042, // n0x0210 c0x0076 (n0x0965-n0x0968) + I io - 0x00331048, // n0x0211 c0x0000 (---------------) + I ipiranga - 0x1de11142, // n0x0212 c0x0077 (n0x0968-n0x096e) + I iq - 0x1e200542, // n0x0213 c0x0078 (n0x096e-n0x0977) + I ir - 0x00294c05, // n0x0214 c0x0000 (---------------) + I irish - 0x1e602b42, // n0x0215 c0x0079 (n0x0977-n0x097f) + I is - 0x00370f07, // n0x0216 c0x0000 (---------------) + I iselect - 0x00202b43, // n0x0217 c0x0000 (---------------) + I ist - 0x00210c48, // n0x0218 c0x0000 (---------------) + I istanbul - 0x1ea06e82, // n0x0219 c0x007a (n0x097f-n0x0af0) + I it - 0x00206e84, // n0x021a c0x0000 (---------------) + I itau - 0x003664c3, // n0x021b c0x0000 (---------------) + I iwc - 0x002a51c6, // n0x021c c0x0000 (---------------) + I jaguar - 0x0030ad84, // n0x021d c0x0000 (---------------) + I java - 0x00243883, // n0x021e c0x0000 (---------------) + I jcb - 0x0025b3c3, // n0x021f c0x0000 (---------------) + I jcp - 0x1ee01f82, // n0x0220 c0x007b (n0x0af0-n0x0af3) + I je - 0x0033ab85, // n0x0221 c0x0000 (---------------) + I jetzt - 0x0034f487, // n0x0222 c0x0000 (---------------) + I jewelry - 0x00266583, // n0x0223 c0x0000 (---------------) + I jio - 0x00297c83, // n0x0224 c0x0000 (---------------) + I jlc - 0x00297e43, // n0x0225 c0x0000 (---------------) + I jll - 0x01697f02, // n0x0226 c0x0005 (---------------)* o I jm - 0x00297f03, // n0x0227 c0x0000 (---------------) + I jmp - 0x002987c3, // n0x0228 c0x0000 (---------------) + I jnj - 0x1f202982, // n0x0229 c0x007c (n0x0af3-n0x0afb) + I jo - 0x002a5d04, // n0x022a c0x0000 (---------------) + I jobs - 0x00389ac6, // n0x022b c0x0000 (---------------) + I joburg - 0x00203903, // n0x022c c0x0000 (---------------) + I jot - 0x00298c43, // n0x022d c0x0000 (---------------) + I joy - 0x1f6990c2, // n0x022e c0x007d (n0x0afb-n0x0b6a) + I jp - 0x002990c8, // n0x022f c0x0000 (---------------) + I jpmorgan - 0x0029ccc4, // n0x0230 c0x0000 (---------------) + I jprs - 0x002faec6, // n0x0231 c0x0000 (---------------) + I juegos - 0x002e6846, // n0x0232 c0x0000 (---------------) + I kaufen - 0x00233fc4, // n0x0233 c0x0000 (---------------) + I kddi - 0x2d201002, // n0x0234 c0x00b4 (n0x11fe-n0x11ff)* o I ke - 0x002a6f4b, // n0x0235 c0x0000 (---------------) + I kerryhotels - 0x0021268e, // n0x0236 c0x0000 (---------------) + I kerrylogistics - 0x0021810f, // n0x0237 c0x0000 (---------------) + I kerryproperties - 0x00235e83, // n0x0238 c0x0000 (---------------) + I kfh - 0x2daa3fc2, // n0x0239 c0x00b6 (n0x1200-n0x1206) + I kg - 0x016176c2, // n0x023a c0x0005 (---------------)* o I kh - 0x2de01b02, // n0x023b c0x00b7 (n0x1206-n0x120d) + I ki - 0x0027d603, // n0x023c c0x0000 (---------------) + I kim - 0x002f33c6, // n0x023d c0x0000 (---------------) + I kinder - 0x00227886, // n0x023e c0x0000 (---------------) + I kindle - 0x00298f07, // n0x023f c0x0000 (---------------) + I kitchen - 0x002d2dc4, // n0x0240 c0x0000 (---------------) + I kiwi - 0x2e268d82, // n0x0241 c0x00b8 (n0x120d-n0x121e) + I km - 0x2e656942, // n0x0242 c0x00b9 (n0x121e-n0x1222) + I kn - 0x0021f385, // n0x0243 c0x0000 (---------------) + I koeln - 0x002be447, // n0x0244 c0x0000 (---------------) + I komatsu - 0x2ea08382, // n0x0245 c0x00ba (n0x1222-n0x1228) + I kp - 0x00208384, // n0x0246 c0x0000 (---------------) + I kpmg - 0x00360183, // n0x0247 c0x0000 (---------------) + I kpn - 0x2ee034c2, // n0x0248 c0x00bb (n0x1228-n0x1246) + I kr - 0x0033a003, // n0x0249 c0x0000 (---------------) + I krd - 0x0029d8c4, // n0x024a c0x0000 (---------------) + I kred - 0x002a3f09, // n0x024b c0x0000 (---------------) + I kuokgroup - 0x016ac642, // n0x024c c0x0005 (---------------)* o I kw - 0x2f229082, // n0x024d c0x00bc (n0x1246-n0x124b) + I ky - 0x002568c6, // n0x024e c0x0000 (---------------) + I kyknet - 0x002acb05, // n0x024f c0x0000 (---------------) + I kyoto - 0x2f6f0002, // n0x0250 c0x00bd (n0x124b-n0x1251) + I kz - 0x2fa01e42, // n0x0251 c0x00be (n0x1251-n0x125a) + I la - 0x003276c7, // n0x0252 c0x0000 (---------------) + I lacaixa - 0x0033df4b, // n0x0253 c0x0000 (---------------) + I lamborghini - 0x002335c9, // n0x0254 c0x0000 (---------------) + I lancaster - 0x002364c4, // n0x0255 c0x0000 (---------------) + I land - 0x0036d989, // n0x0256 c0x0000 (---------------) + I landrover - 0x002679c7, // n0x0257 c0x0000 (---------------) + I lasalle - 0x00222143, // n0x0258 c0x0000 (---------------) + I lat - 0x002c18c7, // n0x0259 c0x0000 (---------------) + I latrobe - 0x00253883, // n0x025a c0x0000 (---------------) + I law - 0x00270406, // n0x025b c0x0000 (---------------) + I lawyer - 0x2fe0a542, // n0x025c c0x00bf (n0x125a-n0x125f) + I lb - 0x302339c2, // n0x025d c0x00c0 (n0x125f-n0x1265) + I lc - 0x0021fbc3, // n0x025e c0x0000 (---------------) + I lds - 0x00267b05, // n0x025f c0x0000 (---------------) + I lease - 0x0025f307, // n0x0260 c0x0000 (---------------) + I leclerc - 0x00362985, // n0x0261 c0x0000 (---------------) + I legal - 0x002ad945, // n0x0262 c0x0000 (---------------) + I lexus - 0x002ce984, // n0x0263 c0x0000 (---------------) + I lgbt - 0x306008c2, // n0x0264 c0x00c1 (n0x1265-n0x1266) + I li - 0x002ee607, // n0x0265 c0x0000 (---------------) + I liaison - 0x002aadc4, // n0x0266 c0x0000 (---------------) + I lidl - 0x00247844, // n0x0267 c0x0000 (---------------) + I life - 0x0031c64d, // n0x0268 c0x0000 (---------------) + I lifeinsurance - 0x00247849, // n0x0269 c0x0000 (---------------) + I lifestyle - 0x00236dc8, // n0x026a c0x0000 (---------------) + I lighting - 0x00261684, // n0x026b c0x0000 (---------------) + I like - 0x002edc87, // n0x026c c0x0000 (---------------) + I limited - 0x002ee1c4, // n0x026d c0x0000 (---------------) + I limo - 0x00251e07, // n0x026e c0x0000 (---------------) + I lincoln - 0x0031dc05, // n0x026f c0x0000 (---------------) + I linde - 0x0031e2c4, // n0x0270 c0x0000 (---------------) + I link - 0x002bfc05, // n0x0271 c0x0000 (---------------) + I lipsy - 0x0024b384, // n0x0272 c0x0000 (---------------) + I live - 0x002d7785, // n0x0273 c0x0000 (---------------) + I lixil - 0x30a08342, // n0x0274 c0x00c2 (n0x1266-n0x1275) + I lk - 0x0020ab84, // n0x0275 c0x0000 (---------------) + I loan - 0x0020ab85, // n0x0276 c0x0000 (---------------) + I loans - 0x0020af86, // n0x0277 c0x0000 (---------------) + I locker - 0x00362ac5, // n0x0278 c0x0000 (---------------) + I locus - 0x002c1ec3, // n0x0279 c0x0000 (---------------) + I lol - 0x00340906, // n0x027a c0x0000 (---------------) + I london - 0x00364385, // n0x027b c0x0000 (---------------) + I lotte - 0x00206505, // n0x027c c0x0000 (---------------) + I lotto - 0x002123c4, // n0x027d c0x0000 (---------------) + I love - 0x30e76e02, // n0x027e c0x00c3 (n0x1275-n0x127a) + I lr - 0x31202d42, // n0x027f c0x00c4 (n0x127a-n0x127c) + I ls - 0x31605ec2, // n0x0280 c0x00c5 (n0x127c-n0x127e) + I lt - 0x003413c3, // n0x0281 c0x0000 (---------------) + I ltd - 0x003413c4, // n0x0282 c0x0000 (---------------) + I ltda - 0x31a071c2, // n0x0283 c0x00c6 (n0x127e-n0x127f) + I lu - 0x0036be05, // n0x0284 c0x0000 (---------------) + I lupin - 0x00222d84, // n0x0285 c0x0000 (---------------) + I luxe - 0x00225dc6, // n0x0286 c0x0000 (---------------) + I luxury - 0x31e27f02, // n0x0287 c0x00c7 (n0x127f-n0x1288) + I lv - 0x32228b42, // n0x0288 c0x00c8 (n0x1288-n0x1291) + I ly - 0x32604302, // n0x0289 c0x00c9 (n0x1291-n0x1297) + I ma - 0x00300a86, // n0x028a c0x0000 (---------------) + I madrid - 0x0032a984, // n0x028b c0x0000 (---------------) + I maif - 0x0033c9c6, // n0x028c c0x0000 (---------------) + I maison - 0x0026a746, // n0x028d c0x0000 (---------------) + I makeup - 0x00206903, // n0x028e c0x0000 (---------------) + I man - 0x00351aca, // n0x028f c0x0000 (---------------) + I management - 0x0022a685, // n0x0290 c0x0000 (---------------) + I mango - 0x0029bcc6, // n0x0291 c0x0000 (---------------) + I market - 0x00357049, // n0x0292 c0x0000 (---------------) + I marketing - 0x0029bcc7, // n0x0293 c0x0000 (---------------) + I markets - 0x0027c808, // n0x0294 c0x0000 (---------------) + I marriott - 0x00271143, // n0x0295 c0x0000 (---------------) + I mba - 0x32a3a6c2, // n0x0296 c0x00ca (n0x1297-n0x1299) + I mc - 0x32e38602, // n0x0297 c0x00cb (n0x1299-n0x129a) + I md - 0x33208942, // n0x0298 c0x00cc (n0x129a-n0x12a2) + I me - 0x002dc385, // n0x0299 c0x0000 (---------------) + I media - 0x00282f44, // n0x029a c0x0000 (---------------) + I meet - 0x0020fe89, // n0x029b c0x0000 (---------------) + I melbourne - 0x003121c4, // n0x029c c0x0000 (---------------) + I meme - 0x002edac8, // n0x029d c0x0000 (---------------) + I memorial - 0x00208943, // n0x029e c0x0000 (---------------) + I men - 0x0034d804, // n0x029f c0x0000 (---------------) + I menu - 0x0023a883, // n0x02a0 c0x0000 (---------------) + I meo - 0x0031c587, // n0x02a1 c0x0000 (---------------) + I metlife - 0x33608402, // n0x02a2 c0x00cd (n0x12a2-n0x12aa) + I mg - 0x00249282, // n0x02a3 c0x0000 (---------------) + I mh - 0x002322c5, // n0x02a4 c0x0000 (---------------) + I miami - 0x00257ec9, // n0x02a5 c0x0000 (---------------) + I microsoft - 0x0023fa03, // n0x02a6 c0x0000 (---------------) + I mil - 0x0026b344, // n0x02a7 c0x0000 (---------------) + I mini - 0x00246f03, // n0x02a8 c0x0000 (---------------) + I mit - 0x33b56d82, // n0x02a9 c0x00ce (n0x12aa-n0x12b2) + I mk - 0x33e0ab42, // n0x02aa c0x00cf (n0x12b2-n0x12b9) + I ml - 0x002afd83, // n0x02ab c0x0000 (---------------) + I mlb - 0x00358b83, // n0x02ac c0x0000 (---------------) + I mls - 0x016035c2, // n0x02ad c0x0005 (---------------)* o I mm - 0x003679c3, // n0x02ae c0x0000 (---------------) + I mma - 0x34217082, // n0x02af c0x00d0 (n0x12b9-n0x12bd) + I mn - 0x00217084, // n0x02b0 c0x0000 (---------------) + I mnet - 0x34603602, // n0x02b1 c0x00d1 (n0x12bd-n0x12c2) + I mo - 0x00203604, // n0x02b2 c0x0000 (---------------) + I mobi - 0x002cc406, // n0x02b3 c0x0000 (---------------) + I mobily - 0x00208484, // n0x02b4 c0x0000 (---------------) + I moda - 0x002fb2c3, // n0x02b5 c0x0000 (---------------) + I moe - 0x0038f703, // n0x02b6 c0x0000 (---------------) + I moi - 0x0021cfc3, // n0x02b7 c0x0000 (---------------) + I mom - 0x00230c46, // n0x02b8 c0x0000 (---------------) + I monash - 0x002b6185, // n0x02b9 c0x0000 (---------------) + I money - 0x00261909, // n0x02ba c0x0000 (---------------) + I montblanc - 0x002b60c6, // n0x02bb c0x0000 (---------------) + I mormon - 0x002b66c8, // n0x02bc c0x0000 (---------------) + I mortgage - 0x002b68c6, // n0x02bd c0x0000 (---------------) + I moscow - 0x0025cb84, // n0x02be c0x0000 (---------------) + I moto - 0x0028678b, // n0x02bf c0x0000 (---------------) + I motorcycles - 0x002b8403, // n0x02c0 c0x0000 (---------------) + I mov - 0x002b8405, // n0x02c1 c0x0000 (---------------) + I movie - 0x002b8548, // n0x02c2 c0x0000 (---------------) + I movistar - 0x00214902, // n0x02c3 c0x0000 (---------------) + I mp - 0x003279c2, // n0x02c4 c0x0000 (---------------) + I mq - 0x34adcb42, // n0x02c5 c0x00d2 (n0x12c2-n0x12c4) + I mr - 0x34e09282, // n0x02c6 c0x00d3 (n0x12c4-n0x12c9) + I ms - 0x35259642, // n0x02c7 c0x00d4 (n0x12c9-n0x12cd) + I mt - 0x00259643, // n0x02c8 c0x0000 (---------------) + I mtn - 0x002b8844, // n0x02c9 c0x0000 (---------------) + I mtpc - 0x002b9703, // n0x02ca c0x0000 (---------------) + I mtr - 0x35a000c2, // n0x02cb c0x00d6 (n0x12ce-n0x12d5) + I mu - 0x002bae0b, // n0x02cc c0x0000 (---------------) + I multichoice - 0x35ebd646, // n0x02cd c0x00d7 (n0x12d5-n0x14f9) + I museum - 0x0036d306, // n0x02ce c0x0000 (---------------) + I mutual - 0x002bdc88, // n0x02cf c0x0000 (---------------) + I mutuelle - 0x3624ffc2, // n0x02d0 c0x00d8 (n0x14f9-n0x1507) + I mv - 0x3660a142, // n0x02d1 c0x00d9 (n0x1507-n0x1512) + I mw - 0x36a0a682, // n0x02d2 c0x00da (n0x1512-n0x1518) + I mx - 0x36e20282, // n0x02d3 c0x00db (n0x1518-n0x1520) + I my - 0x372c6c02, // n0x02d4 c0x00dc (n0x1520-n0x1521)* o I mz - 0x002c6c0b, // n0x02d5 c0x0000 (---------------) + I mzansimagic - 0x37600282, // n0x02d6 c0x00dd (n0x1521-n0x1532) + I na - 0x002f3845, // n0x02d7 c0x0000 (---------------) + I nadex - 0x0032b206, // n0x02d8 c0x0000 (---------------) + I nagoya - 0x37a98944, // n0x02d9 c0x00de (n0x1532-n0x1534) + I name - 0x0030cfc7, // n0x02da c0x0000 (---------------) + I naspers - 0x00240dc6, // n0x02db c0x0000 (---------------) + I natura - 0x0037fe44, // n0x02dc c0x0000 (---------------) + I navy - 0x3861c742, // n0x02dd c0x00e1 (n0x1536-n0x1537) + I nc - 0x00201082, // n0x02de c0x0000 (---------------) + I ne - 0x00305e83, // n0x02df c0x0000 (---------------) + I nec - 0x38a170c3, // n0x02e0 c0x00e2 (n0x1537-n0x1568) + I net - 0x002efe87, // n0x02e1 c0x0000 (---------------) + I netbank - 0x002d7687, // n0x02e2 c0x0000 (---------------) + I netflix - 0x00241a47, // n0x02e3 c0x0000 (---------------) + I network - 0x00319107, // n0x02e4 c0x0000 (---------------) + I neustar - 0x0021a383, // n0x02e5 c0x0000 (---------------) + I new - 0x00366d44, // n0x02e6 c0x0000 (---------------) + I news - 0x00210044, // n0x02e7 c0x0000 (---------------) + I next - 0x00352aca, // n0x02e8 c0x0000 (---------------) + I nextdirect - 0x00255985, // n0x02e9 c0x0000 (---------------) + I nexus - 0x39e00342, // n0x02ea c0x00e7 (n0x1570-n0x157a) + I nf - 0x3a201282, // n0x02eb c0x00e8 (n0x157a-n0x1583) + I ng - 0x00202303, // n0x02ec c0x0000 (---------------) + I ngo - 0x0025aac3, // n0x02ed c0x0000 (---------------) + I nhk - 0x01603d42, // n0x02ee c0x0005 (---------------)* o I ni - 0x00369044, // n0x02ef c0x0000 (---------------) + I nico - 0x00204c45, // n0x02f0 c0x0000 (---------------) + I nikon - 0x002bbfc5, // n0x02f1 c0x0000 (---------------) + I ninja - 0x0029c346, // n0x02f2 c0x0000 (---------------) + I nissan - 0x3aa36482, // n0x02f3 c0x00ea (n0x1584-n0x1587) + I nl - 0x3ae00c02, // n0x02f4 c0x00eb (n0x1587-n0x185d) + I no - 0x00201b85, // n0x02f5 c0x0000 (---------------) + I nokia - 0x0036d012, // n0x02f6 c0x0000 (---------------) + I northwesternmutual - 0x00204546, // n0x02f7 c0x0000 (---------------) + I norton - 0x0021c343, // n0x02f8 c0x0000 (---------------) + I now - 0x0036a0c6, // n0x02f9 c0x0000 (---------------) + I nowruz - 0x0030b645, // n0x02fa c0x0000 (---------------) + I nowtv - 0x0160a2c2, // n0x02fb c0x0005 (---------------)* o I np - 0x43209e82, // n0x02fc c0x010c (n0x1885-n0x188c) + I nr - 0x002cc1c3, // n0x02fd c0x0000 (---------------) + I nra - 0x00345903, // n0x02fe c0x0000 (---------------) + I nrw - 0x00361083, // n0x02ff c0x0000 (---------------) + I ntt - 0x43605bc2, // n0x0300 c0x010d (n0x188c-n0x188f) + I nu - 0x00223403, // n0x0301 c0x0000 (---------------) + I nyc - 0x43a078c2, // n0x0302 c0x010e (n0x188f-n0x189f) + I nz - 0x00203643, // n0x0303 c0x0000 (---------------) + I obi - 0x002a5d48, // n0x0304 c0x0000 (---------------) + I observer - 0x00219c46, // n0x0305 c0x0000 (---------------) + I office - 0x003954c7, // n0x0306 c0x0000 (---------------) + I okinawa - 0x002a2686, // n0x0307 c0x0000 (---------------) + I olayan - 0x002a268b, // n0x0308 c0x0000 (---------------) + I olayangroup - 0x002dbd04, // n0x0309 c0x0000 (---------------) + I ollo - 0x44200082, // n0x030a c0x0110 (n0x18a0-n0x18a9) + I om - 0x0036bc85, // n0x030b c0x0000 (---------------) + I omega - 0x0021a343, // n0x030c c0x0000 (---------------) + I one - 0x00292c83, // n0x030d c0x0000 (---------------) + I ong - 0x003023c3, // n0x030e c0x0000 (---------------) + I onl - 0x003023c6, // n0x030f c0x0000 (---------------) + I online - 0x0027b9c3, // n0x0310 c0x0000 (---------------) + I ooo - 0x0032d686, // n0x0311 c0x0000 (---------------) + I oracle - 0x002a6246, // n0x0312 c0x0000 (---------------) + I orange - 0x4461dcc3, // n0x0313 c0x0111 (n0x18a9-n0x18e3) + I org - 0x00299187, // n0x0314 c0x0000 (---------------) + I organic - 0x0029a9cd, // n0x0315 c0x0000 (---------------) + I orientexpress - 0x002864c5, // n0x0316 c0x0000 (---------------) + I osaka - 0x00239506, // n0x0317 c0x0000 (---------------) + I otsuka - 0x00206543, // n0x0318 c0x0000 (---------------) + I ott - 0x00389e43, // n0x0319 c0x0000 (---------------) + I ovh - 0x45e052c2, // n0x031a c0x0117 (n0x1920-n0x192b) + I pa - 0x00310fc4, // n0x031b c0x0000 (---------------) + I page - 0x002fb60c, // n0x031c c0x0000 (---------------) + I pamperedchef - 0x0022c007, // n0x031d c0x0000 (---------------) + I panerai - 0x0025b445, // n0x031e c0x0000 (---------------) + I paris - 0x0028f504, // n0x031f c0x0000 (---------------) + I pars - 0x00297f88, // n0x0320 c0x0000 (---------------) + I partners - 0x002c2085, // n0x0321 c0x0000 (---------------) + I parts - 0x002a2905, // n0x0322 c0x0000 (---------------) + I party - 0x002a4109, // n0x0323 c0x0000 (---------------) + I passagens - 0x002ab584, // n0x0324 c0x0000 (---------------) + I payu - 0x002b88c4, // n0x0325 c0x0000 (---------------) + I pccw - 0x46214942, // n0x0326 c0x0118 (n0x192b-n0x1933) + I pe - 0x0021ab43, // n0x0327 c0x0000 (---------------) + I pet - 0x46764f42, // n0x0328 c0x0119 (n0x1933-n0x1936) + I pf - 0x016bf182, // n0x0329 c0x0005 (---------------)* o I pg - 0x46a8f0c2, // n0x032a c0x011a (n0x1936-n0x193e) + I ph - 0x002dc948, // n0x032b c0x0000 (---------------) + I pharmacy - 0x002bfb47, // n0x032c c0x0000 (---------------) + I philips - 0x0028f0c5, // n0x032d c0x0000 (---------------) + I photo - 0x002c014b, // n0x032e c0x0000 (---------------) + I photography - 0x002bea86, // n0x032f c0x0000 (---------------) + I photos - 0x002c0346, // n0x0330 c0x0000 (---------------) + I physio - 0x002c04c6, // n0x0331 c0x0000 (---------------) + I piaget - 0x0021ec04, // n0x0332 c0x0000 (---------------) + I pics - 0x002c0a46, // n0x0333 c0x0000 (---------------) + I pictet - 0x002c0fc8, // n0x0334 c0x0000 (---------------) + I pictures - 0x0022c6c3, // n0x0335 c0x0000 (---------------) + I pid - 0x00243743, // n0x0336 c0x0000 (---------------) + I pin - 0x00243744, // n0x0337 c0x0000 (---------------) + I ping - 0x002c1c84, // n0x0338 c0x0000 (---------------) + I pink - 0x002c3cc5, // n0x0339 c0x0000 (---------------) + I pizza - 0x46ec3e02, // n0x033a c0x011b (n0x193e-n0x194c) + I pk - 0x47201e02, // n0x033b c0x011c (n0x194c-n0x19f1) + I pl - 0x00201e05, // n0x033c c0x0000 (---------------) + I place - 0x00290d44, // n0x033d c0x0000 (---------------) + I play - 0x002c61cb, // n0x033e c0x0000 (---------------) + I playstation - 0x002c7948, // n0x033f c0x0000 (---------------) + I plumbing - 0x002c7b84, // n0x0340 c0x0000 (---------------) + I plus - 0x002083c2, // n0x0341 c0x0000 (---------------) + I pm - 0x47a3df82, // n0x0342 c0x011e (n0x1a20-n0x1a25) + I pn - 0x0029a743, // n0x0343 c0x0000 (---------------) + I pnc - 0x002c7fc4, // n0x0344 c0x0000 (---------------) + I pohl - 0x002c80c5, // n0x0345 c0x0000 (---------------) + I poker - 0x002c9d84, // n0x0346 c0x0000 (---------------) + I porn - 0x002b31c4, // n0x0347 c0x0000 (---------------) + I post - 0x47e18242, // n0x0348 c0x011f (n0x1a25-n0x1a32) + I pr - 0x0025da85, // n0x0349 c0x0000 (---------------) + I praxi - 0x0029abc5, // n0x034a c0x0000 (---------------) + I press - 0x002cad45, // n0x034b c0x0000 (---------------) + I prime - 0x48218243, // n0x034c c0x0120 (n0x1a32-n0x1a39) + I pro - 0x002cbe44, // n0x034d c0x0000 (---------------) + I prod - 0x002cbe4b, // n0x034e c0x0000 (---------------) + I productions - 0x002cc284, // n0x034f c0x0000 (---------------) + I prof - 0x002cca85, // n0x0350 c0x0000 (---------------) + I promo - 0x0021824a, // n0x0351 c0x0000 (---------------) + I properties - 0x002cce48, // n0x0352 c0x0000 (---------------) + I property - 0x002cd04a, // n0x0353 c0x0000 (---------------) + I protection - 0x4861dc02, // n0x0354 c0x0121 (n0x1a39-n0x1a40) + I ps - 0x48a95982, // n0x0355 c0x0122 (n0x1a40-n0x1a49) + I pt - 0x00296543, // n0x0356 c0x0000 (---------------) + I pub - 0x48f8ae42, // n0x0357 c0x0123 (n0x1a49-n0x1a4f) + I pw - 0x492be202, // n0x0358 c0x0124 (n0x1a4f-n0x1a56) + I py - 0x496fd8c2, // n0x0359 c0x0125 (n0x1a56-n0x1a5f) + I qa - 0x002ce804, // n0x035a c0x0000 (---------------) + I qpon - 0x00211186, // n0x035b c0x0000 (---------------) + I quebec - 0x00222685, // n0x035c c0x0000 (---------------) + I quest - 0x00301a06, // n0x035d c0x0000 (---------------) + I racing - 0x49a030c2, // n0x035e c0x0126 (n0x1a5f-n0x1a63) + I re - 0x0033d884, // n0x035f c0x0000 (---------------) + I read - 0x0032e0c7, // n0x0360 c0x0000 (---------------) + I realtor - 0x0036b3c6, // n0x0361 c0x0000 (---------------) + I realty - 0x00307487, // n0x0362 c0x0000 (---------------) + I recipes - 0x00230683, // n0x0363 c0x0000 (---------------) + I red - 0x0029d908, // n0x0364 c0x0000 (---------------) + I redstone - 0x003237cb, // n0x0365 c0x0000 (---------------) + I redumbrella - 0x002730c5, // n0x0366 c0x0000 (---------------) + I rehab - 0x002e8505, // n0x0367 c0x0000 (---------------) + I reise - 0x002e8506, // n0x0368 c0x0000 (---------------) + I reisen - 0x002a45c4, // n0x0369 c0x0000 (---------------) + I reit - 0x00365b48, // n0x036a c0x0000 (---------------) + I reliance - 0x00210403, // n0x036b c0x0000 (---------------) + I ren - 0x00210404, // n0x036c c0x0000 (---------------) + I rent - 0x00210407, // n0x036d c0x0000 (---------------) + I rentals - 0x002117c6, // n0x036e c0x0000 (---------------) + I repair - 0x0030ea86, // n0x036f c0x0000 (---------------) + I report - 0x002964ca, // n0x0370 c0x0000 (---------------) + I republican - 0x00237dc4, // n0x0371 c0x0000 (---------------) + I rest - 0x003386ca, // n0x0372 c0x0000 (---------------) + I restaurant - 0x0031bd06, // n0x0373 c0x0000 (---------------) + I review - 0x0031bd07, // n0x0374 c0x0000 (---------------) + I reviews - 0x00243007, // n0x0375 c0x0000 (---------------) + I rexroth - 0x002614c4, // n0x0376 c0x0000 (---------------) + I rich - 0x002614c9, // n0x0377 c0x0000 (---------------) + I richardli - 0x0024ea05, // n0x0378 c0x0000 (---------------) + I ricoh - 0x00228f83, // n0x0379 c0x0000 (---------------) + I ril - 0x0022ad03, // n0x037a c0x0000 (---------------) + I rio - 0x0021dd83, // n0x037b c0x0000 (---------------) + I rip - 0x49e00d82, // n0x037c c0x0127 (n0x1a63-n0x1a6f) + I ro - 0x0028e886, // n0x037d c0x0000 (---------------) + I rocher - 0x00297105, // n0x037e c0x0000 (---------------) + I rocks - 0x002c1b45, // n0x037f c0x0000 (---------------) + I rodeo - 0x0023a144, // n0x0380 c0x0000 (---------------) + I room - 0x4a2060c2, // n0x0381 c0x0128 (n0x1a6f-n0x1a76) + I rs - 0x00324a84, // n0x0382 c0x0000 (---------------) + I rsvp - 0x4a6044c2, // n0x0383 c0x0129 (n0x1a76-n0x1afa) + I ru - 0x0024f144, // n0x0384 c0x0000 (---------------) + I ruhr - 0x002044c3, // n0x0385 c0x0000 (---------------) + I run - 0x4ab0d882, // n0x0386 c0x012a (n0x1afa-n0x1b03) + I rw - 0x0031d103, // n0x0387 c0x0000 (---------------) + I rwe - 0x00289606, // n0x0388 c0x0000 (---------------) + I ryukyu - 0x4ae01a02, // n0x0389 c0x012b (n0x1b03-n0x1b0b) + I sa - 0x00272608, // n0x038a c0x0000 (---------------) + I saarland - 0x00234784, // n0x038b c0x0000 (---------------) + I safe - 0x00234786, // n0x038c c0x0000 (---------------) + I safety - 0x002f4d46, // n0x038d c0x0000 (---------------) + I sakura - 0x00244b04, // n0x038e c0x0000 (---------------) + I sale - 0x00340885, // n0x038f c0x0000 (---------------) + I salon - 0x00395107, // n0x0390 c0x0000 (---------------) + I samsung - 0x0029c407, // n0x0391 c0x0000 (---------------) + I sandvik - 0x0029c40f, // n0x0392 c0x0000 (---------------) + I sandvikcoromant - 0x002098c6, // n0x0393 c0x0000 (---------------) + I sanofi - 0x00210583, // n0x0394 c0x0000 (---------------) + I sap - 0x00210584, // n0x0395 c0x0000 (---------------) + I sapo - 0x0021d684, // n0x0396 c0x0000 (---------------) + I sarl - 0x002275c3, // n0x0397 c0x0000 (---------------) + I sas - 0x00219584, // n0x0398 c0x0000 (---------------) + I save - 0x002332c4, // n0x0399 c0x0000 (---------------) + I saxo - 0x4b2046c2, // n0x039a c0x012c (n0x1b0b-n0x1b10) + I sb - 0x00277ac3, // n0x039b c0x0000 (---------------) + I sbi - 0x002350c3, // n0x039c c0x0000 (---------------) + I sbs - 0x4b600982, // n0x039d c0x012d (n0x1b10-n0x1b15) + I sc - 0x00229183, // n0x039e c0x0000 (---------------) + I sca - 0x00355d83, // n0x039f c0x0000 (---------------) + I scb - 0x00206107, // n0x03a0 c0x0000 (---------------) + I schmidt - 0x0023514c, // n0x03a1 c0x0000 (---------------) + I scholarships - 0x00235406, // n0x03a2 c0x0000 (---------------) + I school - 0x002c39c6, // n0x03a3 c0x0000 (---------------) + I schule - 0x00370987, // n0x03a4 c0x0000 (---------------) + I schwarz - 0x00223b07, // n0x03a5 c0x0000 (---------------) + I science - 0x00212fc4, // n0x03a6 c0x0000 (---------------) + I scor - 0x00237984, // n0x03a7 c0x0000 (---------------) + I scot - 0x4ba4f842, // n0x03a8 c0x012e (n0x1b15-n0x1b1d) + I sd - 0x4be02e82, // n0x03a9 c0x012f (n0x1b1d-n0x1b46) + I se - 0x003004c4, // n0x03aa c0x0000 (---------------) + I seat - 0x00223f88, // n0x03ab c0x0000 (---------------) + I security - 0x00267bc4, // n0x03ac c0x0000 (---------------) + I seek - 0x002ba785, // n0x03ad c0x0000 (---------------) + I sener - 0x00243bc8, // n0x03ae c0x0000 (---------------) + I services - 0x002476c3, // n0x03af c0x0000 (---------------) + I sew - 0x0029acc3, // n0x03b0 c0x0000 (---------------) + I sex - 0x0029acc4, // n0x03b1 c0x0000 (---------------) + I sexy - 0x4c262dc2, // n0x03b2 c0x0130 (n0x1b46-n0x1b4d) + I sg - 0x4c6001c2, // n0x03b3 c0x0131 (n0x1b4d-n0x1b53) + I sh - 0x00255e05, // n0x03b4 c0x0000 (---------------) + I sharp - 0x00256344, // n0x03b5 c0x0000 (---------------) + I shaw - 0x00208c04, // n0x03b6 c0x0000 (---------------) + I shia - 0x002cb1c7, // n0x03b7 c0x0000 (---------------) + I shiksha - 0x00369905, // n0x03b8 c0x0000 (---------------) + I shoes - 0x002b0e86, // n0x03b9 c0x0000 (---------------) + I shouji - 0x002b3884, // n0x03ba c0x0000 (---------------) + I show - 0x002b6b87, // n0x03bb c0x0000 (---------------) + I shriram - 0x4ca09182, // n0x03bc c0x0132 (n0x1b53-n0x1b54) + I si - 0x0036b904, // n0x03bd c0x0000 (---------------) + I silk - 0x002914c4, // n0x03be c0x0000 (---------------) + I sina - 0x00274247, // n0x03bf c0x0000 (---------------) + I singles - 0x00242b84, // n0x03c0 c0x0000 (---------------) + I site - 0x0022e942, // n0x03c1 c0x0000 (---------------) + I sj - 0x4ce07b42, // n0x03c2 c0x0133 (n0x1b54-n0x1b55) + I sk - 0x00207b43, // n0x03c3 c0x0000 (---------------) + I ski - 0x002f3384, // n0x03c4 c0x0000 (---------------) + I skin - 0x00229043, // n0x03c5 c0x0000 (---------------) + I sky - 0x00229045, // n0x03c6 c0x0000 (---------------) + I skype - 0x4d212582, // n0x03c7 c0x0134 (n0x1b55-n0x1b5a) + I sl - 0x0023f582, // n0x03c8 c0x0000 (---------------) + I sm - 0x0034b305, // n0x03c9 c0x0000 (---------------) + I smile - 0x4d610b02, // n0x03ca c0x0135 (n0x1b5a-n0x1b62) + I sn - 0x00310444, // n0x03cb c0x0000 (---------------) + I sncf - 0x4da01102, // n0x03cc c0x0136 (n0x1b62-n0x1b65) + I so - 0x00240a06, // n0x03cd c0x0000 (---------------) + I soccer - 0x002c27c6, // n0x03ce c0x0000 (---------------) + I social - 0x00258008, // n0x03cf c0x0000 (---------------) + I softbank - 0x002a6c88, // n0x03d0 c0x0000 (---------------) + I software - 0x002de604, // n0x03d1 c0x0000 (---------------) + I sohu - 0x002d0205, // n0x03d2 c0x0000 (---------------) + I solar - 0x002d9149, // n0x03d3 c0x0000 (---------------) + I solutions - 0x00364504, // n0x03d4 c0x0000 (---------------) + I song - 0x002bc184, // n0x03d5 c0x0000 (---------------) + I sony - 0x00207fc3, // n0x03d6 c0x0000 (---------------) + I soy - 0x002101c5, // n0x03d7 c0x0000 (---------------) + I space - 0x00379247, // n0x03d8 c0x0000 (---------------) + I spiegel - 0x00236a04, // n0x03d9 c0x0000 (---------------) + I spot - 0x0033d80d, // n0x03da c0x0000 (---------------) + I spreadbetting - 0x002ceec2, // n0x03db c0x0000 (---------------) + I sr - 0x002ceec3, // n0x03dc c0x0000 (---------------) + I srl - 0x4de023c2, // n0x03dd c0x0137 (n0x1b65-n0x1b71) + I st - 0x0035bf05, // n0x03de c0x0000 (---------------) + I stada - 0x00232444, // n0x03df c0x0000 (---------------) + I star - 0x003191c7, // n0x03e0 c0x0000 (---------------) + I starhub - 0x002b1889, // n0x03e1 c0x0000 (---------------) + I statebank - 0x0029ca07, // n0x03e2 c0x0000 (---------------) + I statoil - 0x00264603, // n0x03e3 c0x0000 (---------------) + I stc - 0x00264608, // n0x03e4 c0x0000 (---------------) + I stcgroup - 0x00259f09, // n0x03e5 c0x0000 (---------------) + I stockholm - 0x002cf147, // n0x03e6 c0x0000 (---------------) + I storage - 0x002cf4c5, // n0x03e7 c0x0000 (---------------) + I store - 0x002cfc86, // n0x03e8 c0x0000 (---------------) + I studio - 0x002cfe05, // n0x03e9 c0x0000 (---------------) + I study - 0x00247945, // n0x03ea c0x0000 (---------------) + I style - 0x4e203a42, // n0x03eb c0x0138 (n0x1b71-n0x1b91) + I su - 0x002f0b45, // n0x03ec c0x0000 (---------------) + I sucks - 0x002acd0a, // n0x03ed c0x0000 (---------------) + I supersport - 0x002b49c8, // n0x03ee c0x0000 (---------------) + I supplies - 0x002cccc6, // n0x03ef c0x0000 (---------------) + I supply - 0x00243e87, // n0x03f0 c0x0000 (---------------) + I support - 0x00287c84, // n0x03f1 c0x0000 (---------------) + I surf - 0x00330647, // n0x03f2 c0x0000 (---------------) + I surgery - 0x002d2f46, // n0x03f3 c0x0000 (---------------) + I suzuki - 0x4e61d0c2, // n0x03f4 c0x0139 (n0x1b91-n0x1b96) + I sv - 0x0020ac86, // n0x03f5 c0x0000 (---------------) + I swatch - 0x002d6685, // n0x03f6 c0x0000 (---------------) + I swiss - 0x4ead6b42, // n0x03f7 c0x013a (n0x1b96-n0x1b97) + I sx - 0x4ee84ec2, // n0x03f8 c0x013b (n0x1b97-n0x1b9d) + I sy - 0x00368086, // n0x03f9 c0x0000 (---------------) + I sydney - 0x0029d448, // n0x03fa c0x0000 (---------------) + I symantec - 0x00392447, // n0x03fb c0x0000 (---------------) + I systems - 0x4f207582, // n0x03fc c0x013c (n0x1b9d-n0x1ba0) + I sz - 0x0020c083, // n0x03fd c0x0000 (---------------) + I tab - 0x00382f46, // n0x03fe c0x0000 (---------------) + I taipei - 0x00216944, // n0x03ff c0x0000 (---------------) + I talk - 0x003879c6, // n0x0400 c0x0000 (---------------) + I taobao - 0x0031cbca, // n0x0401 c0x0000 (---------------) + I tatamotors - 0x0031df05, // n0x0402 c0x0000 (---------------) + I tatar - 0x0020f886, // n0x0403 c0x0000 (---------------) + I tattoo - 0x00217c43, // n0x0404 c0x0000 (---------------) + I tax - 0x00217c44, // n0x0405 c0x0000 (---------------) + I taxi - 0x0020ad42, // n0x0406 c0x0000 (---------------) + I tc - 0x002f4203, // n0x0407 c0x0000 (---------------) + I tci - 0x4f600682, // n0x0408 c0x013d (n0x1ba0-n0x1ba1) + I td - 0x002c9803, // n0x0409 c0x0000 (---------------) + I tdk - 0x00354144, // n0x040a c0x0000 (---------------) + I team - 0x0029d584, // n0x040b c0x0000 (---------------) + I tech - 0x0029d58a, // n0x040c c0x0000 (---------------) + I technology - 0x0022ba83, // n0x040d c0x0000 (---------------) + I tel - 0x002734c8, // n0x040e c0x0000 (---------------) + I telecity - 0x00250a0a, // n0x040f c0x0000 (---------------) + I telefonica - 0x00325507, // n0x0410 c0x0000 (---------------) + I temasek - 0x002dab46, // n0x0411 c0x0000 (---------------) + I tennis - 0x0033f0c4, // n0x0412 c0x0000 (---------------) + I teva - 0x0027e202, // n0x0413 c0x0000 (---------------) + I tf - 0x0021e342, // n0x0414 c0x0000 (---------------) + I tg - 0x4fa01d82, // n0x0415 c0x013e (n0x1ba1-n0x1ba8) + I th - 0x00235c83, // n0x0416 c0x0000 (---------------) + I thd - 0x002f9147, // n0x0417 c0x0000 (---------------) + I theater - 0x00242d87, // n0x0418 c0x0000 (---------------) + I theatre - 0x00377f8b, // n0x0419 c0x0000 (---------------) + I theguardian - 0x00340707, // n0x041a c0x0000 (---------------) + I tickets - 0x0021bb06, // n0x041b c0x0000 (---------------) + I tienda - 0x00375107, // n0x041c c0x0000 (---------------) + I tiffany - 0x00354984, // n0x041d c0x0000 (---------------) + I tips - 0x00355585, // n0x041e c0x0000 (---------------) + I tires - 0x002a4985, // n0x041f c0x0000 (---------------) + I tirol - 0x4fe02bc2, // n0x0420 c0x013f (n0x1ba8-n0x1bb7) + I tj - 0x0023a7c2, // n0x0421 c0x0000 (---------------) + I tk - 0x5020fc42, // n0x0422 c0x0140 (n0x1bb7-n0x1bb8) + I tl - 0x50608902, // n0x0423 c0x0141 (n0x1bb8-n0x1bc0) + I tm - 0x0026a9c5, // n0x0424 c0x0000 (---------------) + I tmall - 0x50a1d1c2, // n0x0425 c0x0142 (n0x1bc0-n0x1bd4) + I tn - 0x50e01682, // n0x0426 c0x0143 (n0x1bd4-n0x1bda) + I to - 0x00312e85, // n0x0427 c0x0000 (---------------) + I today - 0x00316545, // n0x0428 c0x0000 (---------------) + I tokyo - 0x0020f945, // n0x0429 c0x0000 (---------------) + I tools - 0x002469c3, // n0x042a c0x0000 (---------------) + I top - 0x00338cc5, // n0x042b c0x0000 (---------------) + I toray - 0x002beb47, // n0x042c c0x0000 (---------------) + I toshiba - 0x00339905, // n0x042d c0x0000 (---------------) + I tours - 0x0021abc4, // n0x042e c0x0000 (---------------) + I town - 0x00338906, // n0x042f c0x0000 (---------------) + I toyota - 0x00247b04, // n0x0430 c0x0000 (---------------) + I toys - 0x00285142, // n0x0431 c0x0000 (---------------) + I tp - 0x51202402, // n0x0432 c0x0144 (n0x1bda-n0x1bef) + I tr - 0x00229a45, // n0x0433 c0x0000 (---------------) + I trade - 0x0028fe07, // n0x0434 c0x0000 (---------------) + I trading - 0x002b9748, // n0x0435 c0x0000 (---------------) + I training - 0x0027f186, // n0x0436 c0x0000 (---------------) + I travel - 0x0027f18d, // n0x0437 c0x0000 (---------------) + I travelchannel - 0x00280489, // n0x0438 c0x0000 (---------------) + I travelers - 0x00280492, // n0x0439 c0x0000 (---------------) + I travelersinsurance - 0x00313185, // n0x043a c0x0000 (---------------) + I trust - 0x0034a4c3, // n0x043b c0x0000 (---------------) + I trv - 0x51e06582, // n0x043c c0x0147 (n0x1bf1-n0x1c02) + I tt - 0x0035a104, // n0x043d c0x0000 (---------------) + I tube - 0x002d71c3, // n0x043e c0x0000 (---------------) + I tui - 0x002d83c5, // n0x043f c0x0000 (---------------) + I tunes - 0x002d8e45, // n0x0440 c0x0000 (---------------) + I tushu - 0x5220bf42, // n0x0441 c0x0148 (n0x1c02-n0x1c06) + I tv - 0x0020bf43, // n0x0442 c0x0000 (---------------) + I tvs - 0x52641ac2, // n0x0443 c0x0149 (n0x1c06-n0x1c14) + I tw - 0x52a17142, // n0x0444 c0x014a (n0x1c14-n0x1c20) + I tz - 0x52e17d82, // n0x0445 c0x014b (n0x1c20-n0x1c6e) + I ua - 0x0032ba03, // n0x0446 c0x0000 (---------------) + I ubs - 0x53205082, // n0x0447 c0x014c (n0x1c6e-n0x1c77) + I ug - 0x5360cf02, // n0x0448 c0x014d (n0x1c77-n0x1c82) + I uk - 0x0029f04a, // n0x0449 c0x0000 (---------------) + I university - 0x00203a83, // n0x044a c0x0000 (---------------) + I uno - 0x00245543, // n0x044b c0x0000 (---------------) + I uol - 0x002c16c3, // n0x044c c0x0000 (---------------) + I ups - 0x54209f42, // n0x044d c0x0150 (n0x1c84-n0x1cc3) + I us - 0x62606842, // n0x044e c0x0189 (n0x1d66-n0x1d6c) + I uy - 0x62e018c2, // n0x044f c0x018b (n0x1d6d-n0x1d71) + I uz - 0x002013c2, // n0x0450 c0x0000 (---------------) + I va - 0x00340209, // n0x0451 c0x0000 (---------------) + I vacations - 0x002aba84, // n0x0452 c0x0000 (---------------) + I vana - 0x6334a542, // n0x0453 c0x018c (n0x1d71-n0x1d77) + I vc - 0x636014c2, // n0x0454 c0x018d (n0x1d77-n0x1d88) + I ve - 0x0027d4c5, // n0x0455 c0x0000 (---------------) + I vegas - 0x00227248, // n0x0456 c0x0000 (---------------) + I ventures - 0x002d998c, // n0x0457 c0x0000 (---------------) + I versicherung - 0x0022b9c3, // n0x0458 c0x0000 (---------------) + I vet - 0x0024ad42, // n0x0459 c0x0000 (---------------) + I vg - 0x63a13602, // n0x045a c0x018e (n0x1d88-n0x1d8d) + I vi - 0x002b4346, // n0x045b c0x0000 (---------------) + I viajes - 0x002db9c5, // n0x045c c0x0000 (---------------) + I video - 0x002b1403, // n0x045d c0x0000 (---------------) + I vig - 0x002c7686, // n0x045e c0x0000 (---------------) + I viking - 0x002dbb06, // n0x045f c0x0000 (---------------) + I villas - 0x00213603, // n0x0460 c0x0000 (---------------) + I vin - 0x002dc703, // n0x0461 c0x0000 (---------------) + I vip - 0x002dd146, // n0x0462 c0x0000 (---------------) + I virgin - 0x00248b46, // n0x0463 c0x0000 (---------------) + I vision - 0x002b85c5, // n0x0464 c0x0000 (---------------) + I vista - 0x002dd6ca, // n0x0465 c0x0000 (---------------) + I vistaprint - 0x0022cf04, // n0x0466 c0x0000 (---------------) + I viva - 0x00332eca, // n0x0467 c0x0000 (---------------) + I vlaanderen - 0x63e08102, // n0x0468 c0x018f (n0x1d8d-n0x1d9a) + I vn - 0x002716c5, // n0x0469 c0x0000 (---------------) + I vodka - 0x002e0c8a, // n0x046a c0x0000 (---------------) + I volkswagen - 0x002e2484, // n0x046b c0x0000 (---------------) + I vote - 0x002e2586, // n0x046c c0x0000 (---------------) + I voting - 0x002e2704, // n0x046d c0x0000 (---------------) + I voto - 0x0030c486, // n0x046e c0x0000 (---------------) + I voyage - 0x6421d102, // n0x046f c0x0190 (n0x1d9a-n0x1d9e) + I vu - 0x002a4e86, // n0x0470 c0x0000 (---------------) + I vuelos - 0x0036cbc5, // n0x0471 c0x0000 (---------------) + I wales - 0x0038b0c6, // n0x0472 c0x0000 (---------------) + I walter - 0x003578c4, // n0x0473 c0x0000 (---------------) + I wang - 0x003578c7, // n0x0474 c0x0000 (---------------) + I wanggou - 0x00351a06, // n0x0475 c0x0000 (---------------) + I warman - 0x0020acc5, // n0x0476 c0x0000 (---------------) + I watch - 0x00293647, // n0x0477 c0x0000 (---------------) + I watches - 0x00384107, // n0x0478 c0x0000 (---------------) + I weather - 0x0038410e, // n0x0479 c0x0000 (---------------) + I weatherchannel - 0x00219fc6, // n0x047a c0x0000 (---------------) + I webcam - 0x00251cc5, // n0x047b c0x0000 (---------------) + I weber - 0x002af047, // n0x047c c0x0000 (---------------) + I website - 0x002d4bc3, // n0x047d c0x0000 (---------------) + I wed - 0x0031c007, // n0x047e c0x0000 (---------------) + I wedding - 0x003912c5, // n0x047f c0x0000 (---------------) + I weibo - 0x0020a184, // n0x0480 c0x0000 (---------------) + I weir - 0x0021f7c2, // n0x0481 c0x0000 (---------------) + I wf - 0x002c7207, // n0x0482 c0x0000 (---------------) + I whoswho - 0x002d2e44, // n0x0483 c0x0000 (---------------) + I wien - 0x0025a484, // n0x0484 c0x0000 (---------------) + I wiki - 0x0024910b, // n0x0485 c0x0000 (---------------) + I williamhill - 0x00213c83, // n0x0486 c0x0000 (---------------) + I win - 0x002b6a07, // n0x0487 c0x0000 (---------------) + I windows - 0x00213c84, // n0x0488 c0x0000 (---------------) + I wine - 0x00231fc3, // n0x0489 c0x0000 (---------------) + I wme - 0x00241b04, // n0x048a c0x0000 (---------------) + I work - 0x0029b085, // n0x048b c0x0000 (---------------) + I works - 0x00314905, // n0x048c c0x0000 (---------------) + I world - 0x6460ba82, // n0x048d c0x0191 (n0x1d9e-n0x1da5) + I ws - 0x002e34c3, // n0x048e c0x0000 (---------------) + I wtc - 0x002e3b03, // n0x048f c0x0000 (---------------) + I wtf - 0x0020a6c4, // n0x0490 c0x0000 (---------------) + I xbox - 0x0020a785, // n0x0491 c0x0000 (---------------) + I xerox - 0x00217cc6, // n0x0492 c0x0000 (---------------) + I xihuan - 0x00356e83, // n0x0493 c0x0000 (---------------) + I xin - 0x002358cb, // n0x0494 c0x0000 (---------------) + I xn--11b4c3d - 0x0023d74b, // n0x0495 c0x0000 (---------------) + I xn--1ck2e1b - 0x00291d4b, // n0x0496 c0x0000 (---------------) + I xn--1qqw23a - 0x002bfeca, // n0x0497 c0x0000 (---------------) + I xn--30rr7y - 0x0033588b, // n0x0498 c0x0000 (---------------) + I xn--3bst00m - 0x003942cb, // n0x0499 c0x0000 (---------------) + I xn--3ds443g - 0x0039658c, // n0x049a c0x0000 (---------------) + I xn--3e0b707e - 0x00397251, // n0x049b c0x0000 (---------------) + I xn--3oq18vl8pn36a - 0x002e480a, // n0x049c c0x0000 (---------------) + I xn--3pxu8k - 0x002e4bcb, // n0x049d c0x0000 (---------------) + I xn--42c2d9a - 0x002e4e8b, // n0x049e c0x0000 (---------------) + I xn--45brj9c - 0x002e6d4a, // n0x049f c0x0000 (---------------) + I xn--45q11c - 0x002e780a, // n0x04a0 c0x0000 (---------------) + I xn--4gbrim - 0x002e8b8e, // n0x04a1 c0x0000 (---------------) + I xn--54b7fta0cc - 0x002e9e4b, // n0x04a2 c0x0000 (---------------) + I xn--55qw42g - 0x002ea10a, // n0x04a3 c0x0000 (---------------) + I xn--55qx5d - 0x002eb14a, // n0x04a4 c0x0000 (---------------) + I xn--5tzm5g - 0x002eb64b, // n0x04a5 c0x0000 (---------------) + I xn--6frz82g - 0x002ebb8e, // n0x04a6 c0x0000 (---------------) + I xn--6qq986b3xl - 0x002ec6cc, // n0x04a7 c0x0000 (---------------) + I xn--80adxhks - 0x002ecb4b, // n0x04a8 c0x0000 (---------------) + I xn--80ao21a - 0x002ece0c, // n0x04a9 c0x0000 (---------------) + I xn--80asehdb - 0x002f108a, // n0x04aa c0x0000 (---------------) + I xn--80aswg - 0x002f228c, // n0x04ab c0x0000 (---------------) + I xn--8y0a063a - 0x64af258a, // n0x04ac c0x0192 (n0x1da5-n0x1dab) + I xn--90a3ac - 0x002f5849, // n0x04ad c0x0000 (---------------) + I xn--90ais - 0x002f664a, // n0x04ae c0x0000 (---------------) + I xn--9dbq2a - 0x002f68ca, // n0x04af c0x0000 (---------------) + I xn--9et52u - 0x002f6b4b, // n0x04b0 c0x0000 (---------------) + I xn--9krt00a - 0x002fa44e, // n0x04b1 c0x0000 (---------------) + I xn--b4w605ferd - 0x002fa7d1, // n0x04b2 c0x0000 (---------------) + I xn--bck1b9a5dre4c - 0x00303289, // n0x04b3 c0x0000 (---------------) + I xn--c1avg - 0x003034ca, // n0x04b4 c0x0000 (---------------) + I xn--c2br7g - 0x00303e0b, // n0x04b5 c0x0000 (---------------) + I xn--cck2b3b - 0x0030618a, // n0x04b6 c0x0000 (---------------) + I xn--cg4bki - 0x00306d16, // n0x04b7 c0x0000 (---------------) + I xn--clchc0ea0b2g2a9gcd - 0x003091cb, // n0x04b8 c0x0000 (---------------) + I xn--czr694b - 0x0030a9ca, // n0x04b9 c0x0000 (---------------) + I xn--czrs0t - 0x0030d48a, // n0x04ba c0x0000 (---------------) + I xn--czru2d - 0x0030f2cb, // n0x04bb c0x0000 (---------------) + I xn--d1acj3b - 0x003125c9, // n0x04bc c0x0000 (---------------) + I xn--d1alf - 0x0031508d, // n0x04bd c0x0000 (---------------) + I xn--eckvdtc9d - 0x003167cb, // n0x04be c0x0000 (---------------) + I xn--efvy88h - 0x003178cb, // n0x04bf c0x0000 (---------------) + I xn--estv75g - 0x0031828b, // n0x04c0 c0x0000 (---------------) + I xn--fct429k - 0x00319909, // n0x04c1 c0x0000 (---------------) + I xn--fhbei - 0x00319f4e, // n0x04c2 c0x0000 (---------------) + I xn--fiq228c5hs - 0x0031a48a, // n0x04c3 c0x0000 (---------------) + I xn--fiq64b - 0x0031ec0a, // n0x04c4 c0x0000 (---------------) + I xn--fiqs8s - 0x0031f0ca, // n0x04c5 c0x0000 (---------------) + I xn--fiqz9s - 0x0031fa8b, // n0x04c6 c0x0000 (---------------) + I xn--fjq720a - 0x003202cb, // n0x04c7 c0x0000 (---------------) + I xn--flw351e - 0x0032058d, // n0x04c8 c0x0000 (---------------) + I xn--fpcrj9c3d - 0x00321e0d, // n0x04c9 c0x0000 (---------------) + I xn--fzc2c9e2c - 0x00322dd0, // n0x04ca c0x0000 (---------------) + I xn--fzys8d69uvgm - 0x0032328b, // n0x04cb c0x0000 (---------------) + I xn--g2xx48c - 0x00323ecc, // n0x04cc c0x0000 (---------------) + I xn--gckr3f0f - 0x0032434b, // n0x04cd c0x0000 (---------------) + I xn--gecrj9c - 0x0032880b, // n0x04ce c0x0000 (---------------) + I xn--h2brj9c - 0x0032f14b, // n0x04cf c0x0000 (---------------) + I xn--hxt814e - 0x0032fbcf, // n0x04d0 c0x0000 (---------------) + I xn--i1b6b1a6a2e - 0x0032ff8b, // n0x04d1 c0x0000 (---------------) + I xn--imr513n - 0x0033080a, // n0x04d2 c0x0000 (---------------) + I xn--io0a7i - 0x00331249, // n0x04d3 c0x0000 (---------------) + I xn--j1aef - 0x003315c9, // n0x04d4 c0x0000 (---------------) + I xn--j1amh - 0x0033198b, // n0x04d5 c0x0000 (---------------) + I xn--j6w193g - 0x00331c4e, // n0x04d6 c0x0000 (---------------) + I xn--jlq61u9w7b - 0x0033354b, // n0x04d7 c0x0000 (---------------) + I xn--jvr189m - 0x0033444f, // n0x04d8 c0x0000 (---------------) + I xn--kcrx77d1x4a - 0x00337d8b, // n0x04d9 c0x0000 (---------------) + I xn--kprw13d - 0x0033804b, // n0x04da c0x0000 (---------------) + I xn--kpry57d - 0x0033830b, // n0x04db c0x0000 (---------------) + I xn--kpu716f - 0x00338e0a, // n0x04dc c0x0000 (---------------) + I xn--kput3i - 0x0033db49, // n0x04dd c0x0000 (---------------) + I xn--l1acc - 0x00344dcf, // n0x04de c0x0000 (---------------) + I xn--lgbbat1ad8j - 0x0034978c, // n0x04df c0x0000 (---------------) + I xn--mgb2ddes - 0x00349c8c, // n0x04e0 c0x0000 (---------------) + I xn--mgb9awbf - 0x0034a18e, // n0x04e1 c0x0000 (---------------) + I xn--mgba3a3ejt - 0x0034a88f, // n0x04e2 c0x0000 (---------------) + I xn--mgba3a4f16a - 0x0034ac4e, // n0x04e3 c0x0000 (---------------) + I xn--mgba3a4fra - 0x0034b750, // n0x04e4 c0x0000 (---------------) + I xn--mgba7c0bbn0a - 0x0034bb4e, // n0x04e5 c0x0000 (---------------) + I xn--mgbaam7a8h - 0x0034c10c, // n0x04e6 c0x0000 (---------------) + I xn--mgbab2bd - 0x0034c412, // n0x04e7 c0x0000 (---------------) + I xn--mgbai9a5eva00b - 0x0034f091, // n0x04e8 c0x0000 (---------------) + I xn--mgbai9azgqp6j - 0x0034f64e, // n0x04e9 c0x0000 (---------------) + I xn--mgbayh7gpa - 0x0034fa8e, // n0x04ea c0x0000 (---------------) + I xn--mgbb9fbpob - 0x0034ffce, // n0x04eb c0x0000 (---------------) + I xn--mgbbh1a71e - 0x0035034f, // n0x04ec c0x0000 (---------------) + I xn--mgbc0a9azcg - 0x00350713, // n0x04ed c0x0000 (---------------) + I xn--mgberp4a5d4a87g - 0x00350bd1, // n0x04ee c0x0000 (---------------) + I xn--mgberp4a5d4ar - 0x0035100c, // n0x04ef c0x0000 (---------------) + I xn--mgbpl2fh - 0x00351453, // n0x04f0 c0x0000 (---------------) + I xn--mgbqly7c0a67fbc - 0x00352310, // n0x04f1 c0x0000 (---------------) + I xn--mgbqly7cvafr - 0x00352e0c, // n0x04f2 c0x0000 (---------------) + I xn--mgbt3dhd - 0x0035310c, // n0x04f3 c0x0000 (---------------) + I xn--mgbtf8fl - 0x003535cb, // n0x04f4 c0x0000 (---------------) + I xn--mgbtx2b - 0x0035588e, // n0x04f5 c0x0000 (---------------) + I xn--mgbx4cd0ab - 0x00355e8b, // n0x04f6 c0x0000 (---------------) + I xn--mix082f - 0x003564cb, // n0x04f7 c0x0000 (---------------) + I xn--mix891f - 0x0035728c, // n0x04f8 c0x0000 (---------------) + I xn--mk1bu44c - 0x0035c6ca, // n0x04f9 c0x0000 (---------------) + I xn--mxtq1m - 0x0035ca8c, // n0x04fa c0x0000 (---------------) + I xn--ngbc5azd - 0x0035cd8c, // n0x04fb c0x0000 (---------------) + I xn--ngbe9e0a - 0x0035f64b, // n0x04fc c0x0000 (---------------) + I xn--nnx388a - 0x0035f908, // n0x04fd c0x0000 (---------------) + I xn--node - 0x00360249, // n0x04fe c0x0000 (---------------) + I xn--nqv7f - 0x0036024f, // n0x04ff c0x0000 (---------------) + I xn--nqv7fs00ema - 0x00361f8b, // n0x0500 c0x0000 (---------------) + I xn--nyqy26a - 0x003633ca, // n0x0501 c0x0000 (---------------) + I xn--o3cw4h - 0x00364d8c, // n0x0502 c0x0000 (---------------) + I xn--ogbpf8fl - 0x00366089, // n0x0503 c0x0000 (---------------) + I xn--p1acf - 0x00366308, // n0x0504 c0x0000 (---------------) + I xn--p1ai - 0x00366f8b, // n0x0505 c0x0000 (---------------) + I xn--pbt977c - 0x003676cb, // n0x0506 c0x0000 (---------------) + I xn--pgbs0dh - 0x00368a8a, // n0x0507 c0x0000 (---------------) + I xn--pssy2u - 0x00368d0b, // n0x0508 c0x0000 (---------------) + I xn--q9jyb4c - 0x0036944c, // n0x0509 c0x0000 (---------------) + I xn--qcka1pmc - 0x0036a988, // n0x050a c0x0000 (---------------) + I xn--qxam - 0x0037230b, // n0x050b c0x0000 (---------------) + I xn--rhqv96g - 0x00374d8b, // n0x050c c0x0000 (---------------) + I xn--rovu88b - 0x0037824b, // n0x050d c0x0000 (---------------) + I xn--s9brj9c - 0x00379a8b, // n0x050e c0x0000 (---------------) + I xn--ses554g - 0x00383c8b, // n0x050f c0x0000 (---------------) + I xn--t60b56a - 0x00383f49, // n0x0510 c0x0000 (---------------) + I xn--tckwe - 0x00387fca, // n0x0511 c0x0000 (---------------) + I xn--unup4y - 0x00388f17, // n0x0512 c0x0000 (---------------) + I xn--vermgensberater-ctb - 0x0038a918, // n0x0513 c0x0000 (---------------) + I xn--vermgensberatung-pwb - 0x0038dcc9, // n0x0514 c0x0000 (---------------) + I xn--vhquv - 0x0038f00b, // n0x0515 c0x0000 (---------------) + I xn--vuq861b - 0x0038fb94, // n0x0516 c0x0000 (---------------) + I xn--w4r85el8fhu5dnra - 0x0039034a, // n0x0517 c0x0000 (---------------) + I xn--wgbh1c - 0x0039090a, // n0x0518 c0x0000 (---------------) + I xn--wgbl6a - 0x00390b8b, // n0x0519 c0x0000 (---------------) + I xn--xhq521b - 0x00391a90, // n0x051a c0x0000 (---------------) + I xn--xkc2al3hye2a - 0x00391e91, // n0x051b c0x0000 (---------------) + I xn--xkc2dl3a5ee0h - 0x0039290a, // n0x051c c0x0000 (---------------) + I xn--y9a3aq - 0x003938cd, // n0x051d c0x0000 (---------------) + I xn--yfro4i67o - 0x00393fcd, // n0x051e c0x0000 (---------------) + I xn--ygbi2ammx - 0x0039688b, // n0x051f c0x0000 (---------------) + I xn--zfr164b - 0x00397046, // n0x0520 c0x0000 (---------------) + I xperia - 0x003971c3, // n0x0521 c0x0000 (---------------) + I xxx - 0x0029ad43, // n0x0522 c0x0000 (---------------) + I xyz - 0x00269586, // n0x0523 c0x0000 (---------------) + I yachts - 0x0027b905, // n0x0524 c0x0000 (---------------) + I yahoo - 0x002151c7, // n0x0525 c0x0000 (---------------) + I yamaxun - 0x00326dc6, // n0x0526 c0x0000 (---------------) + I yandex - 0x01614d82, // n0x0527 c0x0005 (---------------)* o I ye - 0x002e3609, // n0x0528 c0x0000 (---------------) + I yodobashi - 0x00301804, // n0x0529 c0x0000 (---------------) + I yoga - 0x0032b5c8, // n0x052a c0x0000 (---------------) + I yokohama - 0x00235bc3, // n0x052b c0x0000 (---------------) + I you - 0x0035a047, // n0x052c c0x0000 (---------------) + I youtube - 0x0022f542, // n0x052d c0x0000 (---------------) + I yt - 0x00201943, // n0x052e c0x0000 (---------------) + I yun - 0x64e043c2, // n0x052f c0x0193 (n0x1dab-n0x1dbc) o I za - 0x002b3106, // n0x0530 c0x0000 (---------------) + I zappos - 0x002b3c84, // n0x0531 c0x0000 (---------------) + I zara - 0x00311384, // n0x0532 c0x0000 (---------------) + I zero - 0x0023b443, // n0x0533 c0x0000 (---------------) + I zip - 0x0023b445, // n0x0534 c0x0000 (---------------) + I zippo - 0x016e4582, // n0x0535 c0x0005 (---------------)* o I zm - 0x002c7ec4, // n0x0536 c0x0000 (---------------) + I zone - 0x00261407, // n0x0537 c0x0000 (---------------) + I zuerich - 0x016a0202, // n0x0538 c0x0005 (---------------)* o I zw - 0x00222ac3, // n0x0539 c0x0000 (---------------) + I com - 0x002d75c3, // n0x053a c0x0000 (---------------) + I edu - 0x0021e283, // n0x053b c0x0000 (---------------) + I gov - 0x0023fa03, // n0x053c c0x0000 (---------------) + I mil - 0x002170c3, // n0x053d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x053e c0x0000 (---------------) + I org - 0x00207cc3, // n0x053f c0x0000 (---------------) + I nom - 0x00201e82, // n0x0540 c0x0000 (---------------) + I ac - 0x000e4188, // n0x0541 c0x0000 (---------------) + blogspot - 0x00200742, // n0x0542 c0x0000 (---------------) + I co - 0x0021e283, // n0x0543 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x0544 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0545 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0546 c0x0000 (---------------) + I org - 0x00206103, // n0x0547 c0x0000 (---------------) + I sch - 0x002ffad6, // n0x0548 c0x0000 (---------------) + I accident-investigation - 0x00301f93, // n0x0549 c0x0000 (---------------) + I accident-prevention - 0x00340589, // n0x054a c0x0000 (---------------) + I aerobatic - 0x002751c8, // n0x054b c0x0000 (---------------) + I aeroclub - 0x0036bb09, // n0x054c c0x0000 (---------------) + I aerodrome - 0x002e0e06, // n0x054d c0x0000 (---------------) + I agents - 0x0032cf10, // n0x054e c0x0000 (---------------) + I air-surveillance - 0x00211893, // n0x054f c0x0000 (---------------) + I air-traffic-control - 0x002fb3c8, // n0x0550 c0x0000 (---------------) + I aircraft - 0x00262307, // n0x0551 c0x0000 (---------------) + I airline - 0x00266e47, // n0x0552 c0x0000 (---------------) + I airport - 0x0028bd4a, // n0x0553 c0x0000 (---------------) + I airtraffic - 0x003541c9, // n0x0554 c0x0000 (---------------) + I ambulance - 0x00309f89, // n0x0555 c0x0000 (---------------) + I amusement - 0x002bbacb, // n0x0556 c0x0000 (---------------) + I association - 0x002f8406, // n0x0557 c0x0000 (---------------) + I author - 0x002ed6ca, // n0x0558 c0x0000 (---------------) + I ballooning - 0x00218046, // n0x0559 c0x0000 (---------------) + I broker - 0x00301403, // n0x055a c0x0000 (---------------) + I caa - 0x002dc1c5, // n0x055b c0x0000 (---------------) + I cargo - 0x003246c8, // n0x055c c0x0000 (---------------) + I catering - 0x00240acd, // n0x055d c0x0000 (---------------) + I certification - 0x0032cacc, // n0x055e c0x0000 (---------------) + I championship - 0x0036c887, // n0x055f c0x0000 (---------------) + I charter - 0x00328a8d, // n0x0560 c0x0000 (---------------) + I civilaviation - 0x002752c4, // n0x0561 c0x0000 (---------------) + I club - 0x0022498a, // n0x0562 c0x0000 (---------------) + I conference - 0x002255ca, // n0x0563 c0x0000 (---------------) + I consultant - 0x00225a8a, // n0x0564 c0x0000 (---------------) + I consulting - 0x00211b87, // n0x0565 c0x0000 (---------------) + I control - 0x0022cd47, // n0x0566 c0x0000 (---------------) + I council - 0x00231004, // n0x0567 c0x0000 (---------------) + I crew - 0x00232f46, // n0x0568 c0x0000 (---------------) + I design - 0x002727c4, // n0x0569 c0x0000 (---------------) + I dgca - 0x00336208, // n0x056a c0x0000 (---------------) + I educator - 0x00343bc9, // n0x056b c0x0000 (---------------) + I emergency - 0x002a8a86, // n0x056c c0x0000 (---------------) + I engine - 0x002a8a88, // n0x056d c0x0000 (---------------) + I engineer - 0x00233a4d, // n0x056e c0x0000 (---------------) + I entertainment - 0x0021f909, // n0x056f c0x0000 (---------------) + I equipment - 0x002f3908, // n0x0570 c0x0000 (---------------) + I exchange - 0x0029ab47, // n0x0571 c0x0000 (---------------) + I express - 0x0026ac0a, // n0x0572 c0x0000 (---------------) + I federation - 0x0023b146, // n0x0573 c0x0000 (---------------) + I flight - 0x00248ec7, // n0x0574 c0x0000 (---------------) + I freight - 0x0024d004, // n0x0575 c0x0000 (---------------) + I fuel - 0x00256007, // n0x0576 c0x0000 (---------------) + I gliding - 0x00259a0a, // n0x0577 c0x0000 (---------------) + I government - 0x0037868e, // n0x0578 c0x0000 (---------------) + I groundhandling - 0x002646c5, // n0x0579 c0x0000 (---------------) + I group - 0x0038718b, // n0x057a c0x0000 (---------------) + I hanggliding - 0x00278ac9, // n0x057b c0x0000 (---------------) + I homebuilt - 0x002806c9, // n0x057c c0x0000 (---------------) + I insurance - 0x00202987, // n0x057d c0x0000 (---------------) + I journal - 0x0020298a, // n0x057e c0x0000 (---------------) + I journalist - 0x00274187, // n0x057f c0x0000 (---------------) + I leasing - 0x002127c9, // n0x0580 c0x0000 (---------------) + I logistics - 0x00395948, // n0x0581 c0x0000 (---------------) + I magazine - 0x002a0c8b, // n0x0582 c0x0000 (---------------) + I maintenance - 0x003117cb, // n0x0583 c0x0000 (---------------) + I marketplace - 0x002dc385, // n0x0584 c0x0000 (---------------) + I media - 0x00236c8a, // n0x0585 c0x0000 (---------------) + I microlight - 0x002371c9, // n0x0586 c0x0000 (---------------) + I modelling - 0x00354cca, // n0x0587 c0x0000 (---------------) + I navigation - 0x0022948b, // n0x0588 c0x0000 (---------------) + I parachuting - 0x00255f0b, // n0x0589 c0x0000 (---------------) + I paragliding - 0x002bb855, // n0x058a c0x0000 (---------------) + I passenger-association - 0x002c1505, // n0x058b c0x0000 (---------------) + I pilot - 0x0029abc5, // n0x058c c0x0000 (---------------) + I press - 0x002cbe4a, // n0x058d c0x0000 (---------------) + I production - 0x002e634a, // n0x058e c0x0000 (---------------) + I recreation - 0x002e0107, // n0x058f c0x0000 (---------------) + I repbody - 0x00215503, // n0x0590 c0x0000 (---------------) + I res - 0x00296808, // n0x0591 c0x0000 (---------------) + I research - 0x002bc30a, // n0x0592 c0x0000 (---------------) + I rotorcraft - 0x00234786, // n0x0593 c0x0000 (---------------) + I safety - 0x0023f089, // n0x0594 c0x0000 (---------------) + I scientist - 0x00243bc8, // n0x0595 c0x0000 (---------------) + I services - 0x002b3884, // n0x0596 c0x0000 (---------------) + I show - 0x00253c09, // n0x0597 c0x0000 (---------------) + I skydiving - 0x002a6c88, // n0x0598 c0x0000 (---------------) + I software - 0x00298587, // n0x0599 c0x0000 (---------------) + I student - 0x00217c44, // n0x059a c0x0000 (---------------) + I taxi - 0x00229a46, // n0x059b c0x0000 (---------------) + I trader - 0x0028fe07, // n0x059c c0x0000 (---------------) + I trading - 0x0028aec7, // n0x059d c0x0000 (---------------) + I trainer - 0x00230a45, // n0x059e c0x0000 (---------------) + I union - 0x002e04cc, // n0x059f c0x0000 (---------------) + I workinggroup - 0x0029b085, // n0x05a0 c0x0000 (---------------) + I works - 0x00222ac3, // n0x05a1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x05a2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x05a3 c0x0000 (---------------) + I gov - 0x002170c3, // n0x05a4 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05a5 c0x0000 (---------------) + I org - 0x00200742, // n0x05a6 c0x0000 (---------------) + I co - 0x00222ac3, // n0x05a7 c0x0000 (---------------) + I com - 0x002170c3, // n0x05a8 c0x0000 (---------------) + I net - 0x00207cc3, // n0x05a9 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x05aa c0x0000 (---------------) + I org - 0x00222ac3, // n0x05ab c0x0000 (---------------) + I com - 0x002170c3, // n0x05ac c0x0000 (---------------) + I net - 0x00219c43, // n0x05ad c0x0000 (---------------) + I off - 0x0021dcc3, // n0x05ae c0x0000 (---------------) + I org - 0x000e4188, // n0x05af c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x05b0 c0x0000 (---------------) + I com - 0x002d75c3, // n0x05b1 c0x0000 (---------------) + I edu - 0x0021e283, // n0x05b2 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x05b3 c0x0000 (---------------) + I mil - 0x002170c3, // n0x05b4 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05b5 c0x0000 (---------------) + I org - 0x000e4188, // n0x05b6 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x05b7 c0x0000 (---------------) + I com - 0x002d75c3, // n0x05b8 c0x0000 (---------------) + I edu - 0x002170c3, // n0x05b9 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05ba c0x0000 (---------------) + I org - 0x00200742, // n0x05bb c0x0000 (---------------) + I co - 0x00203fc2, // n0x05bc c0x0000 (---------------) + I ed - 0x00225cc2, // n0x05bd c0x0000 (---------------) + I gv - 0x00206e82, // n0x05be c0x0000 (---------------) + I it - 0x002003c2, // n0x05bf c0x0000 (---------------) + I og - 0x00268e82, // n0x05c0 c0x0000 (---------------) + I pb - 0x04a22ac3, // n0x05c1 c0x0012 (n0x05ca-n0x05cb) + I com - 0x002d75c3, // n0x05c2 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x05c3 c0x0000 (---------------) + I gob - 0x0021e283, // n0x05c4 c0x0000 (---------------) + I gov - 0x00238c03, // n0x05c5 c0x0000 (---------------) + I int - 0x0023fa03, // n0x05c6 c0x0000 (---------------) + I mil - 0x002170c3, // n0x05c7 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x05c8 c0x0000 (---------------) + I org - 0x00227303, // n0x05c9 c0x0000 (---------------) + I tur - 0x000e4188, // n0x05ca c0x0000 (---------------) + blogspot - 0x002f5744, // n0x05cb c0x0000 (---------------) + I e164 - 0x0034d5c7, // n0x05cc c0x0000 (---------------) + I in-addr - 0x00213a43, // n0x05cd c0x0000 (---------------) + I ip6 - 0x00234684, // n0x05ce c0x0000 (---------------) + I iris - 0x00202803, // n0x05cf c0x0000 (---------------) + I uri - 0x00202a03, // n0x05d0 c0x0000 (---------------) + I urn - 0x0021e283, // n0x05d1 c0x0000 (---------------) + I gov - 0x00201e82, // n0x05d2 c0x0000 (---------------) + I ac - 0x00110603, // n0x05d3 c0x0000 (---------------) + biz - 0x05a00742, // n0x05d4 c0x0016 (n0x05d9-n0x05da) + I co - 0x00225cc2, // n0x05d5 c0x0000 (---------------) + I gv - 0x00000304, // n0x05d6 c0x0000 (---------------) + info - 0x00200c42, // n0x05d7 c0x0000 (---------------) + I or - 0x000cba44, // n0x05d8 c0x0000 (---------------) + priv - 0x000e4188, // n0x05d9 c0x0000 (---------------) + blogspot - 0x00226043, // n0x05da c0x0000 (---------------) + I act - 0x002a00c3, // n0x05db c0x0000 (---------------) + I asn - 0x06222ac3, // n0x05dc c0x0018 (n0x05ec-n0x05ed) + I com - 0x00224984, // n0x05dd c0x0000 (---------------) + I conf - 0x066d75c3, // n0x05de c0x0019 (n0x05ed-n0x05f5) + I edu - 0x06a1e283, // n0x05df c0x001a (n0x05f5-n0x05fa) + I gov - 0x00206202, // n0x05e0 c0x0000 (---------------) + I id - 0x00200304, // n0x05e1 c0x0000 (---------------) + I info - 0x002170c3, // n0x05e2 c0x0000 (---------------) + I net - 0x0020ac43, // n0x05e3 c0x0000 (---------------) + I nsw - 0x00200e02, // n0x05e4 c0x0000 (---------------) + I nt - 0x0021dcc3, // n0x05e5 c0x0000 (---------------) + I org - 0x00212bc2, // n0x05e6 c0x0000 (---------------) + I oz - 0x002ce743, // n0x05e7 c0x0000 (---------------) + I qld - 0x00201a02, // n0x05e8 c0x0000 (---------------) + I sa - 0x00200143, // n0x05e9 c0x0000 (---------------) + I tas - 0x00243c83, // n0x05ea c0x0000 (---------------) + I vic - 0x00202542, // n0x05eb c0x0000 (---------------) + I wa - 0x000e4188, // n0x05ec c0x0000 (---------------) + blogspot - 0x00226043, // n0x05ed c0x0000 (---------------) + I act - 0x0020ac43, // n0x05ee c0x0000 (---------------) + I nsw - 0x00200e02, // n0x05ef c0x0000 (---------------) + I nt - 0x002ce743, // n0x05f0 c0x0000 (---------------) + I qld - 0x00201a02, // n0x05f1 c0x0000 (---------------) + I sa - 0x00200143, // n0x05f2 c0x0000 (---------------) + I tas - 0x00243c83, // n0x05f3 c0x0000 (---------------) + I vic - 0x00202542, // n0x05f4 c0x0000 (---------------) + I wa - 0x002ce743, // n0x05f5 c0x0000 (---------------) + I qld - 0x00201a02, // n0x05f6 c0x0000 (---------------) + I sa - 0x00200143, // n0x05f7 c0x0000 (---------------) + I tas - 0x00243c83, // n0x05f8 c0x0000 (---------------) + I vic - 0x00202542, // n0x05f9 c0x0000 (---------------) + I wa - 0x00222ac3, // n0x05fa c0x0000 (---------------) + I com - 0x00310603, // n0x05fb c0x0000 (---------------) + I biz - 0x00222ac3, // n0x05fc c0x0000 (---------------) + I com - 0x002d75c3, // n0x05fd c0x0000 (---------------) + I edu - 0x0021e283, // n0x05fe c0x0000 (---------------) + I gov - 0x00200304, // n0x05ff c0x0000 (---------------) + I info - 0x00238c03, // n0x0600 c0x0000 (---------------) + I int - 0x0023fa03, // n0x0601 c0x0000 (---------------) + I mil - 0x00298944, // n0x0602 c0x0000 (---------------) + I name - 0x002170c3, // n0x0603 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0604 c0x0000 (---------------) + I org - 0x00207742, // n0x0605 c0x0000 (---------------) + I pp - 0x00218243, // n0x0606 c0x0000 (---------------) + I pro - 0x000e4188, // n0x0607 c0x0000 (---------------) + blogspot - 0x00200742, // n0x0608 c0x0000 (---------------) + I co - 0x00222ac3, // n0x0609 c0x0000 (---------------) + I com - 0x002d75c3, // n0x060a c0x0000 (---------------) + I edu - 0x0021e283, // n0x060b c0x0000 (---------------) + I gov - 0x0023fa03, // n0x060c c0x0000 (---------------) + I mil - 0x002170c3, // n0x060d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x060e c0x0000 (---------------) + I org - 0x002060c2, // n0x060f c0x0000 (---------------) + I rs - 0x00262644, // n0x0610 c0x0000 (---------------) + I unbi - 0x00201984, // n0x0611 c0x0000 (---------------) + I unsa - 0x00310603, // n0x0612 c0x0000 (---------------) + I biz - 0x00200742, // n0x0613 c0x0000 (---------------) + I co - 0x00222ac3, // n0x0614 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0615 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0616 c0x0000 (---------------) + I gov - 0x00200304, // n0x0617 c0x0000 (---------------) + I info - 0x002170c3, // n0x0618 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0619 c0x0000 (---------------) + I org - 0x002cf4c5, // n0x061a c0x0000 (---------------) + I store - 0x0020bf42, // n0x061b c0x0000 (---------------) + I tv - 0x00201e82, // n0x061c c0x0000 (---------------) + I ac - 0x000e4188, // n0x061d c0x0000 (---------------) + blogspot - 0x0021e283, // n0x061e c0x0000 (---------------) + I gov - 0x00225381, // n0x061f c0x0000 (---------------) + I 0 - 0x00223681, // n0x0620 c0x0000 (---------------) + I 1 - 0x0023d901, // n0x0621 c0x0000 (---------------) + I 2 - 0x00235b01, // n0x0622 c0x0000 (---------------) + I 3 - 0x00235a81, // n0x0623 c0x0000 (---------------) + I 4 - 0x002b1e01, // n0x0624 c0x0000 (---------------) + I 5 - 0x00213ac1, // n0x0625 c0x0000 (---------------) + I 6 - 0x00225481, // n0x0626 c0x0000 (---------------) + I 7 - 0x002e4a01, // n0x0627 c0x0000 (---------------) + I 8 - 0x002e4e01, // n0x0628 c0x0000 (---------------) + I 9 - 0x00200181, // n0x0629 c0x0000 (---------------) + I a - 0x00200001, // n0x062a c0x0000 (---------------) + I b - 0x000e4188, // n0x062b c0x0000 (---------------) + blogspot - 0x00200741, // n0x062c c0x0000 (---------------) + I c - 0x002005c1, // n0x062d c0x0000 (---------------) + I d - 0x00200701, // n0x062e c0x0000 (---------------) + I e - 0x00200381, // n0x062f c0x0000 (---------------) + I f - 0x00200401, // n0x0630 c0x0000 (---------------) + I g - 0x00200201, // n0x0631 c0x0000 (---------------) + I h - 0x00200041, // n0x0632 c0x0000 (---------------) + I i - 0x00201f81, // n0x0633 c0x0000 (---------------) + I j - 0x00201001, // n0x0634 c0x0000 (---------------) + I k - 0x002008c1, // n0x0635 c0x0000 (---------------) + I l - 0x002000c1, // n0x0636 c0x0000 (---------------) + I m - 0x00200281, // n0x0637 c0x0000 (---------------) + I n - 0x00200081, // n0x0638 c0x0000 (---------------) + I o - 0x00200b01, // n0x0639 c0x0000 (---------------) + I p - 0x00211181, // n0x063a c0x0000 (---------------) + I q - 0x00200581, // n0x063b c0x0000 (---------------) + I r - 0x002001c1, // n0x063c c0x0000 (---------------) + I s - 0x00200141, // n0x063d c0x0000 (---------------) + I t - 0x00200101, // n0x063e c0x0000 (---------------) + I u - 0x002013c1, // n0x063f c0x0000 (---------------) + I v - 0x00202541, // n0x0640 c0x0000 (---------------) + I w - 0x00203ec1, // n0x0641 c0x0000 (---------------) + I x - 0x00200801, // n0x0642 c0x0000 (---------------) + I y - 0x00201901, // n0x0643 c0x0000 (---------------) + I z - 0x00222ac3, // n0x0644 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0645 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0646 c0x0000 (---------------) + I gov - 0x002170c3, // n0x0647 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0648 c0x0000 (---------------) + I org - 0x00200742, // n0x0649 c0x0000 (---------------) + I co - 0x00222ac3, // n0x064a c0x0000 (---------------) + I com - 0x002d75c3, // n0x064b c0x0000 (---------------) + I edu - 0x00200c42, // n0x064c c0x0000 (---------------) + I or - 0x0021dcc3, // n0x064d c0x0000 (---------------) + I org - 0x00009ac6, // n0x064e c0x0000 (---------------) + dyndns - 0x00041d4a, // n0x064f c0x0000 (---------------) + for-better - 0x00076a48, // n0x0650 c0x0000 (---------------) + for-more - 0x00042348, // n0x0651 c0x0000 (---------------) + for-some - 0x00042c87, // n0x0652 c0x0000 (---------------) + for-the - 0x00130f46, // n0x0653 c0x0000 (---------------) + selfip - 0x00110e86, // n0x0654 c0x0000 (---------------) + webhop - 0x002729c4, // n0x0655 c0x0000 (---------------) + I asso - 0x002f4347, // n0x0656 c0x0000 (---------------) + I barreau - 0x000e4188, // n0x0657 c0x0000 (---------------) + blogspot - 0x003579c4, // n0x0658 c0x0000 (---------------) + I gouv - 0x00222ac3, // n0x0659 c0x0000 (---------------) + I com - 0x002d75c3, // n0x065a c0x0000 (---------------) + I edu - 0x0021e283, // n0x065b c0x0000 (---------------) + I gov - 0x002170c3, // n0x065c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x065d c0x0000 (---------------) + I org - 0x00222ac3, // n0x065e c0x0000 (---------------) + I com - 0x002d75c3, // n0x065f c0x0000 (---------------) + I edu - 0x0034eb03, // n0x0660 c0x0000 (---------------) + I gob - 0x0021e283, // n0x0661 c0x0000 (---------------) + I gov - 0x00238c03, // n0x0662 c0x0000 (---------------) + I int - 0x0023fa03, // n0x0663 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0664 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0665 c0x0000 (---------------) + I org - 0x0020bf42, // n0x0666 c0x0000 (---------------) + I tv - 0x002b2643, // n0x0667 c0x0000 (---------------) + I adm - 0x002db303, // n0x0668 c0x0000 (---------------) + I adv - 0x00256e43, // n0x0669 c0x0000 (---------------) + I agr - 0x00204942, // n0x066a c0x0000 (---------------) + I am - 0x00323d83, // n0x066b c0x0000 (---------------) + I arq - 0x00200603, // n0x066c c0x0000 (---------------) + I art - 0x00201643, // n0x066d c0x0000 (---------------) + I ato - 0x00200001, // n0x066e c0x0000 (---------------) + I b - 0x00200003, // n0x066f c0x0000 (---------------) + I bio - 0x002d0084, // n0x0670 c0x0000 (---------------) + I blog - 0x0031b803, // n0x0671 c0x0000 (---------------) + I bmd - 0x002f4243, // n0x0672 c0x0000 (---------------) + I cim - 0x002dbfc3, // n0x0673 c0x0000 (---------------) + I cng - 0x002211c3, // n0x0674 c0x0000 (---------------) + I cnt - 0x0a622ac3, // n0x0675 c0x0029 (n0x06ad-n0x06ae) + I com - 0x00228d44, // n0x0676 c0x0000 (---------------) + I coop - 0x00305ec3, // n0x0677 c0x0000 (---------------) + I ecn - 0x00200703, // n0x0678 c0x0000 (---------------) + I eco - 0x002d75c3, // n0x0679 c0x0000 (---------------) + I edu - 0x00226343, // n0x067a c0x0000 (---------------) + I emp - 0x002674c3, // n0x067b c0x0000 (---------------) + I eng - 0x0028cac3, // n0x067c c0x0000 (---------------) + I esp - 0x002f41c3, // n0x067d c0x0000 (---------------) + I etc - 0x0021bac3, // n0x067e c0x0000 (---------------) + I eti - 0x0021f803, // n0x067f c0x0000 (---------------) + I far - 0x0023bdc4, // n0x0680 c0x0000 (---------------) + I flog - 0x00358002, // n0x0681 c0x0000 (---------------) + I fm - 0x002416c3, // n0x0682 c0x0000 (---------------) + I fnd - 0x00247a83, // n0x0683 c0x0000 (---------------) + I fot - 0x002645c3, // n0x0684 c0x0000 (---------------) + I fst - 0x0036f1c3, // n0x0685 c0x0000 (---------------) + I g12 - 0x00311b83, // n0x0686 c0x0000 (---------------) + I ggf - 0x0021e283, // n0x0687 c0x0000 (---------------) + I gov - 0x002b7c43, // n0x0688 c0x0000 (---------------) + I imb - 0x00215703, // n0x0689 c0x0000 (---------------) + I ind - 0x00200303, // n0x068a c0x0000 (---------------) + I inf - 0x00202c03, // n0x068b c0x0000 (---------------) + I jor - 0x002de8c3, // n0x068c c0x0000 (---------------) + I jus - 0x0021e843, // n0x068d c0x0000 (---------------) + I leg - 0x002e3403, // n0x068e c0x0000 (---------------) + I lel - 0x0020f583, // n0x068f c0x0000 (---------------) + I mat - 0x0020b403, // n0x0690 c0x0000 (---------------) + I med - 0x0023fa03, // n0x0691 c0x0000 (---------------) + I mil - 0x00214902, // n0x0692 c0x0000 (---------------) + I mp - 0x002bc903, // n0x0693 c0x0000 (---------------) + I mus - 0x002170c3, // n0x0694 c0x0000 (---------------) + I net - 0x01607cc3, // n0x0695 c0x0005 (---------------)* o I nom - 0x0023fdc3, // n0x0696 c0x0000 (---------------) + I not - 0x00211c03, // n0x0697 c0x0000 (---------------) + I ntr - 0x0024f003, // n0x0698 c0x0000 (---------------) + I odo - 0x0021dcc3, // n0x0699 c0x0000 (---------------) + I org - 0x002bf143, // n0x069a c0x0000 (---------------) + I ppg - 0x00218243, // n0x069b c0x0000 (---------------) + I pro - 0x002353c3, // n0x069c c0x0000 (---------------) + I psc - 0x002dc783, // n0x069d c0x0000 (---------------) + I psi - 0x002ce903, // n0x069e c0x0000 (---------------) + I qsl - 0x00250685, // n0x069f c0x0000 (---------------) + I radio - 0x002e6343, // n0x06a0 c0x0000 (---------------) + I rec - 0x002ce943, // n0x06a1 c0x0000 (---------------) + I slg - 0x002cef83, // n0x06a2 c0x0000 (---------------) + I srv - 0x00217c44, // n0x06a3 c0x0000 (---------------) + I taxi - 0x00362ec3, // n0x06a4 c0x0000 (---------------) + I teo - 0x002fb583, // n0x06a5 c0x0000 (---------------) + I tmp - 0x00283003, // n0x06a6 c0x0000 (---------------) + I trd - 0x00227303, // n0x06a7 c0x0000 (---------------) + I tur - 0x0020bf42, // n0x06a8 c0x0000 (---------------) + I tv - 0x0022b9c3, // n0x06a9 c0x0000 (---------------) + I vet - 0x002df504, // n0x06aa c0x0000 (---------------) + I vlog - 0x0025a484, // n0x06ab c0x0000 (---------------) + I wiki - 0x0024dc43, // n0x06ac c0x0000 (---------------) + I zlg - 0x000e4188, // n0x06ad c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x06ae c0x0000 (---------------) + I com - 0x002d75c3, // n0x06af c0x0000 (---------------) + I edu - 0x0021e283, // n0x06b0 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06b1 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x06b2 c0x0000 (---------------) + I org - 0x00222ac3, // n0x06b3 c0x0000 (---------------) + I com - 0x002d75c3, // n0x06b4 c0x0000 (---------------) + I edu - 0x0021e283, // n0x06b5 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06b6 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x06b7 c0x0000 (---------------) + I org - 0x00200742, // n0x06b8 c0x0000 (---------------) + I co - 0x0021dcc3, // n0x06b9 c0x0000 (---------------) + I org - 0x0ba22ac3, // n0x06ba c0x002e (n0x06be-n0x06bf) + I com - 0x0021e283, // n0x06bb c0x0000 (---------------) + I gov - 0x0023fa03, // n0x06bc c0x0000 (---------------) + I mil - 0x00209982, // n0x06bd c0x0000 (---------------) + I of - 0x000e4188, // n0x06be c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x06bf c0x0000 (---------------) + I com - 0x002d75c3, // n0x06c0 c0x0000 (---------------) + I edu - 0x0021e283, // n0x06c1 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06c2 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x06c3 c0x0000 (---------------) + I org - 0x000043c2, // n0x06c4 c0x0000 (---------------) + za - 0x002004c2, // n0x06c5 c0x0000 (---------------) + I ab - 0x0021a042, // n0x06c6 c0x0000 (---------------) + I bc - 0x000e4188, // n0x06c7 c0x0000 (---------------) + blogspot - 0x00000742, // n0x06c8 c0x0000 (---------------) + co - 0x00227d42, // n0x06c9 c0x0000 (---------------) + I gc - 0x00205942, // n0x06ca c0x0000 (---------------) + I mb - 0x00210d42, // n0x06cb c0x0000 (---------------) + I nb - 0x00200342, // n0x06cc c0x0000 (---------------) + I nf - 0x00236482, // n0x06cd c0x0000 (---------------) + I nl - 0x002019c2, // n0x06ce c0x0000 (---------------) + I ns - 0x00200e02, // n0x06cf c0x0000 (---------------) + I nt - 0x00205bc2, // n0x06d0 c0x0000 (---------------) + I nu - 0x00200dc2, // n0x06d1 c0x0000 (---------------) + I on - 0x00214942, // n0x06d2 c0x0000 (---------------) + I pe - 0x00369542, // n0x06d3 c0x0000 (---------------) + I qc - 0x00207b42, // n0x06d4 c0x0000 (---------------) + I sk - 0x002202c2, // n0x06d5 c0x0000 (---------------) + I yk - 0x00085109, // n0x06d6 c0x0000 (---------------) + ftpaccess - 0x0001208b, // n0x06d7 c0x0000 (---------------) + game-server - 0x000bea08, // n0x06d8 c0x0000 (---------------) + myphotos - 0x00043609, // n0x06d9 c0x0000 (---------------) + scrapping - 0x0021e283, // n0x06da c0x0000 (---------------) + I gov - 0x000e4188, // n0x06db c0x0000 (---------------) + blogspot - 0x000e4188, // n0x06dc c0x0000 (---------------) + blogspot - 0x00201e82, // n0x06dd c0x0000 (---------------) + I ac - 0x002729c4, // n0x06de c0x0000 (---------------) + I asso - 0x00200742, // n0x06df c0x0000 (---------------) + I co - 0x00222ac3, // n0x06e0 c0x0000 (---------------) + I com - 0x00203fc2, // n0x06e1 c0x0000 (---------------) + I ed - 0x002d75c3, // n0x06e2 c0x0000 (---------------) + I edu - 0x00202342, // n0x06e3 c0x0000 (---------------) + I go - 0x003579c4, // n0x06e4 c0x0000 (---------------) + I gouv - 0x00238c03, // n0x06e5 c0x0000 (---------------) + I int - 0x00238602, // n0x06e6 c0x0000 (---------------) + I md - 0x002170c3, // n0x06e7 c0x0000 (---------------) + I net - 0x00200c42, // n0x06e8 c0x0000 (---------------) + I or - 0x0021dcc3, // n0x06e9 c0x0000 (---------------) + I org - 0x0029abc6, // n0x06ea c0x0000 (---------------) + I presse - 0x002f710f, // n0x06eb c0x0000 (---------------) + I xn--aroport-bya - 0x006e3e83, // n0x06ec c0x0001 (---------------) ! I www - 0x000e4188, // n0x06ed c0x0000 (---------------) + blogspot - 0x00200742, // n0x06ee c0x0000 (---------------) + I co - 0x0034eb03, // n0x06ef c0x0000 (---------------) + I gob - 0x0021e283, // n0x06f0 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x06f1 c0x0000 (---------------) + I mil - 0x00200742, // n0x06f2 c0x0000 (---------------) + I co - 0x00222ac3, // n0x06f3 c0x0000 (---------------) + I com - 0x0021e283, // n0x06f4 c0x0000 (---------------) + I gov - 0x002170c3, // n0x06f5 c0x0000 (---------------) + I net - 0x00201e82, // n0x06f6 c0x0000 (---------------) + I ac - 0x002076c2, // n0x06f7 c0x0000 (---------------) + I ah - 0x0ea72409, // n0x06f8 c0x003a (n0x0723-n0x0724) o I amazonaws - 0x00202642, // n0x06f9 c0x0000 (---------------) + I bj - 0x0f222ac3, // n0x06fa c0x003c (n0x0725-n0x0726) + I com - 0x0022e082, // n0x06fb c0x0000 (---------------) + I cq - 0x002d75c3, // n0x06fc c0x0000 (---------------) + I edu - 0x002241c2, // n0x06fd c0x0000 (---------------) + I fj - 0x0021b342, // n0x06fe c0x0000 (---------------) + I gd - 0x0021e283, // n0x06ff c0x0000 (---------------) + I gov - 0x0026cd02, // n0x0700 c0x0000 (---------------) + I gs - 0x0023d702, // n0x0701 c0x0000 (---------------) + I gx - 0x00243802, // n0x0702 c0x0000 (---------------) + I gz - 0x00202dc2, // n0x0703 c0x0000 (---------------) + I ha - 0x002f6242, // n0x0704 c0x0000 (---------------) + I hb - 0x00205202, // n0x0705 c0x0000 (---------------) + I he - 0x00200202, // n0x0706 c0x0000 (---------------) + I hi - 0x0022ea02, // n0x0707 c0x0000 (---------------) + I hk - 0x0020cc02, // n0x0708 c0x0000 (---------------) + I hl - 0x00217542, // n0x0709 c0x0000 (---------------) + I hn - 0x00297c82, // n0x070a c0x0000 (---------------) + I jl - 0x002bdf02, // n0x070b c0x0000 (---------------) + I js - 0x002fc642, // n0x070c c0x0000 (---------------) + I jx - 0x0021f442, // n0x070d c0x0000 (---------------) + I ln - 0x0023fa03, // n0x070e c0x0000 (---------------) + I mil - 0x00203602, // n0x070f c0x0000 (---------------) + I mo - 0x002170c3, // n0x0710 c0x0000 (---------------) + I net - 0x00233c42, // n0x0711 c0x0000 (---------------) + I nm - 0x0026d802, // n0x0712 c0x0000 (---------------) + I nx - 0x0021dcc3, // n0x0713 c0x0000 (---------------) + I org - 0x0022e0c2, // n0x0714 c0x0000 (---------------) + I qh - 0x00200982, // n0x0715 c0x0000 (---------------) + I sc - 0x0024f842, // n0x0716 c0x0000 (---------------) + I sd - 0x002001c2, // n0x0717 c0x0000 (---------------) + I sh - 0x00210b02, // n0x0718 c0x0000 (---------------) + I sn - 0x002d6b42, // n0x0719 c0x0000 (---------------) + I sx - 0x00202bc2, // n0x071a c0x0000 (---------------) + I tj - 0x00241ac2, // n0x071b c0x0000 (---------------) + I tw - 0x0020a882, // n0x071c c0x0000 (---------------) + I xj - 0x002ea10a, // n0x071d c0x0000 (---------------) + I xn--55qx5d - 0x0033080a, // n0x071e c0x0000 (---------------) + I xn--io0a7i - 0x0036394a, // n0x071f c0x0000 (---------------) + I xn--od0alg - 0x00397682, // n0x0720 c0x0000 (---------------) + I xz - 0x00200802, // n0x0721 c0x0000 (---------------) + I yn - 0x00243842, // n0x0722 c0x0000 (---------------) + I zj - 0x0ec23487, // n0x0723 c0x003b (n0x0724-n0x0725) + compute - 0x00105f0a, // n0x0724 c0x0000 (---------------) + cn-north-1 - 0x0f672409, // n0x0725 c0x003d (n0x0726-n0x0727) o I amazonaws - 0x0fb05f0a, // n0x0726 c0x003e (n0x0727-n0x0728) o I cn-north-1 - 0x000413c2, // n0x0727 c0x0000 (---------------) + s3 - 0x00246584, // n0x0728 c0x0000 (---------------) + I arts - 0x10222ac3, // n0x0729 c0x0040 (n0x0735-n0x0736) + I com - 0x002d75c3, // n0x072a c0x0000 (---------------) + I edu - 0x00238544, // n0x072b c0x0000 (---------------) + I firm - 0x0021e283, // n0x072c c0x0000 (---------------) + I gov - 0x00200304, // n0x072d c0x0000 (---------------) + I info - 0x00238c03, // n0x072e c0x0000 (---------------) + I int - 0x0023fa03, // n0x072f c0x0000 (---------------) + I mil - 0x002170c3, // n0x0730 c0x0000 (---------------) + I net - 0x00207cc3, // n0x0731 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x0732 c0x0000 (---------------) + I org - 0x002e6343, // n0x0733 c0x0000 (---------------) + I rec - 0x00219fc3, // n0x0734 c0x0000 (---------------) + I web - 0x000e4188, // n0x0735 c0x0000 (---------------) + blogspot - 0x000f00c5, // n0x0736 c0x0000 (---------------) + 1kapp - 0x000f2202, // n0x0737 c0x0000 (---------------) + 4u - 0x00167c06, // n0x0738 c0x0000 (---------------) + africa - 0x10a72409, // n0x0739 c0x0042 (n0x07ff-n0x0811) o I amazonaws - 0x00036947, // n0x073a c0x0000 (---------------) + appspot - 0x00000602, // n0x073b c0x0000 (---------------) + ar - 0x00163e4a, // n0x073c c0x0000 (---------------) + betainabox - 0x000d0087, // n0x073d c0x0000 (---------------) + blogdns - 0x000e4188, // n0x073e c0x0000 (---------------) + blogspot - 0x00012e82, // n0x073f c0x0000 (---------------) + br - 0x0012df87, // n0x0740 c0x0000 (---------------) + cechire - 0x0013220f, // n0x0741 c0x0000 (---------------) + cloudcontrolapp - 0x0018d44f, // n0x0742 c0x0000 (---------------) + cloudcontrolled - 0x000211c2, // n0x0743 c0x0000 (---------------) + cn - 0x00000742, // n0x0744 c0x0000 (---------------) + co - 0x0008ca08, // n0x0745 c0x0000 (---------------) + codespot - 0x000006c2, // n0x0746 c0x0000 (---------------) + de - 0x00146fc8, // n0x0747 c0x0000 (---------------) + dnsalias - 0x0006a247, // n0x0748 c0x0000 (---------------) + dnsdojo - 0x00010a4b, // n0x0749 c0x0000 (---------------) + doesntexist - 0x0015fdc9, // n0x074a c0x0000 (---------------) + dontexist - 0x00146ec7, // n0x074b c0x0000 (---------------) + doomdns - 0x000da58c, // n0x074c c0x0000 (---------------) + dreamhosters - 0x0015aeca, // n0x074d c0x0000 (---------------) + dyn-o-saur - 0x000007c8, // n0x074e c0x0000 (---------------) + dynalias - 0x000b8c0e, // n0x074f c0x0000 (---------------) + dyndns-at-home - 0x000e024e, // n0x0750 c0x0000 (---------------) + dyndns-at-work - 0x000cfecb, // n0x0751 c0x0000 (---------------) + dyndns-blog - 0x00009acb, // n0x0752 c0x0000 (---------------) + dyndns-free - 0x0000b1cb, // n0x0753 c0x0000 (---------------) + dyndns-home - 0x00013889, // n0x0754 c0x0000 (---------------) + dyndns-ip - 0x00018d4b, // n0x0755 c0x0000 (---------------) + dyndns-mail - 0x00019a8d, // n0x0756 c0x0000 (---------------) + dyndns-office - 0x0001ea4b, // n0x0757 c0x0000 (---------------) + dyndns-pics - 0x0001fd0d, // n0x0758 c0x0000 (---------------) + dyndns-remote - 0x00020d4d, // n0x0759 c0x0000 (---------------) + dyndns-server - 0x00051b0a, // n0x075a c0x0000 (---------------) + dyndns-web - 0x0005a2cb, // n0x075b c0x0000 (---------------) + dyndns-wiki - 0x0009aecb, // n0x075c c0x0000 (---------------) + dyndns-work - 0x00016650, // n0x075d c0x0000 (---------------) + elasticbeanstalk - 0x0013c78f, // n0x075e c0x0000 (---------------) + est-a-la-maison - 0x0002270f, // n0x075f c0x0000 (---------------) + est-a-la-masion - 0x000144cd, // n0x0760 c0x0000 (---------------) + est-le-patron - 0x000ef550, // n0x0761 c0x0000 (---------------) + est-mon-blogueur - 0x0001d5c2, // n0x0762 c0x0000 (---------------) + eu - 0x0003674b, // n0x0763 c0x0000 (---------------) + firebaseapp - 0x0003ffc8, // n0x0764 c0x0000 (---------------) + flynnhub - 0x0004d407, // n0x0765 c0x0000 (---------------) + from-ak - 0x0004d747, // n0x0766 c0x0000 (---------------) + from-al - 0x0004d907, // n0x0767 c0x0000 (---------------) + from-ar - 0x0004dd07, // n0x0768 c0x0000 (---------------) + from-ca - 0x0004f607, // n0x0769 c0x0000 (---------------) + from-ct - 0x00050247, // n0x076a c0x0000 (---------------) + from-dc - 0x00052787, // n0x076b c0x0000 (---------------) + from-de - 0x00052a47, // n0x076c c0x0000 (---------------) + from-fl - 0x00054187, // n0x076d c0x0000 (---------------) + from-ga - 0x00054487, // n0x076e c0x0000 (---------------) + from-hi - 0x00054ec7, // n0x076f c0x0000 (---------------) + from-ia - 0x00055087, // n0x0770 c0x0000 (---------------) + from-id - 0x00055247, // n0x0771 c0x0000 (---------------) + from-il - 0x00055407, // n0x0772 c0x0000 (---------------) + from-in - 0x000561c7, // n0x0773 c0x0000 (---------------) + from-ks - 0x00056787, // n0x0774 c0x0000 (---------------) + from-ky - 0x00057247, // n0x0775 c0x0000 (---------------) + from-ma - 0x00057647, // n0x0776 c0x0000 (---------------) + from-md - 0x00057d87, // n0x0777 c0x0000 (---------------) + from-mi - 0x00058887, // n0x0778 c0x0000 (---------------) + from-mn - 0x00058a47, // n0x0779 c0x0000 (---------------) + from-mo - 0x00059007, // n0x077a c0x0000 (---------------) + from-ms - 0x00059507, // n0x077b c0x0000 (---------------) + from-mt - 0x00059707, // n0x077c c0x0000 (---------------) + from-nc - 0x0005a607, // n0x077d c0x0000 (---------------) + from-nd - 0x0005a7c7, // n0x077e c0x0000 (---------------) + from-ne - 0x0005a987, // n0x077f c0x0000 (---------------) + from-nh - 0x0005b247, // n0x0780 c0x0000 (---------------) + from-nj - 0x0005b747, // n0x0781 c0x0000 (---------------) + from-nm - 0x0005c247, // n0x0782 c0x0000 (---------------) + from-nv - 0x0005c847, // n0x0783 c0x0000 (---------------) + from-oh - 0x0005cf07, // n0x0784 c0x0000 (---------------) + from-ok - 0x0005d407, // n0x0785 c0x0000 (---------------) + from-or - 0x0005d5c7, // n0x0786 c0x0000 (---------------) + from-pa - 0x0005d947, // n0x0787 c0x0000 (---------------) + from-pr - 0x0005e307, // n0x0788 c0x0000 (---------------) + from-ri - 0x0005e687, // n0x0789 c0x0000 (---------------) + from-sc - 0x0005ea87, // n0x078a c0x0000 (---------------) + from-sd - 0x000604c7, // n0x078b c0x0000 (---------------) + from-tn - 0x00060687, // n0x078c c0x0000 (---------------) + from-tx - 0x00061207, // n0x078d c0x0000 (---------------) + from-ut - 0x00062947, // n0x078e c0x0000 (---------------) + from-va - 0x00062f87, // n0x078f c0x0000 (---------------) + from-vt - 0x00063287, // n0x0790 c0x0000 (---------------) + from-wa - 0x00063447, // n0x0791 c0x0000 (---------------) + from-wi - 0x000637c7, // n0x0792 c0x0000 (---------------) + from-wv - 0x00063a07, // n0x0793 c0x0000 (---------------) + from-wy - 0x00005a42, // n0x0794 c0x0000 (---------------) + gb - 0x000c0587, // n0x0795 c0x0000 (---------------) + getmyip - 0x000b53d1, // n0x0796 c0x0000 (---------------) + githubusercontent - 0x000cd58a, // n0x0797 c0x0000 (---------------) + googleapis - 0x0008c88a, // n0x0798 c0x0000 (---------------) + googlecode - 0x00043a86, // n0x0799 c0x0000 (---------------) + gotdns - 0x0000dc82, // n0x079a c0x0000 (---------------) + gr - 0x0008f309, // n0x079b c0x0000 (---------------) + herokuapp - 0x0007fe89, // n0x079c c0x0000 (---------------) + herokussl - 0x0002ea02, // n0x079d c0x0000 (---------------) + hk - 0x0013eeca, // n0x079e c0x0000 (---------------) + hobby-site - 0x00090ec9, // n0x079f c0x0000 (---------------) + homelinux - 0x00091b88, // n0x07a0 c0x0000 (---------------) + homeunix - 0x00017d42, // n0x07a1 c0x0000 (---------------) + hu - 0x001008c9, // n0x07a2 c0x0000 (---------------) + iamallama - 0x0005db8e, // n0x07a3 c0x0000 (---------------) + is-a-anarchist - 0x000d5d8c, // n0x07a4 c0x0000 (---------------) + is-a-blogger - 0x000bf2cf, // n0x07a5 c0x0000 (---------------) + is-a-bookkeeper - 0x0017d14e, // n0x07a6 c0x0000 (---------------) + is-a-bulls-fan - 0x0000cf8c, // n0x07a7 c0x0000 (---------------) + is-a-caterer - 0x00166909, // n0x07a8 c0x0000 (---------------) + is-a-chef - 0x00099ad1, // n0x07a9 c0x0000 (---------------) + is-a-conservative - 0x0009a088, // n0x07aa c0x0000 (---------------) + is-a-cpa - 0x00169b92, // n0x07ab c0x0000 (---------------) + is-a-cubicle-slave - 0x0002e40d, // n0x07ac c0x0000 (---------------) + is-a-democrat - 0x00032e0d, // n0x07ad c0x0000 (---------------) + is-a-designer - 0x00138acb, // n0x07ae c0x0000 (---------------) + is-a-doctor - 0x001713d5, // n0x07af c0x0000 (---------------) + is-a-financialadvisor - 0x00052e49, // n0x07b0 c0x0000 (---------------) + is-a-geek - 0x0005afca, // n0x07b1 c0x0000 (---------------) + is-a-green - 0x0005bb09, // n0x07b2 c0x0000 (---------------) + is-a-guru - 0x00060e10, // n0x07b3 c0x0000 (---------------) + is-a-hard-worker - 0x00065f4b, // n0x07b4 c0x0000 (---------------) + is-a-hunter - 0x0006f74f, // n0x07b5 c0x0000 (---------------) + is-a-landscaper - 0x000702cb, // n0x07b6 c0x0000 (---------------) + is-a-lawyer - 0x00073b0c, // n0x07b7 c0x0000 (---------------) + is-a-liberal - 0x00077590, // n0x07b8 c0x0000 (---------------) + is-a-libertarian - 0x001370ca, // n0x07b9 c0x0000 (---------------) + is-a-llama - 0x00137a4d, // n0x07ba c0x0000 (---------------) + is-a-musician - 0x00174a0e, // n0x07bb c0x0000 (---------------) + is-a-nascarfan - 0x0007bf4a, // n0x07bc c0x0000 (---------------) + is-a-nurse - 0x0007d0cc, // n0x07bd c0x0000 (---------------) + is-a-painter - 0x0008ab94, // n0x07be c0x0000 (---------------) + is-a-personaltrainer - 0x0008ef91, // n0x07bf c0x0000 (---------------) + is-a-photographer - 0x00090c0b, // n0x07c0 c0x0000 (---------------) + is-a-player - 0x0009638f, // n0x07c1 c0x0000 (---------------) + is-a-republican - 0x00096fcd, // n0x07c2 c0x0000 (---------------) + is-a-rockstar - 0x000c268e, // n0x07c3 c0x0000 (---------------) + is-a-socialist - 0x0009844c, // n0x07c4 c0x0000 (---------------) + is-a-student - 0x0009d08c, // n0x07c5 c0x0000 (---------------) + is-a-teacher - 0x000c238b, // n0x07c6 c0x0000 (---------------) + is-a-techie - 0x000c3f4e, // n0x07c7 c0x0000 (---------------) + is-a-therapist - 0x000d7cd0, // n0x07c8 c0x0000 (---------------) + is-an-accountant - 0x0015d44b, // n0x07c9 c0x0000 (---------------) + is-an-actor - 0x000a110d, // n0x07ca c0x0000 (---------------) + is-an-actress - 0x000a768f, // n0x07cb c0x0000 (---------------) + is-an-anarchist - 0x000a814c, // n0x07cc c0x0000 (---------------) + is-an-artist - 0x000a890e, // n0x07cd c0x0000 (---------------) + is-an-engineer - 0x000a97d1, // n0x07ce c0x0000 (---------------) + is-an-entertainer - 0x00135f8c, // n0x07cf c0x0000 (---------------) + is-certified - 0x00133a07, // n0x07d0 c0x0000 (---------------) + is-gone - 0x000b0fcd, // n0x07d1 c0x0000 (---------------) + is-into-anime - 0x000b918c, // n0x07d2 c0x0000 (---------------) + is-into-cars - 0x000d1250, // n0x07d3 c0x0000 (---------------) + is-into-cartoons - 0x000d1f4d, // n0x07d4 c0x0000 (---------------) + is-into-games - 0x000d3087, // n0x07d5 c0x0000 (---------------) + is-leet - 0x000d7250, // n0x07d6 c0x0000 (---------------) + is-not-certified - 0x000f9e48, // n0x07d7 c0x0000 (---------------) + is-slick - 0x001063cb, // n0x07d8 c0x0000 (---------------) + is-uberleet - 0x00146b4f, // n0x07d9 c0x0000 (---------------) + is-with-theband - 0x00191648, // n0x07da c0x0000 (---------------) + isa-geek - 0x000cd78d, // n0x07db c0x0000 (---------------) + isa-hockeynut - 0x00159d10, // n0x07dc c0x0000 (---------------) + issmarterthanyou - 0x0009a703, // n0x07dd c0x0000 (---------------) + jpn - 0x000034c2, // n0x07de c0x0000 (---------------) + kr - 0x00061689, // n0x07df c0x0000 (---------------) + likes-pie - 0x0007878a, // n0x07e0 c0x0000 (---------------) + likescandy - 0x00032003, // n0x07e1 c0x0000 (---------------) + mex - 0x001024c8, // n0x07e2 c0x0000 (---------------) + neat-url - 0x00002f07, // n0x07e3 c0x0000 (---------------) + nfshost - 0x00000c02, // n0x07e4 c0x0000 (---------------) + no - 0x0005080a, // n0x07e5 c0x0000 (---------------) + operaunite - 0x0019238f, // n0x07e6 c0x0000 (---------------) + outsystemscloud - 0x00110fd2, // n0x07e7 c0x0000 (---------------) + pagespeedmobilizer - 0x00169542, // n0x07e8 c0x0000 (---------------) + qc - 0x00132187, // n0x07e9 c0x0000 (---------------) + rhcloud - 0x00000d82, // n0x07ea c0x0000 (---------------) + ro - 0x000044c2, // n0x07eb c0x0000 (---------------) + ru - 0x00001a02, // n0x07ec c0x0000 (---------------) + sa - 0x0002f650, // n0x07ed c0x0000 (---------------) + saves-the-whales - 0x00002e82, // n0x07ee c0x0000 (---------------) + se - 0x00130f46, // n0x07ef c0x0000 (---------------) + selfip - 0x000c368e, // n0x07f0 c0x0000 (---------------) + sells-for-less - 0x0007ac8b, // n0x07f1 c0x0000 (---------------) + sells-for-u - 0x00079088, // n0x07f2 c0x0000 (---------------) + servebbs - 0x000e0a0a, // n0x07f3 c0x0000 (---------------) + simple-url - 0x000dc7c7, // n0x07f4 c0x0000 (---------------) + sinaapp - 0x000101cd, // n0x07f5 c0x0000 (---------------) + space-to-rent - 0x0010160c, // n0x07f6 c0x0000 (---------------) + teaches-yoga - 0x0000cf02, // n0x07f7 c0x0000 (---------------) + uk - 0x00009f42, // n0x07f8 c0x0000 (---------------) + us - 0x00006842, // n0x07f9 c0x0000 (---------------) + uy - 0x000dc70a, // n0x07fa c0x0000 (---------------) + vipsinaapp - 0x000cd48a, // n0x07fb c0x0000 (---------------) + withgoogle - 0x000e3f0e, // n0x07fc c0x0000 (---------------) + writesthisblog - 0x000c9948, // n0x07fd c0x0000 (---------------) + yolasite - 0x000043c2, // n0x07fe c0x0000 (---------------) + za - 0x10c23487, // n0x07ff c0x0043 (n0x0811-n0x081a) + compute - 0x11023489, // n0x0800 c0x0044 (n0x081a-n0x081c) + compute-1 - 0x0000a503, // n0x0801 c0x0000 (---------------) + elb - 0x1172bb4c, // n0x0802 c0x0045 (n0x081c-n0x081d) o I eu-central-1 - 0x000413c2, // n0x0803 c0x0000 (---------------) + s3 - 0x000f0c51, // n0x0804 c0x0000 (---------------) + s3-ap-northeast-1 - 0x000f9411, // n0x0805 c0x0000 (---------------) + s3-ap-southeast-1 - 0x0010a591, // n0x0806 c0x0000 (---------------) + s3-ap-southeast-2 - 0x0012ba8f, // n0x0807 c0x0000 (---------------) + s3-eu-central-1 - 0x00072c0c, // n0x0808 c0x0000 (---------------) + s3-eu-west-1 - 0x0010d14d, // n0x0809 c0x0000 (---------------) + s3-external-1 - 0x0010ef8d, // n0x080a c0x0000 (---------------) + s3-external-2 - 0x0011e6d5, // n0x080b c0x0000 (---------------) + s3-fips-us-gov-west-1 - 0x000413cc, // n0x080c c0x0000 (---------------) + s3-sa-east-1 - 0x000696d0, // n0x080d c0x0000 (---------------) + s3-us-gov-west-1 - 0x0011960c, // n0x080e c0x0000 (---------------) + s3-us-west-1 - 0x000affcc, // n0x080f c0x0000 (---------------) + s3-us-west-2 - 0x0002b6c9, // n0x0810 c0x0000 (---------------) + us-east-1 - 0x000f0d0e, // n0x0811 c0x0000 (---------------) + ap-northeast-1 - 0x000f94ce, // n0x0812 c0x0000 (---------------) + ap-southeast-1 - 0x0010a64e, // n0x0813 c0x0000 (---------------) + ap-southeast-2 - 0x0012bb4c, // n0x0814 c0x0000 (---------------) + eu-central-1 - 0x00072cc9, // n0x0815 c0x0000 (---------------) + eu-west-1 - 0x00041489, // n0x0816 c0x0000 (---------------) + sa-east-1 - 0x0006978d, // n0x0817 c0x0000 (---------------) + us-gov-west-1 - 0x001196c9, // n0x0818 c0x0000 (---------------) + us-west-1 - 0x000b0089, // n0x0819 c0x0000 (---------------) + us-west-2 - 0x000f0043, // n0x081a c0x0000 (---------------) + z-1 - 0x000c8c03, // n0x081b c0x0000 (---------------) + z-2 - 0x000413c2, // n0x081c c0x0000 (---------------) + s3 - 0x00201e82, // n0x081d c0x0000 (---------------) + I ac - 0x00200742, // n0x081e c0x0000 (---------------) + I co - 0x00203fc2, // n0x081f c0x0000 (---------------) + I ed - 0x002099c2, // n0x0820 c0x0000 (---------------) + I fi - 0x00202342, // n0x0821 c0x0000 (---------------) + I go - 0x00200c42, // n0x0822 c0x0000 (---------------) + I or - 0x00201a02, // n0x0823 c0x0000 (---------------) + I sa - 0x00222ac3, // n0x0824 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0825 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0826 c0x0000 (---------------) + I gov - 0x00200303, // n0x0827 c0x0000 (---------------) + I inf - 0x002170c3, // n0x0828 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0829 c0x0000 (---------------) + I org - 0x000e4188, // n0x082a c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x082b c0x0000 (---------------) + I com - 0x002d75c3, // n0x082c c0x0000 (---------------) + I edu - 0x002170c3, // n0x082d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x082e c0x0000 (---------------) + I org - 0x00078a43, // n0x082f c0x0000 (---------------) + ath - 0x0021e283, // n0x0830 c0x0000 (---------------) + I gov - 0x00201e82, // n0x0831 c0x0000 (---------------) + I ac - 0x00310603, // n0x0832 c0x0000 (---------------) + I biz - 0x13222ac3, // n0x0833 c0x004c (n0x083e-n0x083f) + I com - 0x00267c47, // n0x0834 c0x0000 (---------------) + I ekloges - 0x0021e283, // n0x0835 c0x0000 (---------------) + I gov - 0x003413c3, // n0x0836 c0x0000 (---------------) + I ltd - 0x00298944, // n0x0837 c0x0000 (---------------) + I name - 0x002170c3, // n0x0838 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0839 c0x0000 (---------------) + I org - 0x002647ca, // n0x083a c0x0000 (---------------) + I parliament - 0x0029abc5, // n0x083b c0x0000 (---------------) + I press - 0x00218243, // n0x083c c0x0000 (---------------) + I pro - 0x00208902, // n0x083d c0x0000 (---------------) + I tm - 0x000e4188, // n0x083e c0x0000 (---------------) + blogspot - 0x000e4188, // n0x083f c0x0000 (---------------) + blogspot - 0x000e4188, // n0x0840 c0x0000 (---------------) + blogspot - 0x00022ac3, // n0x0841 c0x0000 (---------------) + com - 0x0009fe8f, // n0x0842 c0x0000 (---------------) + fuettertdasnetz - 0x0015ff4a, // n0x0843 c0x0000 (---------------) + isteingeek - 0x000c2947, // n0x0844 c0x0000 (---------------) + istmein - 0x00016f4a, // n0x0845 c0x0000 (---------------) + lebtimnetz - 0x0006cb8a, // n0x0846 c0x0000 (---------------) + leitungsen - 0x000e8f4d, // n0x0847 c0x0000 (---------------) + traeumtgerade - 0x000e4188, // n0x0848 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x0849 c0x0000 (---------------) + I com - 0x002d75c3, // n0x084a c0x0000 (---------------) + I edu - 0x0021e283, // n0x084b c0x0000 (---------------) + I gov - 0x002170c3, // n0x084c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x084d c0x0000 (---------------) + I org - 0x00200603, // n0x084e c0x0000 (---------------) + I art - 0x00222ac3, // n0x084f c0x0000 (---------------) + I com - 0x002d75c3, // n0x0850 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x0851 c0x0000 (---------------) + I gob - 0x0021e283, // n0x0852 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x0853 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0854 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0855 c0x0000 (---------------) + I org - 0x00280043, // n0x0856 c0x0000 (---------------) + I sld - 0x00219fc3, // n0x0857 c0x0000 (---------------) + I web - 0x00200603, // n0x0858 c0x0000 (---------------) + I art - 0x002729c4, // n0x0859 c0x0000 (---------------) + I asso - 0x00222ac3, // n0x085a c0x0000 (---------------) + I com - 0x002d75c3, // n0x085b c0x0000 (---------------) + I edu - 0x0021e283, // n0x085c c0x0000 (---------------) + I gov - 0x002170c3, // n0x085d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x085e c0x0000 (---------------) + I org - 0x00218943, // n0x085f c0x0000 (---------------) + I pol - 0x00222ac3, // n0x0860 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0861 c0x0000 (---------------) + I edu - 0x00236403, // n0x0862 c0x0000 (---------------) + I fin - 0x0034eb03, // n0x0863 c0x0000 (---------------) + I gob - 0x0021e283, // n0x0864 c0x0000 (---------------) + I gov - 0x00200304, // n0x0865 c0x0000 (---------------) + I info - 0x00312503, // n0x0866 c0x0000 (---------------) + I k12 - 0x0020b403, // n0x0867 c0x0000 (---------------) + I med - 0x0023fa03, // n0x0868 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0869 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x086a c0x0000 (---------------) + I org - 0x00218243, // n0x086b c0x0000 (---------------) + I pro - 0x00382f83, // n0x086c c0x0000 (---------------) + I aip - 0x15622ac3, // n0x086d c0x0055 (n0x0876-n0x0877) + I com - 0x002d75c3, // n0x086e c0x0000 (---------------) + I edu - 0x002099c3, // n0x086f c0x0000 (---------------) + I fie - 0x0021e283, // n0x0870 c0x0000 (---------------) + I gov - 0x00273c43, // n0x0871 c0x0000 (---------------) + I lib - 0x0020b403, // n0x0872 c0x0000 (---------------) + I med - 0x0021dcc3, // n0x0873 c0x0000 (---------------) + I org - 0x0025f803, // n0x0874 c0x0000 (---------------) + I pri - 0x00375bc4, // n0x0875 c0x0000 (---------------) + I riik - 0x000e4188, // n0x0876 c0x0000 (---------------) + blogspot - 0x15e22ac3, // n0x0877 c0x0057 (n0x0880-n0x0881) + I com - 0x002d75c3, // n0x0878 c0x0000 (---------------) + I edu - 0x00291c43, // n0x0879 c0x0000 (---------------) + I eun - 0x0021e283, // n0x087a c0x0000 (---------------) + I gov - 0x0023fa03, // n0x087b c0x0000 (---------------) + I mil - 0x00298944, // n0x087c c0x0000 (---------------) + I name - 0x002170c3, // n0x087d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x087e c0x0000 (---------------) + I org - 0x00215583, // n0x087f c0x0000 (---------------) + I sci - 0x000e4188, // n0x0880 c0x0000 (---------------) + blogspot - 0x16622ac3, // n0x0881 c0x0059 (n0x0886-n0x0887) + I com - 0x002d75c3, // n0x0882 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x0883 c0x0000 (---------------) + I gob - 0x00207cc3, // n0x0884 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x0885 c0x0000 (---------------) + I org - 0x000e4188, // n0x0886 c0x0000 (---------------) + blogspot - 0x00310603, // n0x0887 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x0888 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0889 c0x0000 (---------------) + I edu - 0x0021e283, // n0x088a c0x0000 (---------------) + I gov - 0x00200304, // n0x088b c0x0000 (---------------) + I info - 0x00298944, // n0x088c c0x0000 (---------------) + I name - 0x002170c3, // n0x088d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x088e c0x0000 (---------------) + I org - 0x002f85c5, // n0x088f c0x0000 (---------------) + I aland - 0x000e4188, // n0x0890 c0x0000 (---------------) + blogspot - 0x00006743, // n0x0891 c0x0000 (---------------) + iki - 0x0036e608, // n0x0892 c0x0000 (---------------) + I aeroport - 0x00383787, // n0x0893 c0x0000 (---------------) + I assedic - 0x002729c4, // n0x0894 c0x0000 (---------------) + I asso - 0x00310b86, // n0x0895 c0x0000 (---------------) + I avocat - 0x0031e586, // n0x0896 c0x0000 (---------------) + I avoues - 0x000e4188, // n0x0897 c0x0000 (---------------) + blogspot - 0x0025f743, // n0x0898 c0x0000 (---------------) + I cci - 0x003011c9, // n0x0899 c0x0000 (---------------) + I chambagri - 0x00234bd5, // n0x089a c0x0000 (---------------) + I chirurgiens-dentistes - 0x00222ac3, // n0x089b c0x0000 (---------------) + I com - 0x0030c7d2, // n0x089c c0x0000 (---------------) + I experts-comptables - 0x0030c58f, // n0x089d c0x0000 (---------------) + I geometre-expert - 0x003579c4, // n0x089e c0x0000 (---------------) + I gouv - 0x0020dc85, // n0x089f c0x0000 (---------------) + I greta - 0x002de690, // n0x08a0 c0x0000 (---------------) + I huissier-justice - 0x002753c7, // n0x08a1 c0x0000 (---------------) + I medecin - 0x00207cc3, // n0x08a2 c0x0000 (---------------) + I nom - 0x00265c08, // n0x08a3 c0x0000 (---------------) + I notaires - 0x002e078a, // n0x08a4 c0x0000 (---------------) + I pharmacien - 0x0021a444, // n0x08a5 c0x0000 (---------------) + I port - 0x002ca783, // n0x08a6 c0x0000 (---------------) + I prd - 0x0029abc6, // n0x08a7 c0x0000 (---------------) + I presse - 0x00208902, // n0x08a8 c0x0000 (---------------) + I tm - 0x0036b18b, // n0x08a9 c0x0000 (---------------) + I veterinaire - 0x00222ac3, // n0x08aa c0x0000 (---------------) + I com - 0x002d75c3, // n0x08ab c0x0000 (---------------) + I edu - 0x0021e283, // n0x08ac c0x0000 (---------------) + I gov - 0x0023fa03, // n0x08ad c0x0000 (---------------) + I mil - 0x002170c3, // n0x08ae c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08af c0x0000 (---------------) + I org - 0x002ce243, // n0x08b0 c0x0000 (---------------) + I pvt - 0x00200742, // n0x08b1 c0x0000 (---------------) + I co - 0x002170c3, // n0x08b2 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08b3 c0x0000 (---------------) + I org - 0x00222ac3, // n0x08b4 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08b5 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08b6 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x08b7 c0x0000 (---------------) + I mil - 0x0021dcc3, // n0x08b8 c0x0000 (---------------) + I org - 0x00222ac3, // n0x08b9 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08ba c0x0000 (---------------) + I edu - 0x0021e283, // n0x08bb c0x0000 (---------------) + I gov - 0x003413c3, // n0x08bc c0x0000 (---------------) + I ltd - 0x00208483, // n0x08bd c0x0000 (---------------) + I mod - 0x0021dcc3, // n0x08be c0x0000 (---------------) + I org - 0x00200742, // n0x08bf c0x0000 (---------------) + I co - 0x00222ac3, // n0x08c0 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08c1 c0x0000 (---------------) + I edu - 0x002170c3, // n0x08c2 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08c3 c0x0000 (---------------) + I org - 0x00201e82, // n0x08c4 c0x0000 (---------------) + I ac - 0x00222ac3, // n0x08c5 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08c6 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08c7 c0x0000 (---------------) + I gov - 0x002170c3, // n0x08c8 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08c9 c0x0000 (---------------) + I org - 0x002729c4, // n0x08ca c0x0000 (---------------) + I asso - 0x00222ac3, // n0x08cb c0x0000 (---------------) + I com - 0x002d75c3, // n0x08cc c0x0000 (---------------) + I edu - 0x00203604, // n0x08cd c0x0000 (---------------) + I mobi - 0x002170c3, // n0x08ce c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08cf c0x0000 (---------------) + I org - 0x000e4188, // n0x08d0 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x08d1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08d2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08d3 c0x0000 (---------------) + I gov - 0x002170c3, // n0x08d4 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08d5 c0x0000 (---------------) + I org - 0x00222ac3, // n0x08d6 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08d7 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x08d8 c0x0000 (---------------) + I gob - 0x00215703, // n0x08d9 c0x0000 (---------------) + I ind - 0x0023fa03, // n0x08da c0x0000 (---------------) + I mil - 0x002170c3, // n0x08db c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08dc c0x0000 (---------------) + I org - 0x00200742, // n0x08dd c0x0000 (---------------) + I co - 0x00222ac3, // n0x08de c0x0000 (---------------) + I com - 0x002170c3, // n0x08df c0x0000 (---------------) + I net - 0x000e4188, // n0x08e0 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x08e1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08e2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x08e3 c0x0000 (---------------) + I gov - 0x00300b83, // n0x08e4 c0x0000 (---------------) + I idv - 0x00051e43, // n0x08e5 c0x0000 (---------------) + inc - 0x001413c3, // n0x08e6 c0x0000 (---------------) + ltd - 0x002170c3, // n0x08e7 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08e8 c0x0000 (---------------) + I org - 0x002ea10a, // n0x08e9 c0x0000 (---------------) + I xn--55qx5d - 0x00306ac9, // n0x08ea c0x0000 (---------------) + I xn--ciqpn - 0x0032788b, // n0x08eb c0x0000 (---------------) + I xn--gmq050i - 0x00327f0a, // n0x08ec c0x0000 (---------------) + I xn--gmqw5a - 0x0033080a, // n0x08ed c0x0000 (---------------) + I xn--io0a7i - 0x0033f6cb, // n0x08ee c0x0000 (---------------) + I xn--lcvr32d - 0x00356c8a, // n0x08ef c0x0000 (---------------) + I xn--mk0axi - 0x0035c6ca, // n0x08f0 c0x0000 (---------------) + I xn--mxtq1m - 0x0036394a, // n0x08f1 c0x0000 (---------------) + I xn--od0alg - 0x00363bcb, // n0x08f2 c0x0000 (---------------) + I xn--od0aq3b - 0x00384789, // n0x08f3 c0x0000 (---------------) + I xn--tn0ag - 0x003867ca, // n0x08f4 c0x0000 (---------------) + I xn--uc0atv - 0x00386c4b, // n0x08f5 c0x0000 (---------------) + I xn--uc0ay4a - 0x0039008b, // n0x08f6 c0x0000 (---------------) + I xn--wcvs22d - 0x0039634a, // n0x08f7 c0x0000 (---------------) + I xn--zf0avx - 0x00222ac3, // n0x08f8 c0x0000 (---------------) + I com - 0x002d75c3, // n0x08f9 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x08fa c0x0000 (---------------) + I gob - 0x0023fa03, // n0x08fb c0x0000 (---------------) + I mil - 0x002170c3, // n0x08fc c0x0000 (---------------) + I net - 0x0021dcc3, // n0x08fd c0x0000 (---------------) + I org - 0x000e4188, // n0x08fe c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x08ff c0x0000 (---------------) + I com - 0x0024d404, // n0x0900 c0x0000 (---------------) + I from - 0x00209782, // n0x0901 c0x0000 (---------------) + I iz - 0x00298944, // n0x0902 c0x0000 (---------------) + I name - 0x0036b745, // n0x0903 c0x0000 (---------------) + I adult - 0x00200603, // n0x0904 c0x0000 (---------------) + I art - 0x002729c4, // n0x0905 c0x0000 (---------------) + I asso - 0x00222ac3, // n0x0906 c0x0000 (---------------) + I com - 0x00228d44, // n0x0907 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x0908 c0x0000 (---------------) + I edu - 0x00238544, // n0x0909 c0x0000 (---------------) + I firm - 0x003579c4, // n0x090a c0x0000 (---------------) + I gouv - 0x00200304, // n0x090b c0x0000 (---------------) + I info - 0x0020b403, // n0x090c c0x0000 (---------------) + I med - 0x002170c3, // n0x090d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x090e c0x0000 (---------------) + I org - 0x0028acc5, // n0x090f c0x0000 (---------------) + I perso - 0x00218943, // n0x0910 c0x0000 (---------------) + I pol - 0x00218243, // n0x0911 c0x0000 (---------------) + I pro - 0x00241283, // n0x0912 c0x0000 (---------------) + I rel - 0x0029b184, // n0x0913 c0x0000 (---------------) + I shop - 0x0036f244, // n0x0914 c0x0000 (---------------) + I 2000 - 0x00256e45, // n0x0915 c0x0000 (---------------) + I agrar - 0x000e4188, // n0x0916 c0x0000 (---------------) + blogspot - 0x002de404, // n0x0917 c0x0000 (---------------) + I bolt - 0x002112c6, // n0x0918 c0x0000 (---------------) + I casino - 0x002735c4, // n0x0919 c0x0000 (---------------) + I city - 0x00200742, // n0x091a c0x0000 (---------------) + I co - 0x003128c7, // n0x091b c0x0000 (---------------) + I erotica - 0x0023a507, // n0x091c c0x0000 (---------------) + I erotika - 0x00356104, // n0x091d c0x0000 (---------------) + I film - 0x00246b45, // n0x091e c0x0000 (---------------) + I forum - 0x002d2145, // n0x091f c0x0000 (---------------) + I games - 0x00294945, // n0x0920 c0x0000 (---------------) + I hotel - 0x00200304, // n0x0921 c0x0000 (---------------) + I info - 0x0032d888, // n0x0922 c0x0000 (---------------) + I ingatlan - 0x00207486, // n0x0923 c0x0000 (---------------) + I jogasz - 0x002c1d48, // n0x0924 c0x0000 (---------------) + I konyvelo - 0x0023b745, // n0x0925 c0x0000 (---------------) + I lakas - 0x002dc385, // n0x0926 c0x0000 (---------------) + I media - 0x00366d44, // n0x0927 c0x0000 (---------------) + I news - 0x0021dcc3, // n0x0928 c0x0000 (---------------) + I org - 0x002cba44, // n0x0929 c0x0000 (---------------) + I priv - 0x0033de86, // n0x092a c0x0000 (---------------) + I reklam - 0x0029acc3, // n0x092b c0x0000 (---------------) + I sex - 0x0029b184, // n0x092c c0x0000 (---------------) + I shop - 0x0027cac5, // n0x092d c0x0000 (---------------) + I sport - 0x00278704, // n0x092e c0x0000 (---------------) + I suli - 0x0020bac4, // n0x092f c0x0000 (---------------) + I szex - 0x00208902, // n0x0930 c0x0000 (---------------) + I tm - 0x0024f786, // n0x0931 c0x0000 (---------------) + I tozsde - 0x0037a486, // n0x0932 c0x0000 (---------------) + I utazas - 0x002db9c5, // n0x0933 c0x0000 (---------------) + I video - 0x00201e82, // n0x0934 c0x0000 (---------------) + I ac - 0x00310603, // n0x0935 c0x0000 (---------------) + I biz - 0x1b600742, // n0x0936 c0x006d (n0x093f-n0x0940) + I co - 0x00227544, // n0x0937 c0x0000 (---------------) + I desa - 0x00202342, // n0x0938 c0x0000 (---------------) + I go - 0x0023fa03, // n0x0939 c0x0000 (---------------) + I mil - 0x00220282, // n0x093a c0x0000 (---------------) + I my - 0x002170c3, // n0x093b c0x0000 (---------------) + I net - 0x00200c42, // n0x093c c0x0000 (---------------) + I or - 0x00206103, // n0x093d c0x0000 (---------------) + I sch - 0x00219fc3, // n0x093e c0x0000 (---------------) + I web - 0x000e4188, // n0x093f c0x0000 (---------------) + blogspot - 0x000e4188, // n0x0940 c0x0000 (---------------) + blogspot - 0x0021e283, // n0x0941 c0x0000 (---------------) + I gov - 0x1c200742, // n0x0942 c0x0070 (n0x0943-n0x0944) o I co - 0x000e4188, // n0x0943 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x0944 c0x0000 (---------------) + I ac - 0x1ca00742, // n0x0945 c0x0072 (n0x094b-n0x094d) + I co - 0x00222ac3, // n0x0946 c0x0000 (---------------) + I com - 0x002170c3, // n0x0947 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0948 c0x0000 (---------------) + I org - 0x00206582, // n0x0949 c0x0000 (---------------) + I tt - 0x0020bf42, // n0x094a c0x0000 (---------------) + I tv - 0x003413c3, // n0x094b c0x0000 (---------------) + I ltd - 0x002c65c3, // n0x094c c0x0000 (---------------) + I plc - 0x00201e82, // n0x094d c0x0000 (---------------) + I ac - 0x000e4188, // n0x094e c0x0000 (---------------) + blogspot - 0x00200742, // n0x094f c0x0000 (---------------) + I co - 0x002d75c3, // n0x0950 c0x0000 (---------------) + I edu - 0x00238544, // n0x0951 c0x0000 (---------------) + I firm - 0x002012c3, // n0x0952 c0x0000 (---------------) + I gen - 0x0021e283, // n0x0953 c0x0000 (---------------) + I gov - 0x00215703, // n0x0954 c0x0000 (---------------) + I ind - 0x0023fa03, // n0x0955 c0x0000 (---------------) + I mil - 0x002170c3, // n0x0956 c0x0000 (---------------) + I net - 0x0020e3c3, // n0x0957 c0x0000 (---------------) + I nic - 0x0021dcc3, // n0x0958 c0x0000 (---------------) + I org - 0x00215503, // n0x0959 c0x0000 (---------------) + I res - 0x000f7e53, // n0x095a c0x0000 (---------------) + barrel-of-knowledge - 0x00104094, // n0x095b c0x0000 (---------------) + barrell-of-knowledge - 0x00009ac6, // n0x095c c0x0000 (---------------) + dyndns - 0x00042187, // n0x095d c0x0000 (---------------) + for-our - 0x000f8fc9, // n0x095e c0x0000 (---------------) + groks-the - 0x0009b5ca, // n0x095f c0x0000 (---------------) + groks-this - 0x0007690d, // n0x0960 c0x0000 (---------------) + here-for-more - 0x0009bfca, // n0x0961 c0x0000 (---------------) + knowsitall - 0x00130f46, // n0x0962 c0x0000 (---------------) + selfip - 0x00110e86, // n0x0963 c0x0000 (---------------) + webhop - 0x0021d5c2, // n0x0964 c0x0000 (---------------) + I eu - 0x00222ac3, // n0x0965 c0x0000 (---------------) + I com - 0x000b53c6, // n0x0966 c0x0000 (---------------) + github - 0x000f9303, // n0x0967 c0x0000 (---------------) + nid - 0x00222ac3, // n0x0968 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0969 c0x0000 (---------------) + I edu - 0x0021e283, // n0x096a c0x0000 (---------------) + I gov - 0x0023fa03, // n0x096b c0x0000 (---------------) + I mil - 0x002170c3, // n0x096c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x096d c0x0000 (---------------) + I org - 0x00201e82, // n0x096e c0x0000 (---------------) + I ac - 0x00200742, // n0x096f c0x0000 (---------------) + I co - 0x0021e283, // n0x0970 c0x0000 (---------------) + I gov - 0x00206202, // n0x0971 c0x0000 (---------------) + I id - 0x002170c3, // n0x0972 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0973 c0x0000 (---------------) + I org - 0x00206103, // n0x0974 c0x0000 (---------------) + I sch - 0x0034a88f, // n0x0975 c0x0000 (---------------) + I xn--mgba3a4f16a - 0x0034ac4e, // n0x0976 c0x0000 (---------------) + I xn--mgba3a4fra - 0x000e4188, // n0x0977 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x0978 c0x0000 (---------------) + I com - 0x000356c7, // n0x0979 c0x0000 (---------------) + cupcake - 0x002d75c3, // n0x097a c0x0000 (---------------) + I edu - 0x0021e283, // n0x097b c0x0000 (---------------) + I gov - 0x00238c03, // n0x097c c0x0000 (---------------) + I int - 0x002170c3, // n0x097d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x097e c0x0000 (---------------) + I org - 0x00214a43, // n0x097f c0x0000 (---------------) + I abr - 0x0038b8c7, // n0x0980 c0x0000 (---------------) + I abruzzo - 0x002015c2, // n0x0981 c0x0000 (---------------) + I ag - 0x00384949, // n0x0982 c0x0000 (---------------) + I agrigento - 0x00200882, // n0x0983 c0x0000 (---------------) + I al - 0x0022f94b, // n0x0984 c0x0000 (---------------) + I alessandria - 0x002d344a, // n0x0985 c0x0000 (---------------) + I alto-adige - 0x002c0d89, // n0x0986 c0x0000 (---------------) + I altoadige - 0x00201242, // n0x0987 c0x0000 (---------------) + I an - 0x00295b46, // n0x0988 c0x0000 (---------------) + I ancona - 0x00264b95, // n0x0989 c0x0000 (---------------) + I andria-barletta-trani - 0x0022fa95, // n0x098a c0x0000 (---------------) + I andria-trani-barletta - 0x0026bc93, // n0x098b c0x0000 (---------------) + I andriabarlettatrani - 0x00230013, // n0x098c c0x0000 (---------------) + I andriatranibarletta - 0x0020fd82, // n0x098d c0x0000 (---------------) + I ao - 0x00218745, // n0x098e c0x0000 (---------------) + I aosta - 0x00341e0c, // n0x098f c0x0000 (---------------) + I aosta-valley - 0x0029a44b, // n0x0990 c0x0000 (---------------) + I aostavalley - 0x00258685, // n0x0991 c0x0000 (---------------) + I aoste - 0x002105c2, // n0x0992 c0x0000 (---------------) + I ap - 0x00273fc2, // n0x0993 c0x0000 (---------------) + I aq - 0x002d7986, // n0x0994 c0x0000 (---------------) + I aquila - 0x00200602, // n0x0995 c0x0000 (---------------) + I ar - 0x00363106, // n0x0996 c0x0000 (---------------) + I arezzo - 0x0020094d, // n0x0997 c0x0000 (---------------) + I ascoli-piceno - 0x0034714c, // n0x0998 c0x0000 (---------------) + I ascolipiceno - 0x002166c4, // n0x0999 c0x0000 (---------------) + I asti - 0x00201642, // n0x099a c0x0000 (---------------) + I at - 0x00201482, // n0x099b c0x0000 (---------------) + I av - 0x00369f48, // n0x099c c0x0000 (---------------) + I avellino - 0x00205a82, // n0x099d c0x0000 (---------------) + I ba - 0x00240186, // n0x099e c0x0000 (---------------) + I balsan - 0x0027eb84, // n0x099f c0x0000 (---------------) + I bari - 0x00264d55, // n0x09a0 c0x0000 (---------------) + I barletta-trani-andria - 0x0026be13, // n0x09a1 c0x0000 (---------------) + I barlettatraniandria - 0x0020a443, // n0x09a2 c0x0000 (---------------) + I bas - 0x0030d98a, // n0x09a3 c0x0000 (---------------) + I basilicata - 0x002c5dc7, // n0x09a4 c0x0000 (---------------) + I belluno - 0x0030fa49, // n0x09a5 c0x0000 (---------------) + I benevento - 0x0023dc87, // n0x09a6 c0x0000 (---------------) + I bergamo - 0x00355e02, // n0x09a7 c0x0000 (---------------) + I bg - 0x00200002, // n0x09a8 c0x0000 (---------------) + I bi - 0x00381ac6, // n0x09a9 c0x0000 (---------------) + I biella - 0x00205842, // n0x09aa c0x0000 (---------------) + I bl - 0x000e4188, // n0x09ab c0x0000 (---------------) + blogspot - 0x0020a282, // n0x09ac c0x0000 (---------------) + I bn - 0x0020a702, // n0x09ad c0x0000 (---------------) + I bo - 0x0034c987, // n0x09ae c0x0000 (---------------) + I bologna - 0x00391387, // n0x09af c0x0000 (---------------) + I bolzano - 0x00212b85, // n0x09b0 c0x0000 (---------------) + I bozen - 0x00212e82, // n0x09b1 c0x0000 (---------------) + I br - 0x002154c7, // n0x09b2 c0x0000 (---------------) + I brescia - 0x00215688, // n0x09b3 c0x0000 (---------------) + I brindisi - 0x00235102, // n0x09b4 c0x0000 (---------------) + I bs - 0x00216fc2, // n0x09b5 c0x0000 (---------------) + I bt - 0x002203c2, // n0x09b6 c0x0000 (---------------) + I bz - 0x002055c2, // n0x09b7 c0x0000 (---------------) + I ca - 0x00250c08, // n0x09b8 c0x0000 (---------------) + I cagliari - 0x0020e443, // n0x09b9 c0x0000 (---------------) + I cal - 0x00238348, // n0x09ba c0x0000 (---------------) + I calabria - 0x002e718d, // n0x09bb c0x0000 (---------------) + I caltanissetta - 0x0021a083, // n0x09bc c0x0000 (---------------) + I cam - 0x00300748, // n0x09bd c0x0000 (---------------) + I campania - 0x0022c60f, // n0x09be c0x0000 (---------------) + I campidano-medio - 0x0022c9ce, // n0x09bf c0x0000 (---------------) + I campidanomedio - 0x0027284a, // n0x09c0 c0x0000 (---------------) + I campobasso - 0x002d4e91, // n0x09c1 c0x0000 (---------------) + I carbonia-iglesias - 0x002d5310, // n0x09c2 c0x0000 (---------------) + I carboniaiglesias - 0x0031888d, // n0x09c3 c0x0000 (---------------) + I carrara-massa - 0x00318bcc, // n0x09c4 c0x0000 (---------------) + I carraramassa - 0x002055c7, // n0x09c5 c0x0000 (---------------) + I caserta - 0x0030db07, // n0x09c6 c0x0000 (---------------) + I catania - 0x00310c49, // n0x09c7 c0x0000 (---------------) + I catanzaro - 0x002167c2, // n0x09c8 c0x0000 (---------------) + I cb - 0x00200b82, // n0x09c9 c0x0000 (---------------) + I ce - 0x0024434c, // n0x09ca c0x0000 (---------------) + I cesena-forli - 0x0024464b, // n0x09cb c0x0000 (---------------) + I cesenaforli - 0x00204a02, // n0x09cc c0x0000 (---------------) + I ch - 0x002c2546, // n0x09cd c0x0000 (---------------) + I chieti - 0x002155c2, // n0x09ce c0x0000 (---------------) + I ci - 0x0020af42, // n0x09cf c0x0000 (---------------) + I cl - 0x002211c2, // n0x09d0 c0x0000 (---------------) + I cn - 0x00200742, // n0x09d1 c0x0000 (---------------) + I co - 0x002230c4, // n0x09d2 c0x0000 (---------------) + I como - 0x0022bdc7, // n0x09d3 c0x0000 (---------------) + I cosenza - 0x0020c502, // n0x09d4 c0x0000 (---------------) + I cr - 0x00230b87, // n0x09d5 c0x0000 (---------------) + I cremona - 0x00231e07, // n0x09d6 c0x0000 (---------------) + I crotone - 0x0020f142, // n0x09d7 c0x0000 (---------------) + I cs - 0x00223d82, // n0x09d8 c0x0000 (---------------) + I ct - 0x00235585, // n0x09d9 c0x0000 (---------------) + I cuneo - 0x00214442, // n0x09da c0x0000 (---------------) + I cz - 0x002e990e, // n0x09db c0x0000 (---------------) + I dell-ogliastra - 0x002297cd, // n0x09dc c0x0000 (---------------) + I dellogliastra - 0x002d75c3, // n0x09dd c0x0000 (---------------) + I edu - 0x0023f9ce, // n0x09de c0x0000 (---------------) + I emilia-romagna - 0x00261dcd, // n0x09df c0x0000 (---------------) + I emiliaromagna - 0x0034efc3, // n0x09e0 c0x0000 (---------------) + I emr - 0x00200bc2, // n0x09e1 c0x0000 (---------------) + I en - 0x00201504, // n0x09e2 c0x0000 (---------------) + I enna - 0x00235d42, // n0x09e3 c0x0000 (---------------) + I fc - 0x0020c742, // n0x09e4 c0x0000 (---------------) + I fe - 0x002cc345, // n0x09e5 c0x0000 (---------------) + I fermo - 0x002e3b87, // n0x09e6 c0x0000 (---------------) + I ferrara - 0x00331442, // n0x09e7 c0x0000 (---------------) + I fg - 0x002099c2, // n0x09e8 c0x0000 (---------------) + I fi - 0x00237b87, // n0x09e9 c0x0000 (---------------) + I firenze - 0x0023c248, // n0x09ea c0x0000 (---------------) + I florence - 0x00358002, // n0x09eb c0x0000 (---------------) + I fm - 0x00200386, // n0x09ec c0x0000 (---------------) + I foggia - 0x002441cc, // n0x09ed c0x0000 (---------------) + I forli-cesena - 0x0024450b, // n0x09ee c0x0000 (---------------) + I forlicesena - 0x00200d42, // n0x09ef c0x0000 (---------------) + I fr - 0x002495cf, // n0x09f0 c0x0000 (---------------) + I friuli-v-giulia - 0x00249990, // n0x09f1 c0x0000 (---------------) + I friuli-ve-giulia - 0x00249d8f, // n0x09f2 c0x0000 (---------------) + I friuli-vegiulia - 0x0024a155, // n0x09f3 c0x0000 (---------------) + I friuli-venezia-giulia - 0x0024a694, // n0x09f4 c0x0000 (---------------) + I friuli-veneziagiulia - 0x0024ab8e, // n0x09f5 c0x0000 (---------------) + I friuli-vgiulia - 0x0024af0e, // n0x09f6 c0x0000 (---------------) + I friuliv-giulia - 0x0024b28f, // n0x09f7 c0x0000 (---------------) + I friulive-giulia - 0x0024b64e, // n0x09f8 c0x0000 (---------------) + I friulivegiulia - 0x0024b9d4, // n0x09f9 c0x0000 (---------------) + I friulivenezia-giulia - 0x0024bed3, // n0x09fa c0x0000 (---------------) + I friuliveneziagiulia - 0x0024c38d, // n0x09fb c0x0000 (---------------) + I friulivgiulia - 0x00263bc9, // n0x09fc c0x0000 (---------------) + I frosinone - 0x00277443, // n0x09fd c0x0000 (---------------) + I fvg - 0x002012c2, // n0x09fe c0x0000 (---------------) + I ge - 0x0030bb05, // n0x09ff c0x0000 (---------------) + I genoa - 0x002012c6, // n0x0a00 c0x0000 (---------------) + I genova - 0x00202342, // n0x0a01 c0x0000 (---------------) + I go - 0x002473c7, // n0x0a02 c0x0000 (---------------) + I gorizia - 0x0021e283, // n0x0a03 c0x0000 (---------------) + I gov - 0x0020dc82, // n0x0a04 c0x0000 (---------------) + I gr - 0x002e9508, // n0x0a05 c0x0000 (---------------) + I grosseto - 0x002d50d1, // n0x0a06 c0x0000 (---------------) + I iglesias-carbonia - 0x002d5510, // n0x0a07 c0x0000 (---------------) + I iglesiascarbonia - 0x00203582, // n0x0a08 c0x0000 (---------------) + I im - 0x002148c7, // n0x0a09 c0x0000 (---------------) + I imperia - 0x00202b42, // n0x0a0a c0x0000 (---------------) + I is - 0x002ee307, // n0x0a0b c0x0000 (---------------) + I isernia - 0x002034c2, // n0x0a0c c0x0000 (---------------) + I kr - 0x0036dc89, // n0x0a0d c0x0000 (---------------) + I la-spezia - 0x002d7947, // n0x0a0e c0x0000 (---------------) + I laquila - 0x00257b88, // n0x0a0f c0x0000 (---------------) + I laspezia - 0x0035dc46, // n0x0a10 c0x0000 (---------------) + I latina - 0x002c64c3, // n0x0a11 c0x0000 (---------------) + I laz - 0x0035a705, // n0x0a12 c0x0000 (---------------) + I lazio - 0x002339c2, // n0x0a13 c0x0000 (---------------) + I lc - 0x00203c42, // n0x0a14 c0x0000 (---------------) + I le - 0x00381ec5, // n0x0a15 c0x0000 (---------------) + I lecce - 0x0021e6c5, // n0x0a16 c0x0000 (---------------) + I lecco - 0x002008c2, // n0x0a17 c0x0000 (---------------) + I li - 0x0021a583, // n0x0a18 c0x0000 (---------------) + I lig - 0x00244887, // n0x0a19 c0x0000 (---------------) + I liguria - 0x003436c7, // n0x0a1a c0x0000 (---------------) + I livorno - 0x00205882, // n0x0a1b c0x0000 (---------------) + I lo - 0x002455c4, // n0x0a1c c0x0000 (---------------) + I lodi - 0x00260a43, // n0x0a1d c0x0000 (---------------) + I lom - 0x002b0b49, // n0x0a1e c0x0000 (---------------) + I lombardia - 0x002b8a88, // n0x0a1f c0x0000 (---------------) + I lombardy - 0x00205ec2, // n0x0a20 c0x0000 (---------------) + I lt - 0x002071c2, // n0x0a21 c0x0000 (---------------) + I lu - 0x00219187, // n0x0a22 c0x0000 (---------------) + I lucania - 0x0021aa05, // n0x0a23 c0x0000 (---------------) + I lucca - 0x00300248, // n0x0a24 c0x0000 (---------------) + I macerata - 0x0029c6c7, // n0x0a25 c0x0000 (---------------) + I mantova - 0x00216503, // n0x0a26 c0x0000 (---------------) + I mar - 0x0028de06, // n0x0a27 c0x0000 (---------------) + I marche - 0x0031870d, // n0x0a28 c0x0000 (---------------) + I massa-carrara - 0x00318a8c, // n0x0a29 c0x0000 (---------------) + I massacarrara - 0x0029f6c6, // n0x0a2a c0x0000 (---------------) + I matera - 0x00205942, // n0x0a2b c0x0000 (---------------) + I mb - 0x0023a6c2, // n0x0a2c c0x0000 (---------------) + I mc - 0x00208942, // n0x0a2d c0x0000 (---------------) + I me - 0x0022c48f, // n0x0a2e c0x0000 (---------------) + I medio-campidano - 0x0022c88e, // n0x0a2f c0x0000 (---------------) + I mediocampidano - 0x00291407, // n0x0a30 c0x0000 (---------------) + I messina - 0x00204802, // n0x0a31 c0x0000 (---------------) + I mi - 0x002f1e85, // n0x0a32 c0x0000 (---------------) + I milan - 0x002f1e86, // n0x0a33 c0x0000 (---------------) + I milano - 0x00217082, // n0x0a34 c0x0000 (---------------) + I mn - 0x00203602, // n0x0a35 c0x0000 (---------------) + I mo - 0x00278386, // n0x0a36 c0x0000 (---------------) + I modena - 0x00285643, // n0x0a37 c0x0000 (---------------) + I mol - 0x002ee246, // n0x0a38 c0x0000 (---------------) + I molise - 0x002b1e85, // n0x0a39 c0x0000 (---------------) + I monza - 0x002b1e8d, // n0x0a3a c0x0000 (---------------) + I monza-brianza - 0x002b26d5, // n0x0a3b c0x0000 (---------------) + I monza-e-della-brianza - 0x002b2e8c, // n0x0a3c c0x0000 (---------------) + I monzabrianza - 0x002b39cd, // n0x0a3d c0x0000 (---------------) + I monzaebrianza - 0x002b3d92, // n0x0a3e c0x0000 (---------------) + I monzaedellabrianza - 0x00209282, // n0x0a3f c0x0000 (---------------) + I ms - 0x00259642, // n0x0a40 c0x0000 (---------------) + I mt - 0x00200282, // n0x0a41 c0x0000 (---------------) + I na - 0x002b7886, // n0x0a42 c0x0000 (---------------) + I naples - 0x002d5c46, // n0x0a43 c0x0000 (---------------) + I napoli - 0x00200c02, // n0x0a44 c0x0000 (---------------) + I no - 0x00201346, // n0x0a45 c0x0000 (---------------) + I novara - 0x00205bc2, // n0x0a46 c0x0000 (---------------) + I nu - 0x00205bc5, // n0x0a47 c0x0000 (---------------) + I nuoro - 0x002003c2, // n0x0a48 c0x0000 (---------------) + I og - 0x002298c9, // n0x0a49 c0x0000 (---------------) + I ogliastra - 0x0022840c, // n0x0a4a c0x0000 (---------------) + I olbia-tempio - 0x0022874b, // n0x0a4b c0x0000 (---------------) + I olbiatempio - 0x00200c42, // n0x0a4c c0x0000 (---------------) + I or - 0x0023c688, // n0x0a4d c0x0000 (---------------) + I oristano - 0x002031c2, // n0x0a4e c0x0000 (---------------) + I ot - 0x002052c2, // n0x0a4f c0x0000 (---------------) + I pa - 0x0029a206, // n0x0a50 c0x0000 (---------------) + I padova - 0x0034f945, // n0x0a51 c0x0000 (---------------) + I padua - 0x0021ce87, // n0x0a52 c0x0000 (---------------) + I palermo - 0x003927c5, // n0x0a53 c0x0000 (---------------) + I parma - 0x002c0705, // n0x0a54 c0x0000 (---------------) + I pavia - 0x00203e02, // n0x0a55 c0x0000 (---------------) + I pc - 0x0029b282, // n0x0a56 c0x0000 (---------------) + I pd - 0x00214942, // n0x0a57 c0x0000 (---------------) + I pe - 0x0026fa47, // n0x0a58 c0x0000 (---------------) + I perugia - 0x0030758d, // n0x0a59 c0x0000 (---------------) + I pesaro-urbino - 0x0030790c, // n0x0a5a c0x0000 (---------------) + I pesarourbino - 0x00229107, // n0x0a5b c0x0000 (---------------) + I pescara - 0x002bf182, // n0x0a5c c0x0000 (---------------) + I pg - 0x00200b02, // n0x0a5d c0x0000 (---------------) + I pi - 0x00207788, // n0x0a5e c0x0000 (---------------) + I piacenza - 0x00261808, // n0x0a5f c0x0000 (---------------) + I piedmont - 0x002c1308, // n0x0a60 c0x0000 (---------------) + I piemonte - 0x002cd744, // n0x0a61 c0x0000 (---------------) + I pisa - 0x002c41c7, // n0x0a62 c0x0000 (---------------) + I pistoia - 0x002c7d43, // n0x0a63 c0x0000 (---------------) + I pmn - 0x0023df82, // n0x0a64 c0x0000 (---------------) + I pn - 0x00203f02, // n0x0a65 c0x0000 (---------------) + I po - 0x002c9b49, // n0x0a66 c0x0000 (---------------) + I pordenone - 0x00236a47, // n0x0a67 c0x0000 (---------------) + I potenza - 0x00218242, // n0x0a68 c0x0000 (---------------) + I pr - 0x00346185, // n0x0a69 c0x0000 (---------------) + I prato - 0x00295982, // n0x0a6a c0x0000 (---------------) + I pt - 0x00223542, // n0x0a6b c0x0000 (---------------) + I pu - 0x0025cd83, // n0x0a6c c0x0000 (---------------) + I pug - 0x0025cd86, // n0x0a6d c0x0000 (---------------) + I puglia - 0x002ce242, // n0x0a6e c0x0000 (---------------) + I pv - 0x002ce6c2, // n0x0a6f c0x0000 (---------------) + I pz - 0x00201442, // n0x0a70 c0x0000 (---------------) + I ra - 0x0038c106, // n0x0a71 c0x0000 (---------------) + I ragusa - 0x00201447, // n0x0a72 c0x0000 (---------------) + I ravenna - 0x00227b82, // n0x0a73 c0x0000 (---------------) + I rc - 0x002030c2, // n0x0a74 c0x0000 (---------------) + I re - 0x0023818f, // n0x0a75 c0x0000 (---------------) + I reggio-calabria - 0x0023f80d, // n0x0a76 c0x0000 (---------------) + I reggio-emilia - 0x0025df8e, // n0x0a77 c0x0000 (---------------) + I reggiocalabria - 0x00261c4c, // n0x0a78 c0x0000 (---------------) + I reggioemilia - 0x00204782, // n0x0a79 c0x0000 (---------------) + I rg - 0x00202842, // n0x0a7a c0x0000 (---------------) + I ri - 0x0021ba45, // n0x0a7b c0x0000 (---------------) + I rieti - 0x002e79c6, // n0x0a7c c0x0000 (---------------) + I rimini - 0x002194c2, // n0x0a7d c0x0000 (---------------) + I rm - 0x00202182, // n0x0a7e c0x0000 (---------------) + I rn - 0x00200d82, // n0x0a7f c0x0000 (---------------) + I ro - 0x0023fb84, // n0x0a80 c0x0000 (---------------) + I roma - 0x002e7004, // n0x0a81 c0x0000 (---------------) + I rome - 0x002b1386, // n0x0a82 c0x0000 (---------------) + I rovigo - 0x00201a02, // n0x0a83 c0x0000 (---------------) + I sa - 0x002671c7, // n0x0a84 c0x0000 (---------------) + I salerno - 0x00218483, // n0x0a85 c0x0000 (---------------) + I sar - 0x0021c048, // n0x0a86 c0x0000 (---------------) + I sardegna - 0x0021ca08, // n0x0a87 c0x0000 (---------------) + I sardinia - 0x00369a07, // n0x0a88 c0x0000 (---------------) + I sassari - 0x00232a46, // n0x0a89 c0x0000 (---------------) + I savona - 0x00209182, // n0x0a8a c0x0000 (---------------) + I si - 0x00215803, // n0x0a8b c0x0000 (---------------) + I sic - 0x00215807, // n0x0a8c c0x0000 (---------------) + I sicilia - 0x0026b646, // n0x0a8d c0x0000 (---------------) + I sicily - 0x002b77c5, // n0x0a8e c0x0000 (---------------) + I siena - 0x002d0d88, // n0x0a8f c0x0000 (---------------) + I siracusa - 0x00201102, // n0x0a90 c0x0000 (---------------) + I so - 0x0033ca87, // n0x0a91 c0x0000 (---------------) + I sondrio - 0x002101c2, // n0x0a92 c0x0000 (---------------) + I sp - 0x002ceec2, // n0x0a93 c0x0000 (---------------) + I sr - 0x00211f02, // n0x0a94 c0x0000 (---------------) + I ss - 0x002b5a09, // n0x0a95 c0x0000 (---------------) + I suedtirol - 0x0021d0c2, // n0x0a96 c0x0000 (---------------) + I sv - 0x00200142, // n0x0a97 c0x0000 (---------------) + I ta - 0x00229383, // n0x0a98 c0x0000 (---------------) + I taa - 0x0036ec87, // n0x0a99 c0x0000 (---------------) + I taranto - 0x00203202, // n0x0a9a c0x0000 (---------------) + I te - 0x0022858c, // n0x0a9b c0x0000 (---------------) + I tempio-olbia - 0x0022888b, // n0x0a9c c0x0000 (---------------) + I tempioolbia - 0x0029f746, // n0x0a9d c0x0000 (---------------) + I teramo - 0x002f9245, // n0x0a9e c0x0000 (---------------) + I terni - 0x0021d1c2, // n0x0a9f c0x0000 (---------------) + I tn - 0x00201682, // n0x0aa0 c0x0000 (---------------) + I to - 0x0029f3c6, // n0x0aa1 c0x0000 (---------------) + I torino - 0x002520c3, // n0x0aa2 c0x0000 (---------------) + I tos - 0x003096c7, // n0x0aa3 c0x0000 (---------------) + I toscana - 0x00285142, // n0x0aa4 c0x0000 (---------------) + I tp - 0x00202402, // n0x0aa5 c0x0000 (---------------) + I tr - 0x00264a15, // n0x0aa6 c0x0000 (---------------) + I trani-andria-barletta - 0x0022fc55, // n0x0aa7 c0x0000 (---------------) + I trani-barletta-andria - 0x0026bb53, // n0x0aa8 c0x0000 (---------------) + I traniandriabarletta - 0x00230193, // n0x0aa9 c0x0000 (---------------) + I tranibarlettaandria - 0x0027cbc7, // n0x0aaa c0x0000 (---------------) + I trapani - 0x0028cbc8, // n0x0aab c0x0000 (---------------) + I trentino - 0x0028cbd0, // n0x0aac c0x0000 (---------------) + I trentino-a-adige - 0x0029458f, // n0x0aad c0x0000 (---------------) + I trentino-aadige - 0x002d3213, // n0x0aae c0x0000 (---------------) + I trentino-alto-adige - 0x00306652, // n0x0aaf c0x0000 (---------------) + I trentino-altoadige - 0x0033be90, // n0x0ab0 c0x0000 (---------------) + I trentino-s-tirol - 0x0033ac8f, // n0x0ab1 c0x0000 (---------------) + I trentino-stirol - 0x0038cd52, // n0x0ab2 c0x0000 (---------------) + I trentino-sud-tirol - 0x002a4691, // n0x0ab3 c0x0000 (---------------) + I trentino-sudtirol - 0x002acf53, // n0x0ab4 c0x0000 (---------------) + I trentino-sued-tirol - 0x002b57d2, // n0x0ab5 c0x0000 (---------------) + I trentino-suedtirol - 0x002bc54f, // n0x0ab6 c0x0000 (---------------) + I trentinoa-adige - 0x002bd2ce, // n0x0ab7 c0x0000 (---------------) + I trentinoaadige - 0x002dccd2, // n0x0ab8 c0x0000 (---------------) + I trentinoalto-adige - 0x002c0b91, // n0x0ab9 c0x0000 (---------------) + I trentinoaltoadige - 0x002cb48f, // n0x0aba c0x0000 (---------------) + I trentinos-tirol - 0x002cc70e, // n0x0abb c0x0000 (---------------) + I trentinostirol - 0x002cda91, // n0x0abc c0x0000 (---------------) + I trentinosud-tirol - 0x002ce2d0, // n0x0abd c0x0000 (---------------) + I trentinosudtirol - 0x002cea52, // n0x0abe c0x0000 (---------------) + I trentinosued-tirol - 0x002dde91, // n0x0abf c0x0000 (---------------) + I trentinosuedtirol - 0x002d0946, // n0x0ac0 c0x0000 (---------------) + I trento - 0x002de4c7, // n0x0ac1 c0x0000 (---------------) + I treviso - 0x00354007, // n0x0ac2 c0x0000 (---------------) + I trieste - 0x00203a02, // n0x0ac3 c0x0000 (---------------) + I ts - 0x002af6c5, // n0x0ac4 c0x0000 (---------------) + I turin - 0x002d8c87, // n0x0ac5 c0x0000 (---------------) + I tuscany - 0x0020bf42, // n0x0ac6 c0x0000 (---------------) + I tv - 0x002070c2, // n0x0ac7 c0x0000 (---------------) + I ud - 0x00319045, // n0x0ac8 c0x0000 (---------------) + I udine - 0x00215fc3, // n0x0ac9 c0x0000 (---------------) + I umb - 0x002570c6, // n0x0aca c0x0000 (---------------) + I umbria - 0x0030774d, // n0x0acb c0x0000 (---------------) + I urbino-pesaro - 0x00307a8c, // n0x0acc c0x0000 (---------------) + I urbinopesaro - 0x002013c2, // n0x0acd c0x0000 (---------------) + I va - 0x00341c8b, // n0x0ace c0x0000 (---------------) + I val-d-aosta - 0x0029a30a, // n0x0acf c0x0000 (---------------) + I val-daosta - 0x0030ae0a, // n0x0ad0 c0x0000 (---------------) + I vald-aosta - 0x0029e789, // n0x0ad1 c0x0000 (---------------) + I valdaosta - 0x0029c80b, // n0x0ad2 c0x0000 (---------------) + I valle-aosta - 0x002c904d, // n0x0ad3 c0x0000 (---------------) + I valle-d-aosta - 0x002d958c, // n0x0ad4 c0x0000 (---------------) + I valle-daosta - 0x0021860a, // n0x0ad5 c0x0000 (---------------) + I valleaosta - 0x00244e8c, // n0x0ad6 c0x0000 (---------------) + I valled-aosta - 0x0024cc8b, // n0x0ad7 c0x0000 (---------------) + I valledaosta - 0x002584cc, // n0x0ad8 c0x0000 (---------------) + I vallee-aoste - 0x0025be8b, // n0x0ad9 c0x0000 (---------------) + I valleeaoste - 0x00263943, // n0x0ada c0x0000 (---------------) + I vao - 0x00278f86, // n0x0adb c0x0000 (---------------) + I varese - 0x0030b742, // n0x0adc c0x0000 (---------------) + I vb - 0x0034a542, // n0x0add c0x0000 (---------------) + I vc - 0x00211603, // n0x0ade c0x0000 (---------------) + I vda - 0x002014c2, // n0x0adf c0x0000 (---------------) + I ve - 0x002014c3, // n0x0ae0 c0x0000 (---------------) + I ven - 0x003546c6, // n0x0ae1 c0x0000 (---------------) + I veneto - 0x0024a307, // n0x0ae2 c0x0000 (---------------) + I venezia - 0x0025c506, // n0x0ae3 c0x0000 (---------------) + I venice - 0x00220fc8, // n0x0ae4 c0x0000 (---------------) + I verbania - 0x002a5e88, // n0x0ae5 c0x0000 (---------------) + I vercelli - 0x00248346, // n0x0ae6 c0x0000 (---------------) + I verona - 0x00213602, // n0x0ae7 c0x0000 (---------------) + I vi - 0x002db38d, // n0x0ae8 c0x0000 (---------------) + I vibo-valentia - 0x002db6cc, // n0x0ae9 c0x0000 (---------------) + I vibovalentia - 0x00357a87, // n0x0aea c0x0000 (---------------) + I vicenza - 0x002de2c7, // n0x0aeb c0x0000 (---------------) + I viterbo - 0x00211782, // n0x0aec c0x0000 (---------------) + I vr - 0x0020bf82, // n0x0aed c0x0000 (---------------) + I vs - 0x0021e302, // n0x0aee c0x0000 (---------------) + I vt - 0x0024ebc2, // n0x0aef c0x0000 (---------------) + I vv - 0x00200742, // n0x0af0 c0x0000 (---------------) + I co - 0x002170c3, // n0x0af1 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0af2 c0x0000 (---------------) + I org - 0x00222ac3, // n0x0af3 c0x0000 (---------------) + I com - 0x002d75c3, // n0x0af4 c0x0000 (---------------) + I edu - 0x0021e283, // n0x0af5 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x0af6 c0x0000 (---------------) + I mil - 0x00298944, // n0x0af7 c0x0000 (---------------) + I name - 0x002170c3, // n0x0af8 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x0af9 c0x0000 (---------------) + I org - 0x00206103, // n0x0afa c0x0000 (---------------) + I sch - 0x00201e82, // n0x0afb c0x0000 (---------------) + I ac - 0x00210a02, // n0x0afc c0x0000 (---------------) + I ad - 0x1fa34b45, // n0x0afd c0x007e (n0x0b6a-n0x0b9e) + I aichi - 0x1fe06e05, // n0x0afe c0x007f (n0x0b9e-n0x0bba) + I akita - 0x20387ac6, // n0x0aff c0x0080 (n0x0bba-n0x0bd0) + I aomori - 0x000e4188, // n0x0b00 c0x0000 (---------------) + blogspot - 0x206a0745, // n0x0b01 c0x0081 (n0x0bd0-n0x0c0a) + I chiba - 0x00200742, // n0x0b02 c0x0000 (---------------) + I co - 0x00203fc2, // n0x0b03 c0x0000 (---------------) + I ed - 0x20b1c945, // n0x0b04 c0x0082 (n0x0c0a-n0x0c20) + I ehime - 0x20e6b7c5, // n0x0b05 c0x0083 (n0x0c20-n0x0c2f) + I fukui - 0x2126c587, // n0x0b06 c0x0084 (n0x0c2f-n0x0c6e) + I fukuoka - 0x2166d5c9, // n0x0b07 c0x0085 (n0x0c6e-n0x0ca1) + I fukushima - 0x21a89804, // n0x0b08 c0x0086 (n0x0ca1-n0x0cc7) + I gifu - 0x00202342, // n0x0b09 c0x0000 (---------------) + I go - 0x0020dc82, // n0x0b0a c0x0000 (---------------) + I gr - 0x21e36f85, // n0x0b0b c0x0087 (n0x0cc7-n0x0ceb) + I gunma - 0x2227c649, // n0x0b0c c0x0088 (n0x0ceb-n0x0d04) + I hiroshima - 0x2275fc48, // n0x0b0d c0x0089 (n0x0d04-n0x0d92) + I hokkaido - 0x22a96e45, // n0x0b0e c0x008a (n0x0d92-n0x0dc0) + I hyogo - 0x22f16ac7, // n0x0b0f c0x008b (n0x0dc0-n0x0df3) + I ibaraki - 0x23214e48, // n0x0b10 c0x008c (n0x0df3-n0x0e06) + I ishikawa - 0x236c3b85, // n0x0b11 c0x008d (n0x0e06-n0x0e28) + I iwate - 0x23a81f06, // n0x0b12 c0x008e (n0x0e28-n0x0e37) + I kagawa - 0x23e71789, // n0x0b13 c0x008f (n0x0e37-n0x0e4b) + I kagoshima - 0x24332808, // n0x0b14 c0x0090 (n0x0e4b-n0x0e69) + I kanagawa - 0x246a8748, // n0x0b15 c0x0091 (n0x0e69-n0x0e6a)* o I kawasaki - 0x24a8294a, // n0x0b16 c0x0092 (n0x0e6a-n0x0e6b)* o I kitakyushu - 0x24e43484, // n0x0b17 c0x0093 (n0x0e6b-n0x0e6c)* o I kobe - 0x252ba445, // n0x0b18 c0x0094 (n0x0e6c-n0x0e8b) + I kochi - 0x256a2d48, // n0x0b19 c0x0095 (n0x0e8b-n0x0ea5) + I kumamoto - 0x25aacb05, // n0x0b1a c0x0096 (n0x0ea5-n0x0ec4) + I kyoto - 0x0020e4c2, // n0x0b1b c0x0000 (---------------) + I lg - 0x25e28143, // n0x0b1c c0x0097 (n0x0ec4-n0x0ee2) + I mie - 0x2628d746, // n0x0b1d c0x0098 (n0x0ee2-n0x0f03) + I miyagi - 0x26771208, // n0x0b1e c0x0099 (n0x0f03-n0x0f1e) + I miyazaki - 0x26b4e4c6, // n0x0b1f c0x009a (n0x0f1e-n0x0f69) + I nagano - 0x26f6c108, // n0x0b20 c0x009b (n0x0f69-n0x0f7f) + I nagasaki - 0x2732b206, // n0x0b21 c0x009c (n0x0f7f-n0x0f80)* o I nagoya - 0x276da0c4, // n0x0b22 c0x009d (n0x0f80-n0x0fa6) + I nara - 0x00201082, // n0x0b23 c0x0000 (---------------) + I ne - 0x27a5f907, // n0x0b24 c0x009e (n0x0fa6-n0x0fc8) + I niigata - 0x27e98d04, // n0x0b25 c0x009f (n0x0fc8-n0x0fdb) + I oita - 0x28266607, // n0x0b26 c0x00a0 (n0x0fdb-n0x0ff5) + I okayama - 0x287954c7, // n0x0b27 c0x00a1 (n0x0ff5-n0x101f) + I okinawa - 0x00200c42, // n0x0b28 c0x0000 (---------------) + I or - 0x28a864c5, // n0x0b29 c0x00a2 (n0x101f-n0x1051) + I osaka - 0x28e75104, // n0x0b2a c0x00a3 (n0x1051-n0x106b) + I saga - 0x292d0f07, // n0x0b2b c0x00a4 (n0x106b-n0x10b0) + I saitama - 0x296129c7, // n0x0b2c c0x00a5 (n0x10b0-n0x10b1)* o I sapporo - 0x29a6f286, // n0x0b2d c0x00a6 (n0x10b1-n0x10b2)* o I sendai - 0x29e525c5, // n0x0b2e c0x00a7 (n0x10b2-n0x10c9) + I shiga - 0x2a281087, // n0x0b2f c0x00a8 (n0x10c9-n0x10e0) + I shimane - 0x2a6b4b88, // n0x0b30 c0x00a9 (n0x10e0-n0x1104) + I shizuoka - 0x2ab0f5c7, // n0x0b31 c0x00aa (n0x1104-n0x1123) + I tochigi - 0x2ae8e2c9, // n0x0b32 c0x00ab (n0x1123-n0x1134) + I tokushima - 0x2b316545, // n0x0b33 c0x00ac (n0x1134-n0x116d) + I tokyo - 0x2b6e2787, // n0x0b34 c0x00ad (n0x116d-n0x117a) + I tottori - 0x2ba7c346, // n0x0b35 c0x00ae (n0x117a-n0x1192) + I toyama - 0x2bf2dc48, // n0x0b36 c0x00af (n0x1192-n0x11af) + I wakayama - 0x0022528d, // n0x0b37 c0x0000 (---------------) + I xn--0trq7p7nn - 0x00260809, // n0x0b38 c0x0000 (---------------) + I xn--1ctwo - 0x0026d84b, // n0x0b39 c0x0000 (---------------) + I xn--1lqs03n - 0x002910cb, // n0x0b3a c0x0000 (---------------) + I xn--1lqs71d - 0x002b1bcb, // n0x0b3b c0x0000 (---------------) + I xn--2m4a15e - 0x002d6b8b, // n0x0b3c c0x0000 (---------------) + I xn--32vp30h - 0x002e7bcb, // n0x0b3d c0x0000 (---------------) + I xn--4it168d - 0x002e7e8b, // n0x0b3e c0x0000 (---------------) + I xn--4it797k - 0x002e8689, // n0x0b3f c0x0000 (---------------) + I xn--4pvxs - 0x002ea38b, // n0x0b40 c0x0000 (---------------) + I xn--5js045d - 0x002ea64b, // n0x0b41 c0x0000 (---------------) + I xn--5rtp49c - 0x002ead0b, // n0x0b42 c0x0000 (---------------) + I xn--5rtq34k - 0x002eb3ca, // n0x0b43 c0x0000 (---------------) + I xn--6btw5a - 0x002eb90a, // n0x0b44 c0x0000 (---------------) + I xn--6orx2r - 0x002ebf0c, // n0x0b45 c0x0000 (---------------) + I xn--7t0a264c - 0x002f16cb, // n0x0b46 c0x0000 (---------------) + I xn--8ltr62k - 0x002f200a, // n0x0b47 c0x0000 (---------------) + I xn--8pvr4u - 0x0030374a, // n0x0b48 c0x0000 (---------------) + I xn--c3s14m - 0x0031334e, // n0x0b49 c0x0000 (---------------) + I xn--d5qv7z876c - 0x00313d4e, // n0x0b4a c0x0000 (---------------) + I xn--djrs72d6uy - 0x003140ca, // n0x0b4b c0x0000 (---------------) + I xn--djty4k - 0x003153ca, // n0x0b4c c0x0000 (---------------) + I xn--efvn9s - 0x0031700b, // n0x0b4d c0x0000 (---------------) + I xn--ehqz56n - 0x003172cb, // n0x0b4e c0x0000 (---------------) + I xn--elqq16h - 0x00317fcb, // n0x0b4f c0x0000 (---------------) + I xn--f6qx53a - 0x00333bcb, // n0x0b50 c0x0000 (---------------) + I xn--k7yn95e - 0x003341ca, // n0x0b51 c0x0000 (---------------) + I xn--kbrq7o - 0x00334e8b, // n0x0b52 c0x0000 (---------------) + I xn--klt787d - 0x0033514a, // n0x0b53 c0x0000 (---------------) + I xn--kltp7d - 0x003353ca, // n0x0b54 c0x0000 (---------------) + I xn--kltx9a - 0x0033564a, // n0x0b55 c0x0000 (---------------) + I xn--klty5x - 0x00357c4b, // n0x0b56 c0x0000 (---------------) + I xn--mkru45i - 0x0035d08b, // n0x0b57 c0x0000 (---------------) + I xn--nit225k - 0x0036094e, // n0x0b58 c0x0000 (---------------) + I xn--ntso0iqx3a - 0x00360ccb, // n0x0b59 c0x0000 (---------------) + I xn--ntsq17g - 0x003687cb, // n0x0b5a c0x0000 (---------------) + I xn--pssu33l - 0x0036a44b, // n0x0b5b c0x0000 (---------------) + I xn--qqqt11m - 0x003725ca, // n0x0b5c c0x0000 (---------------) + I xn--rht27z - 0x00372849, // n0x0b5d c0x0000 (---------------) + I xn--rht3d - 0x00372a8a, // n0x0b5e c0x0000 (---------------) + I xn--rht61e - 0x0037410a, // n0x0b5f c0x0000 (---------------) + I xn--rny31h - 0x0038548b, // n0x0b60 c0x0000 (---------------) + I xn--tor131o - 0x00386f0b, // n0x0b61 c0x0000 (---------------) + I xn--uist22h - 0x0038744a, // n0x0b62 c0x0000 (---------------) + I xn--uisz3g - 0x0038824b, // n0x0b63 c0x0000 (---------------) + I xn--uuwu58a - 0x0038d1cb, // n0x0b64 c0x0000 (---------------) + I xn--vgu402c - 0x00395d8b, // n0x0b65 c0x0000 (---------------) + I xn--zbx025d - 0x2c26dc08, // n0x0b66 c0x00b0 (n0x11af-n0x11d1) + I yamagata - 0x2c676089, // n0x0b67 c0x00b1 (n0x11d1-n0x11e1) + I yamaguchi - 0x2ca9b889, // n0x0b68 c0x00b2 (n0x11e1-n0x11fd) + I yamanashi - 0x2cf2b5c8, // n0x0b69 c0x00b3 (n0x11fd-n0x11fe)* o I yokohama - 0x002a2345, // n0x0b6a c0x0000 (---------------) + I aisai - 0x002068c3, // n0x0b6b c0x0000 (---------------) + I ama - 0x00203884, // n0x0b6c c0x0000 (---------------) + I anjo - 0x0034cb85, // n0x0b6d c0x0000 (---------------) + I asuke - 0x00289546, // n0x0b6e c0x0000 (---------------) + I chiryu - 0x002932c5, // n0x0b6f c0x0000 (---------------) + I chita - 0x00274d84, // n0x0b70 c0x0000 (---------------) + I fuso - 0x002472c8, // n0x0b71 c0x0000 (---------------) + I gamagori - 0x00242045, // n0x0b72 c0x0000 (---------------) + I handa - 0x0027ed44, // n0x0b73 c0x0000 (---------------) + I hazu - 0x002b2387, // n0x0b74 c0x0000 (---------------) + I hekinan - 0x00288d0a, // n0x0b75 c0x0000 (---------------) + I higashiura - 0x002a580a, // n0x0b76 c0x0000 (---------------) + I ichinomiya - 0x0031f587, // n0x0b77 c0x0000 (---------------) + I inazawa - 0x002067c7, // n0x0b78 c0x0000 (---------------) + I inuyama - 0x002d6707, // n0x0b79 c0x0000 (---------------) + I isshiki - 0x00248887, // n0x0b7a c0x0000 (---------------) + I iwakura - 0x00203cc5, // n0x0b7b c0x0000 (---------------) + I kanie - 0x00311ec6, // n0x0b7c c0x0000 (---------------) + I kariya - 0x0027cf47, // n0x0b7d c0x0000 (---------------) + I kasugai - 0x0025a504, // n0x0b7e c0x0000 (---------------) + I kira - 0x002fe646, // n0x0b7f c0x0000 (---------------) + I kiyosu - 0x002977c6, // n0x0b80 c0x0000 (---------------) + I komaki - 0x00204cc5, // n0x0b81 c0x0000 (---------------) + I konan - 0x0024c9c4, // n0x0b82 c0x0000 (---------------) + I kota - 0x00292a46, // n0x0b83 c0x0000 (---------------) + I mihama - 0x00288107, // n0x0b84 c0x0000 (---------------) + I miyoshi - 0x002209c6, // n0x0b85 c0x0000 (---------------) + I nishio - 0x002e6987, // n0x0b86 c0x0000 (---------------) + I nisshin - 0x0027e743, // n0x0b87 c0x0000 (---------------) + I obu - 0x0023be46, // n0x0b88 c0x0000 (---------------) + I oguchi - 0x0024f085, // n0x0b89 c0x0000 (---------------) + I oharu - 0x0026c687, // n0x0b8a c0x0000 (---------------) + I okazaki - 0x002ad48a, // n0x0b8b c0x0000 (---------------) + I owariasahi - 0x002e9604, // n0x0b8c c0x0000 (---------------) + I seto - 0x00213308, // n0x0b8d c0x0000 (---------------) + I shikatsu - 0x0028d309, // n0x0b8e c0x0000 (---------------) + I shinshiro - 0x002a4307, // n0x0b8f c0x0000 (---------------) + I shitara - 0x0026a586, // n0x0b90 c0x0000 (---------------) + I tahara - 0x00248648, // n0x0b91 c0x0000 (---------------) + I takahama - 0x0030be89, // n0x0b92 c0x0000 (---------------) + I tobishima - 0x00366704, // n0x0b93 c0x0000 (---------------) + I toei - 0x0025d104, // n0x0b94 c0x0000 (---------------) + I togo - 0x002df1c5, // n0x0b95 c0x0000 (---------------) + I tokai - 0x00376b08, // n0x0b96 c0x0000 (---------------) + I tokoname - 0x002aeb47, // n0x0b97 c0x0000 (---------------) + I toyoake - 0x00286c89, // n0x0b98 c0x0000 (---------------) + I toyohashi - 0x00322bc8, // n0x0b99 c0x0000 (---------------) + I toyokawa - 0x00221246, // n0x0b9a c0x0000 (---------------) + I toyone - 0x00338906, // n0x0b9b c0x0000 (---------------) + I toyota - 0x00283308, // n0x0b9c c0x0000 (---------------) + I tsushima - 0x00359906, // n0x0b9d c0x0000 (---------------) + I yatomi - 0x00206e05, // n0x0b9e c0x0000 (---------------) + I akita - 0x0026f346, // n0x0b9f c0x0000 (---------------) + I daisen - 0x00266b48, // n0x0ba0 c0x0000 (---------------) + I fujisato - 0x002dc286, // n0x0ba1 c0x0000 (---------------) + I gojome - 0x0024608b, // n0x0ba2 c0x0000 (---------------) + I hachirogata - 0x00279ac6, // n0x0ba3 c0x0000 (---------------) + I happou - 0x00284b0d, // n0x0ba4 c0x0000 (---------------) + I higashinaruse - 0x002028c5, // n0x0ba5 c0x0000 (---------------) + I honjo - 0x00292e46, // n0x0ba6 c0x0000 (---------------) + I honjyo - 0x00214f05, // n0x0ba7 c0x0000 (---------------) + I ikawa - 0x00281889, // n0x0ba8 c0x0000 (---------------) + I kamikoani - 0x0022ea47, // n0x0ba9 c0x0000 (---------------) + I kamioka - 0x0033ecc8, // n0x0baa c0x0000 (---------------) + I katagami - 0x0022bc46, // n0x0bab c0x0000 (---------------) + I kazuno - 0x00283c89, // n0x0bac c0x0000 (---------------) + I kitaakita - 0x0036b9c6, // n0x0bad c0x0000 (---------------) + I kosaka - 0x002ad405, // n0x0bae c0x0000 (---------------) + I kyowa - 0x0028b246, // n0x0baf c0x0000 (---------------) + I misato - 0x002bf786, // n0x0bb0 c0x0000 (---------------) + I mitane - 0x002b5c49, // n0x0bb1 c0x0000 (---------------) + I moriyoshi - 0x00226806, // n0x0bb2 c0x0000 (---------------) + I nikaho - 0x0023a007, // n0x0bb3 c0x0000 (---------------) + I noshiro - 0x0027bd85, // n0x0bb4 c0x0000 (---------------) + I odate - 0x00204043, // n0x0bb5 c0x0000 (---------------) + I oga - 0x00246205, // n0x0bb6 c0x0000 (---------------) + I ogata - 0x00293cc7, // n0x0bb7 c0x0000 (---------------) + I semboku - 0x0023ed06, // n0x0bb8 c0x0000 (---------------) + I yokote - 0x002027c9, // n0x0bb9 c0x0000 (---------------) + I yurihonjo - 0x00387ac6, // n0x0bba c0x0000 (---------------) + I aomori - 0x0026f586, // n0x0bbb c0x0000 (---------------) + I gonohe - 0x0022e109, // n0x0bbc c0x0000 (---------------) + I hachinohe - 0x0026ed49, // n0x0bbd c0x0000 (---------------) + I hashikami - 0x0028bc07, // n0x0bbe c0x0000 (---------------) + I hiranai - 0x00305a08, // n0x0bbf c0x0000 (---------------) + I hirosaki - 0x00273909, // n0x0bc0 c0x0000 (---------------) + I itayanagi - 0x0026ce88, // n0x0bc1 c0x0000 (---------------) + I kuroishi - 0x0035c906, // n0x0bc2 c0x0000 (---------------) + I misawa - 0x002bda45, // n0x0bc3 c0x0000 (---------------) + I mutsu - 0x0021638a, // n0x0bc4 c0x0000 (---------------) + I nakadomari - 0x0026f606, // n0x0bc5 c0x0000 (---------------) + I noheji - 0x0035e1c6, // n0x0bc6 c0x0000 (---------------) + I oirase - 0x0028d905, // n0x0bc7 c0x0000 (---------------) + I owani - 0x00205c88, // n0x0bc8 c0x0000 (---------------) + I rokunohe - 0x002092c7, // n0x0bc9 c0x0000 (---------------) + I sannohe - 0x0029ba0a, // n0x0bca c0x0000 (---------------) + I shichinohe - 0x00238986, // n0x0bcb c0x0000 (---------------) + I shingo - 0x0024cec5, // n0x0bcc c0x0000 (---------------) + I takko - 0x0023e846, // n0x0bcd c0x0000 (---------------) + I towada - 0x002e1a47, // n0x0bce c0x0000 (---------------) + I tsugaru - 0x0026a447, // n0x0bcf c0x0000 (---------------) + I tsuruta - 0x002041c5, // n0x0bd0 c0x0000 (---------------) + I abiko - 0x002ad5c5, // n0x0bd1 c0x0000 (---------------) + I asahi - 0x002c6646, // n0x0bd2 c0x0000 (---------------) + I chonan - 0x002c6e86, // n0x0bd3 c0x0000 (---------------) + I chosei - 0x0034a586, // n0x0bd4 c0x0000 (---------------) + I choshi - 0x002be904, // n0x0bd5 c0x0000 (---------------) + I chuo - 0x0026e2c9, // n0x0bd6 c0x0000 (---------------) + I funabashi - 0x00276f46, // n0x0bd7 c0x0000 (---------------) + I futtsu - 0x002d6f4a, // n0x0bd8 c0x0000 (---------------) + I hanamigawa - 0x0027df48, // n0x0bd9 c0x0000 (---------------) + I ichihara - 0x00312b88, // n0x0bda c0x0000 (---------------) + I ichikawa - 0x002a580a, // n0x0bdb c0x0000 (---------------) + I ichinomiya - 0x00329b05, // n0x0bdc c0x0000 (---------------) + I inzai - 0x00288045, // n0x0bdd c0x0000 (---------------) + I isumi - 0x00269408, // n0x0bde c0x0000 (---------------) + I kamagaya - 0x002ba1c8, // n0x0bdf c0x0000 (---------------) + I kamogawa - 0x00375c87, // n0x0be0 c0x0000 (---------------) + I kashiwa - 0x00335e46, // n0x0be1 c0x0000 (---------------) + I katori - 0x002fd408, // n0x0be2 c0x0000 (---------------) + I katsuura - 0x0027d607, // n0x0be3 c0x0000 (---------------) + I kimitsu - 0x0026c7c8, // n0x0be4 c0x0000 (---------------) + I kisarazu - 0x0035d306, // n0x0be5 c0x0000 (---------------) + I kozaki - 0x0026ff48, // n0x0be6 c0x0000 (---------------) + I kujukuri - 0x0027e846, // n0x0be7 c0x0000 (---------------) + I kyonan - 0x0023b8c7, // n0x0be8 c0x0000 (---------------) + I matsudo - 0x002846c6, // n0x0be9 c0x0000 (---------------) + I midori - 0x00292a46, // n0x0bea c0x0000 (---------------) + I mihama - 0x00213fca, // n0x0beb c0x0000 (---------------) + I minamiboso - 0x00223146, // n0x0bec c0x0000 (---------------) + I mobara - 0x002bda49, // n0x0bed c0x0000 (---------------) + I mutsuzawa - 0x0032a1c6, // n0x0bee c0x0000 (---------------) + I nagara - 0x002a0a8a, // n0x0bef c0x0000 (---------------) + I nagareyama - 0x002da0c9, // n0x0bf0 c0x0000 (---------------) + I narashino - 0x0025ac46, // n0x0bf1 c0x0000 (---------------) + I narita - 0x00384f84, // n0x0bf2 c0x0000 (---------------) + I noda - 0x0030bbcd, // n0x0bf3 c0x0000 (---------------) + I oamishirasato - 0x00276307, // n0x0bf4 c0x0000 (---------------) + I omigawa - 0x002fffc6, // n0x0bf5 c0x0000 (---------------) + I onjuku - 0x002a8605, // n0x0bf6 c0x0000 (---------------) + I otaki - 0x0036ba45, // n0x0bf7 c0x0000 (---------------) + I sakae - 0x002f4d46, // n0x0bf8 c0x0000 (---------------) + I sakura - 0x002a73c9, // n0x0bf9 c0x0000 (---------------) + I shimofusa - 0x002b9447, // n0x0bfa c0x0000 (---------------) + I shirako - 0x00268406, // n0x0bfb c0x0000 (---------------) + I shiroi - 0x0029fd06, // n0x0bfc c0x0000 (---------------) + I shisui - 0x00274e09, // n0x0bfd c0x0000 (---------------) + I sodegaura - 0x0022a904, // n0x0bfe c0x0000 (---------------) + I sosa - 0x0021f304, // n0x0bff c0x0000 (---------------) + I tako - 0x0038a708, // n0x0c00 c0x0000 (---------------) + I tateyama - 0x002e5fc6, // n0x0c01 c0x0000 (---------------) + I togane - 0x00340e08, // n0x0c02 c0x0000 (---------------) + I tohnosho - 0x003163c8, // n0x0c03 c0x0000 (---------------) + I tomisato - 0x00206f47, // n0x0c04 c0x0000 (---------------) + I urayasu - 0x00382d89, // n0x0c05 c0x0000 (---------------) + I yachimata - 0x002e38c7, // n0x0c06 c0x0000 (---------------) + I yachiyo - 0x002a060a, // n0x0c07 c0x0000 (---------------) + I yokaichiba - 0x00315d8f, // n0x0c08 c0x0000 (---------------) + I yokoshibahikari - 0x002394ca, // n0x0c09 c0x0000 (---------------) + I yotsukaido - 0x0021b845, // n0x0c0a c0x0000 (---------------) + I ainan - 0x00266d85, // n0x0c0b c0x0000 (---------------) + I honai - 0x0020f345, // n0x0c0c c0x0000 (---------------) + I ikata - 0x0027eac7, // n0x0c0d c0x0000 (---------------) + I imabari - 0x00253503, // n0x0c0e c0x0000 (---------------) + I iyo - 0x00305c08, // n0x0c0f c0x0000 (---------------) + I kamijima - 0x0037aec6, // n0x0c10 c0x0000 (---------------) + I kihoku - 0x0037afc9, // n0x0c11 c0x0000 (---------------) + I kumakogen - 0x002e5286, // n0x0c12 c0x0000 (---------------) + I masaki - 0x00392e07, // n0x0c13 c0x0000 (---------------) + I matsuno - 0x00283a49, // n0x0c14 c0x0000 (---------------) + I matsuyama - 0x0033ebc8, // n0x0c15 c0x0000 (---------------) + I namikata - 0x0028d9c7, // n0x0c16 c0x0000 (---------------) + I niihama - 0x002e3dc3, // n0x0c17 c0x0000 (---------------) + I ozu - 0x002a23c5, // n0x0c18 c0x0000 (---------------) + I saijo - 0x00315cc5, // n0x0c19 c0x0000 (---------------) + I seiyo - 0x002be74b, // n0x0c1a c0x0000 (---------------) + I shikokuchuo - 0x002acbc4, // n0x0c1b c0x0000 (---------------) + I tobe - 0x002d1504, // n0x0c1c c0x0000 (---------------) + I toon - 0x00265706, // n0x0c1d c0x0000 (---------------) + I uchiko - 0x002e4647, // n0x0c1e c0x0000 (---------------) + I uwajima - 0x003804ca, // n0x0c1f c0x0000 (---------------) + I yawatahama - 0x002281c7, // n0x0c20 c0x0000 (---------------) + I echizen - 0x00366787, // n0x0c21 c0x0000 (---------------) + I eiheiji - 0x0026b7c5, // n0x0c22 c0x0000 (---------------) + I fukui - 0x00390e45, // n0x0c23 c0x0000 (---------------) + I ikeda - 0x00260149, // n0x0c24 c0x0000 (---------------) + I katsuyama - 0x00292a46, // n0x0c25 c0x0000 (---------------) + I mihama - 0x0022804d, // n0x0c26 c0x0000 (---------------) + I minamiechizen - 0x00395885, // n0x0c27 c0x0000 (---------------) + I obama - 0x00285a43, // n0x0c28 c0x0000 (---------------) + I ohi - 0x00207e83, // n0x0c29 c0x0000 (---------------) + I ono - 0x003404c5, // n0x0c2a c0x0000 (---------------) + I sabae - 0x003396c5, // n0x0c2b c0x0000 (---------------) + I sakai - 0x00248648, // n0x0c2c c0x0000 (---------------) + I takahama - 0x00277007, // n0x0c2d c0x0000 (---------------) + I tsuruga - 0x0021f086, // n0x0c2e c0x0000 (---------------) + I wakasa - 0x00289c86, // n0x0c2f c0x0000 (---------------) + I ashiya - 0x0021de85, // n0x0c30 c0x0000 (---------------) + I buzen - 0x00375807, // n0x0c31 c0x0000 (---------------) + I chikugo - 0x00206a47, // n0x0c32 c0x0000 (---------------) + I chikuho - 0x002a5bc7, // n0x0c33 c0x0000 (---------------) + I chikujo - 0x002ba4ca, // n0x0c34 c0x0000 (---------------) + I chikushino - 0x0023bf08, // n0x0c35 c0x0000 (---------------) + I chikuzen - 0x002be904, // n0x0c36 c0x0000 (---------------) + I chuo - 0x0024ed47, // n0x0c37 c0x0000 (---------------) + I dazaifu - 0x0026ae87, // n0x0c38 c0x0000 (---------------) + I fukuchi - 0x00317546, // n0x0c39 c0x0000 (---------------) + I hakata - 0x002545c7, // n0x0c3a c0x0000 (---------------) + I higashi - 0x002c5b48, // n0x0c3b c0x0000 (---------------) + I hirokawa - 0x0029b788, // n0x0c3c c0x0000 (---------------) + I hisayama - 0x00246d86, // n0x0c3d c0x0000 (---------------) + I iizuka - 0x0023abc8, // n0x0c3e c0x0000 (---------------) + I inatsuki - 0x00226884, // n0x0c3f c0x0000 (---------------) + I kaho - 0x0027cf46, // n0x0c40 c0x0000 (---------------) + I kasuga - 0x0020d3c6, // n0x0c41 c0x0000 (---------------) + I kasuya - 0x003824c6, // n0x0c42 c0x0000 (---------------) + I kawara - 0x00295dc6, // n0x0c43 c0x0000 (---------------) + I keisen - 0x00232c84, // n0x0c44 c0x0000 (---------------) + I koga - 0x00248946, // n0x0c45 c0x0000 (---------------) + I kurate - 0x002a67c6, // n0x0c46 c0x0000 (---------------) + I kurogi - 0x00282e46, // n0x0c47 c0x0000 (---------------) + I kurume - 0x00213fc6, // n0x0c48 c0x0000 (---------------) + I minami - 0x00207d46, // n0x0c49 c0x0000 (---------------) + I miyako - 0x00272346, // n0x0c4a c0x0000 (---------------) + I miyama - 0x0021ef88, // n0x0c4b c0x0000 (---------------) + I miyawaka - 0x002fe4c8, // n0x0c4c c0x0000 (---------------) + I mizumaki - 0x002bb0c8, // n0x0c4d c0x0000 (---------------) + I munakata - 0x002934c8, // n0x0c4e c0x0000 (---------------) + I nakagawa - 0x00269386, // n0x0c4f c0x0000 (---------------) + I nakama - 0x00208b85, // n0x0c50 c0x0000 (---------------) + I nishi - 0x0031b486, // n0x0c51 c0x0000 (---------------) + I nogata - 0x00296ec5, // n0x0c52 c0x0000 (---------------) + I ogori - 0x0035c047, // n0x0c53 c0x0000 (---------------) + I okagaki - 0x0022ecc5, // n0x0c54 c0x0000 (---------------) + I okawa - 0x00201bc3, // n0x0c55 c0x0000 (---------------) + I oki - 0x00200085, // n0x0c56 c0x0000 (---------------) + I omuta - 0x002c7844, // n0x0c57 c0x0000 (---------------) + I onga - 0x00207e85, // n0x0c58 c0x0000 (---------------) + I onojo - 0x0020fdc3, // n0x0c59 c0x0000 (---------------) + I oto - 0x002d47c7, // n0x0c5a c0x0000 (---------------) + I saigawa - 0x00333848, // n0x0c5b c0x0000 (---------------) + I sasaguri - 0x002e6a46, // n0x0c5c c0x0000 (---------------) + I shingu - 0x0029230d, // n0x0c5d c0x0000 (---------------) + I shinyoshitomi - 0x00266d46, // n0x0c5e c0x0000 (---------------) + I shonai - 0x002823c5, // n0x0c5f c0x0000 (---------------) + I soeda - 0x002ad183, // n0x0c60 c0x0000 (---------------) + I sue - 0x002a2189, // n0x0c61 c0x0000 (---------------) + I tachiarai - 0x0020e146, // n0x0c62 c0x0000 (---------------) + I tagawa - 0x002344c6, // n0x0c63 c0x0000 (---------------) + I takata - 0x00253644, // n0x0c64 c0x0000 (---------------) + I toho - 0x00239447, // n0x0c65 c0x0000 (---------------) + I toyotsu - 0x00227786, // n0x0c66 c0x0000 (---------------) + I tsuiki - 0x00289985, // n0x0c67 c0x0000 (---------------) + I ukiha - 0x00209803, // n0x0c68 c0x0000 (---------------) + I umi - 0x00211e04, // n0x0c69 c0x0000 (---------------) + I usui - 0x0026b046, // n0x0c6a c0x0000 (---------------) + I yamada - 0x002d81c4, // n0x0c6b c0x0000 (---------------) + I yame - 0x002f7448, // n0x0c6c c0x0000 (---------------) + I yanagawa - 0x0038f4c9, // n0x0c6d c0x0000 (---------------) + I yukuhashi - 0x0022ef49, // n0x0c6e c0x0000 (---------------) + I aizubange - 0x0028b14a, // n0x0c6f c0x0000 (---------------) + I aizumisato - 0x0023124d, // n0x0c70 c0x0000 (---------------) + I aizuwakamatsu - 0x00240607, // n0x0c71 c0x0000 (---------------) + I asakawa - 0x00255706, // n0x0c72 c0x0000 (---------------) + I bandai - 0x00209004, // n0x0c73 c0x0000 (---------------) + I date - 0x0026d5c9, // n0x0c74 c0x0000 (---------------) + I fukushima - 0x00274788, // n0x0c75 c0x0000 (---------------) + I furudono - 0x00275f06, // n0x0c76 c0x0000 (---------------) + I futaba - 0x002e9cc6, // n0x0c77 c0x0000 (---------------) + I hanawa - 0x002545c7, // n0x0c78 c0x0000 (---------------) + I higashi - 0x0029cdc6, // n0x0c79 c0x0000 (---------------) + I hirata - 0x0021af86, // n0x0c7a c0x0000 (---------------) + I hirono - 0x00329c06, // n0x0c7b c0x0000 (---------------) + I iitate - 0x0039554a, // n0x0c7c c0x0000 (---------------) + I inawashiro - 0x00214e48, // n0x0c7d c0x0000 (---------------) + I ishikawa - 0x002999c5, // n0x0c7e c0x0000 (---------------) + I iwaki - 0x00254a09, // n0x0c7f c0x0000 (---------------) + I izumizaki - 0x002af2ca, // n0x0c80 c0x0000 (---------------) + I kagamiishi - 0x002150c8, // n0x0c81 c0x0000 (---------------) + I kaneyama - 0x00287448, // n0x0c82 c0x0000 (---------------) + I kawamata - 0x002815c8, // n0x0c83 c0x0000 (---------------) + I kitakata - 0x00293e8c, // n0x0c84 c0x0000 (---------------) + I kitashiobara - 0x002c3e45, // n0x0c85 c0x0000 (---------------) + I koori - 0x00289f08, // n0x0c86 c0x0000 (---------------) + I koriyama - 0x002f1d86, // n0x0c87 c0x0000 (---------------) + I kunimi - 0x002d1906, // n0x0c88 c0x0000 (---------------) + I miharu - 0x00392cc7, // n0x0c89 c0x0000 (---------------) + I mishima - 0x002280c5, // n0x0c8a c0x0000 (---------------) + I namie - 0x0026f4c5, // n0x0c8b c0x0000 (---------------) + I nango - 0x0022ee09, // n0x0c8c c0x0000 (---------------) + I nishiaizu - 0x0020bd87, // n0x0c8d c0x0000 (---------------) + I nishigo - 0x0037af85, // n0x0c8e c0x0000 (---------------) + I okuma - 0x0021e147, // n0x0c8f c0x0000 (---------------) + I omotego - 0x00207e83, // n0x0c90 c0x0000 (---------------) + I ono - 0x002af985, // n0x0c91 c0x0000 (---------------) + I otama - 0x00355688, // n0x0c92 c0x0000 (---------------) + I samegawa - 0x0026e047, // n0x0c93 c0x0000 (---------------) + I shimogo - 0x00287309, // n0x0c94 c0x0000 (---------------) + I shirakawa - 0x002b3885, // n0x0c95 c0x0000 (---------------) + I showa - 0x0038e104, // n0x0c96 c0x0000 (---------------) + I soma - 0x0028c348, // n0x0c97 c0x0000 (---------------) + I sukagawa - 0x0025fa47, // n0x0c98 c0x0000 (---------------) + I taishin - 0x0028db88, // n0x0c99 c0x0000 (---------------) + I tamakawa - 0x003109c8, // n0x0c9a c0x0000 (---------------) + I tanagura - 0x0034d1c5, // n0x0c9b c0x0000 (---------------) + I tenei - 0x00389946, // n0x0c9c c0x0000 (---------------) + I yabuki - 0x0022afc6, // n0x0c9d c0x0000 (---------------) + I yamato - 0x00346949, // n0x0c9e c0x0000 (---------------) + I yamatsuri - 0x002fdc47, // n0x0c9f c0x0000 (---------------) + I yanaizu - 0x00297546, // n0x0ca0 c0x0000 (---------------) + I yugawa - 0x00383347, // n0x0ca1 c0x0000 (---------------) + I anpachi - 0x00244403, // n0x0ca2 c0x0000 (---------------) + I ena - 0x00289804, // n0x0ca3 c0x0000 (---------------) + I gifu - 0x003746c5, // n0x0ca4 c0x0000 (---------------) + I ginan - 0x0024efc4, // n0x0ca5 c0x0000 (---------------) + I godo - 0x00232644, // n0x0ca6 c0x0000 (---------------) + I gujo - 0x0023ca07, // n0x0ca7 c0x0000 (---------------) + I hashima - 0x002e5907, // n0x0ca8 c0x0000 (---------------) + I hichiso - 0x002685c4, // n0x0ca9 c0x0000 (---------------) + I hida - 0x00287150, // n0x0caa c0x0000 (---------------) + I higashishirakawa - 0x002f4ec7, // n0x0cab c0x0000 (---------------) + I ibigawa - 0x00390e45, // n0x0cac c0x0000 (---------------) + I ikeda - 0x00271acc, // n0x0cad c0x0000 (---------------) + I kakamigahara - 0x00203cc4, // n0x0cae c0x0000 (---------------) + I kani - 0x0028f7c8, // n0x0caf c0x0000 (---------------) + I kasahara - 0x0023b7c9, // n0x0cb0 c0x0000 (---------------) + I kasamatsu - 0x00298ac6, // n0x0cb1 c0x0000 (---------------) + I kawaue - 0x0022aa08, // n0x0cb2 c0x0000 (---------------) + I kitagata - 0x0022ec04, // n0x0cb3 c0x0000 (---------------) + I mino - 0x002fb148, // n0x0cb4 c0x0000 (---------------) + I minokamo - 0x002adf86, // n0x0cb5 c0x0000 (---------------) + I mitake - 0x00252288, // n0x0cb6 c0x0000 (---------------) + I mizunami - 0x00289146, // n0x0cb7 c0x0000 (---------------) + I motosu - 0x0021d20b, // n0x0cb8 c0x0000 (---------------) + I nakatsugawa - 0x00394b85, // n0x0cb9 c0x0000 (---------------) + I ogaki - 0x002b5248, // n0x0cba c0x0000 (---------------) + I sakahogi - 0x0020d984, // n0x0cbb c0x0000 (---------------) + I seki - 0x0038f90a, // n0x0cbc c0x0000 (---------------) + I sekigahara - 0x00287309, // n0x0cbd c0x0000 (---------------) + I shirakawa - 0x0024f946, // n0x0cbe c0x0000 (---------------) + I tajimi - 0x0020f408, // n0x0cbf c0x0000 (---------------) + I takayama - 0x002b9085, // n0x0cc0 c0x0000 (---------------) + I tarui - 0x002add84, // n0x0cc1 c0x0000 (---------------) + I toki - 0x0028f6c6, // n0x0cc2 c0x0000 (---------------) + I tomika - 0x002e55c8, // n0x0cc3 c0x0000 (---------------) + I wanouchi - 0x0026dc08, // n0x0cc4 c0x0000 (---------------) + I yamagata - 0x00330546, // n0x0cc5 c0x0000 (---------------) + I yaotsu - 0x00396e84, // n0x0cc6 c0x0000 (---------------) + I yoro - 0x00216306, // n0x0cc7 c0x0000 (---------------) + I annaka - 0x002e3947, // n0x0cc8 c0x0000 (---------------) + I chiyoda - 0x00266507, // n0x0cc9 c0x0000 (---------------) + I fujioka - 0x002545cf, // n0x0cca c0x0000 (---------------) + I higashiagatsuma - 0x0037a987, // n0x0ccb c0x0000 (---------------) + I isesaki - 0x0025ad07, // n0x0ccc c0x0000 (---------------) + I itakura - 0x002d17c5, // n0x0ccd c0x0000 (---------------) + I kanna - 0x002cc145, // n0x0cce c0x0000 (---------------) + I kanra - 0x0028b8c9, // n0x0ccf c0x0000 (---------------) + I katashina - 0x00343106, // n0x0cd0 c0x0000 (---------------) + I kawaba - 0x00258d45, // n0x0cd1 c0x0000 (---------------) + I kiryu - 0x0026f047, // n0x0cd2 c0x0000 (---------------) + I kusatsu - 0x002cb088, // n0x0cd3 c0x0000 (---------------) + I maebashi - 0x002cae05, // n0x0cd4 c0x0000 (---------------) + I meiwa - 0x002846c6, // n0x0cd5 c0x0000 (---------------) + I midori - 0x00204808, // n0x0cd6 c0x0000 (---------------) + I minakami - 0x0034e4ca, // n0x0cd7 c0x0000 (---------------) + I naganohara - 0x00364808, // n0x0cd8 c0x0000 (---------------) + I nakanojo - 0x00278107, // n0x0cd9 c0x0000 (---------------) + I nanmoku - 0x003161c6, // n0x0cda c0x0000 (---------------) + I numata - 0x002549c6, // n0x0cdb c0x0000 (---------------) + I oizumi - 0x0020ca43, // n0x0cdc c0x0000 (---------------) + I ora - 0x00203943, // n0x0cdd c0x0000 (---------------) + I ota - 0x0034a649, // n0x0cde c0x0000 (---------------) + I shibukawa - 0x00273789, // n0x0cdf c0x0000 (---------------) + I shimonita - 0x0028e1c6, // n0x0ce0 c0x0000 (---------------) + I shinto - 0x002b3885, // n0x0ce1 c0x0000 (---------------) + I showa - 0x00298d88, // n0x0ce2 c0x0000 (---------------) + I takasaki - 0x0020f408, // n0x0ce3 c0x0000 (---------------) + I takayama - 0x003936c8, // n0x0ce4 c0x0000 (---------------) + I tamamura - 0x00329c8b, // n0x0ce5 c0x0000 (---------------) + I tatebayashi - 0x00292547, // n0x0ce6 c0x0000 (---------------) + I tomioka - 0x0030b489, // n0x0ce7 c0x0000 (---------------) + I tsukiyono - 0x00254848, // n0x0ce8 c0x0000 (---------------) + I tsumagoi - 0x0038dac4, // n0x0ce9 c0x0000 (---------------) + I ueno - 0x002b5d48, // n0x0cea c0x0000 (---------------) + I yoshioka - 0x0027a909, // n0x0ceb c0x0000 (---------------) + I asaminami - 0x002557c5, // n0x0cec c0x0000 (---------------) + I daiwa - 0x0020dd07, // n0x0ced c0x0000 (---------------) + I etajima - 0x002ab685, // n0x0cee c0x0000 (---------------) + I fuchu - 0x0026db08, // n0x0cef c0x0000 (---------------) + I fukuyama - 0x0027dd8b, // n0x0cf0 c0x0000 (---------------) + I hatsukaichi - 0x00280dd0, // n0x0cf1 c0x0000 (---------------) + I higashihiroshima - 0x00292c45, // n0x0cf2 c0x0000 (---------------) + I hongo - 0x0020d8cc, // n0x0cf3 c0x0000 (---------------) + I jinsekikogen - 0x0021f245, // n0x0cf4 c0x0000 (---------------) + I kaita - 0x0026b843, // n0x0cf5 c0x0000 (---------------) + I kui - 0x00285906, // n0x0cf6 c0x0000 (---------------) + I kumano - 0x002a4544, // n0x0cf7 c0x0000 (---------------) + I kure - 0x003637c6, // n0x0cf8 c0x0000 (---------------) + I mihara - 0x00288107, // n0x0cf9 c0x0000 (---------------) + I miyoshi - 0x00204884, // n0x0cfa c0x0000 (---------------) + I naka - 0x002a5708, // n0x0cfb c0x0000 (---------------) + I onomichi - 0x00305acd, // n0x0cfc c0x0000 (---------------) + I osakikamijima - 0x00335c85, // n0x0cfd c0x0000 (---------------) + I otake - 0x00201a04, // n0x0cfe c0x0000 (---------------) + I saka - 0x0021b584, // n0x0cff c0x0000 (---------------) + I sera - 0x00325cc9, // n0x0d00 c0x0000 (---------------) + I seranishi - 0x0027f9c8, // n0x0d01 c0x0000 (---------------) + I shinichi - 0x002f5a47, // n0x0d02 c0x0000 (---------------) + I shobara - 0x002ae008, // n0x0d03 c0x0000 (---------------) + I takehara - 0x0026e388, // n0x0d04 c0x0000 (---------------) + I abashiri - 0x00268705, // n0x0d05 c0x0000 (---------------) + I abira - 0x0031acc7, // n0x0d06 c0x0000 (---------------) + I aibetsu - 0x00268687, // n0x0d07 c0x0000 (---------------) + I akabira - 0x00300f87, // n0x0d08 c0x0000 (---------------) + I akkeshi - 0x002ad5c9, // n0x0d09 c0x0000 (---------------) + I asahikawa - 0x00227609, // n0x0d0a c0x0000 (---------------) + I ashibetsu - 0x00230d06, // n0x0d0b c0x0000 (---------------) + I ashoro - 0x00318dc6, // n0x0d0c c0x0000 (---------------) + I assabu - 0x00254806, // n0x0d0d c0x0000 (---------------) + I atsuma - 0x00323c05, // n0x0d0e c0x0000 (---------------) + I bibai - 0x002626c4, // n0x0d0f c0x0000 (---------------) + I biei - 0x0038aec6, // n0x0d10 c0x0000 (---------------) + I bifuka - 0x0038f286, // n0x0d11 c0x0000 (---------------) + I bihoro - 0x00268748, // n0x0d12 c0x0000 (---------------) + I biratori - 0x002e170b, // n0x0d13 c0x0000 (---------------) + I chippubetsu - 0x00366547, // n0x0d14 c0x0000 (---------------) + I chitose - 0x00209004, // n0x0d15 c0x0000 (---------------) + I date - 0x0032d2c6, // n0x0d16 c0x0000 (---------------) + I ebetsu - 0x00337807, // n0x0d17 c0x0000 (---------------) + I embetsu - 0x00271f45, // n0x0d18 c0x0000 (---------------) + I eniwa - 0x002f35c5, // n0x0d19 c0x0000 (---------------) + I erimo - 0x00202244, // n0x0d1a c0x0000 (---------------) + I esan - 0x00227586, // n0x0d1b c0x0000 (---------------) + I esashi - 0x0038af48, // n0x0d1c c0x0000 (---------------) + I fukagawa - 0x0026d5c9, // n0x0d1d c0x0000 (---------------) + I fukushima - 0x00239f06, // n0x0d1e c0x0000 (---------------) + I furano - 0x00273e08, // n0x0d1f c0x0000 (---------------) + I furubira - 0x002e3146, // n0x0d20 c0x0000 (---------------) + I haboro - 0x00325388, // n0x0d21 c0x0000 (---------------) + I hakodate - 0x002a154c, // n0x0d22 c0x0000 (---------------) + I hamatonbetsu - 0x002685c6, // n0x0d23 c0x0000 (---------------) + I hidaka - 0x0028208d, // n0x0d24 c0x0000 (---------------) + I higashikagura - 0x0028250b, // n0x0d25 c0x0000 (---------------) + I higashikawa - 0x0023a0c5, // n0x0d26 c0x0000 (---------------) + I hiroo - 0x00206b87, // n0x0d27 c0x0000 (---------------) + I hokuryu - 0x00226906, // n0x0d28 c0x0000 (---------------) + I hokuto - 0x00305188, // n0x0d29 c0x0000 (---------------) + I honbetsu - 0x00230d89, // n0x0d2a c0x0000 (---------------) + I horokanai - 0x00346588, // n0x0d2b c0x0000 (---------------) + I horonobe - 0x00390e45, // n0x0d2c c0x0000 (---------------) + I ikeda - 0x0020de07, // n0x0d2d c0x0000 (---------------) + I imakane - 0x002af448, // n0x0d2e c0x0000 (---------------) + I ishikari - 0x0023e509, // n0x0d2f c0x0000 (---------------) + I iwamizawa - 0x002e74c6, // n0x0d30 c0x0000 (---------------) + I iwanai - 0x00239e0a, // n0x0d31 c0x0000 (---------------) + I kamifurano - 0x00304f08, // n0x0d32 c0x0000 (---------------) + I kamikawa - 0x003463cb, // n0x0d33 c0x0000 (---------------) + I kamishihoro - 0x002ae7cc, // n0x0d34 c0x0000 (---------------) + I kamisunagawa - 0x002fb248, // n0x0d35 c0x0000 (---------------) + I kamoenai - 0x00269e06, // n0x0d36 c0x0000 (---------------) + I kayabe - 0x002a5a88, // n0x0d37 c0x0000 (---------------) + I kembuchi - 0x0035e007, // n0x0d38 c0x0000 (---------------) + I kikonai - 0x002e5389, // n0x0d39 c0x0000 (---------------) + I kimobetsu - 0x0027c54d, // n0x0d3a c0x0000 (---------------) + I kitahiroshima - 0x002885c6, // n0x0d3b c0x0000 (---------------) + I kitami - 0x002534c8, // n0x0d3c c0x0000 (---------------) + I kiyosato - 0x002fe389, // n0x0d3d c0x0000 (---------------) + I koshimizu - 0x002a3148, // n0x0d3e c0x0000 (---------------) + I kunneppu - 0x00270048, // n0x0d3f c0x0000 (---------------) + I kuriyama - 0x002a7e8c, // n0x0d40 c0x0000 (---------------) + I kuromatsunai - 0x002a9347, // n0x0d41 c0x0000 (---------------) + I kushiro - 0x002a9e47, // n0x0d42 c0x0000 (---------------) + I kutchan - 0x002ad405, // n0x0d43 c0x0000 (---------------) + I kyowa - 0x00260307, // n0x0d44 c0x0000 (---------------) + I mashike - 0x002caf48, // n0x0d45 c0x0000 (---------------) + I matsumae - 0x0028f746, // n0x0d46 c0x0000 (---------------) + I mikasa - 0x003561cc, // n0x0d47 c0x0000 (---------------) + I minamifurano - 0x002ccb48, // n0x0d48 c0x0000 (---------------) + I mombetsu - 0x002b7108, // n0x0d49 c0x0000 (---------------) + I moseushi - 0x0024e806, // n0x0d4a c0x0000 (---------------) + I mukawa - 0x002a6187, // n0x0d4b c0x0000 (---------------) + I muroran - 0x00230f04, // n0x0d4c c0x0000 (---------------) + I naie - 0x002934c8, // n0x0d4d c0x0000 (---------------) + I nakagawa - 0x0026208c, // n0x0d4e c0x0000 (---------------) + I nakasatsunai - 0x0027848c, // n0x0d4f c0x0000 (---------------) + I nakatombetsu - 0x0021b8c5, // n0x0d50 c0x0000 (---------------) + I nanae - 0x0037c587, // n0x0d51 c0x0000 (---------------) + I nanporo - 0x00396e06, // n0x0d52 c0x0000 (---------------) + I nayoro - 0x002a6106, // n0x0d53 c0x0000 (---------------) + I nemuro - 0x00281a48, // n0x0d54 c0x0000 (---------------) + I niikappu - 0x0037ae44, // n0x0d55 c0x0000 (---------------) + I niki - 0x002209cb, // n0x0d56 c0x0000 (---------------) + I nishiokoppe - 0x002f090b, // n0x0d57 c0x0000 (---------------) + I noboribetsu - 0x003161c6, // n0x0d58 c0x0000 (---------------) + I numata - 0x00305947, // n0x0d59 c0x0000 (---------------) + I obihiro - 0x00311445, // n0x0d5a c0x0000 (---------------) + I obira - 0x0025d045, // n0x0d5b c0x0000 (---------------) + I oketo - 0x00220b06, // n0x0d5c c0x0000 (---------------) + I okoppe - 0x002b9045, // n0x0d5d c0x0000 (---------------) + I otaru - 0x002acb85, // n0x0d5e c0x0000 (---------------) + I otobe - 0x002c4a07, // n0x0d5f c0x0000 (---------------) + I otofuke - 0x0025cbc9, // n0x0d60 c0x0000 (---------------) + I otoineppu - 0x002f3c44, // n0x0d61 c0x0000 (---------------) + I oumu - 0x0035f085, // n0x0d62 c0x0000 (---------------) + I ozora - 0x002c2c45, // n0x0d63 c0x0000 (---------------) + I pippu - 0x0028eb48, // n0x0d64 c0x0000 (---------------) + I rankoshi - 0x002a5545, // n0x0d65 c0x0000 (---------------) + I rebun - 0x002b4809, // n0x0d66 c0x0000 (---------------) + I rikubetsu - 0x00294c47, // n0x0d67 c0x0000 (---------------) + I rishiri - 0x00294c4b, // n0x0d68 c0x0000 (---------------) + I rishirifuji - 0x00307c86, // n0x0d69 c0x0000 (---------------) + I saroma - 0x0021ecc9, // n0x0d6a c0x0000 (---------------) + I sarufutsu - 0x0024c908, // n0x0d6b c0x0000 (---------------) + I shakotan - 0x00252d45, // n0x0d6c c0x0000 (---------------) + I shari - 0x00301088, // n0x0d6d c0x0000 (---------------) + I shibecha - 0x00227648, // n0x0d6e c0x0000 (---------------) + I shibetsu - 0x00251507, // n0x0d6f c0x0000 (---------------) + I shikabe - 0x002d3e87, // n0x0d70 c0x0000 (---------------) + I shikaoi - 0x0023ca89, // n0x0d71 c0x0000 (---------------) + I shimamaki - 0x002521c7, // n0x0d72 c0x0000 (---------------) + I shimizu - 0x00266909, // n0x0d73 c0x0000 (---------------) + I shimokawa - 0x00287a0c, // n0x0d74 c0x0000 (---------------) + I shinshinotsu - 0x0028e1c8, // n0x0d75 c0x0000 (---------------) + I shintoku - 0x002d1609, // n0x0d76 c0x0000 (---------------) + I shiranuka - 0x002d2247, // n0x0d77 c0x0000 (---------------) + I shiraoi - 0x0026e449, // n0x0d78 c0x0000 (---------------) + I shiriuchi - 0x002e5a47, // n0x0d79 c0x0000 (---------------) + I sobetsu - 0x002ae8c8, // n0x0d7a c0x0000 (---------------) + I sunagawa - 0x0028ee85, // n0x0d7b c0x0000 (---------------) + I taiki - 0x0027cec6, // n0x0d7c c0x0000 (---------------) + I takasu - 0x002a8648, // n0x0d7d c0x0000 (---------------) + I takikawa - 0x00245108, // n0x0d7e c0x0000 (---------------) + I takinoue - 0x002af189, // n0x0d7f c0x0000 (---------------) + I teshikaga - 0x002acbc7, // n0x0d80 c0x0000 (---------------) + I tobetsu - 0x0028b345, // n0x0d81 c0x0000 (---------------) + I tohma - 0x002b9dc9, // n0x0d82 c0x0000 (---------------) + I tomakomai - 0x0036edc6, // n0x0d83 c0x0000 (---------------) + I tomari - 0x0027c344, // n0x0d84 c0x0000 (---------------) + I toya - 0x00346246, // n0x0d85 c0x0000 (---------------) + I toyako - 0x00371088, // n0x0d86 c0x0000 (---------------) + I toyotomi - 0x00244007, // n0x0d87 c0x0000 (---------------) + I toyoura - 0x002e1908, // n0x0d88 c0x0000 (---------------) + I tsubetsu - 0x0023ac89, // n0x0d89 c0x0000 (---------------) + I tsukigata - 0x0024e587, // n0x0d8a c0x0000 (---------------) + I urakawa - 0x00288ec6, // n0x0d8b c0x0000 (---------------) + I urausu - 0x00206c44, // n0x0d8c c0x0000 (---------------) + I uryu - 0x00200109, // n0x0d8d c0x0000 (---------------) + I utashinai - 0x00342f08, // n0x0d8e c0x0000 (---------------) + I wakkanai - 0x0024e6c7, // n0x0d8f c0x0000 (---------------) + I wassamu - 0x00311fc6, // n0x0d90 c0x0000 (---------------) + I yakumo - 0x00292f46, // n0x0d91 c0x0000 (---------------) + I yoichi - 0x0035e144, // n0x0d92 c0x0000 (---------------) + I aioi - 0x00341846, // n0x0d93 c0x0000 (---------------) + I akashi - 0x00207e03, // n0x0d94 c0x0000 (---------------) + I ako - 0x0038bd09, // n0x0d95 c0x0000 (---------------) + I amagasaki - 0x00394b46, // n0x0d96 c0x0000 (---------------) + I aogaki - 0x0028c7c5, // n0x0d97 c0x0000 (---------------) + I asago - 0x00289c86, // n0x0d98 c0x0000 (---------------) + I ashiya - 0x0028dcc5, // n0x0d99 c0x0000 (---------------) + I awaji - 0x0026d348, // n0x0d9a c0x0000 (---------------) + I fukusaki - 0x002faf87, // n0x0d9b c0x0000 (---------------) + I goshiki - 0x002f8c46, // n0x0d9c c0x0000 (---------------) + I harima - 0x0031c986, // n0x0d9d c0x0000 (---------------) + I himeji - 0x00312b88, // n0x0d9e c0x0000 (---------------) + I ichikawa - 0x0028ba47, // n0x0d9f c0x0000 (---------------) + I inagawa - 0x00288605, // n0x0da0 c0x0000 (---------------) + I itami - 0x0028a188, // n0x0da1 c0x0000 (---------------) + I kakogawa - 0x003744c8, // n0x0da2 c0x0000 (---------------) + I kamigori - 0x00304f08, // n0x0da3 c0x0000 (---------------) + I kamikawa - 0x0021f105, // n0x0da4 c0x0000 (---------------) + I kasai - 0x0027cf46, // n0x0da5 c0x0000 (---------------) + I kasuga - 0x0022ed09, // n0x0da6 c0x0000 (---------------) + I kawanishi - 0x0022ae44, // n0x0da7 c0x0000 (---------------) + I miki - 0x00359a0b, // n0x0da8 c0x0000 (---------------) + I minamiawaji - 0x0021ac8b, // n0x0da9 c0x0000 (---------------) + I nishinomiya - 0x002998c9, // n0x0daa c0x0000 (---------------) + I nishiwaki - 0x00207e83, // n0x0dab c0x0000 (---------------) + I ono - 0x002453c5, // n0x0dac c0x0000 (---------------) + I sanda - 0x00208a46, // n0x0dad c0x0000 (---------------) + I sannan - 0x002937c8, // n0x0dae c0x0000 (---------------) + I sasayama - 0x002349c4, // n0x0daf c0x0000 (---------------) + I sayo - 0x002e6a46, // n0x0db0 c0x0000 (---------------) + I shingu - 0x002ba609, // n0x0db1 c0x0000 (---------------) + I shinonsen - 0x003081c5, // n0x0db2 c0x0000 (---------------) + I shiso - 0x002c4946, // n0x0db3 c0x0000 (---------------) + I sumoto - 0x0025fa46, // n0x0db4 c0x0000 (---------------) + I taishi - 0x00209604, // n0x0db5 c0x0000 (---------------) + I taka - 0x002875ca, // n0x0db6 c0x0000 (---------------) + I takarazuka - 0x0028c708, // n0x0db7 c0x0000 (---------------) + I takasago - 0x00245106, // n0x0db8 c0x0000 (---------------) + I takino - 0x0035ee85, // n0x0db9 c0x0000 (---------------) + I tamba - 0x00203987, // n0x0dba c0x0000 (---------------) + I tatsuno - 0x0022e707, // n0x0dbb c0x0000 (---------------) + I toyooka - 0x00389944, // n0x0dbc c0x0000 (---------------) + I yabu - 0x0021aec7, // n0x0dbd c0x0000 (---------------) + I yashiro - 0x002a0604, // n0x0dbe c0x0000 (---------------) + I yoka - 0x00322c46, // n0x0dbf c0x0000 (---------------) + I yokawa - 0x00204943, // n0x0dc0 c0x0000 (---------------) + I ami - 0x002ad5c5, // n0x0dc1 c0x0000 (---------------) + I asahi - 0x00346e05, // n0x0dc2 c0x0000 (---------------) + I bando - 0x002e5708, // n0x0dc3 c0x0000 (---------------) + I chikusei - 0x0024ef05, // n0x0dc4 c0x0000 (---------------) + I daigo - 0x00268309, // n0x0dc5 c0x0000 (---------------) + I fujishiro - 0x0028d547, // n0x0dc6 c0x0000 (---------------) + I hitachi - 0x0029330b, // n0x0dc7 c0x0000 (---------------) + I hitachinaka - 0x0028d54c, // n0x0dc8 c0x0000 (---------------) + I hitachiomiya - 0x0028e50a, // n0x0dc9 c0x0000 (---------------) + I hitachiota - 0x00316ac7, // n0x0dca c0x0000 (---------------) + I ibaraki - 0x00200243, // n0x0dcb c0x0000 (---------------) + I ina - 0x00291508, // n0x0dcc c0x0000 (---------------) + I inashiki - 0x0021f2c5, // n0x0dcd c0x0000 (---------------) + I itako - 0x002cae85, // n0x0dce c0x0000 (---------------) + I iwama - 0x00207f44, // n0x0dcf c0x0000 (---------------) + I joso - 0x002ae7c6, // n0x0dd0 c0x0000 (---------------) + I kamisu - 0x0023b7c6, // n0x0dd1 c0x0000 (---------------) + I kasama - 0x00341887, // n0x0dd2 c0x0000 (---------------) + I kashima - 0x0020b60b, // n0x0dd3 c0x0000 (---------------) + I kasumigaura - 0x00232c84, // n0x0dd4 c0x0000 (---------------) + I koga - 0x0033ee44, // n0x0dd5 c0x0000 (---------------) + I miho - 0x00246f04, // n0x0dd6 c0x0000 (---------------) + I mito - 0x002b4f86, // n0x0dd7 c0x0000 (---------------) + I moriya - 0x00204884, // n0x0dd8 c0x0000 (---------------) + I naka - 0x00376c08, // n0x0dd9 c0x0000 (---------------) + I namegata - 0x00321385, // n0x0dda c0x0000 (---------------) + I oarai - 0x00204045, // n0x0ddb c0x0000 (---------------) + I ogawa - 0x00393607, // n0x0ddc c0x0000 (---------------) + I omitama - 0x00206c89, // n0x0ddd c0x0000 (---------------) + I ryugasaki - 0x003396c5, // n0x0dde c0x0000 (---------------) + I sakai - 0x0030cc0a, // n0x0ddf c0x0000 (---------------) + I sakuragawa - 0x0027bc89, // n0x0de0 c0x0000 (---------------) + I shimodate - 0x0027db0a, // n0x0de1 c0x0000 (---------------) + I shimotsuma - 0x00395689, // n0x0de2 c0x0000 (---------------) + I shirosato - 0x00339a04, // n0x0de3 c0x0000 (---------------) + I sowa - 0x0029fdc5, // n0x0de4 c0x0000 (---------------) + I suifu - 0x0029cec8, // n0x0de5 c0x0000 (---------------) + I takahagi - 0x002d0fcb, // n0x0de6 c0x0000 (---------------) + I tamatsukuri - 0x002df1c5, // n0x0de7 c0x0000 (---------------) + I tokai - 0x00352046, // n0x0de8 c0x0000 (---------------) + I tomobe - 0x0021a304, // n0x0de9 c0x0000 (---------------) + I tone - 0x00268846, // n0x0dea c0x0000 (---------------) + I toride - 0x0024e409, // n0x0deb c0x0000 (---------------) + I tsuchiura - 0x0032d387, // n0x0dec c0x0000 (---------------) + I tsukuba - 0x00387c88, // n0x0ded c0x0000 (---------------) + I uchihara - 0x002315c6, // n0x0dee c0x0000 (---------------) + I ushiku - 0x002e38c7, // n0x0def c0x0000 (---------------) + I yachiyo - 0x0026dc08, // n0x0df0 c0x0000 (---------------) + I yamagata - 0x00377b86, // n0x0df1 c0x0000 (---------------) + I yawara - 0x00260d44, // n0x0df2 c0x0000 (---------------) + I yuki - 0x0034af87, // n0x0df3 c0x0000 (---------------) + I anamizu - 0x00336fc5, // n0x0df4 c0x0000 (---------------) + I hakui - 0x0034be87, // n0x0df5 c0x0000 (---------------) + I hakusan - 0x00281f04, // n0x0df6 c0x0000 (---------------) + I kaga - 0x00226886, // n0x0df7 c0x0000 (---------------) + I kahoku - 0x0037ffc8, // n0x0df8 c0x0000 (---------------) + I kanazawa - 0x002826c8, // n0x0df9 c0x0000 (---------------) + I kawakita - 0x002be447, // n0x0dfa c0x0000 (---------------) + I komatsu - 0x0023fcc8, // n0x0dfb c0x0000 (---------------) + I nakanoto - 0x0027e905, // n0x0dfc c0x0000 (---------------) + I nanao - 0x00207cc4, // n0x0dfd c0x0000 (---------------) + I nomi - 0x00312a88, // n0x0dfe c0x0000 (---------------) + I nonoichi - 0x0023fdc4, // n0x0dff c0x0000 (---------------) + I noto - 0x0020f2c5, // n0x0e00 c0x0000 (---------------) + I shika - 0x002d2b84, // n0x0e01 c0x0000 (---------------) + I suzu - 0x0027d707, // n0x0e02 c0x0000 (---------------) + I tsubata - 0x0031c3c7, // n0x0e03 c0x0000 (---------------) + I tsurugi - 0x0026e588, // n0x0e04 c0x0000 (---------------) + I uchinada - 0x0028dd06, // n0x0e05 c0x0000 (---------------) + I wajima - 0x0024ee85, // n0x0e06 c0x0000 (---------------) + I fudai - 0x00268108, // n0x0e07 c0x0000 (---------------) + I fujisawa - 0x00364a08, // n0x0e08 c0x0000 (---------------) + I hanamaki - 0x0028b089, // n0x0e09 c0x0000 (---------------) + I hiraizumi - 0x0021af86, // n0x0e0a c0x0000 (---------------) + I hirono - 0x0029ba88, // n0x0e0b c0x0000 (---------------) + I ichinohe - 0x0038f78a, // n0x0e0c c0x0000 (---------------) + I ichinoseki - 0x00271fc8, // n0x0e0d c0x0000 (---------------) + I iwaizumi - 0x002c3b85, // n0x0e0e c0x0000 (---------------) + I iwate - 0x0031b686, // n0x0e0f c0x0000 (---------------) + I joboji - 0x0027bb48, // n0x0e10 c0x0000 (---------------) + I kamaishi - 0x0020deca, // n0x0e11 c0x0000 (---------------) + I kanegasaki - 0x0032a887, // n0x0e12 c0x0000 (---------------) + I karumai - 0x00273345, // n0x0e13 c0x0000 (---------------) + I kawai - 0x00209588, // n0x0e14 c0x0000 (---------------) + I kitakami - 0x00224704, // n0x0e15 c0x0000 (---------------) + I kuji - 0x00205d06, // n0x0e16 c0x0000 (---------------) + I kunohe - 0x002aa5c8, // n0x0e17 c0x0000 (---------------) + I kuzumaki - 0x00207d46, // n0x0e18 c0x0000 (---------------) + I miyako - 0x00304788, // n0x0e19 c0x0000 (---------------) + I mizusawa - 0x0022ac87, // n0x0e1a c0x0000 (---------------) + I morioka - 0x00205106, // n0x0e1b c0x0000 (---------------) + I ninohe - 0x00384f84, // n0x0e1c c0x0000 (---------------) + I noda - 0x0029a847, // n0x0e1d c0x0000 (---------------) + I ofunato - 0x002e13c4, // n0x0e1e c0x0000 (---------------) + I oshu - 0x0024e3c7, // n0x0e1f c0x0000 (---------------) + I otsuchi - 0x0023430d, // n0x0e20 c0x0000 (---------------) + I rikuzentakata - 0x0026d185, // n0x0e21 c0x0000 (---------------) + I shiwa - 0x002a71cb, // n0x0e22 c0x0000 (---------------) + I shizukuishi - 0x002fe746, // n0x0e23 c0x0000 (---------------) + I sumita - 0x0023c788, // n0x0e24 c0x0000 (---------------) + I tanohata - 0x00369804, // n0x0e25 c0x0000 (---------------) + I tono - 0x00264306, // n0x0e26 c0x0000 (---------------) + I yahaba - 0x0026b046, // n0x0e27 c0x0000 (---------------) + I yamada - 0x0036c587, // n0x0e28 c0x0000 (---------------) + I ayagawa - 0x00281d4d, // n0x0e29 c0x0000 (---------------) + I higashikagawa - 0x002982c7, // n0x0e2a c0x0000 (---------------) + I kanonji - 0x002e8108, // n0x0e2b c0x0000 (---------------) + I kotohira - 0x00257385, // n0x0e2c c0x0000 (---------------) + I manno - 0x00283488, // n0x0e2d c0x0000 (---------------) + I marugame - 0x002aeac6, // n0x0e2e c0x0000 (---------------) + I mitoyo - 0x0027e988, // n0x0e2f c0x0000 (---------------) + I naoshima - 0x0020ce46, // n0x0e30 c0x0000 (---------------) + I sanuki - 0x0031c2c7, // n0x0e31 c0x0000 (---------------) + I tadotsu - 0x0026e909, // n0x0e32 c0x0000 (---------------) + I takamatsu - 0x00369807, // n0x0e33 c0x0000 (---------------) + I tonosho - 0x002761c8, // n0x0e34 c0x0000 (---------------) + I uchinomi - 0x00261345, // n0x0e35 c0x0000 (---------------) + I utazu - 0x00212c08, // n0x0e36 c0x0000 (---------------) + I zentsuji - 0x00305dc5, // n0x0e37 c0x0000 (---------------) + I akune - 0x00236bc5, // n0x0e38 c0x0000 (---------------) + I amami - 0x0030fcc5, // n0x0e39 c0x0000 (---------------) + I hioki - 0x00209883, // n0x0e3a c0x0000 (---------------) + I isa - 0x0026f3c4, // n0x0e3b c0x0000 (---------------) + I isen - 0x00209785, // n0x0e3c c0x0000 (---------------) + I izumi - 0x00271789, // n0x0e3d c0x0000 (---------------) + I kagoshima - 0x002b4d06, // n0x0e3e c0x0000 (---------------) + I kanoya - 0x002c5c48, // n0x0e3f c0x0000 (---------------) + I kawanabe - 0x002d3c45, // n0x0e40 c0x0000 (---------------) + I kinko - 0x00314307, // n0x0e41 c0x0000 (---------------) + I kouyama - 0x002d3a4a, // n0x0e42 c0x0000 (---------------) + I makurazaki - 0x002c4889, // n0x0e43 c0x0000 (---------------) + I matsumoto - 0x002bf68a, // n0x0e44 c0x0000 (---------------) + I minamitane - 0x002bb148, // n0x0e45 c0x0000 (---------------) + I nakatane - 0x0021df8c, // n0x0e46 c0x0000 (---------------) + I nishinoomote - 0x0026f0cd, // n0x0e47 c0x0000 (---------------) + I satsumasendai - 0x002da843, // n0x0e48 c0x0000 (---------------) + I soo - 0x00304688, // n0x0e49 c0x0000 (---------------) + I tarumizu - 0x00211dc5, // n0x0e4a c0x0000 (---------------) + I yusui - 0x00343086, // n0x0e4b c0x0000 (---------------) + I aikawa - 0x0033ea46, // n0x0e4c c0x0000 (---------------) + I atsugi - 0x002c35c5, // n0x0e4d c0x0000 (---------------) + I ayase - 0x00383449, // n0x0e4e c0x0000 (---------------) + I chigasaki - 0x00240845, // n0x0e4f c0x0000 (---------------) + I ebina - 0x00268108, // n0x0e50 c0x0000 (---------------) + I fujisawa - 0x00265b06, // n0x0e51 c0x0000 (---------------) + I hadano - 0x00328686, // n0x0e52 c0x0000 (---------------) + I hakone - 0x0028c209, // n0x0e53 c0x0000 (---------------) + I hiratsuka - 0x00377387, // n0x0e54 c0x0000 (---------------) + I isehara - 0x00315c06, // n0x0e55 c0x0000 (---------------) + I kaisei - 0x002d39c8, // n0x0e56 c0x0000 (---------------) + I kamakura - 0x003823c8, // n0x0e57 c0x0000 (---------------) + I kiyokawa - 0x0032b7c7, // n0x0e58 c0x0000 (---------------) + I matsuda - 0x0025240e, // n0x0e59 c0x0000 (---------------) + I minamiashigara - 0x002aed05, // n0x0e5a c0x0000 (---------------) + I miura - 0x0023e405, // n0x0e5b c0x0000 (---------------) + I nakai - 0x00207c48, // n0x0e5c c0x0000 (---------------) + I ninomiya - 0x00202487, // n0x0e5d c0x0000 (---------------) + I odawara - 0x00238bc2, // n0x0e5e c0x0000 (---------------) + I oi - 0x002a6c04, // n0x0e5f c0x0000 (---------------) + I oiso - 0x003636ca, // n0x0e60 c0x0000 (---------------) + I sagamihara - 0x0024e788, // n0x0e61 c0x0000 (---------------) + I samukawa - 0x00337906, // n0x0e62 c0x0000 (---------------) + I tsukui - 0x00283b88, // n0x0e63 c0x0000 (---------------) + I yamakita - 0x0022afc6, // n0x0e64 c0x0000 (---------------) + I yamato - 0x00311d48, // n0x0e65 c0x0000 (---------------) + I yokosuka - 0x00297548, // n0x0e66 c0x0000 (---------------) + I yugawara - 0x00236b84, // n0x0e67 c0x0000 (---------------) + I zama - 0x003185c5, // n0x0e68 c0x0000 (---------------) + I zushi - 0x006735c4, // n0x0e69 c0x0001 (---------------) ! I city - 0x006735c4, // n0x0e6a c0x0001 (---------------) ! I city - 0x006735c4, // n0x0e6b c0x0001 (---------------) ! I city - 0x00201ac3, // n0x0e6c c0x0000 (---------------) + I aki - 0x002f3a86, // n0x0e6d c0x0000 (---------------) + I geisei - 0x002685c6, // n0x0e6e c0x0000 (---------------) + I hidaka - 0x0028888c, // n0x0e6f c0x0000 (---------------) + I higashitsuno - 0x00201b43, // n0x0e70 c0x0000 (---------------) + I ino - 0x002ab006, // n0x0e71 c0x0000 (---------------) + I kagami - 0x00204904, // n0x0e72 c0x0000 (---------------) + I kami - 0x0020e0c8, // n0x0e73 c0x0000 (---------------) + I kitagawa - 0x002ba445, // n0x0e74 c0x0000 (---------------) + I kochi - 0x003637c6, // n0x0e75 c0x0000 (---------------) + I mihara - 0x002a2e48, // n0x0e76 c0x0000 (---------------) + I motoyama - 0x002bc286, // n0x0e77 c0x0000 (---------------) + I muroto - 0x002f8bc6, // n0x0e78 c0x0000 (---------------) + I nahari - 0x00248448, // n0x0e79 c0x0000 (---------------) + I nakamura - 0x00374747, // n0x0e7a c0x0000 (---------------) + I nankoku - 0x00251f89, // n0x0e7b c0x0000 (---------------) + I nishitosa - 0x00328d8a, // n0x0e7c c0x0000 (---------------) + I niyodogawa - 0x00240384, // n0x0e7d c0x0000 (---------------) + I ochi - 0x0022ecc5, // n0x0e7e c0x0000 (---------------) + I okawa - 0x00286c45, // n0x0e7f c0x0000 (---------------) + I otoyo - 0x0022a786, // n0x0e80 c0x0000 (---------------) + I otsuki - 0x00240646, // n0x0e81 c0x0000 (---------------) + I sakawa - 0x00291906, // n0x0e82 c0x0000 (---------------) + I sukumo - 0x002d1e06, // n0x0e83 c0x0000 (---------------) + I susaki - 0x002520c4, // n0x0e84 c0x0000 (---------------) + I tosa - 0x002520cb, // n0x0e85 c0x0000 (---------------) + I tosashimizu - 0x00221244, // n0x0e86 c0x0000 (---------------) + I toyo - 0x00203a05, // n0x0e87 c0x0000 (---------------) + I tsuno - 0x00296285, // n0x0e88 c0x0000 (---------------) + I umaji - 0x00207006, // n0x0e89 c0x0000 (---------------) + I yasuda - 0x00209f08, // n0x0e8a c0x0000 (---------------) + I yusuhara - 0x0026ef87, // n0x0e8b c0x0000 (---------------) + I amakusa - 0x0034e684, // n0x0e8c c0x0000 (---------------) + I arao - 0x00209dc3, // n0x0e8d c0x0000 (---------------) + I aso - 0x002e3545, // n0x0e8e c0x0000 (---------------) + I choyo - 0x00351f07, // n0x0e8f c0x0000 (---------------) + I gyokuto - 0x0028f9c9, // n0x0e90 c0x0000 (---------------) + I hitoyoshi - 0x0026ee8b, // n0x0e91 c0x0000 (---------------) + I kamiamakusa - 0x00341887, // n0x0e92 c0x0000 (---------------) + I kashima - 0x0036c287, // n0x0e93 c0x0000 (---------------) + I kikuchi - 0x002d4744, // n0x0e94 c0x0000 (---------------) + I kosa - 0x002a2d48, // n0x0e95 c0x0000 (---------------) + I kumamoto - 0x00253387, // n0x0e96 c0x0000 (---------------) + I mashiki - 0x0028fc06, // n0x0e97 c0x0000 (---------------) + I mifune - 0x00260ac8, // n0x0e98 c0x0000 (---------------) + I minamata - 0x0029ee4b, // n0x0e99 c0x0000 (---------------) + I minamioguni - 0x0034cac6, // n0x0e9a c0x0000 (---------------) + I nagasu - 0x0020e649, // n0x0e9b c0x0000 (---------------) + I nishihara - 0x0029efc5, // n0x0e9c c0x0000 (---------------) + I oguni - 0x002e3dc3, // n0x0e9d c0x0000 (---------------) + I ozu - 0x002c4946, // n0x0e9e c0x0000 (---------------) + I sumoto - 0x0022ab88, // n0x0e9f c0x0000 (---------------) + I takamori - 0x0020cf03, // n0x0ea0 c0x0000 (---------------) + I uki - 0x002269c3, // n0x0ea1 c0x0000 (---------------) + I uto - 0x0026dc06, // n0x0ea2 c0x0000 (---------------) + I yamaga - 0x0022afc6, // n0x0ea3 c0x0000 (---------------) + I yamato - 0x00373e8a, // n0x0ea4 c0x0000 (---------------) + I yatsushiro - 0x00269e45, // n0x0ea5 c0x0000 (---------------) + I ayabe - 0x0026ae8b, // n0x0ea6 c0x0000 (---------------) + I fukuchiyama - 0x00289bcb, // n0x0ea7 c0x0000 (---------------) + I higashiyama - 0x00229783, // n0x0ea8 c0x0000 (---------------) + I ide - 0x00213cc3, // n0x0ea9 c0x0000 (---------------) + I ine - 0x00298c44, // n0x0eaa c0x0000 (---------------) + I joyo - 0x0023a807, // n0x0eab c0x0000 (---------------) + I kameoka - 0x0022ac04, // n0x0eac c0x0000 (---------------) + I kamo - 0x00206e44, // n0x0ead c0x0000 (---------------) + I kita - 0x002f1c04, // n0x0eae c0x0000 (---------------) + I kizu - 0x002722c8, // n0x0eaf c0x0000 (---------------) + I kumiyama - 0x0035edc8, // n0x0eb0 c0x0000 (---------------) + I kyotamba - 0x0030f889, // n0x0eb1 c0x0000 (---------------) + I kyotanabe - 0x003165c8, // n0x0eb2 c0x0000 (---------------) + I kyotango - 0x0030c047, // n0x0eb3 c0x0000 (---------------) + I maizuru - 0x00213fc6, // n0x0eb4 c0x0000 (---------------) + I minami - 0x002c588f, // n0x0eb5 c0x0000 (---------------) + I minamiyamashiro - 0x002aee46, // n0x0eb6 c0x0000 (---------------) + I miyazu - 0x002ba3c4, // n0x0eb7 c0x0000 (---------------) + I muko - 0x0035ec0a, // n0x0eb8 c0x0000 (---------------) + I nagaokakyo - 0x00351e07, // n0x0eb9 c0x0000 (---------------) + I nakagyo - 0x00204d46, // n0x0eba c0x0000 (---------------) + I nantan - 0x0027c389, // n0x0ebb c0x0000 (---------------) + I oyamazaki - 0x0030f805, // n0x0ebc c0x0000 (---------------) + I sakyo - 0x002c6f45, // n0x0ebd c0x0000 (---------------) + I seika - 0x0030f946, // n0x0ebe c0x0000 (---------------) + I tanabe - 0x00212d43, // n0x0ebf c0x0000 (---------------) + I uji - 0x00224749, // n0x0ec0 c0x0000 (---------------) + I ujitawara - 0x00214fc6, // n0x0ec1 c0x0000 (---------------) + I wazuka - 0x0023aa49, // n0x0ec2 c0x0000 (---------------) + I yamashina - 0x003804c6, // n0x0ec3 c0x0000 (---------------) + I yawata - 0x002ad5c5, // n0x0ec4 c0x0000 (---------------) + I asahi - 0x0035dd05, // n0x0ec5 c0x0000 (---------------) + I inabe - 0x00233203, // n0x0ec6 c0x0000 (---------------) + I ise - 0x0023a948, // n0x0ec7 c0x0000 (---------------) + I kameyama - 0x002406c7, // n0x0ec8 c0x0000 (---------------) + I kawagoe - 0x0037aec4, // n0x0ec9 c0x0000 (---------------) + I kiho - 0x0022a888, // n0x0eca c0x0000 (---------------) + I kisosaki - 0x002927c4, // n0x0ecb c0x0000 (---------------) + I kiwa - 0x002d4306, // n0x0ecc c0x0000 (---------------) + I komono - 0x00285906, // n0x0ecd c0x0000 (---------------) + I kumano - 0x0022f386, // n0x0ece c0x0000 (---------------) + I kuwana - 0x002b5109, // n0x0ecf c0x0000 (---------------) + I matsusaka - 0x002cae05, // n0x0ed0 c0x0000 (---------------) + I meiwa - 0x00292a46, // n0x0ed1 c0x0000 (---------------) + I mihama - 0x00370d89, // n0x0ed2 c0x0000 (---------------) + I minamiise - 0x002adc06, // n0x0ed3 c0x0000 (---------------) + I misugi - 0x00272346, // n0x0ed4 c0x0000 (---------------) + I miyama - 0x0036fe46, // n0x0ed5 c0x0000 (---------------) + I nabari - 0x0021f645, // n0x0ed6 c0x0000 (---------------) + I shima - 0x002d2b86, // n0x0ed7 c0x0000 (---------------) + I suzuka - 0x0031c2c4, // n0x0ed8 c0x0000 (---------------) + I tado - 0x0028ee85, // n0x0ed9 c0x0000 (---------------) + I taiki - 0x00245104, // n0x0eda c0x0000 (---------------) + I taki - 0x002f1b06, // n0x0edb c0x0000 (---------------) + I tamaki - 0x00395844, // n0x0edc c0x0000 (---------------) + I toba - 0x00203a03, // n0x0edd c0x0000 (---------------) + I tsu - 0x00274845, // n0x0ede c0x0000 (---------------) + I udono - 0x00227348, // n0x0edf c0x0000 (---------------) + I ureshino - 0x00253ec7, // n0x0ee0 c0x0000 (---------------) + I watarai - 0x00234a49, // n0x0ee1 c0x0000 (---------------) + I yokkaichi - 0x00274a88, // n0x0ee2 c0x0000 (---------------) + I furukawa - 0x002830d1, // n0x0ee3 c0x0000 (---------------) + I higashimatsushima - 0x0025faca, // n0x0ee4 c0x0000 (---------------) + I ishinomaki - 0x00316107, // n0x0ee5 c0x0000 (---------------) + I iwanuma - 0x0038d846, // n0x0ee6 c0x0000 (---------------) + I kakuda - 0x00204904, // n0x0ee7 c0x0000 (---------------) + I kami - 0x002a8748, // n0x0ee8 c0x0000 (---------------) + I kawasaki - 0x0034cc49, // n0x0ee9 c0x0000 (---------------) + I kesennuma - 0x0028b408, // n0x0eea c0x0000 (---------------) + I marumori - 0x0028328a, // n0x0eeb c0x0000 (---------------) + I matsushima - 0x002b45cd, // n0x0eec c0x0000 (---------------) + I minamisanriku - 0x0028b246, // n0x0eed c0x0000 (---------------) + I misato - 0x00248546, // n0x0eee c0x0000 (---------------) + I murata - 0x0029a906, // n0x0eef c0x0000 (---------------) + I natori - 0x00204047, // n0x0ef0 c0x0000 (---------------) + I ogawara - 0x002e81c5, // n0x0ef1 c0x0000 (---------------) + I ohira - 0x00295c07, // n0x0ef2 c0x0000 (---------------) + I onagawa - 0x0022a945, // n0x0ef3 c0x0000 (---------------) + I osaki - 0x00294d84, // n0x0ef4 c0x0000 (---------------) + I rifu - 0x0027c146, // n0x0ef5 c0x0000 (---------------) + I semine - 0x003416c7, // n0x0ef6 c0x0000 (---------------) + I shibata - 0x0022444d, // n0x0ef7 c0x0000 (---------------) + I shichikashuku - 0x0027ba87, // n0x0ef8 c0x0000 (---------------) + I shikama - 0x002471c8, // n0x0ef9 c0x0000 (---------------) + I shiogama - 0x00268409, // n0x0efa c0x0000 (---------------) + I shiroishi - 0x0031b586, // n0x0efb c0x0000 (---------------) + I tagajo - 0x002e7445, // n0x0efc c0x0000 (---------------) + I taiwa - 0x0020fe04, // n0x0efd c0x0000 (---------------) + I tome - 0x00371186, // n0x0efe c0x0000 (---------------) + I tomiya - 0x00389846, // n0x0eff c0x0000 (---------------) + I wakuya - 0x0024e906, // n0x0f00 c0x0000 (---------------) + I watari - 0x00286688, // n0x0f01 c0x0000 (---------------) + I yamamoto - 0x00395443, // n0x0f02 c0x0000 (---------------) + I zao - 0x00206fc3, // n0x0f03 c0x0000 (---------------) + I aya - 0x0036cf45, // n0x0f04 c0x0000 (---------------) + I ebino - 0x00375946, // n0x0f05 c0x0000 (---------------) + I gokase - 0x00297505, // n0x0f06 c0x0000 (---------------) + I hyuga - 0x002317c8, // n0x0f07 c0x0000 (---------------) + I kadogawa - 0x002882ca, // n0x0f08 c0x0000 (---------------) + I kawaminami - 0x00389a44, // n0x0f09 c0x0000 (---------------) + I kijo - 0x0020e0c8, // n0x0f0a c0x0000 (---------------) + I kitagawa - 0x002815c8, // n0x0f0b c0x0000 (---------------) + I kitakata - 0x00206e47, // n0x0f0c c0x0000 (---------------) + I kitaura - 0x002d3d09, // n0x0f0d c0x0000 (---------------) + I kobayashi - 0x002a2a48, // n0x0f0e c0x0000 (---------------) + I kunitomi - 0x0026d647, // n0x0f0f c0x0000 (---------------) + I kushima - 0x0027cdc6, // n0x0f10 c0x0000 (---------------) + I mimata - 0x00207d4a, // n0x0f11 c0x0000 (---------------) + I miyakonojo - 0x00371208, // n0x0f12 c0x0000 (---------------) + I miyazaki - 0x002ae609, // n0x0f13 c0x0000 (---------------) + I morotsuka - 0x0027fa88, // n0x0f14 c0x0000 (---------------) + I nichinan - 0x00217e09, // n0x0f15 c0x0000 (---------------) + I nishimera - 0x00346687, // n0x0f16 c0x0000 (---------------) + I nobeoka - 0x00302b45, // n0x0f17 c0x0000 (---------------) + I saito - 0x00329e86, // n0x0f18 c0x0000 (---------------) + I shiiba - 0x0028f5c8, // n0x0f19 c0x0000 (---------------) + I shintomi - 0x0023ae48, // n0x0f1a c0x0000 (---------------) + I takaharu - 0x002462c8, // n0x0f1b c0x0000 (---------------) + I takanabe - 0x002f9c88, // n0x0f1c c0x0000 (---------------) + I takazaki - 0x00203a05, // n0x0f1d c0x0000 (---------------) + I tsuno - 0x0022e144, // n0x0f1e c0x0000 (---------------) + I achi - 0x0034e008, // n0x0f1f c0x0000 (---------------) + I agematsu - 0x00204e44, // n0x0f20 c0x0000 (---------------) + I anan - 0x00395484, // n0x0f21 c0x0000 (---------------) + I aoki - 0x002ad5c5, // n0x0f22 c0x0000 (---------------) + I asahi - 0x0027ed87, // n0x0f23 c0x0000 (---------------) + I azumino - 0x00206a49, // n0x0f24 c0x0000 (---------------) + I chikuhoku - 0x0036c387, // n0x0f25 c0x0000 (---------------) + I chikuma - 0x0022e185, // n0x0f26 c0x0000 (---------------) + I chino - 0x00265906, // n0x0f27 c0x0000 (---------------) + I fujimi - 0x003317c6, // n0x0f28 c0x0000 (---------------) + I hakuba - 0x0020a004, // n0x0f29 c0x0000 (---------------) + I hara - 0x0028c546, // n0x0f2a c0x0000 (---------------) + I hiraya - 0x0024ecc4, // n0x0f2b c0x0000 (---------------) + I iida - 0x00256486, // n0x0f2c c0x0000 (---------------) + I iijima - 0x0034d2c6, // n0x0f2d c0x0000 (---------------) + I iiyama - 0x0020ec86, // n0x0f2e c0x0000 (---------------) + I iizuna - 0x00390e45, // n0x0f2f c0x0000 (---------------) + I ikeda - 0x00231687, // n0x0f30 c0x0000 (---------------) + I ikusaka - 0x00200243, // n0x0f31 c0x0000 (---------------) + I ina - 0x0031e389, // n0x0f32 c0x0000 (---------------) + I karuizawa - 0x00315908, // n0x0f33 c0x0000 (---------------) + I kawakami - 0x0022a884, // n0x0f34 c0x0000 (---------------) + I kiso - 0x0026d4cd, // n0x0f35 c0x0000 (---------------) + I kisofukushima - 0x002827c8, // n0x0f36 c0x0000 (---------------) + I kitaaiki - 0x002fa008, // n0x0f37 c0x0000 (---------------) + I komagane - 0x002ae586, // n0x0f38 c0x0000 (---------------) + I komoro - 0x0026ea09, // n0x0f39 c0x0000 (---------------) + I matsukawa - 0x002c4889, // n0x0f3a c0x0000 (---------------) + I matsumoto - 0x0024e105, // n0x0f3b c0x0000 (---------------) + I miasa - 0x002883ca, // n0x0f3c c0x0000 (---------------) + I minamiaiki - 0x0025b8ca, // n0x0f3d c0x0000 (---------------) + I minamimaki - 0x002b064c, // n0x0f3e c0x0000 (---------------) + I minamiminowa - 0x002b07c6, // n0x0f3f c0x0000 (---------------) + I minowa - 0x00266386, // n0x0f40 c0x0000 (---------------) + I miyada - 0x002af8c6, // n0x0f41 c0x0000 (---------------) + I miyota - 0x00258b89, // n0x0f42 c0x0000 (---------------) + I mochizuki - 0x0034e4c6, // n0x0f43 c0x0000 (---------------) + I nagano - 0x0028ba86, // n0x0f44 c0x0000 (---------------) + I nagawa - 0x00240906, // n0x0f45 c0x0000 (---------------) + I nagiso - 0x002934c8, // n0x0f46 c0x0000 (---------------) + I nakagawa - 0x0023fcc6, // n0x0f47 c0x0000 (---------------) + I nakano - 0x002fe9cb, // n0x0f48 c0x0000 (---------------) + I nozawaonsen - 0x0027ef05, // n0x0f49 c0x0000 (---------------) + I obuse - 0x00204045, // n0x0f4a c0x0000 (---------------) + I ogawa - 0x00266605, // n0x0f4b c0x0000 (---------------) + I okaya - 0x00353c06, // n0x0f4c c0x0000 (---------------) + I omachi - 0x00207d03, // n0x0f4d c0x0000 (---------------) + I omi - 0x0022f306, // n0x0f4e c0x0000 (---------------) + I ookuwa - 0x0027ba07, // n0x0f4f c0x0000 (---------------) + I ooshika - 0x002a8605, // n0x0f50 c0x0000 (---------------) + I otaki - 0x003389c5, // n0x0f51 c0x0000 (---------------) + I otari - 0x0036ba45, // n0x0f52 c0x0000 (---------------) + I sakae - 0x00201a06, // n0x0f53 c0x0000 (---------------) + I sakaki - 0x0024e1c4, // n0x0f54 c0x0000 (---------------) + I saku - 0x0035fb46, // n0x0f55 c0x0000 (---------------) + I sakuho - 0x00325709, // n0x0f56 c0x0000 (---------------) + I shimosuwa - 0x00353a8c, // n0x0f57 c0x0000 (---------------) + I shinanomachi - 0x00294ac8, // n0x0f58 c0x0000 (---------------) + I shiojiri - 0x002e5544, // n0x0f59 c0x0000 (---------------) + I suwa - 0x002d2806, // n0x0f5a c0x0000 (---------------) + I suzaka - 0x002fe846, // n0x0f5b c0x0000 (---------------) + I takagi - 0x0022ab88, // n0x0f5c c0x0000 (---------------) + I takamori - 0x0020f408, // n0x0f5d c0x0000 (---------------) + I takayama - 0x00353989, // n0x0f5e c0x0000 (---------------) + I tateshina - 0x00203987, // n0x0f5f c0x0000 (---------------) + I tatsuno - 0x002e5d09, // n0x0f60 c0x0000 (---------------) + I togakushi - 0x0025e506, // n0x0f61 c0x0000 (---------------) + I togura - 0x002204c4, // n0x0f62 c0x0000 (---------------) + I tomi - 0x00207204, // n0x0f63 c0x0000 (---------------) + I ueda - 0x0023e8c4, // n0x0f64 c0x0000 (---------------) + I wada - 0x0026dc08, // n0x0f65 c0x0000 (---------------) + I yamagata - 0x0020688a, // n0x0f66 c0x0000 (---------------) + I yamanouchi - 0x00339646, // n0x0f67 c0x0000 (---------------) + I yasaka - 0x0033e847, // n0x0f68 c0x0000 (---------------) + I yasuoka - 0x002e9747, // n0x0f69 c0x0000 (---------------) + I chijiwa - 0x0021edc5, // n0x0f6a c0x0000 (---------------) + I futsu - 0x00286c04, // n0x0f6b c0x0000 (---------------) + I goto - 0x0027a8c6, // n0x0f6c c0x0000 (---------------) + I hasami - 0x002e8206, // n0x0f6d c0x0000 (---------------) + I hirado - 0x00206743, // n0x0f6e c0x0000 (---------------) + I iki - 0x00315747, // n0x0f6f c0x0000 (---------------) + I isahaya - 0x003108c8, // n0x0f70 c0x0000 (---------------) + I kawatana - 0x0024e24a, // n0x0f71 c0x0000 (---------------) + I kuchinotsu - 0x002bcc48, // n0x0f72 c0x0000 (---------------) + I matsuura - 0x0036c108, // n0x0f73 c0x0000 (---------------) + I nagasaki - 0x00395885, // n0x0f74 c0x0000 (---------------) + I obama - 0x0023a1c5, // n0x0f75 c0x0000 (---------------) + I omura - 0x00366645, // n0x0f76 c0x0000 (---------------) + I oseto - 0x0021f186, // n0x0f77 c0x0000 (---------------) + I saikai - 0x0029be46, // n0x0f78 c0x0000 (---------------) + I sasebo - 0x002e5845, // n0x0f79 c0x0000 (---------------) + I seihi - 0x0038bf49, // n0x0f7a c0x0000 (---------------) + I shimabara - 0x00286a0c, // n0x0f7b c0x0000 (---------------) + I shinkamigoto - 0x00226a07, // n0x0f7c c0x0000 (---------------) + I togitsu - 0x00283308, // n0x0f7d c0x0000 (---------------) + I tsushima - 0x00279c05, // n0x0f7e c0x0000 (---------------) + I unzen - 0x006735c4, // n0x0f7f c0x0001 (---------------) ! I city - 0x00346e44, // n0x0f80 c0x0000 (---------------) + I ando - 0x0026e184, // n0x0f81 c0x0000 (---------------) + I gose - 0x0022e2c6, // n0x0f82 c0x0000 (---------------) + I heguri - 0x0028a74e, // n0x0f83 c0x0000 (---------------) + I higashiyoshino - 0x00344187, // n0x0f84 c0x0000 (---------------) + I ikaruga - 0x00204245, // n0x0f85 c0x0000 (---------------) + I ikoma - 0x0022adcc, // n0x0f86 c0x0000 (---------------) + I kamikitayama - 0x00292687, // n0x0f87 c0x0000 (---------------) + I kanmaki - 0x00341647, // n0x0f88 c0x0000 (---------------) + I kashiba - 0x00344809, // n0x0f89 c0x0000 (---------------) + I kashihara - 0x002133c9, // n0x0f8a c0x0000 (---------------) + I katsuragi - 0x00273345, // n0x0f8b c0x0000 (---------------) + I kawai - 0x00315908, // n0x0f8c c0x0000 (---------------) + I kawakami - 0x0022ed09, // n0x0f8d c0x0000 (---------------) + I kawanishi - 0x002c9885, // n0x0f8e c0x0000 (---------------) + I koryo - 0x002a8548, // n0x0f8f c0x0000 (---------------) + I kurotaki - 0x002b5f46, // n0x0f90 c0x0000 (---------------) + I mitsue - 0x002a5986, // n0x0f91 c0x0000 (---------------) + I miyake - 0x002da0c4, // n0x0f92 c0x0000 (---------------) + I nara - 0x00257448, // n0x0f93 c0x0000 (---------------) + I nosegawa - 0x002432c3, // n0x0f94 c0x0000 (---------------) + I oji - 0x00392684, // n0x0f95 c0x0000 (---------------) + I ouda - 0x002e35c5, // n0x0f96 c0x0000 (---------------) + I oyodo - 0x002f4d47, // n0x0f97 c0x0000 (---------------) + I sakurai - 0x00202285, // n0x0f98 c0x0000 (---------------) + I sango - 0x0038f649, // n0x0f99 c0x0000 (---------------) + I shimoichi - 0x00267dcd, // n0x0f9a c0x0000 (---------------) + I shimokitayama - 0x00285306, // n0x0f9b c0x0000 (---------------) + I shinjo - 0x00220944, // n0x0f9c c0x0000 (---------------) + I soni - 0x00335dc8, // n0x0f9d c0x0000 (---------------) + I takatori - 0x0025ca0a, // n0x0f9e c0x0000 (---------------) + I tawaramoto - 0x00203207, // n0x0f9f c0x0000 (---------------) + I tenkawa - 0x0027be45, // n0x0fa0 c0x0000 (---------------) + I tenri - 0x002070c3, // n0x0fa1 c0x0000 (---------------) + I uda - 0x00289d8e, // n0x0fa2 c0x0000 (---------------) + I yamatokoriyama - 0x0022afcc, // n0x0fa3 c0x0000 (---------------) + I yamatotakada - 0x0027b147, // n0x0fa4 c0x0000 (---------------) + I yamazoe - 0x0028a907, // n0x0fa5 c0x0000 (---------------) + I yoshino - 0x002015c3, // n0x0fa6 c0x0000 (---------------) + I aga - 0x0034e505, // n0x0fa7 c0x0000 (---------------) + I agano - 0x0026e185, // n0x0fa8 c0x0000 (---------------) + I gosen - 0x00283f48, // n0x0fa9 c0x0000 (---------------) + I itoigawa - 0x00281409, // n0x0faa c0x0000 (---------------) + I izumozaki - 0x0026a386, // n0x0fab c0x0000 (---------------) + I joetsu - 0x0022ac04, // n0x0fac c0x0000 (---------------) + I kamo - 0x00316046, // n0x0fad c0x0000 (---------------) + I kariwa - 0x0038218b, // n0x0fae c0x0000 (---------------) + I kashiwazaki - 0x002c460c, // n0x0faf c0x0000 (---------------) + I minamiuonuma - 0x0026c3c7, // n0x0fb0 c0x0000 (---------------) + I mitsuke - 0x002ba105, // n0x0fb1 c0x0000 (---------------) + I muika - 0x003743c8, // n0x0fb2 c0x0000 (---------------) + I murakami - 0x0032b585, // n0x0fb3 c0x0000 (---------------) + I myoko - 0x0035ec07, // n0x0fb4 c0x0000 (---------------) + I nagaoka - 0x0025f907, // n0x0fb5 c0x0000 (---------------) + I niigata - 0x002432c5, // n0x0fb6 c0x0000 (---------------) + I ojiya - 0x00207d03, // n0x0fb7 c0x0000 (---------------) + I omi - 0x002109c4, // n0x0fb8 c0x0000 (---------------) + I sado - 0x00203845, // n0x0fb9 c0x0000 (---------------) + I sanjo - 0x002f3b45, // n0x0fba c0x0000 (---------------) + I seiro - 0x002f3b46, // n0x0fbb c0x0000 (---------------) + I seirou - 0x00274588, // n0x0fbc c0x0000 (---------------) + I sekikawa - 0x003416c7, // n0x0fbd c0x0000 (---------------) + I shibata - 0x0033ed46, // n0x0fbe c0x0000 (---------------) + I tagami - 0x0031abc6, // n0x0fbf c0x0000 (---------------) + I tainai - 0x0030fc06, // n0x0fc0 c0x0000 (---------------) + I tochio - 0x002e1589, // n0x0fc1 c0x0000 (---------------) + I tokamachi - 0x0031adc7, // n0x0fc2 c0x0000 (---------------) + I tsubame - 0x00207306, // n0x0fc3 c0x0000 (---------------) + I tsunan - 0x002c4786, // n0x0fc4 c0x0000 (---------------) + I uonuma - 0x00243386, // n0x0fc5 c0x0000 (---------------) + I yahiko - 0x00298cc5, // n0x0fc6 c0x0000 (---------------) + I yoita - 0x00216b86, // n0x0fc7 c0x0000 (---------------) + I yuzawa - 0x0034c845, // n0x0fc8 c0x0000 (---------------) + I beppu - 0x002a55c8, // n0x0fc9 c0x0000 (---------------) + I bungoono - 0x0024facb, // n0x0fca c0x0000 (---------------) + I bungotakada - 0x0027a6c6, // n0x0fcb c0x0000 (---------------) + I hasama - 0x002e9784, // n0x0fcc c0x0000 (---------------) + I hiji - 0x00336449, // n0x0fcd c0x0000 (---------------) + I himeshima - 0x0028d544, // n0x0fce c0x0000 (---------------) + I hita - 0x002b5ec8, // n0x0fcf c0x0000 (---------------) + I kamitsue - 0x0027b5c7, // n0x0fd0 c0x0000 (---------------) + I kokonoe - 0x0026ff44, // n0x0fd1 c0x0000 (---------------) + I kuju - 0x002a0f48, // n0x0fd2 c0x0000 (---------------) + I kunisaki - 0x002a9c04, // n0x0fd3 c0x0000 (---------------) + I kusu - 0x00298d04, // n0x0fd4 c0x0000 (---------------) + I oita - 0x002a7585, // n0x0fd5 c0x0000 (---------------) + I saiki - 0x00335cc6, // n0x0fd6 c0x0000 (---------------) + I taketa - 0x00272207, // n0x0fd7 c0x0000 (---------------) + I tsukumi - 0x00222503, // n0x0fd8 c0x0000 (---------------) + I usa - 0x00288f85, // n0x0fd9 c0x0000 (---------------) + I usuki - 0x002ab604, // n0x0fda c0x0000 (---------------) + I yufu - 0x0023e446, // n0x0fdb c0x0000 (---------------) + I akaiwa - 0x0024e188, // n0x0fdc c0x0000 (---------------) + I asakuchi - 0x00310605, // n0x0fdd c0x0000 (---------------) + I bizen - 0x0027e449, // n0x0fde c0x0000 (---------------) + I hayashima - 0x002b9fc5, // n0x0fdf c0x0000 (---------------) + I ibara - 0x002ab008, // n0x0fe0 c0x0000 (---------------) + I kagamino - 0x00340b47, // n0x0fe1 c0x0000 (---------------) + I kasaoka - 0x0035c188, // n0x0fe2 c0x0000 (---------------) + I kibichuo - 0x002a0447, // n0x0fe3 c0x0000 (---------------) + I kumenan - 0x0025adc9, // n0x0fe4 c0x0000 (---------------) + I kurashiki - 0x002487c6, // n0x0fe5 c0x0000 (---------------) + I maniwa - 0x00303986, // n0x0fe6 c0x0000 (---------------) + I misaki - 0x00240904, // n0x0fe7 c0x0000 (---------------) + I nagi - 0x0027cd05, // n0x0fe8 c0x0000 (---------------) + I niimi - 0x002dac0c, // n0x0fe9 c0x0000 (---------------) + I nishiawakura - 0x00266607, // n0x0fea c0x0000 (---------------) + I okayama - 0x00266c47, // n0x0feb c0x0000 (---------------) + I satosho - 0x002e9608, // n0x0fec c0x0000 (---------------) + I setouchi - 0x00285306, // n0x0fed c0x0000 (---------------) + I shinjo - 0x00340f44, // n0x0fee c0x0000 (---------------) + I shoo - 0x0030ad04, // n0x0fef c0x0000 (---------------) + I soja - 0x0023c909, // n0x0ff0 c0x0000 (---------------) + I takahashi - 0x002af9c6, // n0x0ff1 c0x0000 (---------------) + I tamano - 0x002601c7, // n0x0ff2 c0x0000 (---------------) + I tsuyama - 0x00295d44, // n0x0ff3 c0x0000 (---------------) + I wake - 0x002b4e06, // n0x0ff4 c0x0000 (---------------) + I yakage - 0x00342185, // n0x0ff5 c0x0000 (---------------) + I aguni - 0x0028d847, // n0x0ff6 c0x0000 (---------------) + I ginowan - 0x002fe946, // n0x0ff7 c0x0000 (---------------) + I ginoza - 0x00239cc9, // n0x0ff8 c0x0000 (---------------) + I gushikami - 0x002b0487, // n0x0ff9 c0x0000 (---------------) + I haebaru - 0x002545c7, // n0x0ffa c0x0000 (---------------) + I higashi - 0x0028c086, // n0x0ffb c0x0000 (---------------) + I hirara - 0x00231145, // n0x0ffc c0x0000 (---------------) + I iheya - 0x0026cf88, // n0x0ffd c0x0000 (---------------) + I ishigaki - 0x00214e48, // n0x0ffe c0x0000 (---------------) + I ishikawa - 0x0022a5c6, // n0x0fff c0x0000 (---------------) + I itoman - 0x00310645, // n0x1000 c0x0000 (---------------) + I izena - 0x002f0446, // n0x1001 c0x0000 (---------------) + I kadena - 0x00201b03, // n0x1002 c0x0000 (---------------) + I kin - 0x00283dc9, // n0x1003 c0x0000 (---------------) + I kitadaito - 0x0029168e, // n0x1004 c0x0000 (---------------) + I kitanakagusuku - 0x0029f548, // n0x1005 c0x0000 (---------------) + I kumejima - 0x002928c8, // n0x1006 c0x0000 (---------------) + I kunigami - 0x0022a3cb, // n0x1007 c0x0000 (---------------) + I minamidaito - 0x0027e686, // n0x1008 c0x0000 (---------------) + I motobu - 0x002402c4, // n0x1009 c0x0000 (---------------) + I nago - 0x0026ecc4, // n0x100a c0x0000 (---------------) + I naha - 0x0029178a, // n0x100b c0x0000 (---------------) + I nakagusuku - 0x0020d7c7, // n0x100c c0x0000 (---------------) + I nakijin - 0x002073c5, // n0x100d c0x0000 (---------------) + I nanjo - 0x0020e649, // n0x100e c0x0000 (---------------) + I nishihara - 0x002a6885, // n0x100f c0x0000 (---------------) + I ogimi - 0x003954c7, // n0x1010 c0x0000 (---------------) + I okinawa - 0x002988c4, // n0x1011 c0x0000 (---------------) + I onna - 0x00265dc7, // n0x1012 c0x0000 (---------------) + I shimoji - 0x003162c8, // n0x1013 c0x0000 (---------------) + I taketomi - 0x002a43c6, // n0x1014 c0x0000 (---------------) + I tarama - 0x002065c9, // n0x1015 c0x0000 (---------------) + I tokashiki - 0x002a2b4a, // n0x1016 c0x0000 (---------------) + I tomigusuku - 0x0020d746, // n0x1017 c0x0000 (---------------) + I tonaki - 0x00282306, // n0x1018 c0x0000 (---------------) + I urasoe - 0x00296205, // n0x1019 c0x0000 (---------------) + I uruma - 0x00361285, // n0x101a c0x0000 (---------------) + I yaese - 0x00305787, // n0x101b c0x0000 (---------------) + I yomitan - 0x00309c08, // n0x101c c0x0000 (---------------) + I yonabaru - 0x003420c8, // n0x101d c0x0000 (---------------) + I yonaguni - 0x00236b86, // n0x101e c0x0000 (---------------) + I zamami - 0x0031d9c5, // n0x101f c0x0000 (---------------) + I abeno - 0x002403ce, // n0x1020 c0x0000 (---------------) + I chihayaakasaka - 0x002be904, // n0x1021 c0x0000 (---------------) + I chuo - 0x0022a545, // n0x1022 c0x0000 (---------------) + I daito - 0x00265289, // n0x1023 c0x0000 (---------------) + I fujiidera - 0x00273148, // n0x1024 c0x0000 (---------------) + I habikino - 0x00278046, // n0x1025 c0x0000 (---------------) + I hannan - 0x0028630c, // n0x1026 c0x0000 (---------------) + I higashiosaka - 0x00287ed0, // n0x1027 c0x0000 (---------------) + I higashisumiyoshi - 0x0028a38f, // n0x1028 c0x0000 (---------------) + I higashiyodogawa - 0x0028b7c8, // n0x1029 c0x0000 (---------------) + I hirakata - 0x00316ac7, // n0x102a c0x0000 (---------------) + I ibaraki - 0x00390e45, // n0x102b c0x0000 (---------------) + I ikeda - 0x00209785, // n0x102c c0x0000 (---------------) + I izumi - 0x00272089, // n0x102d c0x0000 (---------------) + I izumiotsu - 0x00209789, // n0x102e c0x0000 (---------------) + I izumisano - 0x00216406, // n0x102f c0x0000 (---------------) + I kadoma - 0x002df247, // n0x1030 c0x0000 (---------------) + I kaizuka - 0x0037c505, // n0x1031 c0x0000 (---------------) + I kanan - 0x00375c89, // n0x1032 c0x0000 (---------------) + I kashiwara - 0x003175c6, // n0x1033 c0x0000 (---------------) + I katano - 0x0034e30d, // n0x1034 c0x0000 (---------------) + I kawachinagano - 0x0026d109, // n0x1035 c0x0000 (---------------) + I kishiwada - 0x00206e44, // n0x1036 c0x0000 (---------------) + I kita - 0x0029f2c8, // n0x1037 c0x0000 (---------------) + I kumatori - 0x0034e0c9, // n0x1038 c0x0000 (---------------) + I matsubara - 0x00339806, // n0x1039 c0x0000 (---------------) + I minato - 0x00265a05, // n0x103a c0x0000 (---------------) + I minoh - 0x00303986, // n0x103b c0x0000 (---------------) + I misaki - 0x00387b49, // n0x103c c0x0000 (---------------) + I moriguchi - 0x003896c8, // n0x103d c0x0000 (---------------) + I neyagawa - 0x00208b85, // n0x103e c0x0000 (---------------) + I nishi - 0x00257444, // n0x103f c0x0000 (---------------) + I nose - 0x002864cb, // n0x1040 c0x0000 (---------------) + I osakasayama - 0x003396c5, // n0x1041 c0x0000 (---------------) + I sakai - 0x00286606, // n0x1042 c0x0000 (---------------) + I sayama - 0x0026f406, // n0x1043 c0x0000 (---------------) + I sennan - 0x00243d86, // n0x1044 c0x0000 (---------------) + I settsu - 0x003260cb, // n0x1045 c0x0000 (---------------) + I shijonawate - 0x0027e549, // n0x1046 c0x0000 (---------------) + I shimamoto - 0x002e5b85, // n0x1047 c0x0000 (---------------) + I suita - 0x0035bf47, // n0x1048 c0x0000 (---------------) + I tadaoka - 0x0025fa46, // n0x1049 c0x0000 (---------------) + I taishi - 0x002345c6, // n0x104a c0x0000 (---------------) + I tajiri - 0x0026df08, // n0x104b c0x0000 (---------------) + I takaishi - 0x00376d89, // n0x104c c0x0000 (---------------) + I takatsuki - 0x00246f8c, // n0x104d c0x0000 (---------------) + I tondabayashi - 0x00351d08, // n0x104e c0x0000 (---------------) + I toyonaka - 0x002260c6, // n0x104f c0x0000 (---------------) + I toyono - 0x00330543, // n0x1050 c0x0000 (---------------) + I yao - 0x0027ebc6, // n0x1051 c0x0000 (---------------) + I ariake - 0x0025ac85, // n0x1052 c0x0000 (---------------) + I arita - 0x0026b1c8, // n0x1053 c0x0000 (---------------) + I fukudomi - 0x0021b746, // n0x1054 c0x0000 (---------------) + I genkai - 0x0028da88, // n0x1055 c0x0000 (---------------) + I hamatama - 0x00228245, // n0x1056 c0x0000 (---------------) + I hizen - 0x00352985, // n0x1057 c0x0000 (---------------) + I imari - 0x002877c8, // n0x1058 c0x0000 (---------------) + I kamimine - 0x002d2c87, // n0x1059 c0x0000 (---------------) + I kanzaki - 0x0033e987, // n0x105a c0x0000 (---------------) + I karatsu - 0x00341887, // n0x105b c0x0000 (---------------) + I kashima - 0x0022aa08, // n0x105c c0x0000 (---------------) + I kitagata - 0x00316c08, // n0x105d c0x0000 (---------------) + I kitahata - 0x00253286, // n0x105e c0x0000 (---------------) + I kiyama - 0x002f1947, // n0x105f c0x0000 (---------------) + I kouhoku - 0x002896c7, // n0x1060 c0x0000 (---------------) + I kyuragi - 0x00325dca, // n0x1061 c0x0000 (---------------) + I nishiarita - 0x00212803, // n0x1062 c0x0000 (---------------) + I ogi - 0x00353c06, // n0x1063 c0x0000 (---------------) + I omachi - 0x002069c5, // n0x1064 c0x0000 (---------------) + I ouchi - 0x00275104, // n0x1065 c0x0000 (---------------) + I saga - 0x00268409, // n0x1066 c0x0000 (---------------) + I shiroishi - 0x0025ad44, // n0x1067 c0x0000 (---------------) + I taku - 0x00253f44, // n0x1068 c0x0000 (---------------) + I tara - 0x002891c4, // n0x1069 c0x0000 (---------------) + I tosu - 0x0028a90b, // n0x106a c0x0000 (---------------) + I yoshinogari - 0x0034e247, // n0x106b c0x0000 (---------------) + I arakawa - 0x00240605, // n0x106c c0x0000 (---------------) + I asaka - 0x00280ac8, // n0x106d c0x0000 (---------------) + I chichibu - 0x00265906, // n0x106e c0x0000 (---------------) + I fujimi - 0x00265908, // n0x106f c0x0000 (---------------) + I fujimino - 0x00269d86, // n0x1070 c0x0000 (---------------) + I fukaya - 0x00278e45, // n0x1071 c0x0000 (---------------) + I hanno - 0x002794c5, // n0x1072 c0x0000 (---------------) + I hanyu - 0x0027b306, // n0x1073 c0x0000 (---------------) + I hasuda - 0x0027b788, // n0x1074 c0x0000 (---------------) + I hatogaya - 0x0027c2c8, // n0x1075 c0x0000 (---------------) + I hatoyama - 0x002685c6, // n0x1076 c0x0000 (---------------) + I hidaka - 0x0028090f, // n0x1077 c0x0000 (---------------) + I higashichichibu - 0x00283890, // n0x1078 c0x0000 (---------------) + I higashimatsuyama - 0x002028c5, // n0x1079 c0x0000 (---------------) + I honjo - 0x00200243, // n0x107a c0x0000 (---------------) + I ina - 0x002797c5, // n0x107b c0x0000 (---------------) + I iruma - 0x0030b3c8, // n0x107c c0x0000 (---------------) + I iwatsuki - 0x00209689, // n0x107d c0x0000 (---------------) + I kamiizumi - 0x00304f08, // n0x107e c0x0000 (---------------) + I kamikawa - 0x00340c88, // n0x107f c0x0000 (---------------) + I kamisato - 0x00391808, // n0x1080 c0x0000 (---------------) + I kasukabe - 0x002406c7, // n0x1081 c0x0000 (---------------) + I kawagoe - 0x002655c9, // n0x1082 c0x0000 (---------------) + I kawaguchi - 0x0028dc88, // n0x1083 c0x0000 (---------------) + I kawajima - 0x00369344, // n0x1084 c0x0000 (---------------) + I kazo - 0x00289048, // n0x1085 c0x0000 (---------------) + I kitamoto - 0x0028ec09, // n0x1086 c0x0000 (---------------) + I koshigaya - 0x00307ec7, // n0x1087 c0x0000 (---------------) + I kounosu - 0x00293e04, // n0x1088 c0x0000 (---------------) + I kuki - 0x0036c448, // n0x1089 c0x0000 (---------------) + I kumagaya - 0x0023144a, // n0x108a c0x0000 (---------------) + I matsubushi - 0x0031ef46, // n0x108b c0x0000 (---------------) + I minano - 0x0028b246, // n0x108c c0x0000 (---------------) + I misato - 0x0021ae49, // n0x108d c0x0000 (---------------) + I miyashiro - 0x00288107, // n0x108e c0x0000 (---------------) + I miyoshi - 0x002b62c8, // n0x108f c0x0000 (---------------) + I moroyama - 0x00201588, // n0x1090 c0x0000 (---------------) + I nagatoro - 0x00342d88, // n0x1091 c0x0000 (---------------) + I namegawa - 0x003721c5, // n0x1092 c0x0000 (---------------) + I niiza - 0x00362605, // n0x1093 c0x0000 (---------------) + I ogano - 0x00204045, // n0x1094 c0x0000 (---------------) + I ogawa - 0x0026e145, // n0x1095 c0x0000 (---------------) + I ogose - 0x00259347, // n0x1096 c0x0000 (---------------) + I okegawa - 0x00207d05, // n0x1097 c0x0000 (---------------) + I omiya - 0x002a8605, // n0x1098 c0x0000 (---------------) + I otaki - 0x00386ac6, // n0x1099 c0x0000 (---------------) + I ranzan - 0x00304e47, // n0x109a c0x0000 (---------------) + I ryokami - 0x002d0f07, // n0x109b c0x0000 (---------------) + I saitama - 0x00231746, // n0x109c c0x0000 (---------------) + I sakado - 0x002bb685, // n0x109d c0x0000 (---------------) + I satte - 0x00286606, // n0x109e c0x0000 (---------------) + I sayama - 0x002066c5, // n0x109f c0x0000 (---------------) + I shiki - 0x00298148, // n0x10a0 c0x0000 (---------------) + I shiraoka - 0x002cc0c4, // n0x10a1 c0x0000 (---------------) + I soka - 0x002adc86, // n0x10a2 c0x0000 (---------------) + I sugito - 0x00312e84, // n0x10a3 c0x0000 (---------------) + I toda - 0x002add88, // n0x10a4 c0x0000 (---------------) + I tokigawa - 0x00302c0a, // n0x10a5 c0x0000 (---------------) + I tokorozawa - 0x0027700c, // n0x10a6 c0x0000 (---------------) + I tsurugashima - 0x0020b805, // n0x10a7 c0x0000 (---------------) + I urawa - 0x00204106, // n0x10a8 c0x0000 (---------------) + I warabi - 0x00247146, // n0x10a9 c0x0000 (---------------) + I yashio - 0x002f5606, // n0x10aa c0x0000 (---------------) + I yokoze - 0x00226144, // n0x10ab c0x0000 (---------------) + I yono - 0x00375b45, // n0x10ac c0x0000 (---------------) + I yorii - 0x00269bc7, // n0x10ad c0x0000 (---------------) + I yoshida - 0x00288189, // n0x10ae c0x0000 (---------------) + I yoshikawa - 0x0028fac7, // n0x10af c0x0000 (---------------) + I yoshimi - 0x006735c4, // n0x10b0 c0x0001 (---------------) ! I city - 0x006735c4, // n0x10b1 c0x0001 (---------------) ! I city - 0x002f59c5, // n0x10b2 c0x0000 (---------------) + I aisho - 0x0023dd44, // n0x10b3 c0x0000 (---------------) + I gamo - 0x00285cca, // n0x10b4 c0x0000 (---------------) + I higashiomi - 0x00265786, // n0x10b5 c0x0000 (---------------) + I hikone - 0x00346344, // n0x10b6 c0x0000 (---------------) + I koka - 0x00204cc5, // n0x10b7 c0x0000 (---------------) + I konan - 0x002d7bc5, // n0x10b8 c0x0000 (---------------) + I kosei - 0x002e8104, // n0x10b9 c0x0000 (---------------) + I koto - 0x0026f047, // n0x10ba c0x0000 (---------------) + I kusatsu - 0x002b9f47, // n0x10bb c0x0000 (---------------) + I maibara - 0x002b4f88, // n0x10bc c0x0000 (---------------) + I moriyama - 0x0036df48, // n0x10bd c0x0000 (---------------) + I nagahama - 0x00208b89, // n0x10be c0x0000 (---------------) + I nishiazai - 0x003176c8, // n0x10bf c0x0000 (---------------) + I notogawa - 0x00285e8b, // n0x10c0 c0x0000 (---------------) + I omihachiman - 0x0022a784, // n0x10c1 c0x0000 (---------------) + I otsu - 0x0025e445, // n0x10c2 c0x0000 (---------------) + I ritto - 0x00258dc5, // n0x10c3 c0x0000 (---------------) + I ryuoh - 0x00341809, // n0x10c4 c0x0000 (---------------) + I takashima - 0x00376d89, // n0x10c5 c0x0000 (---------------) + I takatsuki - 0x00336348, // n0x10c6 c0x0000 (---------------) + I torahime - 0x00233d48, // n0x10c7 c0x0000 (---------------) + I toyosato - 0x00207004, // n0x10c8 c0x0000 (---------------) + I yasu - 0x002fe885, // n0x10c9 c0x0000 (---------------) + I akagi - 0x002068c3, // n0x10ca c0x0000 (---------------) + I ama - 0x0022a745, // n0x10cb c0x0000 (---------------) + I gotsu - 0x00292ac6, // n0x10cc c0x0000 (---------------) + I hamada - 0x0028124c, // n0x10cd c0x0000 (---------------) + I higashiizumo - 0x00214ec6, // n0x10ce c0x0000 (---------------) + I hikawa - 0x002fb046, // n0x10cf c0x0000 (---------------) + I hikimi - 0x002782c5, // n0x10d0 c0x0000 (---------------) + I izumo - 0x00201a88, // n0x10d1 c0x0000 (---------------) + I kakinoki - 0x002a2fc6, // n0x10d2 c0x0000 (---------------) + I masuda - 0x0038d9c6, // n0x10d3 c0x0000 (---------------) + I matsue - 0x0028b246, // n0x10d4 c0x0000 (---------------) + I misato - 0x0021f48c, // n0x10d5 c0x0000 (---------------) + I nishinoshima - 0x0024eac4, // n0x10d6 c0x0000 (---------------) + I ohda - 0x0030fd4a, // n0x10d7 c0x0000 (---------------) + I okinoshima - 0x00278208, // n0x10d8 c0x0000 (---------------) + I okuizumo - 0x00281087, // n0x10d9 c0x0000 (---------------) + I shimane - 0x00260c46, // n0x10da c0x0000 (---------------) + I tamayu - 0x002e5507, // n0x10db c0x0000 (---------------) + I tsuwano - 0x002ca4c5, // n0x10dc c0x0000 (---------------) + I unnan - 0x00311fc6, // n0x10dd c0x0000 (---------------) + I yakumo - 0x0033ba46, // n0x10de c0x0000 (---------------) + I yasugi - 0x00365987, // n0x10df c0x0000 (---------------) + I yatsuka - 0x00253f84, // n0x10e0 c0x0000 (---------------) + I arai - 0x0027d805, // n0x10e1 c0x0000 (---------------) + I atami - 0x00265284, // n0x10e2 c0x0000 (---------------) + I fuji - 0x00294e07, // n0x10e3 c0x0000 (---------------) + I fujieda - 0x002654c8, // n0x10e4 c0x0000 (---------------) + I fujikawa - 0x0026620a, // n0x10e5 c0x0000 (---------------) + I fujinomiya - 0x0026ce07, // n0x10e6 c0x0000 (---------------) + I fukuroi - 0x00271047, // n0x10e7 c0x0000 (---------------) + I gotemba - 0x00316a47, // n0x10e8 c0x0000 (---------------) + I haibara - 0x0032b6c9, // n0x10e9 c0x0000 (---------------) + I hamamatsu - 0x0028124a, // n0x10ea c0x0000 (---------------) + I higashiizu - 0x00220483, // n0x10eb c0x0000 (---------------) + I ito - 0x00253e85, // n0x10ec c0x0000 (---------------) + I iwata - 0x00209783, // n0x10ed c0x0000 (---------------) + I izu - 0x002f1c49, // n0x10ee c0x0000 (---------------) + I izunokuni - 0x002c7008, // n0x10ef c0x0000 (---------------) + I kakegawa - 0x002d17c7, // n0x10f0 c0x0000 (---------------) + I kannami - 0x00305009, // n0x10f1 c0x0000 (---------------) + I kawanehon - 0x00214f46, // n0x10f2 c0x0000 (---------------) + I kawazu - 0x0025fcc8, // n0x10f3 c0x0000 (---------------) + I kikugawa - 0x002d4745, // n0x10f4 c0x0000 (---------------) + I kosai - 0x00364b0a, // n0x10f5 c0x0000 (---------------) + I makinohara - 0x00355209, // n0x10f6 c0x0000 (---------------) + I matsuzaki - 0x00246c49, // n0x10f7 c0x0000 (---------------) + I minamiizu - 0x00392cc7, // n0x10f8 c0x0000 (---------------) + I mishima - 0x0028b509, // n0x10f9 c0x0000 (---------------) + I morimachi - 0x0020eb88, // n0x10fa c0x0000 (---------------) + I nishiizu - 0x002d2986, // n0x10fb c0x0000 (---------------) + I numazu - 0x002042c8, // n0x10fc c0x0000 (---------------) + I omaezaki - 0x0034e807, // n0x10fd c0x0000 (---------------) + I shimada - 0x002521c7, // n0x10fe c0x0000 (---------------) + I shimizu - 0x0027bc87, // n0x10ff c0x0000 (---------------) + I shimoda - 0x002b4b88, // n0x1100 c0x0000 (---------------) + I shizuoka - 0x002d2686, // n0x1101 c0x0000 (---------------) + I susono - 0x00231205, // n0x1102 c0x0000 (---------------) + I yaizu - 0x00269bc7, // n0x1103 c0x0000 (---------------) + I yoshida - 0x00281e08, // n0x1104 c0x0000 (---------------) + I ashikaga - 0x0030f544, // n0x1105 c0x0000 (---------------) + I bato - 0x002d6e04, // n0x1106 c0x0000 (---------------) + I haga - 0x00315b07, // n0x1107 c0x0000 (---------------) + I ichikai - 0x00255847, // n0x1108 c0x0000 (---------------) + I iwafune - 0x0022eb8a, // n0x1109 c0x0000 (---------------) + I kaminokawa - 0x002d2906, // n0x110a c0x0000 (---------------) + I kanuma - 0x0027afca, // n0x110b c0x0000 (---------------) + I karasuyama - 0x002a6b47, // n0x110c c0x0000 (---------------) + I kuroiso - 0x002be6c7, // n0x110d c0x0000 (---------------) + I mashiko - 0x0024fa44, // n0x110e c0x0000 (---------------) + I mibu - 0x002669c4, // n0x110f c0x0000 (---------------) + I moka - 0x0021ff46, // n0x1110 c0x0000 (---------------) + I motegi - 0x002efac4, // n0x1111 c0x0000 (---------------) + I nasu - 0x002efacc, // n0x1112 c0x0000 (---------------) + I nasushiobara - 0x0033e185, // n0x1113 c0x0000 (---------------) + I nikko - 0x0020f249, // n0x1114 c0x0000 (---------------) + I nishikata - 0x00267304, // n0x1115 c0x0000 (---------------) + I nogi - 0x002e81c5, // n0x1116 c0x0000 (---------------) + I ohira - 0x0025c988, // n0x1117 c0x0000 (---------------) + I ohtawara - 0x0027c385, // n0x1118 c0x0000 (---------------) + I oyama - 0x002f4d46, // n0x1119 c0x0000 (---------------) + I sakura - 0x002098c4, // n0x111a c0x0000 (---------------) + I sano - 0x0027924a, // n0x111b c0x0000 (---------------) + I shimotsuke - 0x002d80c6, // n0x111c c0x0000 (---------------) + I shioya - 0x00316d8a, // n0x111d c0x0000 (---------------) + I takanezawa - 0x0030f5c7, // n0x111e c0x0000 (---------------) + I tochigi - 0x0021d305, // n0x111f c0x0000 (---------------) + I tsuga - 0x00212d45, // n0x1120 c0x0000 (---------------) + I ujiie - 0x0021ee0a, // n0x1121 c0x0000 (---------------) + I utsunomiya - 0x0028c645, // n0x1122 c0x0000 (---------------) + I yaita - 0x00272046, // n0x1123 c0x0000 (---------------) + I aizumi - 0x00204e44, // n0x1124 c0x0000 (---------------) + I anan - 0x002a0706, // n0x1125 c0x0000 (---------------) + I ichiba - 0x00305845, // n0x1126 c0x0000 (---------------) + I itano - 0x0021b806, // n0x1127 c0x0000 (---------------) + I kainan - 0x002be44c, // n0x1128 c0x0000 (---------------) + I komatsushima - 0x002b644a, // n0x1129 c0x0000 (---------------) + I matsushige - 0x0025b9c4, // n0x112a c0x0000 (---------------) + I mima - 0x00213fc6, // n0x112b c0x0000 (---------------) + I minami - 0x00288107, // n0x112c c0x0000 (---------------) + I miyoshi - 0x002b9b44, // n0x112d c0x0000 (---------------) + I mugi - 0x002934c8, // n0x112e c0x0000 (---------------) + I nakagawa - 0x00376a06, // n0x112f c0x0000 (---------------) + I naruto - 0x00240249, // n0x1130 c0x0000 (---------------) + I sanagochi - 0x002c2189, // n0x1131 c0x0000 (---------------) + I shishikui - 0x0028e2c9, // n0x1132 c0x0000 (---------------) + I tokushima - 0x00359bc6, // n0x1133 c0x0000 (---------------) + I wajiki - 0x0034e906, // n0x1134 c0x0000 (---------------) + I adachi - 0x00204407, // n0x1135 c0x0000 (---------------) + I akiruno - 0x0038be88, // n0x1136 c0x0000 (---------------) + I akishima - 0x0034e709, // n0x1137 c0x0000 (---------------) + I aogashima - 0x0034e247, // n0x1138 c0x0000 (---------------) + I arakawa - 0x0027e786, // n0x1139 c0x0000 (---------------) + I bunkyo - 0x002e3947, // n0x113a c0x0000 (---------------) + I chiyoda - 0x0029a7c5, // n0x113b c0x0000 (---------------) + I chofu - 0x002be904, // n0x113c c0x0000 (---------------) + I chuo - 0x00203fc7, // n0x113d c0x0000 (---------------) + I edogawa - 0x002ab685, // n0x113e c0x0000 (---------------) + I fuchu - 0x00275045, // n0x113f c0x0000 (---------------) + I fussa - 0x00389ec7, // n0x1140 c0x0000 (---------------) + I hachijo - 0x00243188, // n0x1141 c0x0000 (---------------) + I hachioji - 0x00374346, // n0x1142 c0x0000 (---------------) + I hamura - 0x00282c8d, // n0x1143 c0x0000 (---------------) + I higashikurume - 0x0028414f, // n0x1144 c0x0000 (---------------) + I higashimurayama - 0x00289bcd, // n0x1145 c0x0000 (---------------) + I higashiyamato - 0x0021ad44, // n0x1146 c0x0000 (---------------) + I hino - 0x00227446, // n0x1147 c0x0000 (---------------) + I hinode - 0x002bcf88, // n0x1148 c0x0000 (---------------) + I hinohara - 0x002408c5, // n0x1149 c0x0000 (---------------) + I inagi - 0x00325f88, // n0x114a c0x0000 (---------------) + I itabashi - 0x002513ca, // n0x114b c0x0000 (---------------) + I katsushika - 0x00206e44, // n0x114c c0x0000 (---------------) + I kita - 0x002978c6, // n0x114d c0x0000 (---------------) + I kiyose - 0x002a3687, // n0x114e c0x0000 (---------------) + I kodaira - 0x00232c87, // n0x114f c0x0000 (---------------) + I koganei - 0x00374809, // n0x1150 c0x0000 (---------------) + I kokubunji - 0x00204285, // n0x1151 c0x0000 (---------------) + I komae - 0x002e8104, // n0x1152 c0x0000 (---------------) + I koto - 0x0031850a, // n0x1153 c0x0000 (---------------) + I kouzushima - 0x002a2089, // n0x1154 c0x0000 (---------------) + I kunitachi - 0x0028b607, // n0x1155 c0x0000 (---------------) + I machida - 0x002b1286, // n0x1156 c0x0000 (---------------) + I meguro - 0x00339806, // n0x1157 c0x0000 (---------------) + I minato - 0x002fe7c6, // n0x1158 c0x0000 (---------------) + I mitaka - 0x0034b046, // n0x1159 c0x0000 (---------------) + I mizuho - 0x002bc90f, // n0x115a c0x0000 (---------------) + I musashimurayama - 0x002bce49, // n0x115b c0x0000 (---------------) + I musashino - 0x0023fcc6, // n0x115c c0x0000 (---------------) + I nakano - 0x003528c6, // n0x115d c0x0000 (---------------) + I nerima - 0x00301849, // n0x115e c0x0000 (---------------) + I ogasawara - 0x002f1a47, // n0x115f c0x0000 (---------------) + I okutama - 0x0020b3c3, // n0x1160 c0x0000 (---------------) + I ome - 0x0021f606, // n0x1161 c0x0000 (---------------) + I oshima - 0x00203943, // n0x1162 c0x0000 (---------------) + I ota - 0x002c3488, // n0x1163 c0x0000 (---------------) + I setagaya - 0x002e3787, // n0x1164 c0x0000 (---------------) + I shibuya - 0x0028b9c9, // n0x1165 c0x0000 (---------------) + I shinagawa - 0x00285788, // n0x1166 c0x0000 (---------------) + I shinjuku - 0x0033eac8, // n0x1167 c0x0000 (---------------) + I suginami - 0x00289246, // n0x1168 c0x0000 (---------------) + I sumida - 0x0032da89, // n0x1169 c0x0000 (---------------) + I tachikawa - 0x002e5c45, // n0x116a c0x0000 (---------------) + I taito - 0x00260c44, // n0x116b c0x0000 (---------------) + I tama - 0x002d0a47, // n0x116c c0x0000 (---------------) + I toshima - 0x00258c05, // n0x116d c0x0000 (---------------) + I chizu - 0x0021ad44, // n0x116e c0x0000 (---------------) + I hino - 0x00274b88, // n0x116f c0x0000 (---------------) + I kawahara - 0x0020da84, // n0x1170 c0x0000 (---------------) + I koge - 0x002eaf87, // n0x1171 c0x0000 (---------------) + I kotoura - 0x003337c6, // n0x1172 c0x0000 (---------------) + I misasa - 0x002c6705, // n0x1173 c0x0000 (---------------) + I nanbu - 0x0027fa88, // n0x1174 c0x0000 (---------------) + I nichinan - 0x003396cb, // n0x1175 c0x0000 (---------------) + I sakaiminato - 0x002e2787, // n0x1176 c0x0000 (---------------) + I tottori - 0x0021f086, // n0x1177 c0x0000 (---------------) + I wakasa - 0x002aeec4, // n0x1178 c0x0000 (---------------) + I yazu - 0x0032b186, // n0x1179 c0x0000 (---------------) + I yonago - 0x002ad5c5, // n0x117a c0x0000 (---------------) + I asahi - 0x002ab685, // n0x117b c0x0000 (---------------) + I fuchu - 0x0026c2c9, // n0x117c c0x0000 (---------------) + I fukumitsu - 0x0026ec49, // n0x117d c0x0000 (---------------) + I funahashi - 0x00252204, // n0x117e c0x0000 (---------------) + I himi - 0x00252245, // n0x117f c0x0000 (---------------) + I imizu - 0x00214005, // n0x1180 c0x0000 (---------------) + I inami - 0x00364986, // n0x1181 c0x0000 (---------------) + I johana - 0x00315a08, // n0x1182 c0x0000 (---------------) + I kamiichi - 0x002a4c46, // n0x1183 c0x0000 (---------------) + I kurobe - 0x0031070b, // n0x1184 c0x0000 (---------------) + I nakaniikawa - 0x0029894a, // n0x1185 c0x0000 (---------------) + I namerikawa - 0x002e14c5, // n0x1186 c0x0000 (---------------) + I nanto - 0x00279546, // n0x1187 c0x0000 (---------------) + I nyuzen - 0x0031d945, // n0x1188 c0x0000 (---------------) + I oyabe - 0x00205705, // n0x1189 c0x0000 (---------------) + I taira - 0x00281747, // n0x118a c0x0000 (---------------) + I takaoka - 0x0038a708, // n0x118b c0x0000 (---------------) + I tateyama - 0x0027b804, // n0x118c c0x0000 (---------------) + I toga - 0x0024e006, // n0x118d c0x0000 (---------------) + I tonami - 0x0027c346, // n0x118e c0x0000 (---------------) + I toyama - 0x0020ed47, // n0x118f c0x0000 (---------------) + I unazuki - 0x002e3d84, // n0x1190 c0x0000 (---------------) + I uozu - 0x0026b046, // n0x1191 c0x0000 (---------------) + I yamada - 0x00250d45, // n0x1192 c0x0000 (---------------) + I arida - 0x00250d49, // n0x1193 c0x0000 (---------------) + I aridagawa - 0x0034eb04, // n0x1194 c0x0000 (---------------) + I gobo - 0x00286d89, // n0x1195 c0x0000 (---------------) + I hashimoto - 0x002685c6, // n0x1196 c0x0000 (---------------) + I hidaka - 0x002a9408, // n0x1197 c0x0000 (---------------) + I hirogawa - 0x00214005, // n0x1198 c0x0000 (---------------) + I inami - 0x002e9845, // n0x1199 c0x0000 (---------------) + I iwade - 0x0021b806, // n0x119a c0x0000 (---------------) + I kainan - 0x00246e89, // n0x119b c0x0000 (---------------) + I kamitonda - 0x002133c9, // n0x119c c0x0000 (---------------) + I katsuragi - 0x002fb0c6, // n0x119d c0x0000 (---------------) + I kimino - 0x00273248, // n0x119e c0x0000 (---------------) + I kinokawa - 0x0022aec8, // n0x119f c0x0000 (---------------) + I kitayama - 0x0031d904, // n0x11a0 c0x0000 (---------------) + I koya - 0x0034b544, // n0x11a1 c0x0000 (---------------) + I koza - 0x0034b548, // n0x11a2 c0x0000 (---------------) + I kozagawa - 0x003000c8, // n0x11a3 c0x0000 (---------------) + I kudoyama - 0x002e5e09, // n0x11a4 c0x0000 (---------------) + I kushimoto - 0x00292a46, // n0x11a5 c0x0000 (---------------) + I mihama - 0x0028b246, // n0x11a6 c0x0000 (---------------) + I misato - 0x002fd2cd, // n0x11a7 c0x0000 (---------------) + I nachikatsuura - 0x002e6a46, // n0x11a8 c0x0000 (---------------) + I shingu - 0x002a1409, // n0x11a9 c0x0000 (---------------) + I shirahama - 0x00353dc5, // n0x11aa c0x0000 (---------------) + I taiji - 0x0030f946, // n0x11ab c0x0000 (---------------) + I tanabe - 0x0032dc48, // n0x11ac c0x0000 (---------------) + I wakayama - 0x002f9ac5, // n0x11ad c0x0000 (---------------) + I yuasa - 0x00289704, // n0x11ae c0x0000 (---------------) + I yura - 0x002ad5c5, // n0x11af c0x0000 (---------------) + I asahi - 0x0026e788, // n0x11b0 c0x0000 (---------------) + I funagata - 0x00285a89, // n0x11b1 c0x0000 (---------------) + I higashine - 0x00265344, // n0x11b2 c0x0000 (---------------) + I iide - 0x00226886, // n0x11b3 c0x0000 (---------------) + I kahoku - 0x003467ca, // n0x11b4 c0x0000 (---------------) + I kaminoyama - 0x002150c8, // n0x11b5 c0x0000 (---------------) + I kaneyama - 0x0022ed09, // n0x11b6 c0x0000 (---------------) + I kawanishi - 0x002f8d4a, // n0x11b7 c0x0000 (---------------) + I mamurogawa - 0x00304f86, // n0x11b8 c0x0000 (---------------) + I mikawa - 0x00284308, // n0x11b9 c0x0000 (---------------) + I murayama - 0x0035e9c5, // n0x11ba c0x0000 (---------------) + I nagai - 0x00355088, // n0x11bb c0x0000 (---------------) + I nakayama - 0x002a0545, // n0x11bc c0x0000 (---------------) + I nanyo - 0x00214e09, // n0x11bd c0x0000 (---------------) + I nishikawa - 0x0034fd89, // n0x11be c0x0000 (---------------) + I obanazawa - 0x00210a82, // n0x11bf c0x0000 (---------------) + I oe - 0x0029efc5, // n0x11c0 c0x0000 (---------------) + I oguni - 0x00258e86, // n0x11c1 c0x0000 (---------------) + I ohkura - 0x00268507, // n0x11c2 c0x0000 (---------------) + I oishida - 0x00275105, // n0x11c3 c0x0000 (---------------) + I sagae - 0x002f9b86, // n0x11c4 c0x0000 (---------------) + I sakata - 0x00359408, // n0x11c5 c0x0000 (---------------) + I sakegawa - 0x00285306, // n0x11c6 c0x0000 (---------------) + I shinjo - 0x0029cd89, // n0x11c7 c0x0000 (---------------) + I shirataka - 0x00266d46, // n0x11c8 c0x0000 (---------------) + I shonai - 0x0026dd88, // n0x11c9 c0x0000 (---------------) + I takahata - 0x00294245, // n0x11ca c0x0000 (---------------) + I tendo - 0x00247ec6, // n0x11cb c0x0000 (---------------) + I tozawa - 0x003052c8, // n0x11cc c0x0000 (---------------) + I tsuruoka - 0x0026dc08, // n0x11cd c0x0000 (---------------) + I yamagata - 0x0034d348, // n0x11ce c0x0000 (---------------) + I yamanobe - 0x002212c8, // n0x11cf c0x0000 (---------------) + I yonezawa - 0x00216b84, // n0x11d0 c0x0000 (---------------) + I yuza - 0x0021bc43, // n0x11d1 c0x0000 (---------------) + I abu - 0x0029cfc4, // n0x11d2 c0x0000 (---------------) + I hagi - 0x002af4c6, // n0x11d3 c0x0000 (---------------) + I hikari - 0x0029a804, // n0x11d4 c0x0000 (---------------) + I hofu - 0x00292807, // n0x11d5 c0x0000 (---------------) + I iwakuni - 0x0038d8c9, // n0x11d6 c0x0000 (---------------) + I kudamatsu - 0x002ae205, // n0x11d7 c0x0000 (---------------) + I mitou - 0x00201586, // n0x11d8 c0x0000 (---------------) + I nagato - 0x0021f606, // n0x11d9 c0x0000 (---------------) + I oshima - 0x002743cb, // n0x11da c0x0000 (---------------) + I shimonoseki - 0x002e1406, // n0x11db c0x0000 (---------------) + I shunan - 0x003003c6, // n0x11dc c0x0000 (---------------) + I tabuse - 0x00286f48, // n0x11dd c0x0000 (---------------) + I tokuyama - 0x00338906, // n0x11de c0x0000 (---------------) + I toyota - 0x002b48c3, // n0x11df c0x0000 (---------------) + I ube - 0x00213ec3, // n0x11e0 c0x0000 (---------------) + I yuu - 0x002be904, // n0x11e1 c0x0000 (---------------) + I chuo - 0x002243c5, // n0x11e2 c0x0000 (---------------) + I doshi - 0x00289887, // n0x11e3 c0x0000 (---------------) + I fuefuki - 0x002654c8, // n0x11e4 c0x0000 (---------------) + I fujikawa - 0x002654cf, // n0x11e5 c0x0000 (---------------) + I fujikawaguchiko - 0x00269acb, // n0x11e6 c0x0000 (---------------) + I fujiyoshida - 0x00315808, // n0x11e7 c0x0000 (---------------) + I hayakawa - 0x00226906, // n0x11e8 c0x0000 (---------------) + I hokuto - 0x00312b8e, // n0x11e9 c0x0000 (---------------) + I ichikawamisato - 0x0021b803, // n0x11ea c0x0000 (---------------) + I kai - 0x0024cf84, // n0x11eb c0x0000 (---------------) + I kofu - 0x002e1385, // n0x11ec c0x0000 (---------------) + I koshu - 0x002e4a46, // n0x11ed c0x0000 (---------------) + I kosuge - 0x0027a9cb, // n0x11ee c0x0000 (---------------) + I minami-alps - 0x0027ee46, // n0x11ef c0x0000 (---------------) + I minobu - 0x00204889, // n0x11f0 c0x0000 (---------------) + I nakamichi - 0x002c6705, // n0x11f1 c0x0000 (---------------) + I nanbu - 0x00372f88, // n0x11f2 c0x0000 (---------------) + I narusawa - 0x00208608, // n0x11f3 c0x0000 (---------------) + I nirasaki - 0x0021328c, // n0x11f4 c0x0000 (---------------) + I nishikatsura - 0x0028a946, // n0x11f5 c0x0000 (---------------) + I oshino - 0x0022a786, // n0x11f6 c0x0000 (---------------) + I otsuki - 0x002b3885, // n0x11f7 c0x0000 (---------------) + I showa - 0x00275f88, // n0x11f8 c0x0000 (---------------) + I tabayama - 0x0026a445, // n0x11f9 c0x0000 (---------------) + I tsuru - 0x0038dac8, // n0x11fa c0x0000 (---------------) + I uenohara - 0x0028a00a, // n0x11fb c0x0000 (---------------) + I yamanakako - 0x0029b889, // n0x11fc c0x0000 (---------------) + I yamanashi - 0x006735c4, // n0x11fd c0x0001 (---------------) ! I city - 0x2d600742, // n0x11fe c0x00b5 (n0x11ff-n0x1200) o I co - 0x000e4188, // n0x11ff c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1200 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1201 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1202 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1203 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1204 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1205 c0x0000 (---------------) + I org - 0x00310603, // n0x1206 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x1207 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1208 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1209 c0x0000 (---------------) + I gov - 0x00200304, // n0x120a c0x0000 (---------------) + I info - 0x002170c3, // n0x120b c0x0000 (---------------) + I net - 0x0021dcc3, // n0x120c c0x0000 (---------------) + I org - 0x002362c3, // n0x120d c0x0000 (---------------) + I ass - 0x002729c4, // n0x120e c0x0000 (---------------) + I asso - 0x00222ac3, // n0x120f c0x0000 (---------------) + I com - 0x00228d44, // n0x1210 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x1211 c0x0000 (---------------) + I edu - 0x003579c4, // n0x1212 c0x0000 (---------------) + I gouv - 0x0021e283, // n0x1213 c0x0000 (---------------) + I gov - 0x002753c7, // n0x1214 c0x0000 (---------------) + I medecin - 0x0023fa03, // n0x1215 c0x0000 (---------------) + I mil - 0x00207cc3, // n0x1216 c0x0000 (---------------) + I nom - 0x00265c08, // n0x1217 c0x0000 (---------------) + I notaires - 0x0021dcc3, // n0x1218 c0x0000 (---------------) + I org - 0x002e078b, // n0x1219 c0x0000 (---------------) + I pharmaciens - 0x002ca783, // n0x121a c0x0000 (---------------) + I prd - 0x0029abc6, // n0x121b c0x0000 (---------------) + I presse - 0x00208902, // n0x121c c0x0000 (---------------) + I tm - 0x0036b18b, // n0x121d c0x0000 (---------------) + I veterinaire - 0x002d75c3, // n0x121e c0x0000 (---------------) + I edu - 0x0021e283, // n0x121f c0x0000 (---------------) + I gov - 0x002170c3, // n0x1220 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1221 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1222 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1223 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1224 c0x0000 (---------------) + I gov - 0x0021dcc3, // n0x1225 c0x0000 (---------------) + I org - 0x002117c3, // n0x1226 c0x0000 (---------------) + I rep - 0x00210103, // n0x1227 c0x0000 (---------------) + I tra - 0x00201e82, // n0x1228 c0x0000 (---------------) + I ac - 0x000e4188, // n0x1229 c0x0000 (---------------) + blogspot - 0x002224c5, // n0x122a c0x0000 (---------------) + I busan - 0x002ea8c8, // n0x122b c0x0000 (---------------) + I chungbuk - 0x002ec1c8, // n0x122c c0x0000 (---------------) + I chungnam - 0x00200742, // n0x122d c0x0000 (---------------) + I co - 0x0032b905, // n0x122e c0x0000 (---------------) + I daegu - 0x0023e947, // n0x122f c0x0000 (---------------) + I daejeon - 0x002010c2, // n0x1230 c0x0000 (---------------) + I es - 0x00204ac7, // n0x1231 c0x0000 (---------------) + I gangwon - 0x00202342, // n0x1232 c0x0000 (---------------) + I go - 0x00370b47, // n0x1233 c0x0000 (---------------) + I gwangju - 0x00384c89, // n0x1234 c0x0000 (---------------) + I gyeongbuk - 0x0035e588, // n0x1235 c0x0000 (---------------) + I gyeonggi - 0x00342c09, // n0x1236 c0x0000 (---------------) + I gyeongnam - 0x00203802, // n0x1237 c0x0000 (---------------) + I hs - 0x002c2a87, // n0x1238 c0x0000 (---------------) + I incheon - 0x002fae44, // n0x1239 c0x0000 (---------------) + I jeju - 0x0023ea07, // n0x123a c0x0000 (---------------) + I jeonbuk - 0x00298847, // n0x123b c0x0000 (---------------) + I jeonnam - 0x002a3fc2, // n0x123c c0x0000 (---------------) + I kg - 0x0023fa03, // n0x123d c0x0000 (---------------) + I mil - 0x00209282, // n0x123e c0x0000 (---------------) + I ms - 0x00201082, // n0x123f c0x0000 (---------------) + I ne - 0x00200c42, // n0x1240 c0x0000 (---------------) + I or - 0x00214942, // n0x1241 c0x0000 (---------------) + I pe - 0x002030c2, // n0x1242 c0x0000 (---------------) + I re - 0x00200982, // n0x1243 c0x0000 (---------------) + I sc - 0x002baac5, // n0x1244 c0x0000 (---------------) + I seoul - 0x002376c5, // n0x1245 c0x0000 (---------------) + I ulsan - 0x00222ac3, // n0x1246 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1247 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1248 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1249 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x124a c0x0000 (---------------) + I org - 0x00222ac3, // n0x124b c0x0000 (---------------) + I com - 0x002d75c3, // n0x124c c0x0000 (---------------) + I edu - 0x0021e283, // n0x124d c0x0000 (---------------) + I gov - 0x0023fa03, // n0x124e c0x0000 (---------------) + I mil - 0x002170c3, // n0x124f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1250 c0x0000 (---------------) + I org - 0x00000741, // n0x1251 c0x0000 (---------------) + c - 0x00222ac3, // n0x1252 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1253 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1254 c0x0000 (---------------) + I gov - 0x00200304, // n0x1255 c0x0000 (---------------) + I info - 0x00238c03, // n0x1256 c0x0000 (---------------) + I int - 0x002170c3, // n0x1257 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1258 c0x0000 (---------------) + I org - 0x00214943, // n0x1259 c0x0000 (---------------) + I per - 0x00222ac3, // n0x125a c0x0000 (---------------) + I com - 0x002d75c3, // n0x125b c0x0000 (---------------) + I edu - 0x0021e283, // n0x125c c0x0000 (---------------) + I gov - 0x002170c3, // n0x125d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x125e c0x0000 (---------------) + I org - 0x00200742, // n0x125f c0x0000 (---------------) + I co - 0x00222ac3, // n0x1260 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1261 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1262 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1263 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1264 c0x0000 (---------------) + I org - 0x000e4188, // n0x1265 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x1266 c0x0000 (---------------) + I ac - 0x002aa2c4, // n0x1267 c0x0000 (---------------) + I assn - 0x00222ac3, // n0x1268 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1269 c0x0000 (---------------) + I edu - 0x0021e283, // n0x126a c0x0000 (---------------) + I gov - 0x00221d03, // n0x126b c0x0000 (---------------) + I grp - 0x00294945, // n0x126c c0x0000 (---------------) + I hotel - 0x00238c03, // n0x126d c0x0000 (---------------) + I int - 0x003413c3, // n0x126e c0x0000 (---------------) + I ltd - 0x002170c3, // n0x126f c0x0000 (---------------) + I net - 0x00202303, // n0x1270 c0x0000 (---------------) + I ngo - 0x0021dcc3, // n0x1271 c0x0000 (---------------) + I org - 0x00206103, // n0x1272 c0x0000 (---------------) + I sch - 0x00240a03, // n0x1273 c0x0000 (---------------) + I soc - 0x00219fc3, // n0x1274 c0x0000 (---------------) + I web - 0x00222ac3, // n0x1275 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1276 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1277 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1278 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1279 c0x0000 (---------------) + I org - 0x00200742, // n0x127a c0x0000 (---------------) + I co - 0x0021dcc3, // n0x127b c0x0000 (---------------) + I org - 0x000e4188, // n0x127c c0x0000 (---------------) + blogspot - 0x0021e283, // n0x127d c0x0000 (---------------) + I gov - 0x000e4188, // n0x127e c0x0000 (---------------) + blogspot - 0x002a00c3, // n0x127f c0x0000 (---------------) + I asn - 0x00222ac3, // n0x1280 c0x0000 (---------------) + I com - 0x00224984, // n0x1281 c0x0000 (---------------) + I conf - 0x002d75c3, // n0x1282 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1283 c0x0000 (---------------) + I gov - 0x00206202, // n0x1284 c0x0000 (---------------) + I id - 0x0023fa03, // n0x1285 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1286 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1287 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1288 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1289 c0x0000 (---------------) + I edu - 0x0021e283, // n0x128a c0x0000 (---------------) + I gov - 0x00206202, // n0x128b c0x0000 (---------------) + I id - 0x0020b403, // n0x128c c0x0000 (---------------) + I med - 0x002170c3, // n0x128d c0x0000 (---------------) + I net - 0x0021dcc3, // n0x128e c0x0000 (---------------) + I org - 0x002c65c3, // n0x128f c0x0000 (---------------) + I plc - 0x00206103, // n0x1290 c0x0000 (---------------) + I sch - 0x00201e82, // n0x1291 c0x0000 (---------------) + I ac - 0x00200742, // n0x1292 c0x0000 (---------------) + I co - 0x0021e283, // n0x1293 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1294 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1295 c0x0000 (---------------) + I org - 0x0029abc5, // n0x1296 c0x0000 (---------------) + I press - 0x002729c4, // n0x1297 c0x0000 (---------------) + I asso - 0x00208902, // n0x1298 c0x0000 (---------------) + I tm - 0x000e4188, // n0x1299 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x129a c0x0000 (---------------) + I ac - 0x00200742, // n0x129b c0x0000 (---------------) + I co - 0x002d75c3, // n0x129c c0x0000 (---------------) + I edu - 0x0021e283, // n0x129d c0x0000 (---------------) + I gov - 0x00226ac3, // n0x129e c0x0000 (---------------) + I its - 0x002170c3, // n0x129f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12a0 c0x0000 (---------------) + I org - 0x002cba44, // n0x12a1 c0x0000 (---------------) + I priv - 0x00222ac3, // n0x12a2 c0x0000 (---------------) + I com - 0x002d75c3, // n0x12a3 c0x0000 (---------------) + I edu - 0x0021e283, // n0x12a4 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x12a5 c0x0000 (---------------) + I mil - 0x00207cc3, // n0x12a6 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x12a7 c0x0000 (---------------) + I org - 0x002ca783, // n0x12a8 c0x0000 (---------------) + I prd - 0x00208902, // n0x12a9 c0x0000 (---------------) + I tm - 0x000e4188, // n0x12aa c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x12ab c0x0000 (---------------) + I com - 0x002d75c3, // n0x12ac c0x0000 (---------------) + I edu - 0x0021e283, // n0x12ad c0x0000 (---------------) + I gov - 0x00200303, // n0x12ae c0x0000 (---------------) + I inf - 0x00298944, // n0x12af c0x0000 (---------------) + I name - 0x002170c3, // n0x12b0 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12b1 c0x0000 (---------------) + I org - 0x00222ac3, // n0x12b2 c0x0000 (---------------) + I com - 0x002d75c3, // n0x12b3 c0x0000 (---------------) + I edu - 0x003579c4, // n0x12b4 c0x0000 (---------------) + I gouv - 0x0021e283, // n0x12b5 c0x0000 (---------------) + I gov - 0x002170c3, // n0x12b6 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12b7 c0x0000 (---------------) + I org - 0x0029abc6, // n0x12b8 c0x0000 (---------------) + I presse - 0x002d75c3, // n0x12b9 c0x0000 (---------------) + I edu - 0x0021e283, // n0x12ba c0x0000 (---------------) + I gov - 0x00023403, // n0x12bb c0x0000 (---------------) + nyc - 0x0021dcc3, // n0x12bc c0x0000 (---------------) + I org - 0x00222ac3, // n0x12bd c0x0000 (---------------) + I com - 0x002d75c3, // n0x12be c0x0000 (---------------) + I edu - 0x0021e283, // n0x12bf c0x0000 (---------------) + I gov - 0x002170c3, // n0x12c0 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12c1 c0x0000 (---------------) + I org - 0x000e4188, // n0x12c2 c0x0000 (---------------) + blogspot - 0x0021e283, // n0x12c3 c0x0000 (---------------) + I gov - 0x00222ac3, // n0x12c4 c0x0000 (---------------) + I com - 0x002d75c3, // n0x12c5 c0x0000 (---------------) + I edu - 0x0021e283, // n0x12c6 c0x0000 (---------------) + I gov - 0x002170c3, // n0x12c7 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12c8 c0x0000 (---------------) + I org - 0x35622ac3, // n0x12c9 c0x00d5 (n0x12cd-n0x12ce) + I com - 0x002d75c3, // n0x12ca c0x0000 (---------------) + I edu - 0x002170c3, // n0x12cb c0x0000 (---------------) + I net - 0x0021dcc3, // n0x12cc c0x0000 (---------------) + I org - 0x000e4188, // n0x12cd c0x0000 (---------------) + blogspot - 0x00201e82, // n0x12ce c0x0000 (---------------) + I ac - 0x00200742, // n0x12cf c0x0000 (---------------) + I co - 0x00222ac3, // n0x12d0 c0x0000 (---------------) + I com - 0x0021e283, // n0x12d1 c0x0000 (---------------) + I gov - 0x002170c3, // n0x12d2 c0x0000 (---------------) + I net - 0x00200c42, // n0x12d3 c0x0000 (---------------) + I or - 0x0021dcc3, // n0x12d4 c0x0000 (---------------) + I org - 0x002f2787, // n0x12d5 c0x0000 (---------------) + I academy - 0x0033c2cb, // n0x12d6 c0x0000 (---------------) + I agriculture - 0x00205743, // n0x12d7 c0x0000 (---------------) + I air - 0x0022c148, // n0x12d8 c0x0000 (---------------) + I airguard - 0x0038bc07, // n0x12d9 c0x0000 (---------------) + I alabama - 0x00267646, // n0x12da c0x0000 (---------------) + I alaska - 0x002b6e85, // n0x12db c0x0000 (---------------) + I amber - 0x003541c9, // n0x12dc c0x0000 (---------------) + I ambulance - 0x002757c8, // n0x12dd c0x0000 (---------------) + I american - 0x002757c9, // n0x12de c0x0000 (---------------) + I americana - 0x002757d0, // n0x12df c0x0000 (---------------) + I americanantiques - 0x0031aecb, // n0x12e0 c0x0000 (---------------) + I americanart - 0x002b6cc9, // n0x12e1 c0x0000 (---------------) + I amsterdam - 0x00208f03, // n0x12e2 c0x0000 (---------------) + I and - 0x003228c9, // n0x12e3 c0x0000 (---------------) + I annefrank - 0x00225786, // n0x12e4 c0x0000 (---------------) + I anthro - 0x0022578c, // n0x12e5 c0x0000 (---------------) + I anthropology - 0x00222588, // n0x12e6 c0x0000 (---------------) + I antiques - 0x00392b08, // n0x12e7 c0x0000 (---------------) + I aquarium - 0x00256f09, // n0x12e8 c0x0000 (---------------) + I arboretum - 0x0029690e, // n0x12e9 c0x0000 (---------------) + I archaeological - 0x003429cb, // n0x12ea c0x0000 (---------------) + I archaeology - 0x002a52cc, // n0x12eb c0x0000 (---------------) + I architecture - 0x00200603, // n0x12ec c0x0000 (---------------) + I art - 0x0031b0cc, // n0x12ed c0x0000 (---------------) + I artanddesign - 0x0037a6c9, // n0x12ee c0x0000 (---------------) + I artcenter - 0x00200607, // n0x12ef c0x0000 (---------------) + I artdeco - 0x0037548c, // n0x12f0 c0x0000 (---------------) + I arteducation - 0x0022654a, // n0x12f1 c0x0000 (---------------) + I artgallery - 0x00246584, // n0x12f2 c0x0000 (---------------) + I arts - 0x0024658d, // n0x12f3 c0x0000 (---------------) + I artsandcrafts - 0x0037a588, // n0x12f4 c0x0000 (---------------) + I asmatart - 0x0034db0d, // n0x12f5 c0x0000 (---------------) + I assassination - 0x0037ac46, // n0x12f6 c0x0000 (---------------) + I assisi - 0x002bbacb, // n0x12f7 c0x0000 (---------------) + I association - 0x0032b3c9, // n0x12f8 c0x0000 (---------------) + I astronomy - 0x0032d947, // n0x12f9 c0x0000 (---------------) + I atlanta - 0x0030ce46, // n0x12fa c0x0000 (---------------) + I austin - 0x002ee489, // n0x12fb c0x0000 (---------------) + I australia - 0x0030494a, // n0x12fc c0x0000 (---------------) + I automotive - 0x00328bc8, // n0x12fd c0x0000 (---------------) + I aviation - 0x0025db04, // n0x12fe c0x0000 (---------------) + I axis - 0x0035ef47, // n0x12ff c0x0000 (---------------) + I badajoz - 0x00264407, // n0x1300 c0x0000 (---------------) + I baghdad - 0x00295f44, // n0x1301 c0x0000 (---------------) + I bahn - 0x0023d9c4, // n0x1302 c0x0000 (---------------) + I bale - 0x002708c9, // n0x1303 c0x0000 (---------------) + I baltimore - 0x0036bf49, // n0x1304 c0x0000 (---------------) + I barcelona - 0x002ed5c8, // n0x1305 c0x0000 (---------------) + I baseball - 0x0020a445, // n0x1306 c0x0000 (---------------) + I basel - 0x002dbe45, // n0x1307 c0x0000 (---------------) + I baths - 0x00205a86, // n0x1308 c0x0000 (---------------) + I bauern - 0x00246449, // n0x1309 c0x0000 (---------------) + I beauxarts - 0x0035a18d, // n0x130a c0x0000 (---------------) + I beeldengeluid - 0x002a4d48, // n0x130b c0x0000 (---------------) + I bellevue - 0x00205987, // n0x130c c0x0000 (---------------) + I bergbau - 0x002b6f08, // n0x130d c0x0000 (---------------) + I berkeley - 0x00251d46, // n0x130e c0x0000 (---------------) + I berlin - 0x00353844, // n0x130f c0x0000 (---------------) + I bern - 0x003628c5, // n0x1310 c0x0000 (---------------) + I bible - 0x00394a46, // n0x1311 c0x0000 (---------------) + I bilbao - 0x00396b04, // n0x1312 c0x0000 (---------------) + I bill - 0x00200507, // n0x1313 c0x0000 (---------------) + I birdart - 0x00201cca, // n0x1314 c0x0000 (---------------) + I birthplace - 0x0020bcc4, // n0x1315 c0x0000 (---------------) + I bonn - 0x0020d686, // n0x1316 c0x0000 (---------------) + I boston - 0x0020e2c9, // n0x1317 c0x0000 (---------------) + I botanical - 0x0020e2cf, // n0x1318 c0x0000 (---------------) + I botanicalgarden - 0x0020e88d, // n0x1319 c0x0000 (---------------) + I botanicgarden - 0x002107c6, // n0x131a c0x0000 (---------------) + I botany - 0x00213b10, // n0x131b c0x0000 (---------------) + I brandywinevalley - 0x00214a86, // n0x131c c0x0000 (---------------) + I brasil - 0x002159c7, // n0x131d c0x0000 (---------------) + I bristol - 0x00215d47, // n0x131e c0x0000 (---------------) + I british - 0x00215d4f, // n0x131f c0x0000 (---------------) + I britishcolumbia - 0x00216d09, // n0x1320 c0x0000 (---------------) + I broadcast - 0x0021b106, // n0x1321 c0x0000 (---------------) + I brunel - 0x0021be87, // n0x1322 c0x0000 (---------------) + I brussel - 0x0021be88, // n0x1323 c0x0000 (---------------) + I brussels - 0x0021c809, // n0x1324 c0x0000 (---------------) + I bruxelles - 0x002c67c8, // n0x1325 c0x0000 (---------------) + I building - 0x002c2fc7, // n0x1326 c0x0000 (---------------) + I burghof - 0x002224c3, // n0x1327 c0x0000 (---------------) + I bus - 0x00280c46, // n0x1328 c0x0000 (---------------) + I bushey - 0x0027d948, // n0x1329 c0x0000 (---------------) + I cadaques - 0x00296bca, // n0x132a c0x0000 (---------------) + I california - 0x0021a089, // n0x132b c0x0000 (---------------) + I cambridge - 0x00208ec3, // n0x132c c0x0000 (---------------) + I can - 0x00309786, // n0x132d c0x0000 (---------------) + I canada - 0x0024de4a, // n0x132e c0x0000 (---------------) + I capebreton - 0x0031bb87, // n0x132f c0x0000 (---------------) + I carrier - 0x003752ca, // n0x1330 c0x0000 (---------------) + I cartoonart - 0x0038390e, // n0x1331 c0x0000 (---------------) + I casadelamoneda - 0x00216e46, // n0x1332 c0x0000 (---------------) + I castle - 0x0021c487, // n0x1333 c0x0000 (---------------) + I castres - 0x0020f006, // n0x1334 c0x0000 (---------------) + I celtic - 0x00233a06, // n0x1335 c0x0000 (---------------) + I center - 0x0036240b, // n0x1336 c0x0000 (---------------) + I chattanooga - 0x002503ca, // n0x1337 c0x0000 (---------------) + I cheltenham - 0x002eeccd, // n0x1338 c0x0000 (---------------) + I chesapeakebay - 0x0034e9c7, // n0x1339 c0x0000 (---------------) + I chicago - 0x00262bc8, // n0x133a c0x0000 (---------------) + I children - 0x00262bc9, // n0x133b c0x0000 (---------------) + I childrens - 0x00262bcf, // n0x133c c0x0000 (---------------) + I childrensgarden - 0x0029300c, // n0x133d c0x0000 (---------------) + I chiropractic - 0x00299309, // n0x133e c0x0000 (---------------) + I chocolate - 0x0022d30e, // n0x133f c0x0000 (---------------) + I christiansburg - 0x002754ca, // n0x1340 c0x0000 (---------------) + I cincinnati - 0x00343506, // n0x1341 c0x0000 (---------------) + I cinema - 0x00323506, // n0x1342 c0x0000 (---------------) + I circus - 0x0034564c, // n0x1343 c0x0000 (---------------) + I civilisation - 0x0034878c, // n0x1344 c0x0000 (---------------) + I civilization - 0x003518c8, // n0x1345 c0x0000 (---------------) + I civilwar - 0x00369707, // n0x1346 c0x0000 (---------------) + I clinton - 0x0020af45, // n0x1347 c0x0000 (---------------) + I clock - 0x00387ec4, // n0x1348 c0x0000 (---------------) + I coal - 0x0032ac0e, // n0x1349 c0x0000 (---------------) + I coastaldefence - 0x00200744, // n0x134a c0x0000 (---------------) + I cody - 0x00232107, // n0x134b c0x0000 (---------------) + I coldwar - 0x0024f38a, // n0x134c c0x0000 (---------------) + I collection - 0x00221854, // n0x134d c0x0000 (---------------) + I colonialwilliamsburg - 0x00221f0f, // n0x134e c0x0000 (---------------) + I coloradoplateau - 0x00215f08, // n0x134f c0x0000 (---------------) + I columbia - 0x00222388, // n0x1350 c0x0000 (---------------) + I columbus - 0x002b354d, // n0x1351 c0x0000 (---------------) + I communication - 0x002b354e, // n0x1352 c0x0000 (---------------) + I communications - 0x00222ac9, // n0x1353 c0x0000 (---------------) + I community - 0x002236c8, // n0x1354 c0x0000 (---------------) + I computer - 0x002236cf, // n0x1355 c0x0000 (---------------) + I computerhistory - 0x0022624c, // n0x1356 c0x0000 (---------------) + I contemporary - 0x0022624f, // n0x1357 c0x0000 (---------------) + I contemporaryart - 0x00227187, // n0x1358 c0x0000 (---------------) + I convent - 0x00229bca, // n0x1359 c0x0000 (---------------) + I copenhagen - 0x0021300b, // n0x135a c0x0000 (---------------) + I corporation - 0x0022b908, // n0x135b c0x0000 (---------------) + I corvette - 0x0022c347, // n0x135c c0x0000 (---------------) + I costume - 0x00362c0d, // n0x135d c0x0000 (---------------) + I countryestate - 0x002f8886, // n0x135e c0x0000 (---------------) + I county - 0x00246746, // n0x135f c0x0000 (---------------) + I crafts - 0x0022f189, // n0x1360 c0x0000 (---------------) + I cranbrook - 0x002e63c8, // n0x1361 c0x0000 (---------------) + I creation - 0x00233808, // n0x1362 c0x0000 (---------------) + I cultural - 0x0023380e, // n0x1363 c0x0000 (---------------) + I culturalcenter - 0x00323687, // n0x1364 c0x0000 (---------------) + I culture - 0x00343d85, // n0x1365 c0x0000 (---------------) + I cyber - 0x002dcac5, // n0x1366 c0x0000 (---------------) + I cymru - 0x00270d04, // n0x1367 c0x0000 (---------------) + I dali - 0x00267906, // n0x1368 c0x0000 (---------------) + I dallas - 0x002ed4c8, // n0x1369 c0x0000 (---------------) + I database - 0x0034d6c3, // n0x136a c0x0000 (---------------) + I ddr - 0x00255ace, // n0x136b c0x0000 (---------------) + I decorativearts - 0x00362fc8, // n0x136c c0x0000 (---------------) + I delaware - 0x0029f90b, // n0x136d c0x0000 (---------------) + I delmenhorst - 0x00311707, // n0x136e c0x0000 (---------------) + I denmark - 0x002b8f85, // n0x136f c0x0000 (---------------) + I depot - 0x00232f46, // n0x1370 c0x0000 (---------------) + I design - 0x00295507, // n0x1371 c0x0000 (---------------) + I detroit - 0x002dff48, // n0x1372 c0x0000 (---------------) + I dinosaur - 0x00304c89, // n0x1373 c0x0000 (---------------) + I discovery - 0x002250c5, // n0x1374 c0x0000 (---------------) + I dolls - 0x00274888, // n0x1375 c0x0000 (---------------) + I donostia - 0x0038a206, // n0x1376 c0x0000 (---------------) + I durham - 0x00367b0a, // n0x1377 c0x0000 (---------------) + I eastafrica - 0x0032ab09, // n0x1378 c0x0000 (---------------) + I eastcoast - 0x00375549, // n0x1379 c0x0000 (---------------) + I education - 0x0037554b, // n0x137a c0x0000 (---------------) + I educational - 0x002958c8, // n0x137b c0x0000 (---------------) + I egyptian - 0x00295e09, // n0x137c c0x0000 (---------------) + I eisenbahn - 0x0020a506, // n0x137d c0x0000 (---------------) + I elburg - 0x0034cf0a, // n0x137e c0x0000 (---------------) + I elvendrell - 0x0032af4a, // n0x137f c0x0000 (---------------) + I embroidery - 0x00229dcc, // n0x1380 c0x0000 (---------------) + I encyclopedic - 0x0037b187, // n0x1381 c0x0000 (---------------) + I england - 0x00384a8a, // n0x1382 c0x0000 (---------------) + I entomology - 0x0030de4b, // n0x1383 c0x0000 (---------------) + I environment - 0x0030de59, // n0x1384 c0x0000 (---------------) + I environmentalconservation - 0x003543c8, // n0x1385 c0x0000 (---------------) + I epilepsy - 0x0029ac45, // n0x1386 c0x0000 (---------------) + I essex - 0x002b1846, // n0x1387 c0x0000 (---------------) + I estate - 0x002f6409, // n0x1388 c0x0000 (---------------) + I ethnology - 0x0020bb46, // n0x1389 c0x0000 (---------------) + I exeter - 0x00326eca, // n0x138a c0x0000 (---------------) + I exhibition - 0x00311c06, // n0x138b c0x0000 (---------------) + I family - 0x0021f804, // n0x138c c0x0000 (---------------) + I farm - 0x0021f80d, // n0x138d c0x0000 (---------------) + I farmequipment - 0x00366b07, // n0x138e c0x0000 (---------------) + I farmers - 0x002fb8c9, // n0x138f c0x0000 (---------------) + I farmstead - 0x002099c5, // n0x1390 c0x0000 (---------------) + I field - 0x00338588, // n0x1391 c0x0000 (---------------) + I figueres - 0x00349f49, // n0x1392 c0x0000 (---------------) + I filatelia - 0x00356104, // n0x1393 c0x0000 (---------------) + I film - 0x003707c7, // n0x1394 c0x0000 (---------------) + I fineart - 0x003707c8, // n0x1395 c0x0000 (---------------) + I finearts - 0x00236407, // n0x1396 c0x0000 (---------------) + I finland - 0x00252b88, // n0x1397 c0x0000 (---------------) + I flanders - 0x0023c447, // n0x1398 c0x0000 (---------------) + I florida - 0x002e7685, // n0x1399 c0x0000 (---------------) + I force - 0x002457cc, // n0x139a c0x0000 (---------------) + I fortmissoula - 0x00245e89, // n0x139b c0x0000 (---------------) + I fortworth - 0x00303b8a, // n0x139c c0x0000 (---------------) + I foundation - 0x00377209, // n0x139d c0x0000 (---------------) + I francaise - 0x003229c9, // n0x139e c0x0000 (---------------) + I frankfurt - 0x0035268c, // n0x139f c0x0000 (---------------) + I franziskaner - 0x00209c8b, // n0x13a0 c0x0000 (---------------) + I freemasonry - 0x00248cc8, // n0x13a1 c0x0000 (---------------) + I freiburg - 0x002493c8, // n0x13a2 c0x0000 (---------------) + I fribourg - 0x0024c784, // n0x13a3 c0x0000 (---------------) + I frog - 0x0026fc08, // n0x13a4 c0x0000 (---------------) + I fundacio - 0x00272f09, // n0x13a5 c0x0000 (---------------) + I furniture - 0x00226607, // n0x13a6 c0x0000 (---------------) + I gallery - 0x0020e506, // n0x13a7 c0x0000 (---------------) + I garden - 0x0021a607, // n0x13a8 c0x0000 (---------------) + I gateway - 0x00268b89, // n0x13a9 c0x0000 (---------------) + I geelvinck - 0x002a634b, // n0x13aa c0x0000 (---------------) + I gemological - 0x00309a87, // n0x13ab c0x0000 (---------------) + I geology - 0x002f8287, // n0x13ac c0x0000 (---------------) + I georgia - 0x00267387, // n0x13ad c0x0000 (---------------) + I giessen - 0x0034da84, // n0x13ae c0x0000 (---------------) + I glas - 0x0034da85, // n0x13af c0x0000 (---------------) + I glass - 0x00292d05, // n0x13b0 c0x0000 (---------------) + I gorge - 0x00320b0b, // n0x13b1 c0x0000 (---------------) + I grandrapids - 0x00380d44, // n0x13b2 c0x0000 (---------------) + I graz - 0x002e6b48, // n0x13b3 c0x0000 (---------------) + I guernsey - 0x002a19ca, // n0x13b4 c0x0000 (---------------) + I halloffame - 0x0038a2c7, // n0x13b5 c0x0000 (---------------) + I hamburg - 0x00372047, // n0x13b6 c0x0000 (---------------) + I handson - 0x0027a252, // n0x13b7 c0x0000 (---------------) + I harvestcelebration - 0x00256386, // n0x13b8 c0x0000 (---------------) + I hawaii - 0x00205e06, // n0x13b9 c0x0000 (---------------) + I health - 0x002f518e, // n0x13ba c0x0000 (---------------) + I heimatunduhren - 0x00257ac6, // n0x13bb c0x0000 (---------------) + I hellas - 0x00209408, // n0x13bc c0x0000 (---------------) + I helsinki - 0x0027f4cf, // n0x13bd c0x0000 (---------------) + I hembygdsforbund - 0x0034dec8, // n0x13be c0x0000 (---------------) + I heritage - 0x0025de08, // n0x13bf c0x0000 (---------------) + I histoire - 0x002a794a, // n0x13c0 c0x0000 (---------------) + I historical - 0x002a7951, // n0x13c1 c0x0000 (---------------) + I historicalsociety - 0x0028cfce, // n0x13c2 c0x0000 (---------------) + I historichouses - 0x0024268a, // n0x13c3 c0x0000 (---------------) + I historisch - 0x0024268c, // n0x13c4 c0x0000 (---------------) + I historisches - 0x002238c7, // n0x13c5 c0x0000 (---------------) + I history - 0x002238d0, // n0x13c6 c0x0000 (---------------) + I historyofscience - 0x0038f308, // n0x13c7 c0x0000 (---------------) + I horology - 0x0021da05, // n0x13c8 c0x0000 (---------------) + I house - 0x002d8f0a, // n0x13c9 c0x0000 (---------------) + I humanities - 0x00396b4c, // n0x13ca c0x0000 (---------------) + I illustration - 0x003365cd, // n0x13cb c0x0000 (---------------) + I imageandsound - 0x002d5b06, // n0x13cc c0x0000 (---------------) + I indian - 0x002d5b07, // n0x13cd c0x0000 (---------------) + I indiana - 0x002d5b0c, // n0x13ce c0x0000 (---------------) + I indianapolis - 0x00356ecc, // n0x13cf c0x0000 (---------------) + I indianmarket - 0x00238c0c, // n0x13d0 c0x0000 (---------------) + I intelligence - 0x0027d28b, // n0x13d1 c0x0000 (---------------) + I interactive - 0x00273f44, // n0x13d2 c0x0000 (---------------) + I iraq - 0x0021afc4, // n0x13d3 c0x0000 (---------------) + I iron - 0x00357ec9, // n0x13d4 c0x0000 (---------------) + I isleofman - 0x002bc087, // n0x13d5 c0x0000 (---------------) + I jamison - 0x002207c9, // n0x13d6 c0x0000 (---------------) + I jefferson - 0x00337649, // n0x13d7 c0x0000 (---------------) + I jerusalem - 0x0034f487, // n0x13d8 c0x0000 (---------------) + I jewelry - 0x0038cb46, // n0x13d9 c0x0000 (---------------) + I jewish - 0x0038cb49, // n0x13da c0x0000 (---------------) + I jewishart - 0x00297743, // n0x13db c0x0000 (---------------) + I jfk - 0x0028540a, // n0x13dc c0x0000 (---------------) + I journalism - 0x0036e9c7, // n0x13dd c0x0000 (---------------) + I judaica - 0x0035f38b, // n0x13de c0x0000 (---------------) + I judygarland - 0x002eeb4a, // n0x13df c0x0000 (---------------) + I juedisches - 0x00370c84, // n0x13e0 c0x0000 (---------------) + I juif - 0x002df386, // n0x13e1 c0x0000 (---------------) + I karate - 0x002af549, // n0x13e2 c0x0000 (---------------) + I karikatur - 0x00394c44, // n0x13e3 c0x0000 (---------------) + I kids - 0x0033e24a, // n0x13e4 c0x0000 (---------------) + I koebenhavn - 0x0021f385, // n0x13e5 c0x0000 (---------------) + I koeln - 0x002a3845, // n0x13e6 c0x0000 (---------------) + I kunst - 0x002a384d, // n0x13e7 c0x0000 (---------------) + I kunstsammlung - 0x002a3b8e, // n0x13e8 c0x0000 (---------------) + I kunstunddesign - 0x002feec5, // n0x13e9 c0x0000 (---------------) + I labor - 0x0037c986, // n0x13ea c0x0000 (---------------) + I labour - 0x00323a07, // n0x13eb c0x0000 (---------------) + I lajolla - 0x00261a4a, // n0x13ec c0x0000 (---------------) + I lancashire - 0x0035b146, // n0x13ed c0x0000 (---------------) + I landes - 0x002856c4, // n0x13ee c0x0000 (---------------) + I lans - 0x002d0287, // n0x13ef c0x0000 (---------------) + I larsson - 0x0029eacb, // n0x13f0 c0x0000 (---------------) + I lewismiller - 0x00251e07, // n0x13f1 c0x0000 (---------------) + I lincoln - 0x00329ac4, // n0x13f2 c0x0000 (---------------) + I linz - 0x002a1d46, // n0x13f3 c0x0000 (---------------) + I living - 0x002a1d4d, // n0x13f4 c0x0000 (---------------) + I livinghistory - 0x0032254c, // n0x13f5 c0x0000 (---------------) + I localhistory - 0x00340906, // n0x13f6 c0x0000 (---------------) + I london - 0x002a4f4a, // n0x13f7 c0x0000 (---------------) + I losangeles - 0x002116c6, // n0x13f8 c0x0000 (---------------) + I louvre - 0x00259d88, // n0x13f9 c0x0000 (---------------) + I loyalist - 0x0021d747, // n0x13fa c0x0000 (---------------) + I lucerne - 0x00222d8a, // n0x13fb c0x0000 (---------------) + I luxembourg - 0x00226c86, // n0x13fc c0x0000 (---------------) + I luzern - 0x0026b0c3, // n0x13fd c0x0000 (---------------) + I mad - 0x00300a86, // n0x13fe c0x0000 (---------------) + I madrid - 0x0026aa08, // n0x13ff c0x0000 (---------------) + I mallorca - 0x0028608a, // n0x1400 c0x0000 (---------------) + I manchester - 0x00266747, // n0x1401 c0x0000 (---------------) + I mansion - 0x00266748, // n0x1402 c0x0000 (---------------) + I mansions - 0x0026d784, // n0x1403 c0x0000 (---------------) + I manx - 0x00277287, // n0x1404 c0x0000 (---------------) + I marburg - 0x0036ee48, // n0x1405 c0x0000 (---------------) + I maritime - 0x00237048, // n0x1406 c0x0000 (---------------) + I maritimo - 0x00256588, // n0x1407 c0x0000 (---------------) + I maryland - 0x003372ca, // n0x1408 c0x0000 (---------------) + I marylhurst - 0x002dc385, // n0x1409 c0x0000 (---------------) + I media - 0x002e7087, // n0x140a c0x0000 (---------------) + I medical - 0x002424d3, // n0x140b c0x0000 (---------------) + I medizinhistorisches - 0x00257946, // n0x140c c0x0000 (---------------) + I meeres - 0x002edac8, // n0x140d c0x0000 (---------------) + I memorial - 0x00219509, // n0x140e c0x0000 (---------------) + I mesaverde - 0x00204988, // n0x140f c0x0000 (---------------) + I michigan - 0x002892cb, // n0x1410 c0x0000 (---------------) + I midatlantic - 0x002a6948, // n0x1411 c0x0000 (---------------) + I military - 0x0029ec04, // n0x1412 c0x0000 (---------------) + I mill - 0x002878c6, // n0x1413 c0x0000 (---------------) + I miners - 0x002e7a46, // n0x1414 c0x0000 (---------------) + I mining - 0x00335b09, // n0x1415 c0x0000 (---------------) + I minnesota - 0x002ad807, // n0x1416 c0x0000 (---------------) + I missile - 0x002458c8, // n0x1417 c0x0000 (---------------) + I missoula - 0x00291a06, // n0x1418 c0x0000 (---------------) + I modern - 0x0021cfc4, // n0x1419 c0x0000 (---------------) + I moma - 0x002b6185, // n0x141a c0x0000 (---------------) + I money - 0x002b02c8, // n0x141b c0x0000 (---------------) + I monmouth - 0x002b094a, // n0x141c c0x0000 (---------------) + I monticello - 0x002b1648, // n0x141d c0x0000 (---------------) + I montreal - 0x002b68c6, // n0x141e c0x0000 (---------------) + I moscow - 0x0028678a, // n0x141f c0x0000 (---------------) + I motorcycle - 0x002f3cc8, // n0x1420 c0x0000 (---------------) + I muenchen - 0x002b9948, // n0x1421 c0x0000 (---------------) + I muenster - 0x002ba948, // n0x1422 c0x0000 (---------------) + I mulhouse - 0x002bb346, // n0x1423 c0x0000 (---------------) + I muncie - 0x002bd186, // n0x1424 c0x0000 (---------------) + I museet - 0x0030e7cc, // n0x1425 c0x0000 (---------------) + I museumcenter - 0x002bd650, // n0x1426 c0x0000 (---------------) + I museumvereniging - 0x00337b85, // n0x1427 c0x0000 (---------------) + I music - 0x002dd9c8, // n0x1428 c0x0000 (---------------) + I national - 0x002dd9d0, // n0x1429 c0x0000 (---------------) + I nationalfirearms - 0x0034dcd0, // n0x142a c0x0000 (---------------) + I nationalheritage - 0x0027564e, // n0x142b c0x0000 (---------------) + I nativeamerican - 0x0030e44e, // n0x142c c0x0000 (---------------) + I naturalhistory - 0x0030e454, // n0x142d c0x0000 (---------------) + I naturalhistorymuseum - 0x00240dcf, // n0x142e c0x0000 (---------------) + I naturalsciences - 0x00241186, // n0x142f c0x0000 (---------------) + I nature - 0x002f4951, // n0x1430 c0x0000 (---------------) + I naturhistorisches - 0x0031cfd3, // n0x1431 c0x0000 (---------------) + I natuurwetenschappen - 0x0031d448, // n0x1432 c0x0000 (---------------) + I naumburg - 0x00341c05, // n0x1433 c0x0000 (---------------) + I naval - 0x00262448, // n0x1434 c0x0000 (---------------) + I nebraska - 0x0021d585, // n0x1435 c0x0000 (---------------) + I neues - 0x002e60cc, // n0x1436 c0x0000 (---------------) + I newhampshire - 0x00221609, // n0x1437 c0x0000 (---------------) + I newjersey - 0x00231f49, // n0x1438 c0x0000 (---------------) + I newmexico - 0x0021a387, // n0x1439 c0x0000 (---------------) + I newport - 0x00366d49, // n0x143a c0x0000 (---------------) + I newspaper - 0x00237f07, // n0x143b c0x0000 (---------------) + I newyork - 0x00203d46, // n0x143c c0x0000 (---------------) + I niepce - 0x003626c7, // n0x143d c0x0000 (---------------) + I norfolk - 0x002f0dc5, // n0x143e c0x0000 (---------------) + I north - 0x00345903, // n0x143f c0x0000 (---------------) + I nrw - 0x0034d889, // n0x1440 c0x0000 (---------------) + I nuernberg - 0x002e9309, // n0x1441 c0x0000 (---------------) + I nuremberg - 0x00223403, // n0x1442 c0x0000 (---------------) + I nyc - 0x002108c4, // n0x1443 c0x0000 (---------------) + I nyny - 0x0034100d, // n0x1444 c0x0000 (---------------) + I oceanographic - 0x0034384f, // n0x1445 c0x0000 (---------------) + I oceanographique - 0x002e3085, // n0x1446 c0x0000 (---------------) + I omaha - 0x003023c6, // n0x1447 c0x0000 (---------------) + I online - 0x0032a587, // n0x1448 c0x0000 (---------------) + I ontario - 0x0032ce07, // n0x1449 c0x0000 (---------------) + I openair - 0x00276b86, // n0x144a c0x0000 (---------------) + I oregon - 0x00276b8b, // n0x144b c0x0000 (---------------) + I oregontrail - 0x0028e6c5, // n0x144c c0x0000 (---------------) + I otago - 0x00364046, // n0x144d c0x0000 (---------------) + I oxford - 0x0031ba07, // n0x144e c0x0000 (---------------) + I pacific - 0x0025d709, // n0x144f c0x0000 (---------------) + I paderborn - 0x0036ce06, // n0x1450 c0x0000 (---------------) + I palace - 0x002052c5, // n0x1451 c0x0000 (---------------) + I paleo - 0x00324b4b, // n0x1452 c0x0000 (---------------) + I palmsprings - 0x00221d86, // n0x1453 c0x0000 (---------------) + I panama - 0x0025b445, // n0x1454 c0x0000 (---------------) + I paris - 0x002a3348, // n0x1455 c0x0000 (---------------) + I pasadena - 0x002dc948, // n0x1456 c0x0000 (---------------) + I pharmacy - 0x0036150c, // n0x1457 c0x0000 (---------------) + I philadelphia - 0x00361510, // n0x1458 c0x0000 (---------------) + I philadelphiaarea - 0x002bf909, // n0x1459 c0x0000 (---------------) + I philately - 0x002bfd47, // n0x145a c0x0000 (---------------) + I phoenix - 0x002c014b, // n0x145b c0x0000 (---------------) + I photography - 0x002c1506, // n0x145c c0x0000 (---------------) + I pilots - 0x002c2e8a, // n0x145d c0x0000 (---------------) + I pittsburgh - 0x002c438b, // n0x145e c0x0000 (---------------) + I planetarium - 0x002c4bca, // n0x145f c0x0000 (---------------) + I plantation - 0x002c4e46, // n0x1460 c0x0000 (---------------) + I plants - 0x002c6485, // n0x1461 c0x0000 (---------------) + I plaza - 0x0036e706, // n0x1462 c0x0000 (---------------) + I portal - 0x00266f08, // n0x1463 c0x0000 (---------------) + I portland - 0x0021a44a, // n0x1464 c0x0000 (---------------) + I portlligat - 0x002b31dc, // n0x1465 c0x0000 (---------------) + I posts-and-telecommunications - 0x002ca84c, // n0x1466 c0x0000 (---------------) + I preservation - 0x002cab48, // n0x1467 c0x0000 (---------------) + I presidio - 0x0029abc5, // n0x1468 c0x0000 (---------------) + I press - 0x002cc587, // n0x1469 c0x0000 (---------------) + I project - 0x00296546, // n0x146a c0x0000 (---------------) + I public - 0x0034c905, // n0x146b c0x0000 (---------------) + I pubol - 0x00211186, // n0x146c c0x0000 (---------------) + I quebec - 0x00276d48, // n0x146d c0x0000 (---------------) + I railroad - 0x00253fc7, // n0x146e c0x0000 (---------------) + I railway - 0x00296808, // n0x146f c0x0000 (---------------) + I research - 0x0021c58a, // n0x1470 c0x0000 (---------------) + I resistance - 0x0033cb8c, // n0x1471 c0x0000 (---------------) + I riodejaneiro - 0x0033ce09, // n0x1472 c0x0000 (---------------) + I rochester - 0x00201707, // n0x1473 c0x0000 (---------------) + I rockart - 0x0023fb84, // n0x1474 c0x0000 (---------------) + I roma - 0x0023afc6, // n0x1475 c0x0000 (---------------) + I russia - 0x002c508a, // n0x1476 c0x0000 (---------------) + I saintlouis - 0x00337745, // n0x1477 c0x0000 (---------------) + I salem - 0x0034250c, // n0x1478 c0x0000 (---------------) + I salvadordali - 0x0034ec88, // n0x1479 c0x0000 (---------------) + I salzburg - 0x00270ec8, // n0x147a c0x0000 (---------------) + I sandiego - 0x0023774c, // n0x147b c0x0000 (---------------) + I sanfrancisco - 0x0020bfcc, // n0x147c c0x0000 (---------------) + I santabarbara - 0x0020c3c9, // n0x147d c0x0000 (---------------) + I santacruz - 0x0020c607, // n0x147e c0x0000 (---------------) + I santafe - 0x0035768c, // n0x147f c0x0000 (---------------) + I saskatchewan - 0x002251c4, // n0x1480 c0x0000 (---------------) + I satx - 0x0022de0a, // n0x1481 c0x0000 (---------------) + I savannahga - 0x0020cb8c, // n0x1482 c0x0000 (---------------) + I schlesisches - 0x00354a4b, // n0x1483 c0x0000 (---------------) + I schoenbrunn - 0x0025e7cb, // n0x1484 c0x0000 (---------------) + I schokoladen - 0x00235406, // n0x1485 c0x0000 (---------------) + I school - 0x0023b2c7, // n0x1486 c0x0000 (---------------) + I schweiz - 0x00223b07, // n0x1487 c0x0000 (---------------) + I science - 0x00223b0f, // n0x1488 c0x0000 (---------------) + I science-fiction - 0x002d6251, // n0x1489 c0x0000 (---------------) + I scienceandhistory - 0x0037f9d2, // n0x148a c0x0000 (---------------) + I scienceandindustry - 0x0023ce0d, // n0x148b c0x0000 (---------------) + I sciencecenter - 0x0023ce0e, // n0x148c c0x0000 (---------------) + I sciencecenters - 0x0023d14e, // n0x148d c0x0000 (---------------) + I sciencehistory - 0x00240f88, // n0x148e c0x0000 (---------------) + I sciences - 0x00240f92, // n0x148f c0x0000 (---------------) + I sciencesnaturelles - 0x00237988, // n0x1490 c0x0000 (---------------) + I scotland - 0x002dfc87, // n0x1491 c0x0000 (---------------) + I seaport - 0x0023920a, // n0x1492 c0x0000 (---------------) + I settlement - 0x0020fb88, // n0x1493 c0x0000 (---------------) + I settlers - 0x00257a85, // n0x1494 c0x0000 (---------------) + I shell - 0x0025918a, // n0x1495 c0x0000 (---------------) + I sherbrooke - 0x0037ad47, // n0x1496 c0x0000 (---------------) + I sibenik - 0x0036b904, // n0x1497 c0x0000 (---------------) + I silk - 0x00207b43, // n0x1498 c0x0000 (---------------) + I ski - 0x002e3345, // n0x1499 c0x0000 (---------------) + I skole - 0x002a7bc7, // n0x149a c0x0000 (---------------) + I society - 0x002d84c7, // n0x149b c0x0000 (---------------) + I sologne - 0x003367ce, // n0x149c c0x0000 (---------------) + I soundandvision - 0x0031f30d, // n0x149d c0x0000 (---------------) + I southcarolina - 0x00320d89, // n0x149e c0x0000 (---------------) + I southwest - 0x002101c5, // n0x149f c0x0000 (---------------) + I space - 0x00349a43, // n0x14a0 c0x0000 (---------------) + I spy - 0x00275b86, // n0x14a1 c0x0000 (---------------) + I square - 0x00248205, // n0x14a2 c0x0000 (---------------) + I stadt - 0x0029fb48, // n0x14a3 c0x0000 (---------------) + I stalbans - 0x00232449, // n0x14a4 c0x0000 (---------------) + I starnberg - 0x002b1885, // n0x14a5 c0x0000 (---------------) + I state - 0x00362e0f, // n0x14a6 c0x0000 (---------------) + I stateofdelaware - 0x002c62c7, // n0x14a7 c0x0000 (---------------) + I station - 0x00354105, // n0x14a8 c0x0000 (---------------) + I steam - 0x002f2f8a, // n0x14a9 c0x0000 (---------------) + I steiermark - 0x002a83c6, // n0x14aa c0x0000 (---------------) + I stjohn - 0x00259f09, // n0x14ab c0x0000 (---------------) + I stockholm - 0x002cf98c, // n0x14ac c0x0000 (---------------) + I stpetersburg - 0x002d0749, // n0x14ad c0x0000 (---------------) + I stuttgart - 0x00211e46, // n0x14ae c0x0000 (---------------) + I suisse - 0x002a17cc, // n0x14af c0x0000 (---------------) + I surgeonshall - 0x002d1c86, // n0x14b0 c0x0000 (---------------) + I surrey - 0x002d4988, // n0x14b1 c0x0000 (---------------) + I svizzera - 0x002d4b86, // n0x14b2 c0x0000 (---------------) + I sweden - 0x00368086, // n0x14b3 c0x0000 (---------------) + I sydney - 0x0024ca44, // n0x14b4 c0x0000 (---------------) + I tank - 0x00249043, // n0x14b5 c0x0000 (---------------) + I tcm - 0x0029d58a, // n0x14b6 c0x0000 (---------------) + I technology - 0x002994d1, // n0x14b7 c0x0000 (---------------) + I telekommunikation - 0x00248a4a, // n0x14b8 c0x0000 (---------------) + I television - 0x00209085, // n0x14b9 c0x0000 (---------------) + I texas - 0x00326307, // n0x14ba c0x0000 (---------------) + I textile - 0x002f9147, // n0x14bb c0x0000 (---------------) + I theater - 0x0036ef44, // n0x14bc c0x0000 (---------------) + I time - 0x0036ef4b, // n0x14bd c0x0000 (---------------) + I timekeeping - 0x0035e408, // n0x14be c0x0000 (---------------) + I topology - 0x0029f3c6, // n0x14bf c0x0000 (---------------) + I torino - 0x002e9685, // n0x14c0 c0x0000 (---------------) + I touch - 0x0021abc4, // n0x14c1 c0x0000 (---------------) + I town - 0x0027c9c9, // n0x14c2 c0x0000 (---------------) + I transport - 0x00242e84, // n0x14c3 c0x0000 (---------------) + I tree - 0x00211c47, // n0x14c4 c0x0000 (---------------) + I trolley - 0x00313185, // n0x14c5 c0x0000 (---------------) + I trust - 0x00313187, // n0x14c6 c0x0000 (---------------) + I trustee - 0x002f53c5, // n0x14c7 c0x0000 (---------------) + I uhren - 0x00213f43, // n0x14c8 c0x0000 (---------------) + I ulm - 0x002dfb48, // n0x14c9 c0x0000 (---------------) + I undersea - 0x0029f04a, // n0x14ca c0x0000 (---------------) + I university - 0x00222503, // n0x14cb c0x0000 (---------------) + I usa - 0x0022250a, // n0x14cc c0x0000 (---------------) + I usantiques - 0x0038c1c6, // n0x14cd c0x0000 (---------------) + I usarts - 0x00362b8f, // n0x14ce c0x0000 (---------------) + I uscountryestate - 0x00323609, // n0x14cf c0x0000 (---------------) + I usculture - 0x00255a50, // n0x14d0 c0x0000 (---------------) + I usdecorativearts - 0x002ada08, // n0x14d1 c0x0000 (---------------) + I usgarden - 0x002b7209, // n0x14d2 c0x0000 (---------------) + I ushistory - 0x00282ac7, // n0x14d3 c0x0000 (---------------) + I ushuaia - 0x002a1ccf, // n0x14d4 c0x0000 (---------------) + I uslivinghistory - 0x0026a544, // n0x14d5 c0x0000 (---------------) + I utah - 0x00357a44, // n0x14d6 c0x0000 (---------------) + I uvic - 0x00213d86, // n0x14d7 c0x0000 (---------------) + I valley - 0x002292c6, // n0x14d8 c0x0000 (---------------) + I vantaa - 0x0038deca, // n0x14d9 c0x0000 (---------------) + I versailles - 0x002c7686, // n0x14da c0x0000 (---------------) + I viking - 0x00327d47, // n0x14db c0x0000 (---------------) + I village - 0x002dd148, // n0x14dc c0x0000 (---------------) + I virginia - 0x002dd347, // n0x14dd c0x0000 (---------------) + I virtual - 0x002dd507, // n0x14de c0x0000 (---------------) + I virtuel - 0x00332eca, // n0x14df c0x0000 (---------------) + I vlaanderen - 0x002df98b, // n0x14e0 c0x0000 (---------------) + I volkenkunde - 0x0036cbc5, // n0x14e1 c0x0000 (---------------) + I wales - 0x0037f608, // n0x14e2 c0x0000 (---------------) + I wallonie - 0x00202543, // n0x14e3 c0x0000 (---------------) + I war - 0x0025108c, // n0x14e4 c0x0000 (---------------) + I washingtondc - 0x0020accf, // n0x14e5 c0x0000 (---------------) + I watch-and-clock - 0x0025fe4d, // n0x14e6 c0x0000 (---------------) + I watchandclock - 0x0036d147, // n0x14e7 c0x0000 (---------------) + I western - 0x00320ec9, // n0x14e8 c0x0000 (---------------) + I westfalen - 0x0029b447, // n0x14e9 c0x0000 (---------------) + I whaling - 0x00247748, // n0x14ea c0x0000 (---------------) + I wildlife - 0x00221a4c, // n0x14eb c0x0000 (---------------) + I williamsburg - 0x002a0248, // n0x14ec c0x0000 (---------------) + I windmill - 0x0029b088, // n0x14ed c0x0000 (---------------) + I workshop - 0x002f608e, // n0x14ee c0x0000 (---------------) + I xn--9dbhblg6di - 0x003083d4, // n0x14ef c0x0000 (---------------) + I xn--comunicaes-v6a2o - 0x003088e4, // n0x14f0 c0x0000 (---------------) + I xn--correios-e-telecomunicaes-ghc29a - 0x0032844a, // n0x14f1 c0x0000 (---------------) + I xn--h1aegh - 0x0034760b, // n0x14f2 c0x0000 (---------------) + I xn--lns-qla - 0x00237fc4, // n0x14f3 c0x0000 (---------------) + I york - 0x00237fc9, // n0x14f4 c0x0000 (---------------) + I yorkshire - 0x00297948, // n0x14f5 c0x0000 (---------------) + I yosemite - 0x00235bc5, // n0x14f6 c0x0000 (---------------) + I youth - 0x0038ba0a, // n0x14f7 c0x0000 (---------------) + I zoological - 0x00363207, // n0x14f8 c0x0000 (---------------) + I zoology - 0x002751c4, // n0x14f9 c0x0000 (---------------) + I aero - 0x00310603, // n0x14fa c0x0000 (---------------) + I biz - 0x00222ac3, // n0x14fb c0x0000 (---------------) + I com - 0x00228d44, // n0x14fc c0x0000 (---------------) + I coop - 0x002d75c3, // n0x14fd c0x0000 (---------------) + I edu - 0x0021e283, // n0x14fe c0x0000 (---------------) + I gov - 0x00200304, // n0x14ff c0x0000 (---------------) + I info - 0x00238c03, // n0x1500 c0x0000 (---------------) + I int - 0x0023fa03, // n0x1501 c0x0000 (---------------) + I mil - 0x002bd646, // n0x1502 c0x0000 (---------------) + I museum - 0x00298944, // n0x1503 c0x0000 (---------------) + I name - 0x002170c3, // n0x1504 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1505 c0x0000 (---------------) + I org - 0x00218243, // n0x1506 c0x0000 (---------------) + I pro - 0x00201e82, // n0x1507 c0x0000 (---------------) + I ac - 0x00310603, // n0x1508 c0x0000 (---------------) + I biz - 0x00200742, // n0x1509 c0x0000 (---------------) + I co - 0x00222ac3, // n0x150a c0x0000 (---------------) + I com - 0x00228d44, // n0x150b c0x0000 (---------------) + I coop - 0x002d75c3, // n0x150c c0x0000 (---------------) + I edu - 0x0021e283, // n0x150d c0x0000 (---------------) + I gov - 0x00238c03, // n0x150e c0x0000 (---------------) + I int - 0x002bd646, // n0x150f c0x0000 (---------------) + I museum - 0x002170c3, // n0x1510 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1511 c0x0000 (---------------) + I org - 0x000e4188, // n0x1512 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1513 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1514 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x1515 c0x0000 (---------------) + I gob - 0x002170c3, // n0x1516 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1517 c0x0000 (---------------) + I org - 0x000e4188, // n0x1518 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1519 c0x0000 (---------------) + I com - 0x002d75c3, // n0x151a c0x0000 (---------------) + I edu - 0x0021e283, // n0x151b c0x0000 (---------------) + I gov - 0x0023fa03, // n0x151c c0x0000 (---------------) + I mil - 0x00298944, // n0x151d c0x0000 (---------------) + I name - 0x002170c3, // n0x151e c0x0000 (---------------) + I net - 0x0021dcc3, // n0x151f c0x0000 (---------------) + I org - 0x006ed3c8, // n0x1520 c0x0001 (---------------) ! I teledata - 0x002055c2, // n0x1521 c0x0000 (---------------) + I ca - 0x0021aa82, // n0x1522 c0x0000 (---------------) + I cc - 0x00200742, // n0x1523 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1524 c0x0000 (---------------) + I com - 0x0022fb02, // n0x1525 c0x0000 (---------------) + I dr - 0x00200242, // n0x1526 c0x0000 (---------------) + I in - 0x00200304, // n0x1527 c0x0000 (---------------) + I info - 0x00203604, // n0x1528 c0x0000 (---------------) + I mobi - 0x0020a682, // n0x1529 c0x0000 (---------------) + I mx - 0x00298944, // n0x152a c0x0000 (---------------) + I name - 0x00200c42, // n0x152b c0x0000 (---------------) + I or - 0x0021dcc3, // n0x152c c0x0000 (---------------) + I org - 0x00218243, // n0x152d c0x0000 (---------------) + I pro - 0x00235406, // n0x152e c0x0000 (---------------) + I school - 0x0020bf42, // n0x152f c0x0000 (---------------) + I tv - 0x00209f42, // n0x1530 c0x0000 (---------------) + I us - 0x0020ba82, // n0x1531 c0x0000 (---------------) + I ws - 0x37e19443, // n0x1532 c0x00df (n0x1534-n0x1535) o I her - 0x382238c3, // n0x1533 c0x00e0 (n0x1535-n0x1536) o I his - 0x000439c6, // n0x1534 c0x0000 (---------------) + forgot - 0x000439c6, // n0x1535 c0x0000 (---------------) + forgot - 0x002729c4, // n0x1536 c0x0000 (---------------) + I asso - 0x0010054c, // n0x1537 c0x0000 (---------------) + at-band-camp - 0x0006c90c, // n0x1538 c0x0000 (---------------) + azure-mobile - 0x000aef0d, // n0x1539 c0x0000 (---------------) + azurewebsites - 0x000d0087, // n0x153a c0x0000 (---------------) + blogdns - 0x00017a88, // n0x153b c0x0000 (---------------) + broke-it - 0x0001d90a, // n0x153c c0x0000 (---------------) + buyshouses - 0x38e2a085, // n0x153d c0x00e3 (n0x1568-n0x1569) o I cdn77 - 0x0002a089, // n0x153e c0x0000 (---------------) + cdn77-ssl - 0x00192608, // n0x153f c0x0000 (---------------) + cloudapp - 0x0019058a, // n0x1540 c0x0000 (---------------) + cloudfront - 0x00146fc8, // n0x1541 c0x0000 (---------------) + dnsalias - 0x0006a247, // n0x1542 c0x0000 (---------------) + dnsdojo - 0x0018a587, // n0x1543 c0x0000 (---------------) + does-it - 0x0015fdc9, // n0x1544 c0x0000 (---------------) + dontexist - 0x000007c8, // n0x1545 c0x0000 (---------------) + dynalias - 0x00078989, // n0x1546 c0x0000 (---------------) + dynathome - 0x0009428d, // n0x1547 c0x0000 (---------------) + endofinternet - 0x39287d46, // n0x1548 c0x00e4 (n0x1569-n0x156b) o I fastly - 0x0004dac7, // n0x1549 c0x0000 (---------------) + from-az - 0x0004f247, // n0x154a c0x0000 (---------------) + from-co - 0x00056b87, // n0x154b c0x0000 (---------------) + from-la - 0x0005c687, // n0x154c c0x0000 (---------------) + from-ny - 0x00005a42, // n0x154d c0x0000 (---------------) + gb - 0x00104507, // n0x154e c0x0000 (---------------) + gets-it - 0x0005058c, // n0x154f c0x0000 (---------------) + ham-radio-op - 0x00085007, // n0x1550 c0x0000 (---------------) + homeftp - 0x000909c6, // n0x1551 c0x0000 (---------------) + homeip - 0x00090ec9, // n0x1552 c0x0000 (---------------) + homelinux - 0x00091b88, // n0x1553 c0x0000 (---------------) + homeunix - 0x00017d42, // n0x1554 c0x0000 (---------------) + hu - 0x00000242, // n0x1555 c0x0000 (---------------) + in - 0x0005554b, // n0x1556 c0x0000 (---------------) + in-the-band - 0x00166909, // n0x1557 c0x0000 (---------------) + is-a-chef - 0x00052e49, // n0x1558 c0x0000 (---------------) + is-a-geek - 0x00191648, // n0x1559 c0x0000 (---------------) + isa-geek - 0x000990c2, // n0x155a c0x0000 (---------------) + jp - 0x00183609, // n0x155b c0x0000 (---------------) + kicks-ass - 0x00019c4d, // n0x155c c0x0000 (---------------) + office-on-the - 0x000c7e07, // n0x155d c0x0000 (---------------) + podzone - 0x0004294d, // n0x155e c0x0000 (---------------) + scrapper-site - 0x00002e82, // n0x155f c0x0000 (---------------) + se - 0x00130f46, // n0x1560 c0x0000 (---------------) + selfip - 0x0007efc8, // n0x1561 c0x0000 (---------------) + sells-it - 0x00079088, // n0x1562 c0x0000 (---------------) + servebbs - 0x00161348, // n0x1563 c0x0000 (---------------) + serveftp - 0x0003f688, // n0x1564 c0x0000 (---------------) + thruhere - 0x0000cf02, // n0x1565 c0x0000 (---------------) + uk - 0x00110e86, // n0x1566 c0x0000 (---------------) + webhop - 0x000043c2, // n0x1567 c0x0000 (---------------) + za - 0x00000581, // n0x1568 c0x0000 (---------------) + r - 0x396cbe44, // n0x1569 c0x00e5 (n0x156b-n0x156d) o I prod - 0x39a2a203, // n0x156a c0x00e6 (n0x156d-n0x1570) o I ssl - 0x00000181, // n0x156b c0x0000 (---------------) + a - 0x00189c06, // n0x156c c0x0000 (---------------) + global - 0x00000181, // n0x156d c0x0000 (---------------) + a - 0x00000001, // n0x156e c0x0000 (---------------) + b - 0x00189c06, // n0x156f c0x0000 (---------------) + global - 0x00246584, // n0x1570 c0x0000 (---------------) + I arts - 0x00222ac3, // n0x1571 c0x0000 (---------------) + I com - 0x00238544, // n0x1572 c0x0000 (---------------) + I firm - 0x00200304, // n0x1573 c0x0000 (---------------) + I info - 0x002170c3, // n0x1574 c0x0000 (---------------) + I net - 0x002193c5, // n0x1575 c0x0000 (---------------) + I other - 0x00214943, // n0x1576 c0x0000 (---------------) + I per - 0x002e6343, // n0x1577 c0x0000 (---------------) + I rec - 0x002cf4c5, // n0x1578 c0x0000 (---------------) + I store - 0x00219fc3, // n0x1579 c0x0000 (---------------) + I web - 0x3a622ac3, // n0x157a c0x00e9 (n0x1583-n0x1584) + I com - 0x002d75c3, // n0x157b c0x0000 (---------------) + I edu - 0x0021e283, // n0x157c c0x0000 (---------------) + I gov - 0x0023fa03, // n0x157d c0x0000 (---------------) + I mil - 0x00203604, // n0x157e c0x0000 (---------------) + I mobi - 0x00298944, // n0x157f c0x0000 (---------------) + I name - 0x002170c3, // n0x1580 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1581 c0x0000 (---------------) + I org - 0x00206103, // n0x1582 c0x0000 (---------------) + I sch - 0x000e4188, // n0x1583 c0x0000 (---------------) + blogspot - 0x000e4188, // n0x1584 c0x0000 (---------------) + blogspot - 0x003401c2, // n0x1585 c0x0000 (---------------) + I bv - 0x00000742, // n0x1586 c0x0000 (---------------) + co - 0x3b21b502, // n0x1587 c0x00ec (n0x185d-n0x185e) + I aa - 0x00301488, // n0x1588 c0x0000 (---------------) + I aarborte - 0x0021b986, // n0x1589 c0x0000 (---------------) + I aejrie - 0x002aa946, // n0x158a c0x0000 (---------------) + I afjord - 0x0021b307, // n0x158b c0x0000 (---------------) + I agdenes - 0x3b6076c2, // n0x158c c0x00ed (n0x185e-n0x185f) + I ah - 0x3ba2b548, // n0x158d c0x00ee (n0x185f-n0x1860) o I akershus - 0x0031a9ca, // n0x158e c0x0000 (---------------) + I aknoluokta - 0x0024d548, // n0x158f c0x0000 (---------------) + I akrehamn - 0x00200882, // n0x1590 c0x0000 (---------------) + I al - 0x0036e809, // n0x1591 c0x0000 (---------------) + I alaheadju - 0x0036cc07, // n0x1592 c0x0000 (---------------) + I alesund - 0x0020e486, // n0x1593 c0x0000 (---------------) + I algard - 0x00219749, // n0x1594 c0x0000 (---------------) + I alstahaug - 0x0028ee04, // n0x1595 c0x0000 (---------------) + I alta - 0x002ab3c6, // n0x1596 c0x0000 (---------------) + I alvdal - 0x002aad44, // n0x1597 c0x0000 (---------------) + I amli - 0x0025cb44, // n0x1598 c0x0000 (---------------) + I amot - 0x00245409, // n0x1599 c0x0000 (---------------) + I andasuolo - 0x002ee906, // n0x159a c0x0000 (---------------) + I andebu - 0x0034bfc5, // n0x159b c0x0000 (---------------) + I andoy - 0x00279985, // n0x159c c0x0000 (---------------) + I ardal - 0x002a6dc7, // n0x159d c0x0000 (---------------) + I aremark - 0x00275c47, // n0x159e c0x0000 (---------------) + I arendal - 0x002798c4, // n0x159f c0x0000 (---------------) + I arna - 0x0021b546, // n0x15a0 c0x0000 (---------------) + I aseral - 0x00212605, // n0x15a1 c0x0000 (---------------) + I asker - 0x0027d585, // n0x15a2 c0x0000 (---------------) + I askim - 0x0031d885, // n0x15a3 c0x0000 (---------------) + I askoy - 0x002dbc07, // n0x15a4 c0x0000 (---------------) + I askvoll - 0x00311545, // n0x15a5 c0x0000 (---------------) + I asnes - 0x002f1489, // n0x15a6 c0x0000 (---------------) + I audnedaln - 0x00271305, // n0x15a7 c0x0000 (---------------) + I aukra - 0x002e0084, // n0x15a8 c0x0000 (---------------) + I aure - 0x0035b087, // n0x15a9 c0x0000 (---------------) + I aurland - 0x0036d70e, // n0x15aa c0x0000 (---------------) + I aurskog-holand - 0x003298c9, // n0x15ab c0x0000 (---------------) + I austevoll - 0x002f5049, // n0x15ac c0x0000 (---------------) + I austrheim - 0x0030dc86, // n0x15ad c0x0000 (---------------) + I averoy - 0x00321688, // n0x15ae c0x0000 (---------------) + I badaddja - 0x00329f8b, // n0x15af c0x0000 (---------------) + I bahcavuotna - 0x002a080c, // n0x15b0 c0x0000 (---------------) + I bahccavuotna - 0x00323c86, // n0x15b1 c0x0000 (---------------) + I baidar - 0x00342887, // n0x15b2 c0x0000 (---------------) + I bajddar - 0x0035dbc5, // n0x15b3 c0x0000 (---------------) + I balat - 0x0023d9ca, // n0x15b4 c0x0000 (---------------) + I balestrand - 0x0030b989, // n0x15b5 c0x0000 (---------------) + I ballangen - 0x00268ec9, // n0x15b6 c0x0000 (---------------) + I balsfjord - 0x002c8706, // n0x15b7 c0x0000 (---------------) + I bamble - 0x002d37c5, // n0x15b8 c0x0000 (---------------) + I bardu - 0x002b0545, // n0x15b9 c0x0000 (---------------) + I barum - 0x0031a6c9, // n0x15ba c0x0000 (---------------) + I batsfjord - 0x0035ddcb, // n0x15bb c0x0000 (---------------) + I bearalvahki - 0x00269f06, // n0x15bc c0x0000 (---------------) + I beardu - 0x00319a86, // n0x15bd c0x0000 (---------------) + I beiarn - 0x00204704, // n0x15be c0x0000 (---------------) + I berg - 0x00279f06, // n0x15bf c0x0000 (---------------) + I bergen - 0x00343e08, // n0x15c0 c0x0000 (---------------) + I berlevag - 0x00389486, // n0x15c1 c0x0000 (---------------) + I bievat - 0x00219046, // n0x15c2 c0x0000 (---------------) + I bindal - 0x00200f48, // n0x15c3 c0x0000 (---------------) + I birkenes - 0x00202647, // n0x15c4 c0x0000 (---------------) + I bjarkoy - 0x002033c9, // n0x15c5 c0x0000 (---------------) + I bjerkreim - 0x00205005, // n0x15c6 c0x0000 (---------------) + I bjugn - 0x000e4188, // n0x15c7 c0x0000 (---------------) + blogspot - 0x0038a504, // n0x15c8 c0x0000 (---------------) + I bodo - 0x0029bf44, // n0x15c9 c0x0000 (---------------) + I bokn - 0x0020aac5, // n0x15ca c0x0000 (---------------) + I bomlo - 0x0037dc49, // n0x15cb c0x0000 (---------------) + I bremanger - 0x00218ac7, // n0x15cc c0x0000 (---------------) + I bronnoy - 0x00218acb, // n0x15cd c0x0000 (---------------) + I bronnoysund - 0x0021a7ca, // n0x15ce c0x0000 (---------------) + I brumunddal - 0x0021d4c5, // n0x15cf c0x0000 (---------------) + I bryne - 0x3be0a582, // n0x15d0 c0x00ef (n0x1860-n0x1861) + I bu - 0x002eea07, // n0x15d1 c0x0000 (---------------) + I budejju - 0x3c318ec8, // n0x15d2 c0x00f0 (n0x1861-n0x1862) o I buskerud - 0x00251987, // n0x15d3 c0x0000 (---------------) + I bygland - 0x0025f245, // n0x15d4 c0x0000 (---------------) + I bykle - 0x0032234a, // n0x15d5 c0x0000 (---------------) + I cahcesuolo - 0x00000742, // n0x15d6 c0x0000 (---------------) + co - 0x0024fd0b, // n0x15d7 c0x0000 (---------------) + I davvenjarga - 0x0024eb4a, // n0x15d8 c0x0000 (---------------) + I davvesiida - 0x002e9206, // n0x15d9 c0x0000 (---------------) + I deatnu - 0x002b8f83, // n0x15da c0x0000 (---------------) + I dep - 0x0023404d, // n0x15db c0x0000 (---------------) + I dielddanuorri - 0x0023e18c, // n0x15dc c0x0000 (---------------) + I divtasvuodna - 0x002690cd, // n0x15dd c0x0000 (---------------) + I divttasvuotna - 0x002f8b05, // n0x15de c0x0000 (---------------) + I donna - 0x002396c5, // n0x15df c0x0000 (---------------) + I dovre - 0x0034d707, // n0x15e0 c0x0000 (---------------) + I drammen - 0x002edfc9, // n0x15e1 c0x0000 (---------------) + I drangedal - 0x0031a8c6, // n0x15e2 c0x0000 (---------------) + I drobak - 0x002c7505, // n0x15e3 c0x0000 (---------------) + I dyroy - 0x0021e888, // n0x15e4 c0x0000 (---------------) + I egersund - 0x00262743, // n0x15e5 c0x0000 (---------------) + I eid - 0x002ec4c8, // n0x15e6 c0x0000 (---------------) + I eidfjord - 0x00279e08, // n0x15e7 c0x0000 (---------------) + I eidsberg - 0x002ac2c7, // n0x15e8 c0x0000 (---------------) + I eidskog - 0x00262748, // n0x15e9 c0x0000 (---------------) + I eidsvoll - 0x00383049, // n0x15ea c0x0000 (---------------) + I eigersund - 0x00227ec7, // n0x15eb c0x0000 (---------------) + I elverum - 0x00300e87, // n0x15ec c0x0000 (---------------) + I enebakk - 0x002674c8, // n0x15ed c0x0000 (---------------) + I engerdal - 0x002569c4, // n0x15ee c0x0000 (---------------) + I etne - 0x002569c7, // n0x15ef c0x0000 (---------------) + I etnedal - 0x0037ab48, // n0x15f0 c0x0000 (---------------) + I evenassi - 0x0030a446, // n0x15f1 c0x0000 (---------------) + I evenes - 0x00201f0f, // n0x15f2 c0x0000 (---------------) + I evje-og-hornnes - 0x00345a07, // n0x15f3 c0x0000 (---------------) + I farsund - 0x002c3146, // n0x15f4 c0x0000 (---------------) + I fauske - 0x0020c745, // n0x15f5 c0x0000 (---------------) + I fedje - 0x00234803, // n0x15f6 c0x0000 (---------------) + I fet - 0x00324187, // n0x15f7 c0x0000 (---------------) + I fetsund - 0x00235ec3, // n0x15f8 c0x0000 (---------------) + I fhs - 0x002365c6, // n0x15f9 c0x0000 (---------------) + I finnoy - 0x00238f06, // n0x15fa c0x0000 (---------------) + I fitjar - 0x00239986, // n0x15fb c0x0000 (---------------) + I fjaler - 0x0027e245, // n0x15fc c0x0000 (---------------) + I fjell - 0x00252b83, // n0x15fd c0x0000 (---------------) + I fla - 0x0035be08, // n0x15fe c0x0000 (---------------) + I flakstad - 0x00353389, // n0x15ff c0x0000 (---------------) + I flatanger - 0x0036500b, // n0x1600 c0x0000 (---------------) + I flekkefjord - 0x00239b08, // n0x1601 c0x0000 (---------------) + I flesberg - 0x0023c105, // n0x1602 c0x0000 (---------------) + I flora - 0x0023d4c5, // n0x1603 c0x0000 (---------------) + I floro - 0x3c758002, // n0x1604 c0x00f1 (n0x1862-n0x1863) + I fm - 0x00362789, // n0x1605 c0x0000 (---------------) + I folkebibl - 0x00241787, // n0x1606 c0x0000 (---------------) + I folldal - 0x003640c5, // n0x1607 c0x0000 (---------------) + I forde - 0x00245307, // n0x1608 c0x0000 (---------------) + I forsand - 0x00247586, // n0x1609 c0x0000 (---------------) + I fosnes - 0x0034af05, // n0x160a c0x0000 (---------------) + I frana - 0x0024804b, // n0x160b c0x0000 (---------------) + I fredrikstad - 0x00248cc4, // n0x160c c0x0000 (---------------) + I frei - 0x0024d105, // n0x160d c0x0000 (---------------) + I frogn - 0x0024d247, // n0x160e c0x0000 (---------------) + I froland - 0x00263e06, // n0x160f c0x0000 (---------------) + I frosta - 0x00264245, // n0x1610 c0x0000 (---------------) + I froya - 0x0026fe07, // n0x1611 c0x0000 (---------------) + I fuoisku - 0x00270587, // n0x1612 c0x0000 (---------------) + I fuossko - 0x002a7504, // n0x1613 c0x0000 (---------------) + I fusa - 0x0027798a, // n0x1614 c0x0000 (---------------) + I fylkesbibl - 0x00277e48, // n0x1615 c0x0000 (---------------) + I fyresdal - 0x0035ea49, // n0x1616 c0x0000 (---------------) + I gaivuotna - 0x00215b85, // n0x1617 c0x0000 (---------------) + I galsa - 0x0024ff46, // n0x1618 c0x0000 (---------------) + I gamvik - 0x00343fca, // n0x1619 c0x0000 (---------------) + I gangaviika - 0x003442c6, // n0x161a c0x0000 (---------------) + I gaular - 0x002542c7, // n0x161b c0x0000 (---------------) + I gausdal - 0x0035e70d, // n0x161c c0x0000 (---------------) + I giehtavuoatna - 0x00220049, // n0x161d c0x0000 (---------------) + I gildeskal - 0x00347945, // n0x161e c0x0000 (---------------) + I giske - 0x0030ee07, // n0x161f c0x0000 (---------------) + I gjemnes - 0x002ed908, // n0x1620 c0x0000 (---------------) + I gjerdrum - 0x0031c188, // n0x1621 c0x0000 (---------------) + I gjerstad - 0x0031d607, // n0x1622 c0x0000 (---------------) + I gjesdal - 0x003446c6, // n0x1623 c0x0000 (---------------) + I gjovik - 0x00395287, // n0x1624 c0x0000 (---------------) + I gloppen - 0x00238a83, // n0x1625 c0x0000 (---------------) + I gol - 0x00320b04, // n0x1626 c0x0000 (---------------) + I gran - 0x00348cc5, // n0x1627 c0x0000 (---------------) + I grane - 0x00376107, // n0x1628 c0x0000 (---------------) + I granvin - 0x00379f89, // n0x1629 c0x0000 (---------------) + I gratangen - 0x002136c8, // n0x162a c0x0000 (---------------) + I grimstad - 0x002c77c5, // n0x162b c0x0000 (---------------) + I grong - 0x00222fc4, // n0x162c c0x0000 (---------------) + I grue - 0x00331485, // n0x162d c0x0000 (---------------) + I gulen - 0x002373cd, // n0x162e c0x0000 (---------------) + I guovdageaidnu - 0x00202dc2, // n0x162f c0x0000 (---------------) + I ha - 0x00289a46, // n0x1630 c0x0000 (---------------) + I habmer - 0x00330e86, // n0x1631 c0x0000 (---------------) + I hadsel - 0x002f5e0a, // n0x1632 c0x0000 (---------------) + I hagebostad - 0x0035b7c6, // n0x1633 c0x0000 (---------------) + I halden - 0x00363605, // n0x1634 c0x0000 (---------------) + I halsa - 0x0036e045, // n0x1635 c0x0000 (---------------) + I hamar - 0x0036e047, // n0x1636 c0x0000 (---------------) + I hamaroy - 0x0036794c, // n0x1637 c0x0000 (---------------) + I hammarfeasta - 0x002ef38a, // n0x1638 c0x0000 (---------------) + I hammerfest - 0x002796c6, // n0x1639 c0x0000 (---------------) + I hapmir - 0x002ae105, // n0x163a c0x0000 (---------------) + I haram - 0x00279d46, // n0x163b c0x0000 (---------------) + I hareid - 0x0027a087, // n0x163c c0x0000 (---------------) + I harstad - 0x0027b486, // n0x163d c0x0000 (---------------) + I hasvik - 0x0027e14c, // n0x163e c0x0000 (---------------) + I hattfjelldal - 0x00219889, // n0x163f c0x0000 (---------------) + I haugesund - 0x3ca9bc07, // n0x1640 c0x00f2 (n0x1863-n0x1866) o I hedmark - 0x0027f885, // n0x1641 c0x0000 (---------------) + I hemne - 0x0027f886, // n0x1642 c0x0000 (---------------) + I hemnes - 0x0027fc88, // n0x1643 c0x0000 (---------------) + I hemsedal - 0x0022db45, // n0x1644 c0x0000 (---------------) + I herad - 0x0028fd85, // n0x1645 c0x0000 (---------------) + I hitra - 0x0028ffc8, // n0x1646 c0x0000 (---------------) + I hjartdal - 0x002901ca, // n0x1647 c0x0000 (---------------) + I hjelmeland - 0x3ce0cc02, // n0x1648 c0x00f3 (n0x1866-n0x1867) + I hl - 0x3d206182, // n0x1649 c0x00f4 (n0x1867-n0x1868) + I hm - 0x002536c5, // n0x164a c0x0000 (---------------) + I hobol - 0x0029a803, // n0x164b c0x0000 (---------------) + I hof - 0x002c7348, // n0x164c c0x0000 (---------------) + I hokksund - 0x002351c3, // n0x164d c0x0000 (---------------) + I hol - 0x00290444, // n0x164e c0x0000 (---------------) + I hole - 0x0025a04b, // n0x164f c0x0000 (---------------) + I holmestrand - 0x00271dc8, // n0x1650 c0x0000 (---------------) + I holtalen - 0x00292148, // n0x1651 c0x0000 (---------------) + I honefoss - 0x3d6f84c9, // n0x1652 c0x00f5 (n0x1868-n0x1869) o I hordaland - 0x002939c9, // n0x1653 c0x0000 (---------------) + I hornindal - 0x00294186, // n0x1654 c0x0000 (---------------) + I horten - 0x00295188, // n0x1655 c0x0000 (---------------) + I hoyanger - 0x00295389, // n0x1656 c0x0000 (---------------) + I hoylandet - 0x00296046, // n0x1657 c0x0000 (---------------) + I hurdal - 0x002961c5, // n0x1658 c0x0000 (---------------) + I hurum - 0x003512c6, // n0x1659 c0x0000 (---------------) + I hvaler - 0x0036b589, // n0x165a c0x0000 (---------------) + I hyllestad - 0x0030a287, // n0x165b c0x0000 (---------------) + I ibestad - 0x00247d86, // n0x165c c0x0000 (---------------) + I idrett - 0x002f3407, // n0x165d c0x0000 (---------------) + I inderoy - 0x00304b07, // n0x165e c0x0000 (---------------) + I iveland - 0x0025f644, // n0x165f c0x0000 (---------------) + I ivgu - 0x3da14c09, // n0x1660 c0x00f6 (n0x1869-n0x186a) + I jan-mayen - 0x002b4408, // n0x1661 c0x0000 (---------------) + I jessheim - 0x00345148, // n0x1662 c0x0000 (---------------) + I jevnaker - 0x002326c7, // n0x1663 c0x0000 (---------------) + I jolster - 0x002afb86, // n0x1664 c0x0000 (---------------) + I jondal - 0x0038a009, // n0x1665 c0x0000 (---------------) + I jorpeland - 0x002ab887, // n0x1666 c0x0000 (---------------) + I kafjord - 0x0022e84a, // n0x1667 c0x0000 (---------------) + I karasjohka - 0x002d8848, // n0x1668 c0x0000 (---------------) + I karasjok - 0x0023eb87, // n0x1669 c0x0000 (---------------) + I karlsoy - 0x00305646, // n0x166a c0x0000 (---------------) + I karmoy - 0x002eaa8a, // n0x166b c0x0000 (---------------) + I kautokeino - 0x0023cc48, // n0x166c c0x0000 (---------------) + I kirkenes - 0x0025ef45, // n0x166d c0x0000 (---------------) + I klabu - 0x0021cd85, // n0x166e c0x0000 (---------------) + I klepp - 0x002ac947, // n0x166f c0x0000 (---------------) + I kommune - 0x002b7dc9, // n0x1670 c0x0000 (---------------) + I kongsberg - 0x002b814b, // n0x1671 c0x0000 (---------------) + I kongsvinger - 0x002c83c8, // n0x1672 c0x0000 (---------------) + I kopervik - 0x00271389, // n0x1673 c0x0000 (---------------) + I kraanghke - 0x0023a407, // n0x1674 c0x0000 (---------------) + I kragero - 0x0029db0c, // n0x1675 c0x0000 (---------------) + I kristiansand - 0x0029df8c, // n0x1676 c0x0000 (---------------) + I kristiansund - 0x0029e28a, // n0x1677 c0x0000 (---------------) + I krodsherad - 0x0029e50c, // n0x1678 c0x0000 (---------------) + I krokstadelva - 0x002aa8c8, // n0x1679 c0x0000 (---------------) + I kvafjord - 0x002aaac8, // n0x167a c0x0000 (---------------) + I kvalsund - 0x002aacc4, // n0x167b c0x0000 (---------------) + I kvam - 0x002aba49, // n0x167c c0x0000 (---------------) + I kvanangen - 0x002abc89, // n0x167d c0x0000 (---------------) + I kvinesdal - 0x002abeca, // n0x167e c0x0000 (---------------) + I kvinnherad - 0x002ac149, // n0x167f c0x0000 (---------------) + I kviteseid - 0x002ac487, // n0x1680 c0x0000 (---------------) + I kvitsoy - 0x00381bcc, // n0x1681 c0x0000 (---------------) + I laakesvuemie - 0x00207686, // n0x1682 c0x0000 (---------------) + I lahppi - 0x00256cc8, // n0x1683 c0x0000 (---------------) + I langevag - 0x00344386, // n0x1684 c0x0000 (---------------) + I lardal - 0x002d7a86, // n0x1685 c0x0000 (---------------) + I larvik - 0x00347847, // n0x1686 c0x0000 (---------------) + I lavagis - 0x00358888, // n0x1687 c0x0000 (---------------) + I lavangen - 0x002f020b, // n0x1688 c0x0000 (---------------) + I leangaviika - 0x00251847, // n0x1689 c0x0000 (---------------) + I lebesby - 0x00227989, // n0x168a c0x0000 (---------------) + I leikanger - 0x002386c9, // n0x168b c0x0000 (---------------) + I leirfjord - 0x00244b87, // n0x168c c0x0000 (---------------) + I leirvik - 0x00203c44, // n0x168d c0x0000 (---------------) + I leka - 0x0034b3c7, // n0x168e c0x0000 (---------------) + I leksvik - 0x00364686, // n0x168f c0x0000 (---------------) + I lenvik - 0x00364246, // n0x1690 c0x0000 (---------------) + I lerdal - 0x002a5105, // n0x1691 c0x0000 (---------------) + I lesja - 0x00326448, // n0x1692 c0x0000 (---------------) + I levanger - 0x002a6004, // n0x1693 c0x0000 (---------------) + I lier - 0x002a6006, // n0x1694 c0x0000 (---------------) + I lierne - 0x002ef24b, // n0x1695 c0x0000 (---------------) + I lillehammer - 0x00270d89, // n0x1696 c0x0000 (---------------) + I lillesand - 0x0031d786, // n0x1697 c0x0000 (---------------) + I lindas - 0x0031dc09, // n0x1698 c0x0000 (---------------) + I lindesnes - 0x002dbd86, // n0x1699 c0x0000 (---------------) + I loabat - 0x002455c8, // n0x169a c0x0000 (---------------) + I lodingen - 0x00260a43, // n0x169b c0x0000 (---------------) + I lom - 0x0031b945, // n0x169c c0x0000 (---------------) + I loppa - 0x003444c9, // n0x169d c0x0000 (---------------) + I lorenskog - 0x0034d145, // n0x169e c0x0000 (---------------) + I loten - 0x002d8b84, // n0x169f c0x0000 (---------------) + I lund - 0x00263646, // n0x16a0 c0x0000 (---------------) + I lunner - 0x0029cb85, // n0x16a1 c0x0000 (---------------) + I luroy - 0x002c7bc6, // n0x16a2 c0x0000 (---------------) + I luster - 0x002e1c87, // n0x16a3 c0x0000 (---------------) + I lyngdal - 0x0029c206, // n0x16a4 c0x0000 (---------------) + I lyngen - 0x0028448b, // n0x16a5 c0x0000 (---------------) + I malatvuopmi - 0x0034ce07, // n0x16a6 c0x0000 (---------------) + I malselv - 0x00307d86, // n0x16a7 c0x0000 (---------------) + I malvik - 0x00358046, // n0x16a8 c0x0000 (---------------) + I mandal - 0x002a6e86, // n0x16a9 c0x0000 (---------------) + I marker - 0x00279889, // n0x16aa c0x0000 (---------------) + I marnardal - 0x003419ca, // n0x16ab c0x0000 (---------------) + I masfjorden - 0x00314445, // n0x16ac c0x0000 (---------------) + I masoy - 0x0020f58d, // n0x16ad c0x0000 (---------------) + I matta-varjjat - 0x002902c6, // n0x16ae c0x0000 (---------------) + I meland - 0x002d8246, // n0x16af c0x0000 (---------------) + I meldal - 0x002a1bc6, // n0x16b0 c0x0000 (---------------) + I melhus - 0x00259d05, // n0x16b1 c0x0000 (---------------) + I meloy - 0x0022b487, // n0x16b2 c0x0000 (---------------) + I meraker - 0x002886c7, // n0x16b3 c0x0000 (---------------) + I midsund - 0x002061ce, // n0x16b4 c0x0000 (---------------) + I midtre-gauldal - 0x0023fa03, // n0x16b5 c0x0000 (---------------) + I mil - 0x002afb49, // n0x16b6 c0x0000 (---------------) + I mjondalen - 0x002f3689, // n0x16b7 c0x0000 (---------------) + I mo-i-rana - 0x0023ddc7, // n0x16b8 c0x0000 (---------------) + I moareke - 0x00208487, // n0x16b9 c0x0000 (---------------) + I modalen - 0x003120c5, // n0x16ba c0x0000 (---------------) + I modum - 0x0029f845, // n0x16bb c0x0000 (---------------) + I molde - 0x3de70a0f, // n0x16bc c0x00f7 (n0x186a-n0x186c) o I more-og-romsdal - 0x002b7447, // n0x16bd c0x0000 (---------------) + I mosjoen - 0x002b7608, // n0x16be c0x0000 (---------------) + I moskenes - 0x002b7b44, // n0x16bf c0x0000 (---------------) + I moss - 0x002b8006, // n0x16c0 c0x0000 (---------------) + I mosvik - 0x3e2dcb42, // n0x16c1 c0x00f8 (n0x186c-n0x186d) + I mr - 0x002bb5c6, // n0x16c2 c0x0000 (---------------) + I muosat - 0x002bd646, // n0x16c3 c0x0000 (---------------) + I museum - 0x002f054e, // n0x16c4 c0x0000 (---------------) + I naamesjevuemie - 0x002ec30a, // n0x16c5 c0x0000 (---------------) + I namdalseid - 0x0021c1c6, // n0x16c6 c0x0000 (---------------) + I namsos - 0x00232b4a, // n0x16c7 c0x0000 (---------------) + I namsskogan - 0x002b2489, // n0x16c8 c0x0000 (---------------) + I nannestad - 0x002ff685, // n0x16c9 c0x0000 (---------------) + I naroy - 0x0037c388, // n0x16ca c0x0000 (---------------) + I narviika - 0x00393206, // n0x16cb c0x0000 (---------------) + I narvik - 0x0031e108, // n0x16cc c0x0000 (---------------) + I naustdal - 0x00354f08, // n0x16cd c0x0000 (---------------) + I navuotna - 0x00395acb, // n0x16ce c0x0000 (---------------) + I nedre-eiker - 0x0021b405, // n0x16cf c0x0000 (---------------) + I nesna - 0x003115c8, // n0x16d0 c0x0000 (---------------) + I nesodden - 0x0020108c, // n0x16d1 c0x0000 (---------------) + I nesoddtangen - 0x0025f107, // n0x16d2 c0x0000 (---------------) + I nesseby - 0x00239146, // n0x16d3 c0x0000 (---------------) + I nesset - 0x002e6588, // n0x16d4 c0x0000 (---------------) + I nissedal - 0x002677c8, // n0x16d5 c0x0000 (---------------) + I nittedal - 0x3e636482, // n0x16d6 c0x00f9 (n0x186d-n0x186e) + I nl - 0x002ab18b, // n0x16d7 c0x0000 (---------------) + I nord-aurdal - 0x00200c09, // n0x16d8 c0x0000 (---------------) + I nord-fron - 0x003473c9, // n0x16d9 c0x0000 (---------------) + I nord-odal - 0x0031da87, // n0x16da c0x0000 (---------------) + I norddal - 0x002befc8, // n0x16db c0x0000 (---------------) + I nordkapp - 0x3ea3dfc8, // n0x16dc c0x00fa (n0x186e-n0x1872) o I nordland - 0x002c5f0b, // n0x16dd c0x0000 (---------------) + I nordre-land - 0x003914c9, // n0x16de c0x0000 (---------------) + I nordreisa - 0x002113cd, // n0x16df c0x0000 (---------------) + I nore-og-uvdal - 0x0023fdc8, // n0x16e0 c0x0000 (---------------) + I notodden - 0x00288b08, // n0x16e1 c0x0000 (---------------) + I notteroy - 0x3ee00e02, // n0x16e2 c0x00fb (n0x1872-n0x1873) + I nt - 0x00396f44, // n0x16e3 c0x0000 (---------------) + I odda - 0x3f209982, // n0x16e4 c0x00fc (n0x1873-n0x1874) + I of - 0x002d89c6, // n0x16e5 c0x0000 (---------------) + I oksnes - 0x3f600a02, // n0x16e6 c0x00fd (n0x1874-n0x1875) + I ol - 0x0021d00a, // n0x16e7 c0x0000 (---------------) + I omasvuotna - 0x0029b206, // n0x16e8 c0x0000 (---------------) + I oppdal - 0x00220b88, // n0x16e9 c0x0000 (---------------) + I oppegard - 0x00241b48, // n0x16ea c0x0000 (---------------) + I orkanger - 0x00321986, // n0x16eb c0x0000 (---------------) + I orkdal - 0x0032e206, // n0x16ec c0x0000 (---------------) + I orland - 0x002ce006, // n0x16ed c0x0000 (---------------) + I orskog - 0x0029fac5, // n0x16ee c0x0000 (---------------) + I orsta - 0x0022be04, // n0x16ef c0x0000 (---------------) + I osen - 0x3fab8a04, // n0x16f0 c0x00fe (n0x1875-n0x1876) + I oslo - 0x00207f86, // n0x16f1 c0x0000 (---------------) + I osoyro - 0x002586c7, // n0x16f2 c0x0000 (---------------) + I osteroy - 0x3fed6987, // n0x16f3 c0x00ff (n0x1876-n0x1877) o I ostfold - 0x0020300b, // n0x16f4 c0x0000 (---------------) + I ostre-toten - 0x0036dac9, // n0x16f5 c0x0000 (---------------) + I overhalla - 0x0023970a, // n0x16f6 c0x0000 (---------------) + I ovre-eiker - 0x002f3544, // n0x16f7 c0x0000 (---------------) + I oyer - 0x00300d08, // n0x16f8 c0x0000 (---------------) + I oygarden - 0x00247b4d, // n0x16f9 c0x0000 (---------------) + I oystre-slidre - 0x002c9e89, // n0x16fa c0x0000 (---------------) + I porsanger - 0x002ca0c8, // n0x16fb c0x0000 (---------------) + I porsangu - 0x002ca349, // n0x16fc c0x0000 (---------------) + I porsgrunn - 0x002cba44, // n0x16fd c0x0000 (---------------) + I priv - 0x00212ec4, // n0x16fe c0x0000 (---------------) + I rade - 0x00254d85, // n0x16ff c0x0000 (---------------) + I radoy - 0x0035f14b, // n0x1700 c0x0000 (---------------) + I rahkkeravju - 0x00271d46, // n0x1701 c0x0000 (---------------) + I raholt - 0x002a2305, // n0x1702 c0x0000 (---------------) + I raisa - 0x0032a2c9, // n0x1703 c0x0000 (---------------) + I rakkestad - 0x0021b608, // n0x1704 c0x0000 (---------------) + I ralingen - 0x0025abc4, // n0x1705 c0x0000 (---------------) + I rana - 0x0023db49, // n0x1706 c0x0000 (---------------) + I randaberg - 0x0026a685, // n0x1707 c0x0000 (---------------) + I rauma - 0x00275c88, // n0x1708 c0x0000 (---------------) + I rendalen - 0x0033c507, // n0x1709 c0x0000 (---------------) + I rennebu - 0x002f5448, // n0x170a c0x0000 (---------------) + I rennesoy - 0x002af746, // n0x170b c0x0000 (---------------) + I rindal - 0x003247c7, // n0x170c c0x0000 (---------------) + I ringebu - 0x002a8c49, // n0x170d c0x0000 (---------------) + I ringerike - 0x00324cc9, // n0x170e c0x0000 (---------------) + I ringsaker - 0x0025b4c5, // n0x170f c0x0000 (---------------) + I risor - 0x002346c5, // n0x1710 c0x0000 (---------------) + I rissa - 0x4021d702, // n0x1711 c0x0100 (n0x1877-n0x1878) + I rl - 0x002dfe44, // n0x1712 c0x0000 (---------------) + I roan - 0x0036a305, // n0x1713 c0x0000 (---------------) + I rodoy - 0x0033c1c6, // n0x1714 c0x0000 (---------------) + I rollag - 0x00302a85, // n0x1715 c0x0000 (---------------) + I romsa - 0x0023d587, // n0x1716 c0x0000 (---------------) + I romskog - 0x002e3245, // n0x1717 c0x0000 (---------------) + I roros - 0x00263e44, // n0x1718 c0x0000 (---------------) + I rost - 0x0030dd46, // n0x1719 c0x0000 (---------------) + I royken - 0x002c7587, // n0x171a c0x0000 (---------------) + I royrvik - 0x002dcb86, // n0x171b c0x0000 (---------------) + I ruovat - 0x00268ac5, // n0x171c c0x0000 (---------------) + I rygge - 0x0031ce08, // n0x171d c0x0000 (---------------) + I salangen - 0x0031de05, // n0x171e c0x0000 (---------------) + I salat - 0x00341347, // n0x171f c0x0000 (---------------) + I saltdal - 0x0035b289, // n0x1720 c0x0000 (---------------) + I samnanger - 0x0029dd0a, // n0x1721 c0x0000 (---------------) + I sandefjord - 0x0023bac7, // n0x1722 c0x0000 (---------------) + I sandnes - 0x0023bacc, // n0x1723 c0x0000 (---------------) + I sandnessjoen - 0x0034bf86, // n0x1724 c0x0000 (---------------) + I sandoy - 0x0021db49, // n0x1725 c0x0000 (---------------) + I sarpsborg - 0x0022d7c5, // n0x1726 c0x0000 (---------------) + I sauda - 0x0022da88, // n0x1727 c0x0000 (---------------) + I sauherad - 0x0020a4c3, // n0x1728 c0x0000 (---------------) + I sel - 0x0020a4c5, // n0x1729 c0x0000 (---------------) + I selbu - 0x002fad85, // n0x172a c0x0000 (---------------) + I selje - 0x00245cc7, // n0x172b c0x0000 (---------------) + I seljord - 0x4060f182, // n0x172c c0x0101 (n0x1878-n0x1879) + I sf - 0x0023b647, // n0x172d c0x0000 (---------------) + I siellak - 0x002b79c6, // n0x172e c0x0000 (---------------) + I sigdal - 0x00214b46, // n0x172f c0x0000 (---------------) + I siljan - 0x002c1186, // n0x1730 c0x0000 (---------------) + I sirdal - 0x00267706, // n0x1731 c0x0000 (---------------) + I skanit - 0x00310108, // n0x1732 c0x0000 (---------------) + I skanland - 0x00262585, // n0x1733 c0x0000 (---------------) + I skaun - 0x002c3207, // n0x1734 c0x0000 (---------------) + I skedsmo - 0x002c320d, // n0x1735 c0x0000 (---------------) + I skedsmokorset - 0x00207b43, // n0x1736 c0x0000 (---------------) + I ski - 0x00207b45, // n0x1737 c0x0000 (---------------) + I skien - 0x002f2d47, // n0x1738 c0x0000 (---------------) + I skierva - 0x0036b048, // n0x1739 c0x0000 (---------------) + I skiptvet - 0x0036ac05, // n0x173a c0x0000 (---------------) + I skjak - 0x0030c348, // n0x173b c0x0000 (---------------) + I skjervoy - 0x002206c6, // n0x173c c0x0000 (---------------) + I skodje - 0x0022a247, // n0x173d c0x0000 (---------------) + I slattum - 0x00285605, // n0x173e c0x0000 (---------------) + I smola - 0x0021b486, // n0x173f c0x0000 (---------------) + I snaase - 0x00340405, // n0x1740 c0x0000 (---------------) + I snasa - 0x002aa34a, // n0x1741 c0x0000 (---------------) + I snillfjord - 0x002c4f86, // n0x1742 c0x0000 (---------------) + I snoasa - 0x002141c7, // n0x1743 c0x0000 (---------------) + I sogndal - 0x00308285, // n0x1744 c0x0000 (---------------) + I sogne - 0x002d9347, // n0x1745 c0x0000 (---------------) + I sokndal - 0x002d0204, // n0x1746 c0x0000 (---------------) + I sola - 0x002d8b06, // n0x1747 c0x0000 (---------------) + I solund - 0x002da005, // n0x1748 c0x0000 (---------------) + I somna - 0x002ee70b, // n0x1749 c0x0000 (---------------) + I sondre-land - 0x00364509, // n0x174a c0x0000 (---------------) + I songdalen - 0x0037184a, // n0x174b c0x0000 (---------------) + I sor-aurdal - 0x0025b548, // n0x174c c0x0000 (---------------) + I sor-fron - 0x002e0f48, // n0x174d c0x0000 (---------------) + I sor-odal - 0x002e888c, // n0x174e c0x0000 (---------------) + I sor-varanger - 0x002ec987, // n0x174f c0x0000 (---------------) + I sorfold - 0x00315608, // n0x1750 c0x0000 (---------------) + I sorreisa - 0x0031a288, // n0x1751 c0x0000 (---------------) + I sortland - 0x0031ee45, // n0x1752 c0x0000 (---------------) + I sorum - 0x002ac70a, // n0x1753 c0x0000 (---------------) + I spjelkavik - 0x00349a49, // n0x1754 c0x0000 (---------------) + I spydeberg - 0x40a023c2, // n0x1755 c0x0102 (n0x1879-n0x187a) + I st - 0x00309986, // n0x1756 c0x0000 (---------------) + I stange - 0x0029ca04, // n0x1757 c0x0000 (---------------) + I stat - 0x0029e909, // n0x1758 c0x0000 (---------------) + I stathelle - 0x002c92c9, // n0x1759 c0x0000 (---------------) + I stavanger - 0x002d97c7, // n0x175a c0x0000 (---------------) + I stavern - 0x0025c087, // n0x175b c0x0000 (---------------) + I steigen - 0x003374c9, // n0x175c c0x0000 (---------------) + I steinkjer - 0x00202b88, // n0x175d c0x0000 (---------------) + I stjordal - 0x00202b8f, // n0x175e c0x0000 (---------------) + I stjordalshalsen - 0x00228bc6, // n0x175f c0x0000 (---------------) + I stokke - 0x0023f24b, // n0x1760 c0x0000 (---------------) + I stor-elvdal - 0x002cf305, // n0x1761 c0x0000 (---------------) + I stord - 0x002cf307, // n0x1762 c0x0000 (---------------) + I stordal - 0x002cf749, // n0x1763 c0x0000 (---------------) + I storfjord - 0x0023dac6, // n0x1764 c0x0000 (---------------) + I strand - 0x0023dac7, // n0x1765 c0x0000 (---------------) + I stranda - 0x0037fd45, // n0x1766 c0x0000 (---------------) + I stryn - 0x00224fc4, // n0x1767 c0x0000 (---------------) + I sula - 0x00226b46, // n0x1768 c0x0000 (---------------) + I suldal - 0x00218c84, // n0x1769 c0x0000 (---------------) + I sund - 0x002a9c87, // n0x176a c0x0000 (---------------) + I sunndal - 0x002d1a88, // n0x176b c0x0000 (---------------) + I surnadal - 0x40ed36c8, // n0x176c c0x0103 (n0x187a-n0x187b) + I svalbard - 0x002d4485, // n0x176d c0x0000 (---------------) + I sveio - 0x002d45c7, // n0x176e c0x0000 (---------------) + I svelvik - 0x00354549, // n0x176f c0x0000 (---------------) + I sykkylven - 0x00204e04, // n0x1770 c0x0000 (---------------) + I tana - 0x00204e08, // n0x1771 c0x0000 (---------------) + I tananger - 0x4122ba88, // n0x1772 c0x0104 (n0x187b-n0x187d) o I telemark - 0x0036ef44, // n0x1773 c0x0000 (---------------) + I time - 0x00225c08, // n0x1774 c0x0000 (---------------) + I tingvoll - 0x0030cf04, // n0x1775 c0x0000 (---------------) + I tinn - 0x0021fb09, // n0x1776 c0x0000 (---------------) + I tjeldsund - 0x00259c45, // n0x1777 c0x0000 (---------------) + I tjome - 0x41608902, // n0x1778 c0x0105 (n0x187d-n0x187e) + I tm - 0x00228c05, // n0x1779 c0x0000 (---------------) + I tokke - 0x00215ac5, // n0x177a c0x0000 (---------------) + I tolga - 0x00204608, // n0x177b c0x0000 (---------------) + I tonsberg - 0x00226fc7, // n0x177c c0x0000 (---------------) + I torsken - 0x41a02402, // n0x177d c0x0106 (n0x187e-n0x187f) + I tr - 0x0025ab85, // n0x177e c0x0000 (---------------) + I trana - 0x00263106, // n0x177f c0x0000 (---------------) + I tranby - 0x00278cc6, // n0x1780 c0x0000 (---------------) + I tranoy - 0x002dfe08, // n0x1781 c0x0000 (---------------) + I troandin - 0x002e4348, // n0x1782 c0x0000 (---------------) + I trogstad - 0x00302a46, // n0x1783 c0x0000 (---------------) + I tromsa - 0x0030ac06, // n0x1784 c0x0000 (---------------) + I tromso - 0x00214709, // n0x1785 c0x0000 (---------------) + I trondheim - 0x0036b846, // n0x1786 c0x0000 (---------------) + I trysil - 0x00394d4b, // n0x1787 c0x0000 (---------------) + I tvedestrand - 0x00222c85, // n0x1788 c0x0000 (---------------) + I tydal - 0x0020fac6, // n0x1789 c0x0000 (---------------) + I tynset - 0x00224108, // n0x178a c0x0000 (---------------) + I tysfjord - 0x00234886, // n0x178b c0x0000 (---------------) + I tysnes - 0x002f8986, // n0x178c c0x0000 (---------------) + I tysvar - 0x00210dca, // n0x178d c0x0000 (---------------) + I ullensaker - 0x002bab8a, // n0x178e c0x0000 (---------------) + I ullensvang - 0x0025bd05, // n0x178f c0x0000 (---------------) + I ulvik - 0x00215307, // n0x1790 c0x0000 (---------------) + I unjarga - 0x002d0d06, // n0x1791 c0x0000 (---------------) + I utsira - 0x41e013c2, // n0x1792 c0x0107 (n0x187f-n0x1880) + I va - 0x002f2e87, // n0x1793 c0x0000 (---------------) + I vaapste - 0x00262a85, // n0x1794 c0x0000 (---------------) + I vadso - 0x00343f44, // n0x1795 c0x0000 (---------------) + I vaga - 0x00343f45, // n0x1796 c0x0000 (---------------) + I vagan - 0x00300c06, // n0x1797 c0x0000 (---------------) + I vagsoy - 0x0033f147, // n0x1798 c0x0000 (---------------) + I vaksdal - 0x00213d85, // n0x1799 c0x0000 (---------------) + I valle - 0x002bad04, // n0x179a c0x0000 (---------------) + I vang - 0x0025c3c8, // n0x179b c0x0000 (---------------) + I vanylven - 0x002f8a45, // n0x179c c0x0000 (---------------) + I vardo - 0x00280307, // n0x179d c0x0000 (---------------) + I varggat - 0x002cf005, // n0x179e c0x0000 (---------------) + I varoy - 0x00310385, // n0x179f c0x0000 (---------------) + I vefsn - 0x00212004, // n0x17a0 c0x0000 (---------------) + I vega - 0x00299e89, // n0x17a1 c0x0000 (---------------) + I vegarshei - 0x00212448, // n0x17a2 c0x0000 (---------------) + I vennesla - 0x00212286, // n0x17a3 c0x0000 (---------------) + I verdal - 0x00386a06, // n0x17a4 c0x0000 (---------------) + I verran - 0x002b9c46, // n0x17a5 c0x0000 (---------------) + I vestby - 0x422d9c88, // n0x17a6 c0x0108 (n0x1880-n0x1881) o I vestfold - 0x002d9e87, // n0x17a7 c0x0000 (---------------) + I vestnes - 0x002da30d, // n0x17a8 c0x0000 (---------------) + I vestre-slidre - 0x002da90c, // n0x17a9 c0x0000 (---------------) + I vestre-toten - 0x002daf09, // n0x17aa c0x0000 (---------------) + I vestvagoy - 0x002db149, // n0x17ab c0x0000 (---------------) + I vevelstad - 0x4273b4c2, // n0x17ac c0x0109 (n0x1881-n0x1882) + I vf - 0x0038c903, // n0x17ad c0x0000 (---------------) + I vgs - 0x00244c83, // n0x17ae c0x0000 (---------------) + I vik - 0x00364745, // n0x17af c0x0000 (---------------) + I vikna - 0x0037620a, // n0x17b0 c0x0000 (---------------) + I vindafjord - 0x00302906, // n0x17b1 c0x0000 (---------------) + I voagat - 0x002df605, // n0x17b2 c0x0000 (---------------) + I volda - 0x002e21c4, // n0x17b3 c0x0000 (---------------) + I voss - 0x002e21cb, // n0x17b4 c0x0000 (---------------) + I vossevangen - 0x002f6e0c, // n0x17b5 c0x0000 (---------------) + I xn--andy-ira - 0x002f764c, // n0x17b6 c0x0000 (---------------) + I xn--asky-ira - 0x002f7955, // n0x17b7 c0x0000 (---------------) + I xn--aurskog-hland-jnb - 0x002f984d, // n0x17b8 c0x0000 (---------------) + I xn--avery-yua - 0x002fbb0f, // n0x17b9 c0x0000 (---------------) + I xn--bdddj-mrabd - 0x002fbed2, // n0x17ba c0x0000 (---------------) + I xn--bearalvhki-y4a - 0x002fc34f, // n0x17bb c0x0000 (---------------) + I xn--berlevg-jxa - 0x002fc712, // n0x17bc c0x0000 (---------------) + I xn--bhcavuotna-s4a - 0x002fcb93, // n0x17bd c0x0000 (---------------) + I xn--bhccavuotna-k7a - 0x002fd04d, // n0x17be c0x0000 (---------------) + I xn--bidr-5nac - 0x002fd60d, // n0x17bf c0x0000 (---------------) + I xn--bievt-0qa - 0x002fd94e, // n0x17c0 c0x0000 (---------------) + I xn--bjarky-fya - 0x002fde0e, // n0x17c1 c0x0000 (---------------) + I xn--bjddar-pta - 0x002fec8c, // n0x17c2 c0x0000 (---------------) + I xn--blt-elab - 0x002ff00c, // n0x17c3 c0x0000 (---------------) + I xn--bmlo-gra - 0x002ff44b, // n0x17c4 c0x0000 (---------------) + I xn--bod-2na - 0x002ff7ce, // n0x17c5 c0x0000 (---------------) + I xn--brnny-wuac - 0x00301b92, // n0x17c6 c0x0000 (---------------) + I xn--brnnysund-m8ac - 0x003026cc, // n0x17c7 c0x0000 (---------------) + I xn--brum-voa - 0x00302e90, // n0x17c8 c0x0000 (---------------) + I xn--btsfjord-9za - 0x003138d2, // n0x17c9 c0x0000 (---------------) + I xn--davvenjrga-y4a - 0x0031458c, // n0x17ca c0x0000 (---------------) + I xn--dnna-gra - 0x00314a4d, // n0x17cb c0x0000 (---------------) + I xn--drbak-wua - 0x00314d8c, // n0x17cc c0x0000 (---------------) + I xn--dyry-ira - 0x00317b91, // n0x17cd c0x0000 (---------------) + I xn--eveni-0qa01ga - 0x00319c0d, // n0x17ce c0x0000 (---------------) + I xn--finny-yua - 0x0031f74d, // n0x17cf c0x0000 (---------------) + I xn--fjord-lra - 0x0031fd4a, // n0x17d0 c0x0000 (---------------) + I xn--fl-zia - 0x0031ffcc, // n0x17d1 c0x0000 (---------------) + I xn--flor-jra - 0x003208cc, // n0x17d2 c0x0000 (---------------) + I xn--frde-gra - 0x0032110c, // n0x17d3 c0x0000 (---------------) + I xn--frna-woa - 0x00321b0c, // n0x17d4 c0x0000 (---------------) + I xn--frya-hra - 0x00324f13, // n0x17d5 c0x0000 (---------------) + I xn--ggaviika-8ya47h - 0x00326650, // n0x17d6 c0x0000 (---------------) + I xn--gildeskl-g0a - 0x00326a50, // n0x17d7 c0x0000 (---------------) + I xn--givuotna-8ya - 0x0032714d, // n0x17d8 c0x0000 (---------------) + I xn--gjvik-wua - 0x0032748c, // n0x17d9 c0x0000 (---------------) + I xn--gls-elac - 0x00328189, // n0x17da c0x0000 (---------------) + I xn--h-2fa - 0x0032900d, // n0x17db c0x0000 (---------------) + I xn--hbmer-xqa - 0x00329353, // n0x17dc c0x0000 (---------------) + I xn--hcesuolo-7ya35b - 0x0032c151, // n0x17dd c0x0000 (---------------) + I xn--hgebostad-g3a - 0x0032c593, // n0x17de c0x0000 (---------------) + I xn--hmmrfeasta-s4ac - 0x0032e38f, // n0x17df c0x0000 (---------------) + I xn--hnefoss-q1a - 0x0032e74c, // n0x17e0 c0x0000 (---------------) + I xn--hobl-ira - 0x0032ea4f, // n0x17e1 c0x0000 (---------------) + I xn--holtlen-hxa - 0x0032ee0d, // n0x17e2 c0x0000 (---------------) + I xn--hpmir-xqa - 0x0032f40f, // n0x17e3 c0x0000 (---------------) + I xn--hyanger-q1a - 0x0032f7d0, // n0x17e4 c0x0000 (---------------) + I xn--hylandet-54a - 0x0033024e, // n0x17e5 c0x0000 (---------------) + I xn--indery-fya - 0x00332a0e, // n0x17e6 c0x0000 (---------------) + I xn--jlster-bya - 0x00333150, // n0x17e7 c0x0000 (---------------) + I xn--jrpeland-54a - 0x00333e8d, // n0x17e8 c0x0000 (---------------) + I xn--karmy-yua - 0x0033480e, // n0x17e9 c0x0000 (---------------) + I xn--kfjord-iua - 0x00334b8c, // n0x17ea c0x0000 (---------------) + I xn--klbu-woa - 0x00336b53, // n0x17eb c0x0000 (---------------) + I xn--koluokta-7ya57h - 0x0033934e, // n0x17ec c0x0000 (---------------) + I xn--krager-gya - 0x00339b10, // n0x17ed c0x0000 (---------------) + I xn--kranghke-b0a - 0x00339f11, // n0x17ee c0x0000 (---------------) + I xn--krdsherad-m8a - 0x0033a34f, // n0x17ef c0x0000 (---------------) + I xn--krehamn-dxa - 0x0033a713, // n0x17f0 c0x0000 (---------------) + I xn--krjohka-hwab49j - 0x0033b04d, // n0x17f1 c0x0000 (---------------) + I xn--ksnes-uua - 0x0033b38f, // n0x17f2 c0x0000 (---------------) + I xn--kvfjord-nxa - 0x0033b74e, // n0x17f3 c0x0000 (---------------) + I xn--kvitsy-fya - 0x0033d050, // n0x17f4 c0x0000 (---------------) + I xn--kvnangen-k0a - 0x0033d449, // n0x17f5 c0x0000 (---------------) + I xn--l-1fa - 0x0033e4d0, // n0x17f6 c0x0000 (---------------) + I xn--laheadju-7ya - 0x0033f30f, // n0x17f7 c0x0000 (---------------) + I xn--langevg-jxa - 0x0033f98f, // n0x17f8 c0x0000 (---------------) + I xn--ldingen-q1a - 0x0033fd52, // n0x17f9 c0x0000 (---------------) + I xn--leagaviika-52b - 0x00344a4e, // n0x17fa c0x0000 (---------------) + I xn--lesund-hua - 0x0034534d, // n0x17fb c0x0000 (---------------) + I xn--lgrd-poac - 0x00345bcd, // n0x17fc c0x0000 (---------------) + I xn--lhppi-xqa - 0x00345f0d, // n0x17fd c0x0000 (---------------) + I xn--linds-pra - 0x00347a8d, // n0x17fe c0x0000 (---------------) + I xn--loabt-0qa - 0x00347dcd, // n0x17ff c0x0000 (---------------) + I xn--lrdal-sra - 0x00348110, // n0x1800 c0x0000 (---------------) + I xn--lrenskog-54a - 0x0034850b, // n0x1801 c0x0000 (---------------) + I xn--lt-liac - 0x00348a8c, // n0x1802 c0x0000 (---------------) + I xn--lten-gra - 0x00348e0c, // n0x1803 c0x0000 (---------------) + I xn--lury-ira - 0x0034910c, // n0x1804 c0x0000 (---------------) + I xn--mely-ira - 0x0034940e, // n0x1805 c0x0000 (---------------) + I xn--merker-kua - 0x00356890, // n0x1806 c0x0000 (---------------) + I xn--mjndalen-64a - 0x003581d2, // n0x1807 c0x0000 (---------------) + I xn--mlatvuopmi-s4a - 0x0035864b, // n0x1808 c0x0000 (---------------) + I xn--mli-tla - 0x00358a8e, // n0x1809 c0x0000 (---------------) + I xn--mlselv-iua - 0x00358e0e, // n0x180a c0x0000 (---------------) + I xn--moreke-jua - 0x0035960e, // n0x180b c0x0000 (---------------) + I xn--mosjen-eya - 0x0035a4cb, // n0x180c c0x0000 (---------------) + I xn--mot-tla - 0x42b5a856, // n0x180d c0x010a (n0x1882-n0x1884) o I xn--mre-og-romsdal-qqb - 0x0035b4cd, // n0x180e c0x0000 (---------------) + I xn--msy-ula0h - 0x0035b954, // n0x180f c0x0000 (---------------) + I xn--mtta-vrjjat-k7af - 0x0035c38d, // n0x1810 c0x0000 (---------------) + I xn--muost-0qa - 0x0035d715, // n0x1811 c0x0000 (---------------) + I xn--nmesjevuemie-tcba - 0x0036060d, // n0x1812 c0x0000 (---------------) + I xn--nry-yla5g - 0x00360f8f, // n0x1813 c0x0000 (---------------) + I xn--nttery-byae - 0x00361bcf, // n0x1814 c0x0000 (---------------) + I xn--nvuotna-hwa - 0x003652cf, // n0x1815 c0x0000 (---------------) + I xn--oppegrd-ixa - 0x0036568e, // n0x1816 c0x0000 (---------------) + I xn--ostery-fya - 0x00365d4d, // n0x1817 c0x0000 (---------------) + I xn--osyro-wua - 0x00368211, // n0x1818 c0x0000 (---------------) + I xn--porsgu-sta26f - 0x0036f34c, // n0x1819 c0x0000 (---------------) + I xn--rady-ira - 0x0036f64c, // n0x181a c0x0000 (---------------) + I xn--rdal-poa - 0x0036f94b, // n0x181b c0x0000 (---------------) + I xn--rde-ula - 0x0036fc0c, // n0x181c c0x0000 (---------------) + I xn--rdy-0nab - 0x0036ffcf, // n0x181d c0x0000 (---------------) + I xn--rennesy-v1a - 0x00370392, // n0x181e c0x0000 (---------------) + I xn--rhkkervju-01af - 0x00371acd, // n0x181f c0x0000 (---------------) + I xn--rholt-mra - 0x00372d0c, // n0x1820 c0x0000 (---------------) + I xn--risa-5na - 0x0037318c, // n0x1821 c0x0000 (---------------) + I xn--risr-ira - 0x0037348d, // n0x1822 c0x0000 (---------------) + I xn--rland-uua - 0x003737cf, // n0x1823 c0x0000 (---------------) + I xn--rlingen-mxa - 0x00373b8e, // n0x1824 c0x0000 (---------------) + I xn--rmskog-bya - 0x00375ecc, // n0x1825 c0x0000 (---------------) + I xn--rros-gra - 0x0037648d, // n0x1826 c0x0000 (---------------) + I xn--rskog-uua - 0x003767cb, // n0x1827 c0x0000 (---------------) + I xn--rst-0na - 0x00376fcc, // n0x1828 c0x0000 (---------------) + I xn--rsta-fra - 0x0037754d, // n0x1829 c0x0000 (---------------) + I xn--ryken-vua - 0x0037788e, // n0x182a c0x0000 (---------------) + I xn--ryrvik-bya - 0x00377d09, // n0x182b c0x0000 (---------------) + I xn--s-1fa - 0x00378b53, // n0x182c c0x0000 (---------------) + I xn--sandnessjen-ogb - 0x0037940d, // n0x182d c0x0000 (---------------) + I xn--sandy-yua - 0x0037974d, // n0x182e c0x0000 (---------------) + I xn--seral-lra - 0x00379d4c, // n0x182f c0x0000 (---------------) + I xn--sgne-gra - 0x0037a1ce, // n0x1830 c0x0000 (---------------) + I xn--skierv-uta - 0x0037b34f, // n0x1831 c0x0000 (---------------) + I xn--skjervy-v1a - 0x0037b70c, // n0x1832 c0x0000 (---------------) + I xn--skjk-soa - 0x0037ba0d, // n0x1833 c0x0000 (---------------) + I xn--sknit-yqa - 0x0037bd4f, // n0x1834 c0x0000 (---------------) + I xn--sknland-fxa - 0x0037c10c, // n0x1835 c0x0000 (---------------) + I xn--slat-5na - 0x0037c74c, // n0x1836 c0x0000 (---------------) + I xn--slt-elab - 0x0037cb0c, // n0x1837 c0x0000 (---------------) + I xn--smla-hra - 0x0037ce0c, // n0x1838 c0x0000 (---------------) + I xn--smna-gra - 0x0037d4cd, // n0x1839 c0x0000 (---------------) + I xn--snase-nra - 0x0037d812, // n0x183a c0x0000 (---------------) + I xn--sndre-land-0cb - 0x0037de8c, // n0x183b c0x0000 (---------------) + I xn--snes-poa - 0x0037e18c, // n0x183c c0x0000 (---------------) + I xn--snsa-roa - 0x0037e491, // n0x183d c0x0000 (---------------) + I xn--sr-aurdal-l8a - 0x0037e8cf, // n0x183e c0x0000 (---------------) + I xn--sr-fron-q1a - 0x0037ec8f, // n0x183f c0x0000 (---------------) + I xn--sr-odal-q1a - 0x0037f053, // n0x1840 c0x0000 (---------------) + I xn--sr-varanger-ggb - 0x003801ce, // n0x1841 c0x0000 (---------------) + I xn--srfold-bya - 0x0038074f, // n0x1842 c0x0000 (---------------) + I xn--srreisa-q1a - 0x00380b0c, // n0x1843 c0x0000 (---------------) + I xn--srum-gra - 0x42f80e4e, // n0x1844 c0x010b (n0x1884-n0x1885) o I xn--stfold-9xa - 0x003811cf, // n0x1845 c0x0000 (---------------) + I xn--stjrdal-s1a - 0x00381596, // n0x1846 c0x0000 (---------------) + I xn--stjrdalshalsen-sqb - 0x00382652, // n0x1847 c0x0000 (---------------) + I xn--stre-toten-zcb - 0x0038448c, // n0x1848 c0x0000 (---------------) + I xn--tjme-hra - 0x003850cf, // n0x1849 c0x0000 (---------------) + I xn--tnsberg-q1a - 0x0038574d, // n0x184a c0x0000 (---------------) + I xn--trany-yua - 0x00385a8f, // n0x184b c0x0000 (---------------) + I xn--trgstad-r1a - 0x00385e4c, // n0x184c c0x0000 (---------------) + I xn--trna-woa - 0x0038614d, // n0x184d c0x0000 (---------------) + I xn--troms-zua - 0x0038648d, // n0x184e c0x0000 (---------------) + I xn--tysvr-vra - 0x003876ce, // n0x184f c0x0000 (---------------) + I xn--unjrga-rta - 0x0038850c, // n0x1850 c0x0000 (---------------) + I xn--vads-jra - 0x0038880c, // n0x1851 c0x0000 (---------------) + I xn--vard-jra - 0x00388b10, // n0x1852 c0x0000 (---------------) + I xn--vegrshei-c0a - 0x0038b251, // n0x1853 c0x0000 (---------------) + I xn--vestvgy-ixa6o - 0x0038b68b, // n0x1854 c0x0000 (---------------) + I xn--vg-yiab - 0x0038c50c, // n0x1855 c0x0000 (---------------) + I xn--vgan-qoa - 0x0038c80e, // n0x1856 c0x0000 (---------------) + I xn--vgsy-qoa0j - 0x0038e511, // n0x1857 c0x0000 (---------------) + I xn--vre-eiker-k8a - 0x0038e94e, // n0x1858 c0x0000 (---------------) + I xn--vrggt-xqad - 0x0038eccd, // n0x1859 c0x0000 (---------------) + I xn--vry-yla5g - 0x00392fcb, // n0x185a c0x0000 (---------------) + I xn--yer-zna - 0x00393c0f, // n0x185b c0x0000 (---------------) + I xn--ygarden-p1a - 0x00394594, // n0x185c c0x0000 (---------------) + I xn--ystre-slidre-ujb - 0x0026cd02, // n0x185d c0x0000 (---------------) + I gs - 0x0026cd02, // n0x185e c0x0000 (---------------) + I gs - 0x00201083, // n0x185f c0x0000 (---------------) + I nes - 0x0026cd02, // n0x1860 c0x0000 (---------------) + I gs - 0x00201083, // n0x1861 c0x0000 (---------------) + I nes - 0x0026cd02, // n0x1862 c0x0000 (---------------) + I gs - 0x00202382, // n0x1863 c0x0000 (---------------) + I os - 0x00351305, // n0x1864 c0x0000 (---------------) + I valer - 0x0038e20c, // n0x1865 c0x0000 (---------------) + I xn--vler-qoa - 0x0026cd02, // n0x1866 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1867 c0x0000 (---------------) + I gs - 0x00202382, // n0x1868 c0x0000 (---------------) + I os - 0x0026cd02, // n0x1869 c0x0000 (---------------) + I gs - 0x00280105, // n0x186a c0x0000 (---------------) + I heroy - 0x0029dd05, // n0x186b c0x0000 (---------------) + I sande - 0x0026cd02, // n0x186c c0x0000 (---------------) + I gs - 0x0026cd02, // n0x186d c0x0000 (---------------) + I gs - 0x0020a702, // n0x186e c0x0000 (---------------) + I bo - 0x00280105, // n0x186f c0x0000 (---------------) + I heroy - 0x002fa209, // n0x1870 c0x0000 (---------------) + I xn--b-5ga - 0x0032be4c, // n0x1871 c0x0000 (---------------) + I xn--hery-ira - 0x0026cd02, // n0x1872 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1873 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1874 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1875 c0x0000 (---------------) + I gs - 0x00351305, // n0x1876 c0x0000 (---------------) + I valer - 0x0026cd02, // n0x1877 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1878 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x1879 c0x0000 (---------------) + I gs - 0x0026cd02, // n0x187a c0x0000 (---------------) + I gs - 0x0020a702, // n0x187b c0x0000 (---------------) + I bo - 0x002fa209, // n0x187c c0x0000 (---------------) + I xn--b-5ga - 0x0026cd02, // n0x187d c0x0000 (---------------) + I gs - 0x0026cd02, // n0x187e c0x0000 (---------------) + I gs - 0x0026cd02, // n0x187f c0x0000 (---------------) + I gs - 0x0029dd05, // n0x1880 c0x0000 (---------------) + I sande - 0x0026cd02, // n0x1881 c0x0000 (---------------) + I gs - 0x0029dd05, // n0x1882 c0x0000 (---------------) + I sande - 0x0032be4c, // n0x1883 c0x0000 (---------------) + I xn--hery-ira - 0x0038e20c, // n0x1884 c0x0000 (---------------) + I xn--vler-qoa - 0x00310603, // n0x1885 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x1886 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1887 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1888 c0x0000 (---------------) + I gov - 0x00200304, // n0x1889 c0x0000 (---------------) + I info - 0x002170c3, // n0x188a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x188b c0x0000 (---------------) + I org - 0x00166bc8, // n0x188c c0x0000 (---------------) + merseine - 0x0007c1c4, // n0x188d c0x0000 (---------------) + mine - 0x000cb2c8, // n0x188e c0x0000 (---------------) + shacknet - 0x00201e82, // n0x188f c0x0000 (---------------) + I ac - 0x43e00742, // n0x1890 c0x010f (n0x189f-n0x18a0) + I co - 0x002319c3, // n0x1891 c0x0000 (---------------) + I cri - 0x00252f84, // n0x1892 c0x0000 (---------------) + I geek - 0x002012c3, // n0x1893 c0x0000 (---------------) + I gen - 0x0021e284, // n0x1894 c0x0000 (---------------) + I govt - 0x00205e06, // n0x1895 c0x0000 (---------------) + I health - 0x002d2e03, // n0x1896 c0x0000 (---------------) + I iwi - 0x002d2dc4, // n0x1897 c0x0000 (---------------) + I kiwi - 0x002701c5, // n0x1898 c0x0000 (---------------) + I maori - 0x0023fa03, // n0x1899 c0x0000 (---------------) + I mil - 0x002170c3, // n0x189a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x189b c0x0000 (---------------) + I org - 0x002647ca, // n0x189c c0x0000 (---------------) + I parliament - 0x00235406, // n0x189d c0x0000 (---------------) + I school - 0x0035918c, // n0x189e c0x0000 (---------------) + I xn--mori-qsa - 0x000e4188, // n0x189f c0x0000 (---------------) + blogspot - 0x00200742, // n0x18a0 c0x0000 (---------------) + I co - 0x00222ac3, // n0x18a1 c0x0000 (---------------) + I com - 0x002d75c3, // n0x18a2 c0x0000 (---------------) + I edu - 0x0021e283, // n0x18a3 c0x0000 (---------------) + I gov - 0x0020b403, // n0x18a4 c0x0000 (---------------) + I med - 0x002bd646, // n0x18a5 c0x0000 (---------------) + I museum - 0x002170c3, // n0x18a6 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x18a7 c0x0000 (---------------) + I org - 0x00218243, // n0x18a8 c0x0000 (---------------) + I pro - 0x00004342, // n0x18a9 c0x0000 (---------------) + ae - 0x000d0087, // n0x18aa c0x0000 (---------------) + blogdns - 0x001619c8, // n0x18ab c0x0000 (---------------) + blogsite - 0x00076592, // n0x18ac c0x0000 (---------------) + boldlygoingnowhere - 0x44a2a085, // n0x18ad c0x0112 (n0x18e3-n0x18e5) o I cdn77 - 0x44f0720c, // n0x18ae c0x0113 (n0x18e5-n0x18e6) o I cdn77-secure - 0x00146fc8, // n0x18af c0x0000 (---------------) + dnsalias - 0x0006a247, // n0x18b0 c0x0000 (---------------) + dnsdojo - 0x00010a4b, // n0x18b1 c0x0000 (---------------) + doesntexist - 0x0015fdc9, // n0x18b2 c0x0000 (---------------) + dontexist - 0x00146ec7, // n0x18b3 c0x0000 (---------------) + doomdns - 0x0006a147, // n0x18b4 c0x0000 (---------------) + duckdns - 0x00194fc6, // n0x18b5 c0x0000 (---------------) + dvrdns - 0x000007c8, // n0x18b6 c0x0000 (---------------) + dynalias - 0x45409ac6, // n0x18b7 c0x0115 (n0x18e7-n0x18e9) + dyndns - 0x0009428d, // n0x18b8 c0x0000 (---------------) + endofinternet - 0x000f3e50, // n0x18b9 c0x0000 (---------------) + endoftheinternet - 0x4581d5c2, // n0x18ba c0x0116 (n0x18e9-n0x1920) + eu - 0x00057807, // n0x18bb c0x0000 (---------------) + from-me - 0x00083589, // n0x18bc c0x0000 (---------------) + game-host - 0x00043a86, // n0x18bd c0x0000 (---------------) + gotdns - 0x0002ea02, // n0x18be c0x0000 (---------------) + hk - 0x0013eeca, // n0x18bf c0x0000 (---------------) + hobby-site - 0x0000b387, // n0x18c0 c0x0000 (---------------) + homedns - 0x00085007, // n0x18c1 c0x0000 (---------------) + homeftp - 0x00090ec9, // n0x18c2 c0x0000 (---------------) + homelinux - 0x00091b88, // n0x18c3 c0x0000 (---------------) + homeunix - 0x000c528e, // n0x18c4 c0x0000 (---------------) + is-a-bruinsfan - 0x00008d8e, // n0x18c5 c0x0000 (---------------) + is-a-candidate - 0x0000eecf, // n0x18c6 c0x0000 (---------------) + is-a-celticsfan - 0x00166909, // n0x18c7 c0x0000 (---------------) + is-a-chef - 0x00052e49, // n0x18c8 c0x0000 (---------------) + is-a-geek - 0x0006b8cb, // n0x18c9 c0x0000 (---------------) + is-a-knight - 0x001259cf, // n0x18ca c0x0000 (---------------) + is-a-linux-user - 0x0008480c, // n0x18cb c0x0000 (---------------) + is-a-patsfan - 0x000d23cb, // n0x18cc c0x0000 (---------------) + is-a-soxfan - 0x00103ac8, // n0x18cd c0x0000 (---------------) + is-found - 0x000d6887, // n0x18ce c0x0000 (---------------) + is-lost - 0x000e2908, // n0x18cf c0x0000 (---------------) + is-saved - 0x0012148b, // n0x18d0 c0x0000 (---------------) + is-very-bad - 0x00127b0c, // n0x18d1 c0x0000 (---------------) + is-very-evil - 0x00130a4c, // n0x18d2 c0x0000 (---------------) + is-very-good - 0x0013904c, // n0x18d3 c0x0000 (---------------) + is-very-nice - 0x0013bb8d, // n0x18d4 c0x0000 (---------------) + is-very-sweet - 0x00191648, // n0x18d5 c0x0000 (---------------) + isa-geek - 0x00183609, // n0x18d6 c0x0000 (---------------) + kicks-ass - 0x0016a6cb, // n0x18d7 c0x0000 (---------------) + misconfused - 0x000c7e07, // n0x18d8 c0x0000 (---------------) + podzone - 0x0016184a, // n0x18d9 c0x0000 (---------------) + readmyblog - 0x00130f46, // n0x18da c0x0000 (---------------) + selfip - 0x00084dcd, // n0x18db c0x0000 (---------------) + sellsyourhome - 0x00079088, // n0x18dc c0x0000 (---------------) + servebbs - 0x00161348, // n0x18dd c0x0000 (---------------) + serveftp - 0x00011f49, // n0x18de c0x0000 (---------------) + servegame - 0x000d044c, // n0x18df c0x0000 (---------------) + stuff-4-sale - 0x00009f42, // n0x18e0 c0x0000 (---------------) + us - 0x00110e86, // n0x18e1 c0x0000 (---------------) + webhop - 0x000043c2, // n0x18e2 c0x0000 (---------------) + za - 0x00000741, // n0x18e3 c0x0000 (---------------) + c - 0x000060c3, // n0x18e4 c0x0000 (---------------) + rsc - 0x45374606, // n0x18e5 c0x0114 (n0x18e6-n0x18e7) o I origin - 0x0002a203, // n0x18e6 c0x0000 (---------------) + ssl - 0x00002342, // n0x18e7 c0x0000 (---------------) + go - 0x0000b384, // n0x18e8 c0x0000 (---------------) + home - 0x00000882, // n0x18e9 c0x0000 (---------------) + al - 0x000729c4, // n0x18ea c0x0000 (---------------) + asso - 0x00001642, // n0x18eb c0x0000 (---------------) + at - 0x00005ac2, // n0x18ec c0x0000 (---------------) + au - 0x00004702, // n0x18ed c0x0000 (---------------) + be - 0x00155e02, // n0x18ee c0x0000 (---------------) + bg - 0x000055c2, // n0x18ef c0x0000 (---------------) + ca - 0x0002a082, // n0x18f0 c0x0000 (---------------) + cd - 0x00004a02, // n0x18f1 c0x0000 (---------------) + ch - 0x000211c2, // n0x18f2 c0x0000 (---------------) + cn - 0x00029e42, // n0x18f3 c0x0000 (---------------) + cy - 0x00014442, // n0x18f4 c0x0000 (---------------) + cz - 0x000006c2, // n0x18f5 c0x0000 (---------------) + de - 0x00071742, // n0x18f6 c0x0000 (---------------) + dk - 0x000d75c3, // n0x18f7 c0x0000 (---------------) + edu - 0x00006042, // n0x18f8 c0x0000 (---------------) + ee - 0x000010c2, // n0x18f9 c0x0000 (---------------) + es - 0x000099c2, // n0x18fa c0x0000 (---------------) + fi - 0x00000d42, // n0x18fb c0x0000 (---------------) + fr - 0x0000dc82, // n0x18fc c0x0000 (---------------) + gr - 0x00025842, // n0x18fd c0x0000 (---------------) + hr - 0x00017d42, // n0x18fe c0x0000 (---------------) + hu - 0x00000e82, // n0x18ff c0x0000 (---------------) + ie - 0x000036c2, // n0x1900 c0x0000 (---------------) + il - 0x00000242, // n0x1901 c0x0000 (---------------) + in - 0x00038c03, // n0x1902 c0x0000 (---------------) + int - 0x00002b42, // n0x1903 c0x0000 (---------------) + is - 0x00006e82, // n0x1904 c0x0000 (---------------) + it - 0x000990c2, // n0x1905 c0x0000 (---------------) + jp - 0x000034c2, // n0x1906 c0x0000 (---------------) + kr - 0x00005ec2, // n0x1907 c0x0000 (---------------) + lt - 0x000071c2, // n0x1908 c0x0000 (---------------) + lu - 0x00027f02, // n0x1909 c0x0000 (---------------) + lv - 0x0003a6c2, // n0x190a c0x0000 (---------------) + mc - 0x00008942, // n0x190b c0x0000 (---------------) + me - 0x00156d82, // n0x190c c0x0000 (---------------) + mk - 0x00059642, // n0x190d c0x0000 (---------------) + mt - 0x00020282, // n0x190e c0x0000 (---------------) + my - 0x000170c3, // n0x190f c0x0000 (---------------) + net - 0x00001282, // n0x1910 c0x0000 (---------------) + ng - 0x00036482, // n0x1911 c0x0000 (---------------) + nl - 0x00000c02, // n0x1912 c0x0000 (---------------) + no - 0x000078c2, // n0x1913 c0x0000 (---------------) + nz - 0x0005b445, // n0x1914 c0x0000 (---------------) + paris - 0x00001e02, // n0x1915 c0x0000 (---------------) + pl - 0x00095982, // n0x1916 c0x0000 (---------------) + pt - 0x00123e03, // n0x1917 c0x0000 (---------------) + q-a - 0x00000d82, // n0x1918 c0x0000 (---------------) + ro - 0x000044c2, // n0x1919 c0x0000 (---------------) + ru - 0x00002e82, // n0x191a c0x0000 (---------------) + se - 0x00009182, // n0x191b c0x0000 (---------------) + si - 0x00007b42, // n0x191c c0x0000 (---------------) + sk - 0x00002402, // n0x191d c0x0000 (---------------) + tr - 0x0000cf02, // n0x191e c0x0000 (---------------) + uk - 0x00009f42, // n0x191f c0x0000 (---------------) + us - 0x0020c283, // n0x1920 c0x0000 (---------------) + I abo - 0x00201e82, // n0x1921 c0x0000 (---------------) + I ac - 0x00222ac3, // n0x1922 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1923 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x1924 c0x0000 (---------------) + I gob - 0x0020dc03, // n0x1925 c0x0000 (---------------) + I ing - 0x0020b403, // n0x1926 c0x0000 (---------------) + I med - 0x002170c3, // n0x1927 c0x0000 (---------------) + I net - 0x00207cc3, // n0x1928 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1929 c0x0000 (---------------) + I org - 0x00280043, // n0x192a c0x0000 (---------------) + I sld - 0x000e4188, // n0x192b c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x192c c0x0000 (---------------) + I com - 0x002d75c3, // n0x192d c0x0000 (---------------) + I edu - 0x0034eb03, // n0x192e c0x0000 (---------------) + I gob - 0x0023fa03, // n0x192f c0x0000 (---------------) + I mil - 0x002170c3, // n0x1930 c0x0000 (---------------) + I net - 0x00207cc3, // n0x1931 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1932 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1933 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1934 c0x0000 (---------------) + I edu - 0x0021dcc3, // n0x1935 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1936 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1937 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1938 c0x0000 (---------------) + I gov - 0x00200041, // n0x1939 c0x0000 (---------------) + I i - 0x0023fa03, // n0x193a c0x0000 (---------------) + I mil - 0x002170c3, // n0x193b c0x0000 (---------------) + I net - 0x00202303, // n0x193c c0x0000 (---------------) + I ngo - 0x0021dcc3, // n0x193d c0x0000 (---------------) + I org - 0x00310603, // n0x193e c0x0000 (---------------) + I biz - 0x00222ac3, // n0x193f c0x0000 (---------------) + I com - 0x002d75c3, // n0x1940 c0x0000 (---------------) + I edu - 0x002a1b43, // n0x1941 c0x0000 (---------------) + I fam - 0x0034eb03, // n0x1942 c0x0000 (---------------) + I gob - 0x00375943, // n0x1943 c0x0000 (---------------) + I gok - 0x0026f583, // n0x1944 c0x0000 (---------------) + I gon - 0x0028e783, // n0x1945 c0x0000 (---------------) + I gop - 0x00202343, // n0x1946 c0x0000 (---------------) + I gos - 0x0021e283, // n0x1947 c0x0000 (---------------) + I gov - 0x00200304, // n0x1948 c0x0000 (---------------) + I info - 0x002170c3, // n0x1949 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x194a c0x0000 (---------------) + I org - 0x00219fc3, // n0x194b c0x0000 (---------------) + I web - 0x002f8f84, // n0x194c c0x0000 (---------------) + I agro - 0x002375c3, // n0x194d c0x0000 (---------------) + I aid - 0x00000603, // n0x194e c0x0000 (---------------) + art - 0x0026a983, // n0x194f c0x0000 (---------------) + I atm - 0x0023e708, // n0x1950 c0x0000 (---------------) + I augustow - 0x002eaac4, // n0x1951 c0x0000 (---------------) + I auto - 0x0032d4ca, // n0x1952 c0x0000 (---------------) + I babia-gora - 0x0034d4c6, // n0x1953 c0x0000 (---------------) + I bedzin - 0x0035ad87, // n0x1954 c0x0000 (---------------) + I beskidy - 0x0021604a, // n0x1955 c0x0000 (---------------) + I bialowieza - 0x00228a89, // n0x1956 c0x0000 (---------------) + I bialystok - 0x0037f4c7, // n0x1957 c0x0000 (---------------) + I bielawa - 0x00382a8a, // n0x1958 c0x0000 (---------------) + I bieszczady - 0x00310603, // n0x1959 c0x0000 (---------------) + I biz - 0x0025374b, // n0x195a c0x0000 (---------------) + I boleslawiec - 0x00343289, // n0x195b c0x0000 (---------------) + I bydgoszcz - 0x002b9d45, // n0x195c c0x0000 (---------------) + I bytom - 0x002bb407, // n0x195d c0x0000 (---------------) + I cieszyn - 0x00000742, // n0x195e c0x0000 (---------------) + co - 0x00222ac3, // n0x195f c0x0000 (---------------) + I com - 0x002c8a87, // n0x1960 c0x0000 (---------------) + I czeladz - 0x00214445, // n0x1961 c0x0000 (---------------) + I czest - 0x002aae49, // n0x1962 c0x0000 (---------------) + I dlugoleka - 0x002d75c3, // n0x1963 c0x0000 (---------------) + I edu - 0x0021b206, // n0x1964 c0x0000 (---------------) + I elblag - 0x002aa003, // n0x1965 c0x0000 (---------------) + I elk - 0x000b7a43, // n0x1966 c0x0000 (---------------) + gda - 0x000e1246, // n0x1967 c0x0000 (---------------) + gdansk - 0x0016e4c6, // n0x1968 c0x0000 (---------------) + gdynia - 0x0014ee47, // n0x1969 c0x0000 (---------------) + gliwice - 0x00391046, // n0x196a c0x0000 (---------------) + I glogow - 0x002047c5, // n0x196b c0x0000 (---------------) + I gmina - 0x0031b347, // n0x196c c0x0000 (---------------) + I gniezno - 0x002b1487, // n0x196d c0x0000 (---------------) + I gorlice - 0x4761e283, // n0x196e c0x011d (n0x19f1-n0x1a20) + I gov - 0x003147c7, // n0x196f c0x0000 (---------------) + I grajewo - 0x0034b2c3, // n0x1970 c0x0000 (---------------) + I gsm - 0x0036cb05, // n0x1971 c0x0000 (---------------) + I ilawa - 0x00200304, // n0x1972 c0x0000 (---------------) + I info - 0x0020a8c8, // n0x1973 c0x0000 (---------------) + I jaworzno - 0x0020c80c, // n0x1974 c0x0000 (---------------) + I jelenia-gora - 0x00297b45, // n0x1975 c0x0000 (---------------) + I jgora - 0x002bed46, // n0x1976 c0x0000 (---------------) + I kalisz - 0x002c8947, // n0x1977 c0x0000 (---------------) + I karpacz - 0x002017c7, // n0x1978 c0x0000 (---------------) + I kartuzy - 0x00216a07, // n0x1979 c0x0000 (---------------) + I kaszuby - 0x00217888, // n0x197a c0x0000 (---------------) + I katowice - 0x0036730f, // n0x197b c0x0000 (---------------) + I kazimierz-dolny - 0x0023df05, // n0x197c c0x0000 (---------------) + I kepno - 0x00231ac7, // n0x197d c0x0000 (---------------) + I ketrzyn - 0x002a3547, // n0x197e c0x0000 (---------------) + I klodzko - 0x0029058a, // n0x197f c0x0000 (---------------) + I kobierzyce - 0x00295709, // n0x1980 c0x0000 (---------------) + I kolobrzeg - 0x002bbf45, // n0x1981 c0x0000 (---------------) + I konin - 0x002bdf8a, // n0x1982 c0x0000 (---------------) + I konskowola - 0x0011bec6, // n0x1983 c0x0000 (---------------) + krakow - 0x002aa085, // n0x1984 c0x0000 (---------------) + I kutno - 0x002be184, // n0x1985 c0x0000 (---------------) + I lapy - 0x002c8806, // n0x1986 c0x0000 (---------------) + I lebork - 0x00322207, // n0x1987 c0x0000 (---------------) + I legnica - 0x002bde07, // n0x1988 c0x0000 (---------------) + I lezajsk - 0x0036d448, // n0x1989 c0x0000 (---------------) + I limanowa - 0x002c6b85, // n0x198a c0x0000 (---------------) + I lomza - 0x00214346, // n0x198b c0x0000 (---------------) + I lowicz - 0x00218fc5, // n0x198c c0x0000 (---------------) + I lubin - 0x0029b345, // n0x198d c0x0000 (---------------) + I lukow - 0x00218f04, // n0x198e c0x0000 (---------------) + I mail - 0x00321887, // n0x198f c0x0000 (---------------) + I malbork - 0x0030ff4a, // n0x1990 c0x0000 (---------------) + I malopolska - 0x0020b988, // n0x1991 c0x0000 (---------------) + I mazowsze - 0x002d2a06, // n0x1992 c0x0000 (---------------) + I mazury - 0x0000b403, // n0x1993 c0x0000 (---------------) + med - 0x002dc385, // n0x1994 c0x0000 (---------------) + I media - 0x00232386, // n0x1995 c0x0000 (---------------) + I miasta - 0x00381e06, // n0x1996 c0x0000 (---------------) + I mielec - 0x002f0806, // n0x1997 c0x0000 (---------------) + I mielno - 0x0023fa03, // n0x1998 c0x0000 (---------------) + I mil - 0x00371d47, // n0x1999 c0x0000 (---------------) + I mragowo - 0x002a34c5, // n0x199a c0x0000 (---------------) + I naklo - 0x002170c3, // n0x199b c0x0000 (---------------) + I net - 0x0037f74d, // n0x199c c0x0000 (---------------) + I nieruchomosci - 0x00207cc3, // n0x199d c0x0000 (---------------) + I nom - 0x0036d548, // n0x199e c0x0000 (---------------) + I nowaruda - 0x00210944, // n0x199f c0x0000 (---------------) + I nysa - 0x00264105, // n0x19a0 c0x0000 (---------------) + I olawa - 0x00290486, // n0x19a1 c0x0000 (---------------) + I olecko - 0x002c1f06, // n0x19a2 c0x0000 (---------------) + I olkusz - 0x0020f9c7, // n0x19a3 c0x0000 (---------------) + I olsztyn - 0x00228dc7, // n0x19a4 c0x0000 (---------------) + I opoczno - 0x00246a05, // n0x19a5 c0x0000 (---------------) + I opole - 0x0021dcc3, // n0x19a6 c0x0000 (---------------) + I org - 0x00202387, // n0x19a7 c0x0000 (---------------) + I ostroda - 0x00203b09, // n0x19a8 c0x0000 (---------------) + I ostroleka - 0x002053c9, // n0x19a9 c0x0000 (---------------) + I ostrowiec - 0x0020818a, // n0x19aa c0x0000 (---------------) + I ostrowwlkp - 0x00203e02, // n0x19ab c0x0000 (---------------) + I pc - 0x0036cac4, // n0x19ac c0x0000 (---------------) + I pila - 0x002c2d84, // n0x19ad c0x0000 (---------------) + I pisz - 0x00210607, // n0x19ae c0x0000 (---------------) + I podhale - 0x0023b508, // n0x19af c0x0000 (---------------) + I podlasie - 0x002c8cc9, // n0x19b0 c0x0000 (---------------) + I polkowice - 0x00207a09, // n0x19b1 c0x0000 (---------------) + I pomorskie - 0x002c9507, // n0x19b2 c0x0000 (---------------) + I pomorze - 0x0026a886, // n0x19b3 c0x0000 (---------------) + I powiat - 0x000ca606, // n0x19b4 c0x0000 (---------------) + poznan - 0x002cba44, // n0x19b5 c0x0000 (---------------) + I priv - 0x002cbbca, // n0x19b6 c0x0000 (---------------) + I prochowice - 0x002cd2c8, // n0x19b7 c0x0000 (---------------) + I pruszkow - 0x002cdec9, // n0x19b8 c0x0000 (---------------) + I przeworsk - 0x00281bc6, // n0x19b9 c0x0000 (---------------) + I pulawy - 0x002e8285, // n0x19ba c0x0000 (---------------) + I radom - 0x0020b848, // n0x19bb c0x0000 (---------------) + I rawa-maz - 0x002b174a, // n0x19bc c0x0000 (---------------) + I realestate - 0x00241283, // n0x19bd c0x0000 (---------------) + I rel - 0x00226746, // n0x19be c0x0000 (---------------) + I rybnik - 0x002c9607, // n0x19bf c0x0000 (---------------) + I rzeszow - 0x0020b505, // n0x19c0 c0x0000 (---------------) + I sanok - 0x00375a45, // n0x19c1 c0x0000 (---------------) + I sejny - 0x0029acc3, // n0x19c2 c0x0000 (---------------) + I sex - 0x0029b184, // n0x19c3 c0x0000 (---------------) + I shop - 0x0021cd45, // n0x19c4 c0x0000 (---------------) + I sklep - 0x00270687, // n0x19c5 c0x0000 (---------------) + I skoczow - 0x00212585, // n0x19c6 c0x0000 (---------------) + I slask - 0x002c1646, // n0x19c7 c0x0000 (---------------) + I slupsk - 0x000ddd85, // n0x19c8 c0x0000 (---------------) + sopot - 0x0021c283, // n0x19c9 c0x0000 (---------------) + I sos - 0x0021c289, // n0x19ca c0x0000 (---------------) + I sosnowiec - 0x00263ecc, // n0x19cb c0x0000 (---------------) + I stalowa-wola - 0x0029720c, // n0x19cc c0x0000 (---------------) + I starachowice - 0x002b8648, // n0x19cd c0x0000 (---------------) + I stargard - 0x00325847, // n0x19ce c0x0000 (---------------) + I suwalki - 0x002d4d08, // n0x19cf c0x0000 (---------------) + I swidnica - 0x002d590a, // n0x19d0 c0x0000 (---------------) + I swiebodzin - 0x002d608b, // n0x19d1 c0x0000 (---------------) + I swinoujscie - 0x003433c8, // n0x19d2 c0x0000 (---------------) + I szczecin - 0x002bee48, // n0x19d3 c0x0000 (---------------) + I szczytno - 0x00207586, // n0x19d4 c0x0000 (---------------) + I szkola - 0x0030a185, // n0x19d5 c0x0000 (---------------) + I targi - 0x0030ebca, // n0x19d6 c0x0000 (---------------) + I tarnobrzeg - 0x0021e345, // n0x19d7 c0x0000 (---------------) + I tgory - 0x00208902, // n0x19d8 c0x0000 (---------------) + I tm - 0x002ae287, // n0x19d9 c0x0000 (---------------) + I tourism - 0x0027f186, // n0x19da c0x0000 (---------------) + I travel - 0x0033de05, // n0x19db c0x0000 (---------------) + I turek - 0x002d8689, // n0x19dc c0x0000 (---------------) + I turystyka - 0x0036b4c5, // n0x19dd c0x0000 (---------------) + I tychy - 0x0027af05, // n0x19de c0x0000 (---------------) + I ustka - 0x0036c6c9, // n0x19df c0x0000 (---------------) + I walbrzych - 0x00232206, // n0x19e0 c0x0000 (---------------) + I warmia - 0x00250f08, // n0x19e1 c0x0000 (---------------) + I warszawa - 0x002c7183, // n0x19e2 c0x0000 (---------------) + I waw - 0x00391186, // n0x19e3 c0x0000 (---------------) + I wegrow - 0x00263586, // n0x19e4 c0x0000 (---------------) + I wielun - 0x002e2d45, // n0x19e5 c0x0000 (---------------) + I wlocl - 0x002e2d49, // n0x19e6 c0x0000 (---------------) + I wloclawek - 0x0030b189, // n0x19e7 c0x0000 (---------------) + I wodzislaw - 0x002609c7, // n0x19e8 c0x0000 (---------------) + I wolomin - 0x000e2bc4, // n0x19e9 c0x0000 (---------------) + wroc - 0x002e2bc7, // n0x19ea c0x0000 (---------------) + I wroclaw - 0x00207909, // n0x19eb c0x0000 (---------------) + I zachpomor - 0x00216245, // n0x19ec c0x0000 (---------------) + I zagan - 0x0002bf08, // n0x19ed c0x0000 (---------------) + zakopane - 0x00310d85, // n0x19ee c0x0000 (---------------) + I zarow - 0x00217185, // n0x19ef c0x0000 (---------------) + I zgora - 0x0021e549, // n0x19f0 c0x0000 (---------------) + I zgorzelec - 0x002105c2, // n0x19f1 c0x0000 (---------------) + I ap - 0x00253e04, // n0x19f2 c0x0000 (---------------) + I griw - 0x00200b42, // n0x19f3 c0x0000 (---------------) + I ic - 0x00202b42, // n0x19f4 c0x0000 (---------------) + I is - 0x00268d85, // n0x19f5 c0x0000 (---------------) + I kmpsp - 0x002c1788, // n0x19f6 c0x0000 (---------------) + I konsulat - 0x00379185, // n0x19f7 c0x0000 (---------------) + I kppsp - 0x002ac643, // n0x19f8 c0x0000 (---------------) + I kwp - 0x002ac645, // n0x19f9 c0x0000 (---------------) + I kwpsp - 0x002bb7c3, // n0x19fa c0x0000 (---------------) + I mup - 0x0020a142, // n0x19fb c0x0000 (---------------) + I mw - 0x002d3fc4, // n0x19fc c0x0000 (---------------) + I oirm - 0x002f3c43, // n0x19fd c0x0000 (---------------) + I oum - 0x002052c2, // n0x19fe c0x0000 (---------------) + I pa - 0x0036be84, // n0x19ff c0x0000 (---------------) + I pinb - 0x002c3b43, // n0x1a00 c0x0000 (---------------) + I piw - 0x00203f02, // n0x1a01 c0x0000 (---------------) + I po - 0x002369c3, // n0x1a02 c0x0000 (---------------) + I psp - 0x0027ac04, // n0x1a03 c0x0000 (---------------) + I psse - 0x002a32c3, // n0x1a04 c0x0000 (---------------) + I pup - 0x00370ac4, // n0x1a05 c0x0000 (---------------) + I rzgw - 0x00201a02, // n0x1a06 c0x0000 (---------------) + I sa - 0x0025ebc3, // n0x1a07 c0x0000 (---------------) + I sdn - 0x002206c3, // n0x1a08 c0x0000 (---------------) + I sko - 0x00201102, // n0x1a09 c0x0000 (---------------) + I so - 0x002ceec2, // n0x1a0a c0x0000 (---------------) + I sr - 0x0030afc9, // n0x1a0b c0x0000 (---------------) + I starostwo - 0x00205082, // n0x1a0c c0x0000 (---------------) + I ug - 0x0031c4c4, // n0x1a0d c0x0000 (---------------) + I ugim - 0x00209802, // n0x1a0e c0x0000 (---------------) + I um - 0x0020b6c4, // n0x1a0f c0x0000 (---------------) + I umig - 0x0026a844, // n0x1a10 c0x0000 (---------------) + I upow - 0x00243ec4, // n0x1a11 c0x0000 (---------------) + I uppo - 0x00209f42, // n0x1a12 c0x0000 (---------------) + I us - 0x0022f3c2, // n0x1a13 c0x0000 (---------------) + I uw - 0x0020c583, // n0x1a14 c0x0000 (---------------) + I uzs - 0x00345983, // n0x1a15 c0x0000 (---------------) + I wif - 0x002310c4, // n0x1a16 c0x0000 (---------------) + I wiih - 0x00270804, // n0x1a17 c0x0000 (---------------) + I winb - 0x002b8984, // n0x1a18 c0x0000 (---------------) + I wios - 0x002c9784, // n0x1a19 c0x0000 (---------------) + I witd - 0x0030b383, // n0x1a1a c0x0000 (---------------) + I wiw - 0x002725c3, // n0x1a1b c0x0000 (---------------) + I wsa - 0x0031be44, // n0x1a1c c0x0000 (---------------) + I wskr - 0x002e3d44, // n0x1a1d c0x0000 (---------------) + I wuoz - 0x002e4546, // n0x1a1e c0x0000 (---------------) + I wzmiuw - 0x002c2042, // n0x1a1f c0x0000 (---------------) + I zp - 0x00200742, // n0x1a20 c0x0000 (---------------) + I co - 0x002d75c3, // n0x1a21 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a22 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1a23 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a24 c0x0000 (---------------) + I org - 0x00201e82, // n0x1a25 c0x0000 (---------------) + I ac - 0x00310603, // n0x1a26 c0x0000 (---------------) + I biz - 0x00222ac3, // n0x1a27 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a28 c0x0000 (---------------) + I edu - 0x00208883, // n0x1a29 c0x0000 (---------------) + I est - 0x0021e283, // n0x1a2a c0x0000 (---------------) + I gov - 0x00200304, // n0x1a2b c0x0000 (---------------) + I info - 0x0030b284, // n0x1a2c c0x0000 (---------------) + I isla - 0x00298944, // n0x1a2d c0x0000 (---------------) + I name - 0x002170c3, // n0x1a2e c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a2f c0x0000 (---------------) + I org - 0x00218243, // n0x1a30 c0x0000 (---------------) + I pro - 0x002cc284, // n0x1a31 c0x0000 (---------------) + I prof - 0x002f2783, // n0x1a32 c0x0000 (---------------) + I aca - 0x0020c103, // n0x1a33 c0x0000 (---------------) + I bar - 0x0025b403, // n0x1a34 c0x0000 (---------------) + I cpa - 0x002674c3, // n0x1a35 c0x0000 (---------------) + I eng - 0x0029d803, // n0x1a36 c0x0000 (---------------) + I jur - 0x00253883, // n0x1a37 c0x0000 (---------------) + I law - 0x0020b403, // n0x1a38 c0x0000 (---------------) + I med - 0x00222ac3, // n0x1a39 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a3a c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a3b c0x0000 (---------------) + I gov - 0x002170c3, // n0x1a3c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a3d c0x0000 (---------------) + I org - 0x002c6b43, // n0x1a3e c0x0000 (---------------) + I plo - 0x00223f83, // n0x1a3f c0x0000 (---------------) + I sec - 0x000e4188, // n0x1a40 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a41 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a42 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a43 c0x0000 (---------------) + I gov - 0x00238c03, // n0x1a44 c0x0000 (---------------) + I int - 0x002170c3, // n0x1a45 c0x0000 (---------------) + I net - 0x0022cb84, // n0x1a46 c0x0000 (---------------) + I nome - 0x0021dcc3, // n0x1a47 c0x0000 (---------------) + I org - 0x00296544, // n0x1a48 c0x0000 (---------------) + I publ - 0x00251645, // n0x1a49 c0x0000 (---------------) + I belau - 0x00200742, // n0x1a4a c0x0000 (---------------) + I co - 0x00203fc2, // n0x1a4b c0x0000 (---------------) + I ed - 0x00202342, // n0x1a4c c0x0000 (---------------) + I go - 0x00201082, // n0x1a4d c0x0000 (---------------) + I ne - 0x00200c42, // n0x1a4e c0x0000 (---------------) + I or - 0x00222ac3, // n0x1a4f c0x0000 (---------------) + I com - 0x00228d44, // n0x1a50 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x1a51 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a52 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1a53 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1a54 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a55 c0x0000 (---------------) + I org - 0x000e4188, // n0x1a56 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a57 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1a58 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a59 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1a5a c0x0000 (---------------) + I mil - 0x00298944, // n0x1a5b c0x0000 (---------------) + I name - 0x002170c3, // n0x1a5c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1a5d c0x0000 (---------------) + I org - 0x00206103, // n0x1a5e c0x0000 (---------------) + I sch - 0x002729c4, // n0x1a5f c0x0000 (---------------) + I asso - 0x000e4188, // n0x1a60 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a61 c0x0000 (---------------) + I com - 0x00207cc3, // n0x1a62 c0x0000 (---------------) + I nom - 0x00246584, // n0x1a63 c0x0000 (---------------) + I arts - 0x000e4188, // n0x1a64 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1a65 c0x0000 (---------------) + I com - 0x00238544, // n0x1a66 c0x0000 (---------------) + I firm - 0x00200304, // n0x1a67 c0x0000 (---------------) + I info - 0x00207cc3, // n0x1a68 c0x0000 (---------------) + I nom - 0x00200e02, // n0x1a69 c0x0000 (---------------) + I nt - 0x0021dcc3, // n0x1a6a c0x0000 (---------------) + I org - 0x002e6343, // n0x1a6b c0x0000 (---------------) + I rec - 0x002cf4c5, // n0x1a6c c0x0000 (---------------) + I store - 0x00208902, // n0x1a6d c0x0000 (---------------) + I tm - 0x002e3e83, // n0x1a6e c0x0000 (---------------) + I www - 0x00201e82, // n0x1a6f c0x0000 (---------------) + I ac - 0x000e4188, // n0x1a70 c0x0000 (---------------) + blogspot - 0x00200742, // n0x1a71 c0x0000 (---------------) + I co - 0x002d75c3, // n0x1a72 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1a73 c0x0000 (---------------) + I gov - 0x00200242, // n0x1a74 c0x0000 (---------------) + I in - 0x0021dcc3, // n0x1a75 c0x0000 (---------------) + I org - 0x00201e82, // n0x1a76 c0x0000 (---------------) + I ac - 0x00382c47, // n0x1a77 c0x0000 (---------------) + I adygeya - 0x0028ee05, // n0x1a78 c0x0000 (---------------) + I altai - 0x00248504, // n0x1a79 c0x0000 (---------------) + I amur - 0x0036ab06, // n0x1a7a c0x0000 (---------------) + I amursk - 0x002f314b, // n0x1a7b c0x0000 (---------------) + I arkhangelsk - 0x002e9b49, // n0x1a7c c0x0000 (---------------) + I astrakhan - 0x002bec86, // n0x1a7d c0x0000 (---------------) + I baikal - 0x00309449, // n0x1a7e c0x0000 (---------------) + I bashkiria - 0x002c1a08, // n0x1a7f c0x0000 (---------------) + I belgorod - 0x00200503, // n0x1a80 c0x0000 (---------------) + I bir - 0x000e4188, // n0x1a81 c0x0000 (---------------) + blogspot - 0x0021cc07, // n0x1a82 c0x0000 (---------------) + I bryansk - 0x0021bc88, // n0x1a83 c0x0000 (---------------) + I buryatia - 0x00355dc3, // n0x1a84 c0x0000 (---------------) + I cbg - 0x002503c4, // n0x1a85 c0x0000 (---------------) + I chel - 0x002539cb, // n0x1a86 c0x0000 (---------------) + I chelyabinsk - 0x002932c5, // n0x1a87 c0x0000 (---------------) + I chita - 0x002ab708, // n0x1a88 c0x0000 (---------------) + I chukotka - 0x00313689, // n0x1a89 c0x0000 (---------------) + I chuvashia - 0x00249083, // n0x1a8a c0x0000 (---------------) + I cmw - 0x00222ac3, // n0x1a8b c0x0000 (---------------) + I com - 0x00309888, // n0x1a8c c0x0000 (---------------) + I dagestan - 0x002d3887, // n0x1a8d c0x0000 (---------------) + I dudinka - 0x00311a46, // n0x1a8e c0x0000 (---------------) + I e-burg - 0x002d75c3, // n0x1a8f c0x0000 (---------------) + I edu - 0x0032aa47, // n0x1a90 c0x0000 (---------------) + I fareast - 0x0021e283, // n0x1a91 c0x0000 (---------------) + I gov - 0x003789c6, // n0x1a92 c0x0000 (---------------) + I grozny - 0x00238c03, // n0x1a93 c0x0000 (---------------) + I int - 0x00220587, // n0x1a94 c0x0000 (---------------) + I irkutsk - 0x002f2a47, // n0x1a95 c0x0000 (---------------) + I ivanovo - 0x00379007, // n0x1a96 c0x0000 (---------------) + I izhevsk - 0x00321805, // n0x1a97 c0x0000 (---------------) + I jamal - 0x00202683, // n0x1a98 c0x0000 (---------------) + I jar - 0x002a248b, // n0x1a99 c0x0000 (---------------) + I joshkar-ola - 0x00312348, // n0x1a9a c0x0000 (---------------) + I k-uralsk - 0x002201c8, // n0x1a9b c0x0000 (---------------) + I kalmykia - 0x00305446, // n0x1a9c c0x0000 (---------------) + I kaluga - 0x0023a649, // n0x1a9d c0x0000 (---------------) + I kamchatka - 0x00365ac7, // n0x1a9e c0x0000 (---------------) + I karelia - 0x002dec85, // n0x1a9f c0x0000 (---------------) + I kazan - 0x0022d2c4, // n0x1aa0 c0x0000 (---------------) + I kchr - 0x00271548, // n0x1aa1 c0x0000 (---------------) + I kemerovo - 0x00235f8a, // n0x1aa2 c0x0000 (---------------) + I khabarovsk - 0x002361c9, // n0x1aa3 c0x0000 (---------------) + I khakassia - 0x0025be03, // n0x1aa4 c0x0000 (---------------) + I khv - 0x00254bc5, // n0x1aa5 c0x0000 (---------------) + I kirov - 0x00325683, // n0x1aa6 c0x0000 (---------------) + I kms - 0x002b9586, // n0x1aa7 c0x0000 (---------------) + I koenig - 0x003935c4, // n0x1aa8 c0x0000 (---------------) + I komi - 0x002e2f48, // n0x1aa9 c0x0000 (---------------) + I kostroma - 0x0039334b, // n0x1aaa c0x0000 (---------------) + I krasnoyarsk - 0x00331845, // n0x1aab c0x0000 (---------------) + I kuban - 0x002a4ac6, // n0x1aac c0x0000 (---------------) + I kurgan - 0x002a8e85, // n0x1aad c0x0000 (---------------) + I kursk - 0x002a9608, // n0x1aae c0x0000 (---------------) + I kustanai - 0x002aa1c7, // n0x1aaf c0x0000 (---------------) + I kuzbass - 0x003414c7, // n0x1ab0 c0x0000 (---------------) + I lipetsk - 0x0032ddc7, // n0x1ab1 c0x0000 (---------------) + I magadan - 0x00271948, // n0x1ab2 c0x0000 (---------------) + I magnitka - 0x00216504, // n0x1ab3 c0x0000 (---------------) + I mari - 0x00216507, // n0x1ab4 c0x0000 (---------------) + I mari-el - 0x003529c6, // n0x1ab5 c0x0000 (---------------) + I marine - 0x0023fa03, // n0x1ab6 c0x0000 (---------------) + I mil - 0x002b4208, // n0x1ab7 c0x0000 (---------------) + I mordovia - 0x00233f43, // n0x1ab8 c0x0000 (---------------) + I msk - 0x002bbd88, // n0x1ab9 c0x0000 (---------------) + I murmansk - 0x002bf205, // n0x1aba c0x0000 (---------------) + I mytis - 0x00332688, // n0x1abb c0x0000 (---------------) + I nakhodka - 0x00375747, // n0x1abc c0x0000 (---------------) + I nalchik - 0x002170c3, // n0x1abd c0x0000 (---------------) + I net - 0x002effc3, // n0x1abe c0x0000 (---------------) + I nkz - 0x00278ec4, // n0x1abf c0x0000 (---------------) + I nnov - 0x00228f07, // n0x1ac0 c0x0000 (---------------) + I norilsk - 0x00201343, // n0x1ac1 c0x0000 (---------------) + I nov - 0x002f2b0b, // n0x1ac2 c0x0000 (---------------) + I novosibirsk - 0x00217803, // n0x1ac3 c0x0000 (---------------) + I nsk - 0x00233f04, // n0x1ac4 c0x0000 (---------------) + I omsk - 0x002cf548, // n0x1ac5 c0x0000 (---------------) + I orenburg - 0x0021dcc3, // n0x1ac6 c0x0000 (---------------) + I org - 0x002c98c5, // n0x1ac7 c0x0000 (---------------) + I oryol - 0x002e3305, // n0x1ac8 c0x0000 (---------------) + I oskol - 0x00332586, // n0x1ac9 c0x0000 (---------------) + I palana - 0x00395385, // n0x1aca c0x0000 (---------------) + I penza - 0x002bf5c4, // n0x1acb c0x0000 (---------------) + I perm - 0x00207742, // n0x1acc c0x0000 (---------------) + I pp - 0x002ce183, // n0x1acd c0x0000 (---------------) + I ptz - 0x002be20a, // n0x1ace c0x0000 (---------------) + I pyatigorsk - 0x002ef043, // n0x1acf c0x0000 (---------------) + I rnd - 0x0030c189, // n0x1ad0 c0x0000 (---------------) + I rubtsovsk - 0x003227c6, // n0x1ad1 c0x0000 (---------------) + I ryazan - 0x00217648, // n0x1ad2 c0x0000 (---------------) + I sakhalin - 0x0027a746, // n0x1ad3 c0x0000 (---------------) + I samara - 0x00218487, // n0x1ad4 c0x0000 (---------------) + I saratov - 0x002b7c08, // n0x1ad5 c0x0000 (---------------) + I simbirsk - 0x002ae3c8, // n0x1ad6 c0x0000 (---------------) + I smolensk - 0x002c5603, // n0x1ad7 c0x0000 (---------------) + I snz - 0x00268e43, // n0x1ad8 c0x0000 (---------------) + I spb - 0x002187c9, // n0x1ad9 c0x0000 (---------------) + I stavropol - 0x002daf83, // n0x1ada c0x0000 (---------------) + I stv - 0x002d0c06, // n0x1adb c0x0000 (---------------) + I surgut - 0x0028ea86, // n0x1adc c0x0000 (---------------) + I syzran - 0x002fe106, // n0x1add c0x0000 (---------------) + I tambov - 0x0031df09, // n0x1ade c0x0000 (---------------) + I tatarstan - 0x002e3fc4, // n0x1adf c0x0000 (---------------) + I test - 0x0020fe03, // n0x1ae0 c0x0000 (---------------) + I tom - 0x00233ec5, // n0x1ae1 c0x0000 (---------------) + I tomsk - 0x0038c2c9, // n0x1ae2 c0x0000 (---------------) + I tsaritsyn - 0x00220683, // n0x1ae3 c0x0000 (---------------) + I tsk - 0x002d78c4, // n0x1ae4 c0x0000 (---------------) + I tula - 0x002d9504, // n0x1ae5 c0x0000 (---------------) + I tuva - 0x00248304, // n0x1ae6 c0x0000 (---------------) + I tver - 0x002a7d06, // n0x1ae7 c0x0000 (---------------) + I tyumen - 0x00309dc3, // n0x1ae8 c0x0000 (---------------) + I udm - 0x00309dc8, // n0x1ae9 c0x0000 (---------------) + I udmurtia - 0x00245a08, // n0x1aea c0x0000 (---------------) + I ulan-ude - 0x002fe246, // n0x1aeb c0x0000 (---------------) + I vdonsk - 0x002dea8b, // n0x1aec c0x0000 (---------------) + I vladikavkaz - 0x002dedc8, // n0x1aed c0x0000 (---------------) + I vladimir - 0x002defcb, // n0x1aee c0x0000 (---------------) + I vladivostok - 0x002df749, // n0x1aef c0x0000 (---------------) + I volgograd - 0x002e1147, // n0x1af0 c0x0000 (---------------) + I vologda - 0x002e1e48, // n0x1af1 c0x0000 (---------------) + I voronezh - 0x002e2b03, // n0x1af2 c0x0000 (---------------) + I vrn - 0x0037fec6, // n0x1af3 c0x0000 (---------------) + I vyatka - 0x0020d4c7, // n0x1af4 c0x0000 (---------------) + I yakutia - 0x00284405, // n0x1af5 c0x0000 (---------------) + I yamal - 0x00332d09, // n0x1af6 c0x0000 (---------------) + I yaroslavl - 0x0036e1cd, // n0x1af7 c0x0000 (---------------) + I yekaterinburg - 0x00217491, // n0x1af8 c0x0000 (---------------) + I yuzhno-sakhalinsk - 0x0029adc5, // n0x1af9 c0x0000 (---------------) + I zgrad - 0x00201e82, // n0x1afa c0x0000 (---------------) + I ac - 0x00200742, // n0x1afb c0x0000 (---------------) + I co - 0x00222ac3, // n0x1afc c0x0000 (---------------) + I com - 0x002d75c3, // n0x1afd c0x0000 (---------------) + I edu - 0x003579c4, // n0x1afe c0x0000 (---------------) + I gouv - 0x0021e283, // n0x1aff c0x0000 (---------------) + I gov - 0x00238c03, // n0x1b00 c0x0000 (---------------) + I int - 0x0023fa03, // n0x1b01 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b02 c0x0000 (---------------) + I net - 0x00222ac3, // n0x1b03 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b04 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b05 c0x0000 (---------------) + I gov - 0x0020b403, // n0x1b06 c0x0000 (---------------) + I med - 0x002170c3, // n0x1b07 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b08 c0x0000 (---------------) + I org - 0x00296543, // n0x1b09 c0x0000 (---------------) + I pub - 0x00206103, // n0x1b0a c0x0000 (---------------) + I sch - 0x00222ac3, // n0x1b0b c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b0c c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b0d c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b0e c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b0f c0x0000 (---------------) + I org - 0x00222ac3, // n0x1b10 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b11 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b12 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b13 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b14 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1b15 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b16 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b17 c0x0000 (---------------) + I gov - 0x00200304, // n0x1b18 c0x0000 (---------------) + I info - 0x0020b403, // n0x1b19 c0x0000 (---------------) + I med - 0x002170c3, // n0x1b1a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b1b c0x0000 (---------------) + I org - 0x0020bf42, // n0x1b1c c0x0000 (---------------) + I tv - 0x00200181, // n0x1b1d c0x0000 (---------------) + I a - 0x00201e82, // n0x1b1e c0x0000 (---------------) + I ac - 0x00200001, // n0x1b1f c0x0000 (---------------) + I b - 0x002fbc02, // n0x1b20 c0x0000 (---------------) + I bd - 0x000e4188, // n0x1b21 c0x0000 (---------------) + blogspot - 0x00213b05, // n0x1b22 c0x0000 (---------------) + I brand - 0x00200741, // n0x1b23 c0x0000 (---------------) + I c - 0x00022ac3, // n0x1b24 c0x0000 (---------------) + com - 0x002005c1, // n0x1b25 c0x0000 (---------------) + I d - 0x00200701, // n0x1b26 c0x0000 (---------------) + I e - 0x00200381, // n0x1b27 c0x0000 (---------------) + I f - 0x00235ec2, // n0x1b28 c0x0000 (---------------) + I fh - 0x00235ec4, // n0x1b29 c0x0000 (---------------) + I fhsk - 0x00351283, // n0x1b2a c0x0000 (---------------) + I fhv - 0x00200401, // n0x1b2b c0x0000 (---------------) + I g - 0x00200201, // n0x1b2c c0x0000 (---------------) + I h - 0x00200041, // n0x1b2d c0x0000 (---------------) + I i - 0x00201001, // n0x1b2e c0x0000 (---------------) + I k - 0x002c8587, // n0x1b2f c0x0000 (---------------) + I komforb - 0x002a8f8f, // n0x1b30 c0x0000 (---------------) + I kommunalforbund - 0x002b1a86, // n0x1b31 c0x0000 (---------------) + I komvux - 0x002008c1, // n0x1b32 c0x0000 (---------------) + I l - 0x00323b46, // n0x1b33 c0x0000 (---------------) + I lanbib - 0x002000c1, // n0x1b34 c0x0000 (---------------) + I m - 0x00200281, // n0x1b35 c0x0000 (---------------) + I n - 0x002f460e, // n0x1b36 c0x0000 (---------------) + I naturbruksgymn - 0x00200081, // n0x1b37 c0x0000 (---------------) + I o - 0x0021dcc3, // n0x1b38 c0x0000 (---------------) + I org - 0x00200b01, // n0x1b39 c0x0000 (---------------) + I p - 0x00290b05, // n0x1b3a c0x0000 (---------------) + I parti - 0x00207742, // n0x1b3b c0x0000 (---------------) + I pp - 0x0029abc5, // n0x1b3c c0x0000 (---------------) + I press - 0x00200581, // n0x1b3d c0x0000 (---------------) + I r - 0x002001c1, // n0x1b3e c0x0000 (---------------) + I s - 0x00200141, // n0x1b3f c0x0000 (---------------) + I t - 0x00208902, // n0x1b40 c0x0000 (---------------) + I tm - 0x00200101, // n0x1b41 c0x0000 (---------------) + I u - 0x00202541, // n0x1b42 c0x0000 (---------------) + I w - 0x00203ec1, // n0x1b43 c0x0000 (---------------) + I x - 0x00200801, // n0x1b44 c0x0000 (---------------) + I y - 0x00201901, // n0x1b45 c0x0000 (---------------) + I z - 0x000e4188, // n0x1b46 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1b47 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b48 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b49 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b4a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b4b c0x0000 (---------------) + I org - 0x00214943, // n0x1b4c c0x0000 (---------------) + I per - 0x00222ac3, // n0x1b4d c0x0000 (---------------) + I com - 0x0021e283, // n0x1b4e c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1b4f c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b50 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b51 c0x0000 (---------------) + I org - 0x014c56c8, // n0x1b52 c0x0005 (---------------)* o platform - 0x000e4188, // n0x1b53 c0x0000 (---------------) + blogspot - 0x000e4188, // n0x1b54 c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1b55 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b56 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b57 c0x0000 (---------------) + I gov - 0x002170c3, // n0x1b58 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b59 c0x0000 (---------------) + I org - 0x00200603, // n0x1b5a c0x0000 (---------------) + I art - 0x000e4188, // n0x1b5b c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1b5c c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b5d c0x0000 (---------------) + I edu - 0x003579c4, // n0x1b5e c0x0000 (---------------) + I gouv - 0x0021dcc3, // n0x1b5f c0x0000 (---------------) + I org - 0x0028acc5, // n0x1b60 c0x0000 (---------------) + I perso - 0x0029f044, // n0x1b61 c0x0000 (---------------) + I univ - 0x00222ac3, // n0x1b62 c0x0000 (---------------) + I com - 0x002170c3, // n0x1b63 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b64 c0x0000 (---------------) + I org - 0x00200742, // n0x1b65 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1b66 c0x0000 (---------------) + I com - 0x00224f09, // n0x1b67 c0x0000 (---------------) + I consulado - 0x002d75c3, // n0x1b68 c0x0000 (---------------) + I edu - 0x00271109, // n0x1b69 c0x0000 (---------------) + I embaixada - 0x0021e283, // n0x1b6a c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1b6b c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b6c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b6d c0x0000 (---------------) + I org - 0x002cb848, // n0x1b6e c0x0000 (---------------) + I principe - 0x0020fd47, // n0x1b6f c0x0000 (---------------) + I saotome - 0x002cf4c5, // n0x1b70 c0x0000 (---------------) + I store - 0x00382c47, // n0x1b71 c0x0000 (---------------) + I adygeya - 0x002f314b, // n0x1b72 c0x0000 (---------------) + I arkhangelsk - 0x00389cc8, // n0x1b73 c0x0000 (---------------) + I balashov - 0x00309449, // n0x1b74 c0x0000 (---------------) + I bashkiria - 0x0021cc07, // n0x1b75 c0x0000 (---------------) + I bryansk - 0x00309888, // n0x1b76 c0x0000 (---------------) + I dagestan - 0x003789c6, // n0x1b77 c0x0000 (---------------) + I grozny - 0x002f2a47, // n0x1b78 c0x0000 (---------------) + I ivanovo - 0x002201c8, // n0x1b79 c0x0000 (---------------) + I kalmykia - 0x00305446, // n0x1b7a c0x0000 (---------------) + I kaluga - 0x00365ac7, // n0x1b7b c0x0000 (---------------) + I karelia - 0x002361c9, // n0x1b7c c0x0000 (---------------) + I khakassia - 0x00384e89, // n0x1b7d c0x0000 (---------------) + I krasnodar - 0x002a4ac6, // n0x1b7e c0x0000 (---------------) + I kurgan - 0x00275dc5, // n0x1b7f c0x0000 (---------------) + I lenug - 0x002b4208, // n0x1b80 c0x0000 (---------------) + I mordovia - 0x00233f43, // n0x1b81 c0x0000 (---------------) + I msk - 0x002bbd88, // n0x1b82 c0x0000 (---------------) + I murmansk - 0x00375747, // n0x1b83 c0x0000 (---------------) + I nalchik - 0x00201343, // n0x1b84 c0x0000 (---------------) + I nov - 0x0032a707, // n0x1b85 c0x0000 (---------------) + I obninsk - 0x00395385, // n0x1b86 c0x0000 (---------------) + I penza - 0x002c8208, // n0x1b87 c0x0000 (---------------) + I pokrovsk - 0x00262b45, // n0x1b88 c0x0000 (---------------) + I sochi - 0x00268e43, // n0x1b89 c0x0000 (---------------) + I spb - 0x003547c9, // n0x1b8a c0x0000 (---------------) + I togliatti - 0x00295587, // n0x1b8b c0x0000 (---------------) + I troitsk - 0x002d78c4, // n0x1b8c c0x0000 (---------------) + I tula - 0x002d9504, // n0x1b8d c0x0000 (---------------) + I tuva - 0x002dea8b, // n0x1b8e c0x0000 (---------------) + I vladikavkaz - 0x002dedc8, // n0x1b8f c0x0000 (---------------) + I vladimir - 0x002e1147, // n0x1b90 c0x0000 (---------------) + I vologda - 0x00222ac3, // n0x1b91 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b92 c0x0000 (---------------) + I edu - 0x0034eb03, // n0x1b93 c0x0000 (---------------) + I gob - 0x0021dcc3, // n0x1b94 c0x0000 (---------------) + I org - 0x00230683, // n0x1b95 c0x0000 (---------------) + I red - 0x0021e283, // n0x1b96 c0x0000 (---------------) + I gov - 0x00222ac3, // n0x1b97 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1b98 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1b99 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1b9a c0x0000 (---------------) + I mil - 0x002170c3, // n0x1b9b c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1b9c c0x0000 (---------------) + I org - 0x00201e82, // n0x1b9d c0x0000 (---------------) + I ac - 0x00200742, // n0x1b9e c0x0000 (---------------) + I co - 0x0021dcc3, // n0x1b9f c0x0000 (---------------) + I org - 0x000e4188, // n0x1ba0 c0x0000 (---------------) + blogspot - 0x00201e82, // n0x1ba1 c0x0000 (---------------) + I ac - 0x00200742, // n0x1ba2 c0x0000 (---------------) + I co - 0x00202342, // n0x1ba3 c0x0000 (---------------) + I go - 0x00200242, // n0x1ba4 c0x0000 (---------------) + I in - 0x00204802, // n0x1ba5 c0x0000 (---------------) + I mi - 0x002170c3, // n0x1ba6 c0x0000 (---------------) + I net - 0x00200c42, // n0x1ba7 c0x0000 (---------------) + I or - 0x00201e82, // n0x1ba8 c0x0000 (---------------) + I ac - 0x00310603, // n0x1ba9 c0x0000 (---------------) + I biz - 0x00200742, // n0x1baa c0x0000 (---------------) + I co - 0x00222ac3, // n0x1bab c0x0000 (---------------) + I com - 0x002d75c3, // n0x1bac c0x0000 (---------------) + I edu - 0x00202342, // n0x1bad c0x0000 (---------------) + I go - 0x0021e283, // n0x1bae c0x0000 (---------------) + I gov - 0x00238c03, // n0x1baf c0x0000 (---------------) + I int - 0x0023fa03, // n0x1bb0 c0x0000 (---------------) + I mil - 0x00298944, // n0x1bb1 c0x0000 (---------------) + I name - 0x002170c3, // n0x1bb2 c0x0000 (---------------) + I net - 0x0020e3c3, // n0x1bb3 c0x0000 (---------------) + I nic - 0x0021dcc3, // n0x1bb4 c0x0000 (---------------) + I org - 0x002e3fc4, // n0x1bb5 c0x0000 (---------------) + I test - 0x00219fc3, // n0x1bb6 c0x0000 (---------------) + I web - 0x0021e283, // n0x1bb7 c0x0000 (---------------) + I gov - 0x00200742, // n0x1bb8 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1bb9 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1bba c0x0000 (---------------) + I edu - 0x0021e283, // n0x1bbb c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1bbc c0x0000 (---------------) + I mil - 0x002170c3, // n0x1bbd c0x0000 (---------------) + I net - 0x00207cc3, // n0x1bbe c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1bbf c0x0000 (---------------) + I org - 0x002efd87, // n0x1bc0 c0x0000 (---------------) + I agrinet - 0x00222ac3, // n0x1bc1 c0x0000 (---------------) + I com - 0x00245b87, // n0x1bc2 c0x0000 (---------------) + I defense - 0x002d75c6, // n0x1bc3 c0x0000 (---------------) + I edunet - 0x00210e83, // n0x1bc4 c0x0000 (---------------) + I ens - 0x00236403, // n0x1bc5 c0x0000 (---------------) + I fin - 0x0021e283, // n0x1bc6 c0x0000 (---------------) + I gov - 0x00215703, // n0x1bc7 c0x0000 (---------------) + I ind - 0x00200304, // n0x1bc8 c0x0000 (---------------) + I info - 0x002c5104, // n0x1bc9 c0x0000 (---------------) + I intl - 0x002d4086, // n0x1bca c0x0000 (---------------) + I mincom - 0x0023ac03, // n0x1bcb c0x0000 (---------------) + I nat - 0x002170c3, // n0x1bcc c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bcd c0x0000 (---------------) + I org - 0x0028acc5, // n0x1bce c0x0000 (---------------) + I perso - 0x003538c4, // n0x1bcf c0x0000 (---------------) + I rnrt - 0x002e6c03, // n0x1bd0 c0x0000 (---------------) + I rns - 0x00205b83, // n0x1bd1 c0x0000 (---------------) + I rnu - 0x002ae287, // n0x1bd2 c0x0000 (---------------) + I tourism - 0x0033c485, // n0x1bd3 c0x0000 (---------------) + I turen - 0x00222ac3, // n0x1bd4 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1bd5 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1bd6 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1bd7 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1bd8 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bd9 c0x0000 (---------------) + I org - 0x00201482, // n0x1bda c0x0000 (---------------) + I av - 0x002791c3, // n0x1bdb c0x0000 (---------------) + I bbs - 0x00251643, // n0x1bdc c0x0000 (---------------) + I bel - 0x00310603, // n0x1bdd c0x0000 (---------------) + I biz - 0x51622ac3, // n0x1bde c0x0145 (n0x1bef-n0x1bf0) + I com - 0x0022fb02, // n0x1bdf c0x0000 (---------------) + I dr - 0x002d75c3, // n0x1be0 c0x0000 (---------------) + I edu - 0x002012c3, // n0x1be1 c0x0000 (---------------) + I gen - 0x0021e283, // n0x1be2 c0x0000 (---------------) + I gov - 0x00200304, // n0x1be3 c0x0000 (---------------) + I info - 0x00312503, // n0x1be4 c0x0000 (---------------) + I k12 - 0x0023df03, // n0x1be5 c0x0000 (---------------) + I kep - 0x0023fa03, // n0x1be6 c0x0000 (---------------) + I mil - 0x00298944, // n0x1be7 c0x0000 (---------------) + I name - 0x51a1c742, // n0x1be8 c0x0146 (n0x1bf0-n0x1bf1) + I nc - 0x002170c3, // n0x1be9 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bea c0x0000 (---------------) + I org - 0x00218943, // n0x1beb c0x0000 (---------------) + I pol - 0x0022ba83, // n0x1bec c0x0000 (---------------) + I tel - 0x0020bf42, // n0x1bed c0x0000 (---------------) + I tv - 0x00219fc3, // n0x1bee c0x0000 (---------------) + I web - 0x000e4188, // n0x1bef c0x0000 (---------------) + blogspot - 0x0021e283, // n0x1bf0 c0x0000 (---------------) + I gov - 0x002751c4, // n0x1bf1 c0x0000 (---------------) + I aero - 0x00310603, // n0x1bf2 c0x0000 (---------------) + I biz - 0x00200742, // n0x1bf3 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1bf4 c0x0000 (---------------) + I com - 0x00228d44, // n0x1bf5 c0x0000 (---------------) + I coop - 0x002d75c3, // n0x1bf6 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1bf7 c0x0000 (---------------) + I gov - 0x00200304, // n0x1bf8 c0x0000 (---------------) + I info - 0x00238c03, // n0x1bf9 c0x0000 (---------------) + I int - 0x002a5d04, // n0x1bfa c0x0000 (---------------) + I jobs - 0x00203604, // n0x1bfb c0x0000 (---------------) + I mobi - 0x002bd646, // n0x1bfc c0x0000 (---------------) + I museum - 0x00298944, // n0x1bfd c0x0000 (---------------) + I name - 0x002170c3, // n0x1bfe c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1bff c0x0000 (---------------) + I org - 0x00218243, // n0x1c00 c0x0000 (---------------) + I pro - 0x0027f186, // n0x1c01 c0x0000 (---------------) + I travel - 0x00041e4b, // n0x1c02 c0x0000 (---------------) + better-than - 0x00009ac6, // n0x1c03 c0x0000 (---------------) + dyndns - 0x00019e0a, // n0x1c04 c0x0000 (---------------) + on-the-web - 0x00171e8a, // n0x1c05 c0x0000 (---------------) + worse-than - 0x000e4188, // n0x1c06 c0x0000 (---------------) + blogspot - 0x002752c4, // n0x1c07 c0x0000 (---------------) + I club - 0x00222ac3, // n0x1c08 c0x0000 (---------------) + I com - 0x003105c4, // n0x1c09 c0x0000 (---------------) + I ebiz - 0x002d75c3, // n0x1c0a c0x0000 (---------------) + I edu - 0x00212084, // n0x1c0b c0x0000 (---------------) + I game - 0x0021e283, // n0x1c0c c0x0000 (---------------) + I gov - 0x00300b83, // n0x1c0d c0x0000 (---------------) + I idv - 0x0023fa03, // n0x1c0e c0x0000 (---------------) + I mil - 0x002170c3, // n0x1c0f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1c10 c0x0000 (---------------) + I org - 0x0030d70b, // n0x1c11 c0x0000 (---------------) + I xn--czrw28b - 0x003867ca, // n0x1c12 c0x0000 (---------------) + I xn--uc0atv - 0x0039604c, // n0x1c13 c0x0000 (---------------) + I xn--zf0ao64a - 0x00201e82, // n0x1c14 c0x0000 (---------------) + I ac - 0x00200742, // n0x1c15 c0x0000 (---------------) + I co - 0x00202342, // n0x1c16 c0x0000 (---------------) + I go - 0x00294945, // n0x1c17 c0x0000 (---------------) + I hotel - 0x00200304, // n0x1c18 c0x0000 (---------------) + I info - 0x00208942, // n0x1c19 c0x0000 (---------------) + I me - 0x0023fa03, // n0x1c1a c0x0000 (---------------) + I mil - 0x00203604, // n0x1c1b c0x0000 (---------------) + I mobi - 0x00201082, // n0x1c1c c0x0000 (---------------) + I ne - 0x00200c42, // n0x1c1d c0x0000 (---------------) + I or - 0x00200982, // n0x1c1e c0x0000 (---------------) + I sc - 0x0020bf42, // n0x1c1f c0x0000 (---------------) + I tv - 0x0029d289, // n0x1c20 c0x0000 (---------------) + I cherkassy - 0x0028e908, // n0x1c21 c0x0000 (---------------) + I cherkasy - 0x00259889, // n0x1c22 c0x0000 (---------------) + I chernigov - 0x0025f489, // n0x1c23 c0x0000 (---------------) + I chernihiv - 0x0026b44a, // n0x1c24 c0x0000 (---------------) + I chernivtsi - 0x00367e8a, // n0x1c25 c0x0000 (---------------) + I chernovtsy - 0x00201782, // n0x1c26 c0x0000 (---------------) + I ck - 0x002211c2, // n0x1c27 c0x0000 (---------------) + I cn - 0x00200742, // n0x1c28 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1c29 c0x0000 (---------------) + I com - 0x0020c502, // n0x1c2a c0x0000 (---------------) + I cr - 0x00231c86, // n0x1c2b c0x0000 (---------------) + I crimea - 0x0033f802, // n0x1c2c c0x0000 (---------------) + I cv - 0x00209b82, // n0x1c2d c0x0000 (---------------) + I dn - 0x0036ad4e, // n0x1c2e c0x0000 (---------------) + I dnepropetrovsk - 0x0025ec0e, // n0x1c2f c0x0000 (---------------) + I dnipropetrovsk - 0x0026b2c7, // n0x1c30 c0x0000 (---------------) + I dominic - 0x003409c7, // n0x1c31 c0x0000 (---------------) + I donetsk - 0x00238b42, // n0x1c32 c0x0000 (---------------) + I dp - 0x002d75c3, // n0x1c33 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1c34 c0x0000 (---------------) + I gov - 0x00239ec2, // n0x1c35 c0x0000 (---------------) + I if - 0x00200242, // n0x1c36 c0x0000 (---------------) + I in - 0x0022cf4f, // n0x1c37 c0x0000 (---------------) + I ivano-frankivsk - 0x002176c2, // n0x1c38 c0x0000 (---------------) + I kh - 0x00244d07, // n0x1c39 c0x0000 (---------------) + I kharkiv - 0x0024cb07, // n0x1c3a c0x0000 (---------------) + I kharkov - 0x00250087, // n0x1c3b c0x0000 (---------------) + I kherson - 0x0025304c, // n0x1c3c c0x0000 (---------------) + I khmelnitskiy - 0x002581cc, // n0x1c3d c0x0000 (---------------) + I khmelnytskyi - 0x0037aac4, // n0x1c3e c0x0000 (---------------) + I kiev - 0x00254bca, // n0x1c3f c0x0000 (---------------) + I kirovograd - 0x00268d82, // n0x1c40 c0x0000 (---------------) + I km - 0x002034c2, // n0x1c41 c0x0000 (---------------) + I kr - 0x0029ed84, // n0x1c42 c0x0000 (---------------) + I krym - 0x00238082, // n0x1c43 c0x0000 (---------------) + I ks - 0x002aa8c2, // n0x1c44 c0x0000 (---------------) + I kv - 0x00258404, // n0x1c45 c0x0000 (---------------) + I kyiv - 0x0020e4c2, // n0x1c46 c0x0000 (---------------) + I lg - 0x00205ec2, // n0x1c47 c0x0000 (---------------) + I lt - 0x003054c7, // n0x1c48 c0x0000 (---------------) + I lugansk - 0x002e6745, // n0x1c49 c0x0000 (---------------) + I lutsk - 0x00227f02, // n0x1c4a c0x0000 (---------------) + I lv - 0x0022cec4, // n0x1c4b c0x0000 (---------------) + I lviv - 0x00356d82, // n0x1c4c c0x0000 (---------------) + I mk - 0x002f28c8, // n0x1c4d c0x0000 (---------------) + I mykolaiv - 0x002170c3, // n0x1c4e c0x0000 (---------------) + I net - 0x00342248, // n0x1c4f c0x0000 (---------------) + I nikolaev - 0x00200782, // n0x1c50 c0x0000 (---------------) + I od - 0x00227505, // n0x1c51 c0x0000 (---------------) + I odesa - 0x0035fa46, // n0x1c52 c0x0000 (---------------) + I odessa - 0x0021dcc3, // n0x1c53 c0x0000 (---------------) + I org - 0x00201e02, // n0x1c54 c0x0000 (---------------) + I pl - 0x002c8f07, // n0x1c55 c0x0000 (---------------) + I poltava - 0x00207742, // n0x1c56 c0x0000 (---------------) + I pp - 0x002cba85, // n0x1c57 c0x0000 (---------------) + I rivne - 0x00208085, // n0x1c58 c0x0000 (---------------) + I rovno - 0x00211fc2, // n0x1c59 c0x0000 (---------------) + I rv - 0x002046c2, // n0x1c5a c0x0000 (---------------) + I sb - 0x0035e2ca, // n0x1c5b c0x0000 (---------------) + I sebastopol - 0x0024688a, // n0x1c5c c0x0000 (---------------) + I sevastopol - 0x0023f582, // n0x1c5d c0x0000 (---------------) + I sm - 0x00308004, // n0x1c5e c0x0000 (---------------) + I sumy - 0x00203202, // n0x1c5f c0x0000 (---------------) + I te - 0x0036c988, // n0x1c60 c0x0000 (---------------) + I ternopil - 0x002018c2, // n0x1c61 c0x0000 (---------------) + I uz - 0x0036a1c8, // n0x1c62 c0x0000 (---------------) + I uzhgorod - 0x002dc087, // n0x1c63 c0x0000 (---------------) + I vinnica - 0x002dc4c9, // n0x1c64 c0x0000 (---------------) + I vinnytsia - 0x00208102, // n0x1c65 c0x0000 (---------------) + I vn - 0x002e1c05, // n0x1c66 c0x0000 (---------------) + I volyn - 0x0028edc5, // n0x1c67 c0x0000 (---------------) + I yalta - 0x002b214b, // n0x1c68 c0x0000 (---------------) + I zaporizhzhe - 0x002b2b8c, // n0x1c69 c0x0000 (---------------) + I zaporizhzhia - 0x00220408, // n0x1c6a c0x0000 (---------------) + I zhitomir - 0x002e1fc8, // n0x1c6b c0x0000 (---------------) + I zhytomyr - 0x002c2042, // n0x1c6c c0x0000 (---------------) + I zp - 0x0020fa82, // n0x1c6d c0x0000 (---------------) + I zt - 0x00201e82, // n0x1c6e c0x0000 (---------------) + I ac - 0x000e4188, // n0x1c6f c0x0000 (---------------) + blogspot - 0x00200742, // n0x1c70 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1c71 c0x0000 (---------------) + I com - 0x00202342, // n0x1c72 c0x0000 (---------------) + I go - 0x00201082, // n0x1c73 c0x0000 (---------------) + I ne - 0x00200c42, // n0x1c74 c0x0000 (---------------) + I or - 0x0021dcc3, // n0x1c75 c0x0000 (---------------) + I org - 0x00200982, // n0x1c76 c0x0000 (---------------) + I sc - 0x00201e82, // n0x1c77 c0x0000 (---------------) + I ac - 0x53a00742, // n0x1c78 c0x014e (n0x1c82-n0x1c83) + I co - 0x53e1e283, // n0x1c79 c0x014f (n0x1c83-n0x1c84) + I gov - 0x003413c3, // n0x1c7a c0x0000 (---------------) + I ltd - 0x00208942, // n0x1c7b c0x0000 (---------------) + I me - 0x002170c3, // n0x1c7c c0x0000 (---------------) + I net - 0x002037c3, // n0x1c7d c0x0000 (---------------) + I nhs - 0x0021dcc3, // n0x1c7e c0x0000 (---------------) + I org - 0x002c65c3, // n0x1c7f c0x0000 (---------------) + I plc - 0x00218946, // n0x1c80 c0x0000 (---------------) + I police - 0x01606103, // n0x1c81 c0x0005 (---------------)* o I sch - 0x000e4188, // n0x1c82 c0x0000 (---------------) + blogspot - 0x00043bc7, // n0x1c83 c0x0000 (---------------) + service - 0x54601a42, // n0x1c84 c0x0151 (n0x1cc3-n0x1cc6) + I ak - 0x54a00882, // n0x1c85 c0x0152 (n0x1cc6-n0x1cc9) + I al - 0x54e00602, // n0x1c86 c0x0153 (n0x1cc9-n0x1ccc) + I ar - 0x55200182, // n0x1c87 c0x0154 (n0x1ccc-n0x1ccf) + I as - 0x55608cc2, // n0x1c88 c0x0155 (n0x1ccf-n0x1cd2) + I az - 0x55a055c2, // n0x1c89 c0x0156 (n0x1cd2-n0x1cd5) + I ca - 0x55e00742, // n0x1c8a c0x0157 (n0x1cd5-n0x1cd8) + I co - 0x56223d82, // n0x1c8b c0x0158 (n0x1cd8-n0x1cdb) + I ct - 0x56616e02, // n0x1c8c c0x0159 (n0x1cdb-n0x1cde) + I dc - 0x56a006c2, // n0x1c8d c0x015a (n0x1cde-n0x1ce1) + I de - 0x0025ec03, // n0x1c8e c0x0000 (---------------) + I dni - 0x0020c743, // n0x1c8f c0x0000 (---------------) + I fed - 0x56e39b02, // n0x1c90 c0x015b (n0x1ce1-n0x1ce4) + I fl - 0x57201602, // n0x1c91 c0x015c (n0x1ce4-n0x1ce7) + I ga - 0x57629702, // n0x1c92 c0x015d (n0x1ce7-n0x1cea) + I gu - 0x57a00202, // n0x1c93 c0x015e (n0x1cea-n0x1cec) + I hi - 0x57e00482, // n0x1c94 c0x015f (n0x1cec-n0x1cef) + I ia - 0x58206202, // n0x1c95 c0x0160 (n0x1cef-n0x1cf2) + I id - 0x586036c2, // n0x1c96 c0x0161 (n0x1cf2-n0x1cf5) + I il - 0x58a00242, // n0x1c97 c0x0162 (n0x1cf5-n0x1cf8) + I in - 0x000aa785, // n0x1c98 c0x0000 (---------------) + is-by - 0x00209883, // n0x1c99 c0x0000 (---------------) + I isa - 0x00394c44, // n0x1c9a c0x0000 (---------------) + I kids - 0x58e38082, // n0x1c9b c0x0163 (n0x1cf8-n0x1cfb) + I ks - 0x59229082, // n0x1c9c c0x0164 (n0x1cfb-n0x1cfe) + I ky - 0x59601e42, // n0x1c9d c0x0165 (n0x1cfe-n0x1d01) + I la - 0x0006700b, // n0x1c9e c0x0000 (---------------) + land-4-sale - 0x59a04302, // n0x1c9f c0x0166 (n0x1d01-n0x1d04) + I ma - 0x5a238602, // n0x1ca0 c0x0168 (n0x1d07-n0x1d0a) + I md - 0x5a608942, // n0x1ca1 c0x0169 (n0x1d0a-n0x1d0d) + I me - 0x5aa04802, // n0x1ca2 c0x016a (n0x1d0d-n0x1d10) + I mi - 0x5ae17082, // n0x1ca3 c0x016b (n0x1d10-n0x1d13) + I mn - 0x5b203602, // n0x1ca4 c0x016c (n0x1d13-n0x1d16) + I mo - 0x5b609282, // n0x1ca5 c0x016d (n0x1d16-n0x1d19) + I ms - 0x5ba59642, // n0x1ca6 c0x016e (n0x1d19-n0x1d1c) + I mt - 0x5be1c742, // n0x1ca7 c0x016f (n0x1d1c-n0x1d1f) + I nc - 0x5c208f42, // n0x1ca8 c0x0170 (n0x1d1f-n0x1d21) + I nd - 0x5c601082, // n0x1ca9 c0x0171 (n0x1d21-n0x1d24) + I ne - 0x5ca037c2, // n0x1caa c0x0172 (n0x1d24-n0x1d27) + I nh - 0x5ce02942, // n0x1cab c0x0173 (n0x1d27-n0x1d2a) + I nj - 0x5d233c42, // n0x1cac c0x0174 (n0x1d2a-n0x1d2d) + I nm - 0x002c55c3, // n0x1cad c0x0000 (---------------) + I nsn - 0x5d608802, // n0x1cae c0x0175 (n0x1d2d-n0x1d30) + I nv - 0x5da108c2, // n0x1caf c0x0176 (n0x1d30-n0x1d33) + I ny - 0x5de051c2, // n0x1cb0 c0x0177 (n0x1d33-n0x1d36) + I oh - 0x5e201bc2, // n0x1cb1 c0x0178 (n0x1d36-n0x1d39) + I ok - 0x5e600c42, // n0x1cb2 c0x0179 (n0x1d39-n0x1d3c) + I or - 0x5ea052c2, // n0x1cb3 c0x017a (n0x1d3c-n0x1d3f) + I pa - 0x5ee18242, // n0x1cb4 c0x017b (n0x1d3f-n0x1d42) + I pr - 0x5f202842, // n0x1cb5 c0x017c (n0x1d42-n0x1d45) + I ri - 0x5f600982, // n0x1cb6 c0x017d (n0x1d45-n0x1d48) + I sc - 0x5fa4f842, // n0x1cb7 c0x017e (n0x1d48-n0x1d4a) + I sd - 0x000d044c, // n0x1cb8 c0x0000 (---------------) + stuff-4-sale - 0x5fe1d1c2, // n0x1cb9 c0x017f (n0x1d4a-n0x1d4d) + I tn - 0x60225242, // n0x1cba c0x0180 (n0x1d4d-n0x1d50) + I tx - 0x60600102, // n0x1cbb c0x0181 (n0x1d50-n0x1d53) + I ut - 0x60a013c2, // n0x1cbc c0x0182 (n0x1d53-n0x1d56) + I va - 0x60e13602, // n0x1cbd c0x0183 (n0x1d56-n0x1d59) + I vi - 0x6121e302, // n0x1cbe c0x0184 (n0x1d59-n0x1d5c) + I vt - 0x61602542, // n0x1cbf c0x0185 (n0x1d5c-n0x1d5f) + I wa - 0x61a05502, // n0x1cc0 c0x0186 (n0x1d5f-n0x1d62) + I wi - 0x61e63902, // n0x1cc1 c0x0187 (n0x1d62-n0x1d63) + I wv - 0x62237f82, // n0x1cc2 c0x0188 (n0x1d63-n0x1d66) + I wy - 0x0021aa82, // n0x1cc3 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cc4 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cc5 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cc6 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cc7 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cc8 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cc9 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cca c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ccb c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ccc c0x0000 (---------------) + I cc - 0x00312503, // n0x1ccd c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cce c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ccf c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd0 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cd1 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cd2 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd3 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cd4 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cd5 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd6 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cd7 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cd8 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cd9 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cda c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cdb c0x0000 (---------------) + I cc - 0x00312503, // n0x1cdc c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cdd c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cde c0x0000 (---------------) + I cc - 0x00312503, // n0x1cdf c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce0 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ce1 c0x0000 (---------------) + I cc - 0x00312503, // n0x1ce2 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce3 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ce4 c0x0000 (---------------) + I cc - 0x00312503, // n0x1ce5 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce6 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1ce7 c0x0000 (---------------) + I cc - 0x00312503, // n0x1ce8 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1ce9 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cea c0x0000 (---------------) + I cc - 0x00273c43, // n0x1ceb c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cec c0x0000 (---------------) + I cc - 0x00312503, // n0x1ced c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cee c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cef c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf0 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cf1 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cf2 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf3 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cf4 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cf5 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf6 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cf7 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cf8 c0x0000 (---------------) + I cc - 0x00312503, // n0x1cf9 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cfa c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cfb c0x0000 (---------------) + I cc - 0x00312503, // n0x1cfc c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1cfd c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1cfe c0x0000 (---------------) + I cc - 0x00312503, // n0x1cff c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d00 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d01 c0x0000 (---------------) + I cc - 0x59f12503, // n0x1d02 c0x0167 (n0x1d04-n0x1d07) + I k12 - 0x00273c43, // n0x1d03 c0x0000 (---------------) + I lib - 0x002e8ec4, // n0x1d04 c0x0000 (---------------) + I chtr - 0x0028e806, // n0x1d05 c0x0000 (---------------) + I paroch - 0x002ce243, // n0x1d06 c0x0000 (---------------) + I pvt - 0x0021aa82, // n0x1d07 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d08 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d09 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d0a c0x0000 (---------------) + I cc - 0x00312503, // n0x1d0b c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d0c c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d0d c0x0000 (---------------) + I cc - 0x00312503, // n0x1d0e c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d0f c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d10 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d11 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d12 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d13 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d14 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d15 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d16 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d17 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d18 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d19 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d1a c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d1b c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d1c c0x0000 (---------------) + I cc - 0x00312503, // n0x1d1d c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d1e c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d1f c0x0000 (---------------) + I cc - 0x00273c43, // n0x1d20 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d21 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d22 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d23 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d24 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d25 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d26 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d27 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d28 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d29 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d2a c0x0000 (---------------) + I cc - 0x00312503, // n0x1d2b c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d2c c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d2d c0x0000 (---------------) + I cc - 0x00312503, // n0x1d2e c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d2f c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d30 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d31 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d32 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d33 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d34 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d35 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d36 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d37 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d38 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d39 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d3a c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d3b c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d3c c0x0000 (---------------) + I cc - 0x00312503, // n0x1d3d c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d3e c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d3f c0x0000 (---------------) + I cc - 0x00312503, // n0x1d40 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d41 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d42 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d43 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d44 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d45 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d46 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d47 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d48 c0x0000 (---------------) + I cc - 0x00273c43, // n0x1d49 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d4a c0x0000 (---------------) + I cc - 0x00312503, // n0x1d4b c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d4c c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d4d c0x0000 (---------------) + I cc - 0x00312503, // n0x1d4e c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d4f c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d50 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d51 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d52 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d53 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d54 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d55 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d56 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d57 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d58 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d59 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d5a c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d5b c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d5c c0x0000 (---------------) + I cc - 0x00312503, // n0x1d5d c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d5e c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d5f c0x0000 (---------------) + I cc - 0x00312503, // n0x1d60 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d61 c0x0000 (---------------) + I lib - 0x0021aa82, // n0x1d62 c0x0000 (---------------) + I cc - 0x0021aa82, // n0x1d63 c0x0000 (---------------) + I cc - 0x00312503, // n0x1d64 c0x0000 (---------------) + I k12 - 0x00273c43, // n0x1d65 c0x0000 (---------------) + I lib - 0x62a22ac3, // n0x1d66 c0x018a (n0x1d6c-n0x1d6d) + I com - 0x002d75c3, // n0x1d67 c0x0000 (---------------) + I edu - 0x0032b9c3, // n0x1d68 c0x0000 (---------------) + I gub - 0x0023fa03, // n0x1d69 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1d6a c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d6b c0x0000 (---------------) + I org - 0x000e4188, // n0x1d6c c0x0000 (---------------) + blogspot - 0x00200742, // n0x1d6d c0x0000 (---------------) + I co - 0x00222ac3, // n0x1d6e c0x0000 (---------------) + I com - 0x002170c3, // n0x1d6f c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d70 c0x0000 (---------------) + I org - 0x00222ac3, // n0x1d71 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1d72 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1d73 c0x0000 (---------------) + I gov - 0x0023fa03, // n0x1d74 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1d75 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d76 c0x0000 (---------------) + I org - 0x00246584, // n0x1d77 c0x0000 (---------------) + I arts - 0x00200742, // n0x1d78 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1d79 c0x0000 (---------------) + I com - 0x0023ee43, // n0x1d7a c0x0000 (---------------) + I e12 - 0x002d75c3, // n0x1d7b c0x0000 (---------------) + I edu - 0x00238544, // n0x1d7c c0x0000 (---------------) + I firm - 0x0034eb03, // n0x1d7d c0x0000 (---------------) + I gob - 0x0021e283, // n0x1d7e c0x0000 (---------------) + I gov - 0x00200304, // n0x1d7f c0x0000 (---------------) + I info - 0x00238c03, // n0x1d80 c0x0000 (---------------) + I int - 0x0023fa03, // n0x1d81 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1d82 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d83 c0x0000 (---------------) + I org - 0x002e6343, // n0x1d84 c0x0000 (---------------) + I rec - 0x002cf4c5, // n0x1d85 c0x0000 (---------------) + I store - 0x0029d583, // n0x1d86 c0x0000 (---------------) + I tec - 0x00219fc3, // n0x1d87 c0x0000 (---------------) + I web - 0x00200742, // n0x1d88 c0x0000 (---------------) + I co - 0x00222ac3, // n0x1d89 c0x0000 (---------------) + I com - 0x00312503, // n0x1d8a c0x0000 (---------------) + I k12 - 0x002170c3, // n0x1d8b c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d8c c0x0000 (---------------) + I org - 0x00201e82, // n0x1d8d c0x0000 (---------------) + I ac - 0x00310603, // n0x1d8e c0x0000 (---------------) + I biz - 0x000e4188, // n0x1d8f c0x0000 (---------------) + blogspot - 0x00222ac3, // n0x1d90 c0x0000 (---------------) + I com - 0x002d75c3, // n0x1d91 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1d92 c0x0000 (---------------) + I gov - 0x00205e06, // n0x1d93 c0x0000 (---------------) + I health - 0x00200304, // n0x1d94 c0x0000 (---------------) + I info - 0x00238c03, // n0x1d95 c0x0000 (---------------) + I int - 0x00298944, // n0x1d96 c0x0000 (---------------) + I name - 0x002170c3, // n0x1d97 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d98 c0x0000 (---------------) + I org - 0x00218243, // n0x1d99 c0x0000 (---------------) + I pro - 0x00222ac3, // n0x1d9a c0x0000 (---------------) + I com - 0x002d75c3, // n0x1d9b c0x0000 (---------------) + I edu - 0x002170c3, // n0x1d9c c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1d9d c0x0000 (---------------) + I org - 0x00222ac3, // n0x1d9e c0x0000 (---------------) + I com - 0x00009ac6, // n0x1d9f c0x0000 (---------------) + dyndns - 0x002d75c3, // n0x1da0 c0x0000 (---------------) + I edu - 0x0021e283, // n0x1da1 c0x0000 (---------------) + I gov - 0x00108086, // n0x1da2 c0x0000 (---------------) + mypets - 0x002170c3, // n0x1da3 c0x0000 (---------------) + I net - 0x0021dcc3, // n0x1da4 c0x0000 (---------------) + I org - 0x002f1308, // n0x1da5 c0x0000 (---------------) + I xn--80au - 0x002f5c09, // n0x1da6 c0x0000 (---------------) + I xn--90azh - 0x00303289, // n0x1da7 c0x0000 (---------------) + I xn--c1avg - 0x00312fc8, // n0x1da8 c0x0000 (---------------) + I xn--d1at - 0x00362248, // n0x1da9 c0x0000 (---------------) + I xn--o1ac - 0x00362249, // n0x1daa c0x0000 (---------------) + I xn--o1ach - 0x00201e82, // n0x1dab c0x0000 (---------------) + I ac - 0x00301306, // n0x1dac c0x0000 (---------------) + I agrica - 0x00205e83, // n0x1dad c0x0000 (---------------) + I alt - 0x65200742, // n0x1dae c0x0194 (n0x1dbc-n0x1dbd) + I co - 0x002d75c3, // n0x1daf c0x0000 (---------------) + I edu - 0x0021e283, // n0x1db0 c0x0000 (---------------) + I gov - 0x002c6987, // n0x1db1 c0x0000 (---------------) + I grondar - 0x00253883, // n0x1db2 c0x0000 (---------------) + I law - 0x0023fa03, // n0x1db3 c0x0000 (---------------) + I mil - 0x002170c3, // n0x1db4 c0x0000 (---------------) + I net - 0x00202303, // n0x1db5 c0x0000 (---------------) + I ngo - 0x00208b83, // n0x1db6 c0x0000 (---------------) + I nis - 0x00207cc3, // n0x1db7 c0x0000 (---------------) + I nom - 0x0021dcc3, // n0x1db8 c0x0000 (---------------) + I org - 0x00235406, // n0x1db9 c0x0000 (---------------) + I school - 0x00208902, // n0x1dba c0x0000 (---------------) + I tm - 0x00219fc3, // n0x1dbb c0x0000 (---------------) + I web - 0x000e4188, // n0x1dbc c0x0000 (---------------) + blogspot -} - -// children is the list of nodes' children, the parent's wildcard bit and the -// parent's node type. If a node has no children then their children index -// will be in the range [0, 6), depending on the wildcard bit and node type. -// -// The layout within the uint32, from MSB to LSB, is: -// [ 1 bits] unused -// [ 1 bits] wildcard bit -// [ 2 bits] node type -// [14 bits] high nodes index (exclusive) of children -// [14 bits] low nodes index (inclusive) of children -var children = [...]uint32{ - 0x00000000, // c0x0000 (---------------) + - 0x10000000, // c0x0001 (---------------) ! - 0x20000000, // c0x0002 (---------------) o - 0x40000000, // c0x0003 (---------------)* + - 0x50000000, // c0x0004 (---------------)* ! - 0x60000000, // c0x0005 (---------------)* o - 0x014fc539, // c0x0006 (n0x0539-n0x053f) + - 0x0150053f, // c0x0007 (n0x053f-n0x0540) + - 0x01520540, // c0x0008 (n0x0540-n0x0548) + - 0x01684548, // c0x0009 (n0x0548-n0x05a1) + - 0x016985a1, // c0x000a (n0x05a1-n0x05a6) + - 0x016ac5a6, // c0x000b (n0x05a6-n0x05ab) + - 0x016bc5ab, // c0x000c (n0x05ab-n0x05af) + - 0x016d85af, // c0x000d (n0x05af-n0x05b6) + - 0x016dc5b6, // c0x000e (n0x05b6-n0x05b7) + - 0x016ec5b7, // c0x000f (n0x05b7-n0x05bb) + - 0x017045bb, // c0x0010 (n0x05bb-n0x05c1) + - 0x017285c1, // c0x0011 (n0x05c1-n0x05ca) + - 0x0172c5ca, // c0x0012 (n0x05ca-n0x05cb) + - 0x017445cb, // c0x0013 (n0x05cb-n0x05d1) + - 0x017485d1, // c0x0014 (n0x05d1-n0x05d2) + - 0x017645d2, // c0x0015 (n0x05d2-n0x05d9) + - 0x017685d9, // c0x0016 (n0x05d9-n0x05da) + - 0x017b05da, // c0x0017 (n0x05da-n0x05ec) + - 0x017b45ec, // c0x0018 (n0x05ec-n0x05ed) + - 0x017d45ed, // c0x0019 (n0x05ed-n0x05f5) + - 0x017e85f5, // c0x001a (n0x05f5-n0x05fa) + - 0x017ec5fa, // c0x001b (n0x05fa-n0x05fb) + - 0x0181c5fb, // c0x001c (n0x05fb-n0x0607) + - 0x01848607, // c0x001d (n0x0607-n0x0612) + - 0x01870612, // c0x001e (n0x0612-n0x061c) + - 0x0187861c, // c0x001f (n0x061c-n0x061e) + - 0x0187c61e, // c0x0020 (n0x061e-n0x061f) + - 0x0191061f, // c0x0021 (n0x061f-n0x0644) + - 0x01924644, // c0x0022 (n0x0644-n0x0649) + - 0x01938649, // c0x0023 (n0x0649-n0x064e) + - 0x0195464e, // c0x0024 (n0x064e-n0x0655) + - 0x01964655, // c0x0025 (n0x0655-n0x0659) + - 0x01978659, // c0x0026 (n0x0659-n0x065e) + - 0x0199c65e, // c0x0027 (n0x065e-n0x0667) + - 0x01ab4667, // c0x0028 (n0x0667-n0x06ad) + - 0x01ab86ad, // c0x0029 (n0x06ad-n0x06ae) + - 0x01acc6ae, // c0x002a (n0x06ae-n0x06b3) + - 0x01ae06b3, // c0x002b (n0x06b3-n0x06b8) + - 0x01ae86b8, // c0x002c (n0x06b8-n0x06ba) + - 0x01af86ba, // c0x002d (n0x06ba-n0x06be) + - 0x01afc6be, // c0x002e (n0x06be-n0x06bf) + - 0x01b146bf, // c0x002f (n0x06bf-n0x06c5) + - 0x01b586c5, // c0x0030 (n0x06c5-n0x06d6) + - 0x01b686d6, // c0x0031 (n0x06d6-n0x06da) + - 0x01b6c6da, // c0x0032 (n0x06da-n0x06db) + - 0x01b706db, // c0x0033 (n0x06db-n0x06dc) + - 0x01b746dc, // c0x0034 (n0x06dc-n0x06dd) + - 0x01bb06dd, // c0x0035 (n0x06dd-n0x06ec) + - 0x61bb46ec, // c0x0036 (n0x06ec-n0x06ed)* o - 0x01bc86ed, // c0x0037 (n0x06ed-n0x06f2) + - 0x01bd86f2, // c0x0038 (n0x06f2-n0x06f6) + - 0x01c8c6f6, // c0x0039 (n0x06f6-n0x0723) + - 0x21c90723, // c0x003a (n0x0723-n0x0724) o - 0x01c94724, // c0x003b (n0x0724-n0x0725) + - 0x01c98725, // c0x003c (n0x0725-n0x0726) + - 0x21c9c726, // c0x003d (n0x0726-n0x0727) o - 0x21ca0727, // c0x003e (n0x0727-n0x0728) o - 0x01cd4728, // c0x003f (n0x0728-n0x0735) + - 0x01cd8735, // c0x0040 (n0x0735-n0x0736) + - 0x01ffc736, // c0x0041 (n0x0736-n0x07ff) + - 0x220447ff, // c0x0042 (n0x07ff-n0x0811) o - 0x02068811, // c0x0043 (n0x0811-n0x081a) + - 0x0207081a, // c0x0044 (n0x081a-n0x081c) + - 0x2207481c, // c0x0045 (n0x081c-n0x081d) o - 0x0209081d, // c0x0046 (n0x081d-n0x0824) + - 0x020a8824, // c0x0047 (n0x0824-n0x082a) + - 0x020ac82a, // c0x0048 (n0x082a-n0x082b) + - 0x020bc82b, // c0x0049 (n0x082b-n0x082f) + - 0x020c482f, // c0x004a (n0x082f-n0x0831) + - 0x220f8831, // c0x004b (n0x0831-n0x083e) o - 0x020fc83e, // c0x004c (n0x083e-n0x083f) + - 0x0210083f, // c0x004d (n0x083f-n0x0840) + - 0x02120840, // c0x004e (n0x0840-n0x0848) + - 0x02124848, // c0x004f (n0x0848-n0x0849) + - 0x02138849, // c0x0050 (n0x0849-n0x084e) + - 0x0216084e, // c0x0051 (n0x084e-n0x0858) + - 0x02180858, // c0x0052 (n0x0858-n0x0860) + - 0x021b0860, // c0x0053 (n0x0860-n0x086c) + - 0x021d886c, // c0x0054 (n0x086c-n0x0876) + - 0x021dc876, // c0x0055 (n0x0876-n0x0877) + - 0x02200877, // c0x0056 (n0x0877-n0x0880) + - 0x02204880, // c0x0057 (n0x0880-n0x0881) + - 0x02218881, // c0x0058 (n0x0881-n0x0886) + - 0x0221c886, // c0x0059 (n0x0886-n0x0887) + - 0x0223c887, // c0x005a (n0x0887-n0x088f) + - 0x0224888f, // c0x005b (n0x088f-n0x0892) + - 0x022a8892, // c0x005c (n0x0892-n0x08aa) + - 0x022c48aa, // c0x005d (n0x08aa-n0x08b1) + - 0x022d08b1, // c0x005e (n0x08b1-n0x08b4) + - 0x022e48b4, // c0x005f (n0x08b4-n0x08b9) + - 0x022fc8b9, // c0x0060 (n0x08b9-n0x08bf) + - 0x023108bf, // c0x0061 (n0x08bf-n0x08c4) + - 0x023288c4, // c0x0062 (n0x08c4-n0x08ca) + - 0x023408ca, // c0x0063 (n0x08ca-n0x08d0) + - 0x023588d0, // c0x0064 (n0x08d0-n0x08d6) + - 0x023748d6, // c0x0065 (n0x08d6-n0x08dd) + - 0x023808dd, // c0x0066 (n0x08dd-n0x08e0) + - 0x023e08e0, // c0x0067 (n0x08e0-n0x08f8) + - 0x023f88f8, // c0x0068 (n0x08f8-n0x08fe) + - 0x0240c8fe, // c0x0069 (n0x08fe-n0x0903) + - 0x02450903, // c0x006a (n0x0903-n0x0914) + - 0x024d0914, // c0x006b (n0x0914-n0x0934) + - 0x024fc934, // c0x006c (n0x0934-n0x093f) + - 0x0250093f, // c0x006d (n0x093f-n0x0940) + - 0x02508940, // c0x006e (n0x0940-n0x0942) + - 0x6250c942, // c0x006f (n0x0942-n0x0943)* o - 0x22510943, // c0x0070 (n0x0943-n0x0944) o - 0x0252c944, // c0x0071 (n0x0944-n0x094b) + - 0x0253494b, // c0x0072 (n0x094b-n0x094d) + - 0x0256894d, // c0x0073 (n0x094d-n0x095a) + - 0x0259095a, // c0x0074 (n0x095a-n0x0964) + - 0x02594964, // c0x0075 (n0x0964-n0x0965) + - 0x025a0965, // c0x0076 (n0x0965-n0x0968) + - 0x025b8968, // c0x0077 (n0x0968-n0x096e) + - 0x025dc96e, // c0x0078 (n0x096e-n0x0977) + - 0x025fc977, // c0x0079 (n0x0977-n0x097f) + - 0x02bc097f, // c0x007a (n0x097f-n0x0af0) + - 0x02bccaf0, // c0x007b (n0x0af0-n0x0af3) + - 0x02becaf3, // c0x007c (n0x0af3-n0x0afb) + - 0x02da8afb, // c0x007d (n0x0afb-n0x0b6a) + - 0x02e78b6a, // c0x007e (n0x0b6a-n0x0b9e) + - 0x02ee8b9e, // c0x007f (n0x0b9e-n0x0bba) + - 0x02f40bba, // c0x0080 (n0x0bba-n0x0bd0) + - 0x03028bd0, // c0x0081 (n0x0bd0-n0x0c0a) + - 0x03080c0a, // c0x0082 (n0x0c0a-n0x0c20) + - 0x030bcc20, // c0x0083 (n0x0c20-n0x0c2f) + - 0x031b8c2f, // c0x0084 (n0x0c2f-n0x0c6e) + - 0x03284c6e, // c0x0085 (n0x0c6e-n0x0ca1) + - 0x0331cca1, // c0x0086 (n0x0ca1-n0x0cc7) + - 0x033accc7, // c0x0087 (n0x0cc7-n0x0ceb) + - 0x03410ceb, // c0x0088 (n0x0ceb-n0x0d04) + - 0x03648d04, // c0x0089 (n0x0d04-n0x0d92) + - 0x03700d92, // c0x008a (n0x0d92-n0x0dc0) + - 0x037ccdc0, // c0x008b (n0x0dc0-n0x0df3) + - 0x03818df3, // c0x008c (n0x0df3-n0x0e06) + - 0x038a0e06, // c0x008d (n0x0e06-n0x0e28) + - 0x038dce28, // c0x008e (n0x0e28-n0x0e37) + - 0x0392ce37, // c0x008f (n0x0e37-n0x0e4b) + - 0x039a4e4b, // c0x0090 (n0x0e4b-n0x0e69) + - 0x639a8e69, // c0x0091 (n0x0e69-n0x0e6a)* o - 0x639ace6a, // c0x0092 (n0x0e6a-n0x0e6b)* o - 0x639b0e6b, // c0x0093 (n0x0e6b-n0x0e6c)* o - 0x03a2ce6c, // c0x0094 (n0x0e6c-n0x0e8b) + - 0x03a94e8b, // c0x0095 (n0x0e8b-n0x0ea5) + - 0x03b10ea5, // c0x0096 (n0x0ea5-n0x0ec4) + - 0x03b88ec4, // c0x0097 (n0x0ec4-n0x0ee2) + - 0x03c0cee2, // c0x0098 (n0x0ee2-n0x0f03) + - 0x03c78f03, // c0x0099 (n0x0f03-n0x0f1e) + - 0x03da4f1e, // c0x009a (n0x0f1e-n0x0f69) + - 0x03dfcf69, // c0x009b (n0x0f69-n0x0f7f) + - 0x63e00f7f, // c0x009c (n0x0f7f-n0x0f80)* o - 0x03e98f80, // c0x009d (n0x0f80-n0x0fa6) + - 0x03f20fa6, // c0x009e (n0x0fa6-n0x0fc8) + - 0x03f6cfc8, // c0x009f (n0x0fc8-n0x0fdb) + - 0x03fd4fdb, // c0x00a0 (n0x0fdb-n0x0ff5) + - 0x0407cff5, // c0x00a1 (n0x0ff5-n0x101f) + - 0x0414501f, // c0x00a2 (n0x101f-n0x1051) + - 0x041ad051, // c0x00a3 (n0x1051-n0x106b) + - 0x042c106b, // c0x00a4 (n0x106b-n0x10b0) + - 0x642c50b0, // c0x00a5 (n0x10b0-n0x10b1)* o - 0x642c90b1, // c0x00a6 (n0x10b1-n0x10b2)* o - 0x043250b2, // c0x00a7 (n0x10b2-n0x10c9) + - 0x043810c9, // c0x00a8 (n0x10c9-n0x10e0) + - 0x044110e0, // c0x00a9 (n0x10e0-n0x1104) + - 0x0448d104, // c0x00aa (n0x1104-n0x1123) + - 0x044d1123, // c0x00ab (n0x1123-n0x1134) + - 0x045b5134, // c0x00ac (n0x1134-n0x116d) + - 0x045e916d, // c0x00ad (n0x116d-n0x117a) + - 0x0464917a, // c0x00ae (n0x117a-n0x1192) + - 0x046bd192, // c0x00af (n0x1192-n0x11af) + - 0x047451af, // c0x00b0 (n0x11af-n0x11d1) + - 0x047851d1, // c0x00b1 (n0x11d1-n0x11e1) + - 0x047f51e1, // c0x00b2 (n0x11e1-n0x11fd) + - 0x647f91fd, // c0x00b3 (n0x11fd-n0x11fe)* o - 0x647fd1fe, // c0x00b4 (n0x11fe-n0x11ff)* o - 0x248011ff, // c0x00b5 (n0x11ff-n0x1200) o - 0x04819200, // c0x00b6 (n0x1200-n0x1206) + - 0x04835206, // c0x00b7 (n0x1206-n0x120d) + - 0x0487920d, // c0x00b8 (n0x120d-n0x121e) + - 0x0488921e, // c0x00b9 (n0x121e-n0x1222) + - 0x048a1222, // c0x00ba (n0x1222-n0x1228) + - 0x04919228, // c0x00bb (n0x1228-n0x1246) + - 0x0492d246, // c0x00bc (n0x1246-n0x124b) + - 0x0494524b, // c0x00bd (n0x124b-n0x1251) + - 0x04969251, // c0x00be (n0x1251-n0x125a) + - 0x0497d25a, // c0x00bf (n0x125a-n0x125f) + - 0x0499525f, // c0x00c0 (n0x125f-n0x1265) + - 0x04999265, // c0x00c1 (n0x1265-n0x1266) + - 0x049d5266, // c0x00c2 (n0x1266-n0x1275) + - 0x049e9275, // c0x00c3 (n0x1275-n0x127a) + - 0x049f127a, // c0x00c4 (n0x127a-n0x127c) + - 0x049f927c, // c0x00c5 (n0x127c-n0x127e) + - 0x049fd27e, // c0x00c6 (n0x127e-n0x127f) + - 0x04a2127f, // c0x00c7 (n0x127f-n0x1288) + - 0x04a45288, // c0x00c8 (n0x1288-n0x1291) + - 0x04a5d291, // c0x00c9 (n0x1291-n0x1297) + - 0x04a65297, // c0x00ca (n0x1297-n0x1299) + - 0x04a69299, // c0x00cb (n0x1299-n0x129a) + - 0x04a8929a, // c0x00cc (n0x129a-n0x12a2) + - 0x04aa92a2, // c0x00cd (n0x12a2-n0x12aa) + - 0x04ac92aa, // c0x00ce (n0x12aa-n0x12b2) + - 0x04ae52b2, // c0x00cf (n0x12b2-n0x12b9) + - 0x04af52b9, // c0x00d0 (n0x12b9-n0x12bd) + - 0x04b092bd, // c0x00d1 (n0x12bd-n0x12c2) + - 0x04b112c2, // c0x00d2 (n0x12c2-n0x12c4) + - 0x04b252c4, // c0x00d3 (n0x12c4-n0x12c9) + - 0x04b352c9, // c0x00d4 (n0x12c9-n0x12cd) + - 0x04b392cd, // c0x00d5 (n0x12cd-n0x12ce) + - 0x04b552ce, // c0x00d6 (n0x12ce-n0x12d5) + - 0x053e52d5, // c0x00d7 (n0x12d5-n0x14f9) + - 0x0541d4f9, // c0x00d8 (n0x14f9-n0x1507) + - 0x05449507, // c0x00d9 (n0x1507-n0x1512) + - 0x05461512, // c0x00da (n0x1512-n0x1518) + - 0x05481518, // c0x00db (n0x1518-n0x1520) + - 0x65485520, // c0x00dc (n0x1520-n0x1521)* o - 0x054c9521, // c0x00dd (n0x1521-n0x1532) + - 0x054d1532, // c0x00de (n0x1532-n0x1534) + - 0x254d5534, // c0x00df (n0x1534-n0x1535) o - 0x254d9535, // c0x00e0 (n0x1535-n0x1536) o - 0x054dd536, // c0x00e1 (n0x1536-n0x1537) + - 0x055a1537, // c0x00e2 (n0x1537-n0x1568) + - 0x255a5568, // c0x00e3 (n0x1568-n0x1569) o - 0x255ad569, // c0x00e4 (n0x1569-n0x156b) o - 0x255b556b, // c0x00e5 (n0x156b-n0x156d) o - 0x255c156d, // c0x00e6 (n0x156d-n0x1570) o - 0x055e9570, // c0x00e7 (n0x1570-n0x157a) + - 0x0560d57a, // c0x00e8 (n0x157a-n0x1583) + - 0x05611583, // c0x00e9 (n0x1583-n0x1584) + - 0x0561d584, // c0x00ea (n0x1584-n0x1587) + - 0x06175587, // c0x00eb (n0x1587-n0x185d) + - 0x0617985d, // c0x00ec (n0x185d-n0x185e) + - 0x0617d85e, // c0x00ed (n0x185e-n0x185f) + - 0x2618185f, // c0x00ee (n0x185f-n0x1860) o - 0x06185860, // c0x00ef (n0x1860-n0x1861) + - 0x26189861, // c0x00f0 (n0x1861-n0x1862) o - 0x0618d862, // c0x00f1 (n0x1862-n0x1863) + - 0x26199863, // c0x00f2 (n0x1863-n0x1866) o - 0x0619d866, // c0x00f3 (n0x1866-n0x1867) + - 0x061a1867, // c0x00f4 (n0x1867-n0x1868) + - 0x261a5868, // c0x00f5 (n0x1868-n0x1869) o - 0x061a9869, // c0x00f6 (n0x1869-n0x186a) + - 0x261b186a, // c0x00f7 (n0x186a-n0x186c) o - 0x061b586c, // c0x00f8 (n0x186c-n0x186d) + - 0x061b986d, // c0x00f9 (n0x186d-n0x186e) + - 0x261c986e, // c0x00fa (n0x186e-n0x1872) o - 0x061cd872, // c0x00fb (n0x1872-n0x1873) + - 0x061d1873, // c0x00fc (n0x1873-n0x1874) + - 0x061d5874, // c0x00fd (n0x1874-n0x1875) + - 0x061d9875, // c0x00fe (n0x1875-n0x1876) + - 0x261dd876, // c0x00ff (n0x1876-n0x1877) o - 0x061e1877, // c0x0100 (n0x1877-n0x1878) + - 0x061e5878, // c0x0101 (n0x1878-n0x1879) + - 0x061e9879, // c0x0102 (n0x1879-n0x187a) + - 0x061ed87a, // c0x0103 (n0x187a-n0x187b) + - 0x261f587b, // c0x0104 (n0x187b-n0x187d) o - 0x061f987d, // c0x0105 (n0x187d-n0x187e) + - 0x061fd87e, // c0x0106 (n0x187e-n0x187f) + - 0x0620187f, // c0x0107 (n0x187f-n0x1880) + - 0x26205880, // c0x0108 (n0x1880-n0x1881) o - 0x06209881, // c0x0109 (n0x1881-n0x1882) + - 0x26211882, // c0x010a (n0x1882-n0x1884) o - 0x26215884, // c0x010b (n0x1884-n0x1885) o - 0x06231885, // c0x010c (n0x1885-n0x188c) + - 0x0623d88c, // c0x010d (n0x188c-n0x188f) + - 0x0627d88f, // c0x010e (n0x188f-n0x189f) + - 0x0628189f, // c0x010f (n0x189f-n0x18a0) + - 0x062a58a0, // c0x0110 (n0x18a0-n0x18a9) + - 0x0638d8a9, // c0x0111 (n0x18a9-n0x18e3) + - 0x263958e3, // c0x0112 (n0x18e3-n0x18e5) o - 0x263998e5, // c0x0113 (n0x18e5-n0x18e6) o - 0x2639d8e6, // c0x0114 (n0x18e6-n0x18e7) o - 0x063a58e7, // c0x0115 (n0x18e7-n0x18e9) + - 0x064818e9, // c0x0116 (n0x18e9-n0x1920) + - 0x064ad920, // c0x0117 (n0x1920-n0x192b) + - 0x064cd92b, // c0x0118 (n0x192b-n0x1933) + - 0x064d9933, // c0x0119 (n0x1933-n0x1936) + - 0x064f9936, // c0x011a (n0x1936-n0x193e) + - 0x0653193e, // c0x011b (n0x193e-n0x194c) + - 0x067c594c, // c0x011c (n0x194c-n0x19f1) + - 0x068819f1, // c0x011d (n0x19f1-n0x1a20) + - 0x06895a20, // c0x011e (n0x1a20-n0x1a25) + - 0x068c9a25, // c0x011f (n0x1a25-n0x1a32) + - 0x068e5a32, // c0x0120 (n0x1a32-n0x1a39) + - 0x06901a39, // c0x0121 (n0x1a39-n0x1a40) + - 0x06925a40, // c0x0122 (n0x1a40-n0x1a49) + - 0x0693da49, // c0x0123 (n0x1a49-n0x1a4f) + - 0x06959a4f, // c0x0124 (n0x1a4f-n0x1a56) + - 0x0697da56, // c0x0125 (n0x1a56-n0x1a5f) + - 0x0698da5f, // c0x0126 (n0x1a5f-n0x1a63) + - 0x069bda63, // c0x0127 (n0x1a63-n0x1a6f) + - 0x069d9a6f, // c0x0128 (n0x1a6f-n0x1a76) + - 0x06be9a76, // c0x0129 (n0x1a76-n0x1afa) + - 0x06c0dafa, // c0x012a (n0x1afa-n0x1b03) + - 0x06c2db03, // c0x012b (n0x1b03-n0x1b0b) + - 0x06c41b0b, // c0x012c (n0x1b0b-n0x1b10) + - 0x06c55b10, // c0x012d (n0x1b10-n0x1b15) + - 0x06c75b15, // c0x012e (n0x1b15-n0x1b1d) + - 0x06d19b1d, // c0x012f (n0x1b1d-n0x1b46) + - 0x06d35b46, // c0x0130 (n0x1b46-n0x1b4d) + - 0x06d4db4d, // c0x0131 (n0x1b4d-n0x1b53) + - 0x06d51b53, // c0x0132 (n0x1b53-n0x1b54) + - 0x06d55b54, // c0x0133 (n0x1b54-n0x1b55) + - 0x06d69b55, // c0x0134 (n0x1b55-n0x1b5a) + - 0x06d89b5a, // c0x0135 (n0x1b5a-n0x1b62) + - 0x06d95b62, // c0x0136 (n0x1b62-n0x1b65) + - 0x06dc5b65, // c0x0137 (n0x1b65-n0x1b71) + - 0x06e45b71, // c0x0138 (n0x1b71-n0x1b91) + - 0x06e59b91, // c0x0139 (n0x1b91-n0x1b96) + - 0x06e5db96, // c0x013a (n0x1b96-n0x1b97) + - 0x06e75b97, // c0x013b (n0x1b97-n0x1b9d) + - 0x06e81b9d, // c0x013c (n0x1b9d-n0x1ba0) + - 0x06e85ba0, // c0x013d (n0x1ba0-n0x1ba1) + - 0x06ea1ba1, // c0x013e (n0x1ba1-n0x1ba8) + - 0x06eddba8, // c0x013f (n0x1ba8-n0x1bb7) + - 0x06ee1bb7, // c0x0140 (n0x1bb7-n0x1bb8) + - 0x06f01bb8, // c0x0141 (n0x1bb8-n0x1bc0) + - 0x06f51bc0, // c0x0142 (n0x1bc0-n0x1bd4) + - 0x06f69bd4, // c0x0143 (n0x1bd4-n0x1bda) + - 0x06fbdbda, // c0x0144 (n0x1bda-n0x1bef) + - 0x06fc1bef, // c0x0145 (n0x1bef-n0x1bf0) + - 0x06fc5bf0, // c0x0146 (n0x1bf0-n0x1bf1) + - 0x07009bf1, // c0x0147 (n0x1bf1-n0x1c02) + - 0x07019c02, // c0x0148 (n0x1c02-n0x1c06) + - 0x07051c06, // c0x0149 (n0x1c06-n0x1c14) + - 0x07081c14, // c0x014a (n0x1c14-n0x1c20) + - 0x071b9c20, // c0x014b (n0x1c20-n0x1c6e) + - 0x071ddc6e, // c0x014c (n0x1c6e-n0x1c77) + - 0x07209c77, // c0x014d (n0x1c77-n0x1c82) + - 0x0720dc82, // c0x014e (n0x1c82-n0x1c83) + - 0x07211c83, // c0x014f (n0x1c83-n0x1c84) + - 0x0730dc84, // c0x0150 (n0x1c84-n0x1cc3) + - 0x07319cc3, // c0x0151 (n0x1cc3-n0x1cc6) + - 0x07325cc6, // c0x0152 (n0x1cc6-n0x1cc9) + - 0x07331cc9, // c0x0153 (n0x1cc9-n0x1ccc) + - 0x0733dccc, // c0x0154 (n0x1ccc-n0x1ccf) + - 0x07349ccf, // c0x0155 (n0x1ccf-n0x1cd2) + - 0x07355cd2, // c0x0156 (n0x1cd2-n0x1cd5) + - 0x07361cd5, // c0x0157 (n0x1cd5-n0x1cd8) + - 0x0736dcd8, // c0x0158 (n0x1cd8-n0x1cdb) + - 0x07379cdb, // c0x0159 (n0x1cdb-n0x1cde) + - 0x07385cde, // c0x015a (n0x1cde-n0x1ce1) + - 0x07391ce1, // c0x015b (n0x1ce1-n0x1ce4) + - 0x0739dce4, // c0x015c (n0x1ce4-n0x1ce7) + - 0x073a9ce7, // c0x015d (n0x1ce7-n0x1cea) + - 0x073b1cea, // c0x015e (n0x1cea-n0x1cec) + - 0x073bdcec, // c0x015f (n0x1cec-n0x1cef) + - 0x073c9cef, // c0x0160 (n0x1cef-n0x1cf2) + - 0x073d5cf2, // c0x0161 (n0x1cf2-n0x1cf5) + - 0x073e1cf5, // c0x0162 (n0x1cf5-n0x1cf8) + - 0x073edcf8, // c0x0163 (n0x1cf8-n0x1cfb) + - 0x073f9cfb, // c0x0164 (n0x1cfb-n0x1cfe) + - 0x07405cfe, // c0x0165 (n0x1cfe-n0x1d01) + - 0x07411d01, // c0x0166 (n0x1d01-n0x1d04) + - 0x0741dd04, // c0x0167 (n0x1d04-n0x1d07) + - 0x07429d07, // c0x0168 (n0x1d07-n0x1d0a) + - 0x07435d0a, // c0x0169 (n0x1d0a-n0x1d0d) + - 0x07441d0d, // c0x016a (n0x1d0d-n0x1d10) + - 0x0744dd10, // c0x016b (n0x1d10-n0x1d13) + - 0x07459d13, // c0x016c (n0x1d13-n0x1d16) + - 0x07465d16, // c0x016d (n0x1d16-n0x1d19) + - 0x07471d19, // c0x016e (n0x1d19-n0x1d1c) + - 0x0747dd1c, // c0x016f (n0x1d1c-n0x1d1f) + - 0x07485d1f, // c0x0170 (n0x1d1f-n0x1d21) + - 0x07491d21, // c0x0171 (n0x1d21-n0x1d24) + - 0x0749dd24, // c0x0172 (n0x1d24-n0x1d27) + - 0x074a9d27, // c0x0173 (n0x1d27-n0x1d2a) + - 0x074b5d2a, // c0x0174 (n0x1d2a-n0x1d2d) + - 0x074c1d2d, // c0x0175 (n0x1d2d-n0x1d30) + - 0x074cdd30, // c0x0176 (n0x1d30-n0x1d33) + - 0x074d9d33, // c0x0177 (n0x1d33-n0x1d36) + - 0x074e5d36, // c0x0178 (n0x1d36-n0x1d39) + - 0x074f1d39, // c0x0179 (n0x1d39-n0x1d3c) + - 0x074fdd3c, // c0x017a (n0x1d3c-n0x1d3f) + - 0x07509d3f, // c0x017b (n0x1d3f-n0x1d42) + - 0x07515d42, // c0x017c (n0x1d42-n0x1d45) + - 0x07521d45, // c0x017d (n0x1d45-n0x1d48) + - 0x07529d48, // c0x017e (n0x1d48-n0x1d4a) + - 0x07535d4a, // c0x017f (n0x1d4a-n0x1d4d) + - 0x07541d4d, // c0x0180 (n0x1d4d-n0x1d50) + - 0x0754dd50, // c0x0181 (n0x1d50-n0x1d53) + - 0x07559d53, // c0x0182 (n0x1d53-n0x1d56) + - 0x07565d56, // c0x0183 (n0x1d56-n0x1d59) + - 0x07571d59, // c0x0184 (n0x1d59-n0x1d5c) + - 0x0757dd5c, // c0x0185 (n0x1d5c-n0x1d5f) + - 0x07589d5f, // c0x0186 (n0x1d5f-n0x1d62) + - 0x0758dd62, // c0x0187 (n0x1d62-n0x1d63) + - 0x07599d63, // c0x0188 (n0x1d63-n0x1d66) + - 0x075b1d66, // c0x0189 (n0x1d66-n0x1d6c) + - 0x075b5d6c, // c0x018a (n0x1d6c-n0x1d6d) + - 0x075c5d6d, // c0x018b (n0x1d6d-n0x1d71) + - 0x075ddd71, // c0x018c (n0x1d71-n0x1d77) + - 0x07621d77, // c0x018d (n0x1d77-n0x1d88) + - 0x07635d88, // c0x018e (n0x1d88-n0x1d8d) + - 0x07669d8d, // c0x018f (n0x1d8d-n0x1d9a) + - 0x07679d9a, // c0x0190 (n0x1d9a-n0x1d9e) + - 0x07695d9e, // c0x0191 (n0x1d9e-n0x1da5) + - 0x076adda5, // c0x0192 (n0x1da5-n0x1dab) + - 0x276f1dab, // c0x0193 (n0x1dab-n0x1dbc) o - 0x076f5dbc, // c0x0194 (n0x1dbc-n0x1dbd) + -} - -// max children 404 (capacity 511) -// max text offset 26074 (capacity 32767) -// max text length 36 (capacity 63) -// max hi 7613 (capacity 16383) -// max lo 7612 (capacity 16383) diff --git a/vendor/golang.org/x/net/publicsuffix/table_test.go b/vendor/golang.org/x/net/publicsuffix/table_test.go deleted file mode 100644 index ec14b2d0..00000000 --- a/vendor/golang.org/x/net/publicsuffix/table_test.go +++ /dev/null @@ -1,15206 +0,0 @@ -// generated by go run gen.go; DO NOT EDIT - -package publicsuffix - -var rules = [...]string{ - "ac", - "com.ac", - "edu.ac", - "gov.ac", - "net.ac", - "mil.ac", - "org.ac", - "ad", - "nom.ad", - "ae", - "co.ae", - "net.ae", - "org.ae", - "sch.ae", - "ac.ae", - "gov.ae", - "mil.ae", - "aero", - "accident-investigation.aero", - "accident-prevention.aero", - "aerobatic.aero", - "aeroclub.aero", - "aerodrome.aero", - "agents.aero", - "aircraft.aero", - "airline.aero", - "airport.aero", - "air-surveillance.aero", - "airtraffic.aero", - "air-traffic-control.aero", - "ambulance.aero", - "amusement.aero", - "association.aero", - "author.aero", - "ballooning.aero", - "broker.aero", - "caa.aero", - "cargo.aero", - "catering.aero", - "certification.aero", - "championship.aero", - "charter.aero", - "civilaviation.aero", - "club.aero", - "conference.aero", - "consultant.aero", - "consulting.aero", - "control.aero", - "council.aero", - "crew.aero", - "design.aero", - "dgca.aero", - "educator.aero", - "emergency.aero", - "engine.aero", - "engineer.aero", - "entertainment.aero", - "equipment.aero", - "exchange.aero", - "express.aero", - "federation.aero", - "flight.aero", - "freight.aero", - "fuel.aero", - "gliding.aero", - "government.aero", - "groundhandling.aero", - "group.aero", - "hanggliding.aero", - "homebuilt.aero", - "insurance.aero", - "journal.aero", - "journalist.aero", - "leasing.aero", - "logistics.aero", - "magazine.aero", - "maintenance.aero", - "marketplace.aero", - "media.aero", - "microlight.aero", - "modelling.aero", - "navigation.aero", - "parachuting.aero", - "paragliding.aero", - "passenger-association.aero", - "pilot.aero", - "press.aero", - "production.aero", - "recreation.aero", - "repbody.aero", - "res.aero", - "research.aero", - "rotorcraft.aero", - "safety.aero", - "scientist.aero", - "services.aero", - "show.aero", - "skydiving.aero", - "software.aero", - "student.aero", - "taxi.aero", - "trader.aero", - "trading.aero", - "trainer.aero", - "union.aero", - "workinggroup.aero", - "works.aero", - "af", - "gov.af", - "com.af", - "org.af", - "net.af", - "edu.af", - "ag", - "com.ag", - "org.ag", - "net.ag", - "co.ag", - "nom.ag", - "ai", - "off.ai", - "com.ai", - "net.ai", - "org.ai", - "al", - "com.al", - "edu.al", - "gov.al", - "mil.al", - "net.al", - "org.al", - "am", - "an", - "com.an", - "net.an", - "org.an", - "edu.an", - "ao", - "ed.ao", - "gv.ao", - "og.ao", - "co.ao", - "pb.ao", - "it.ao", - "aq", - "ar", - "com.ar", - "edu.ar", - "gob.ar", - "gov.ar", - "int.ar", - "mil.ar", - "net.ar", - "org.ar", - "tur.ar", - "arpa", - "e164.arpa", - "in-addr.arpa", - "ip6.arpa", - "iris.arpa", - "uri.arpa", - "urn.arpa", - "as", - "gov.as", - "asia", - "at", - "ac.at", - "co.at", - "gv.at", - "or.at", - "au", - "com.au", - "net.au", - "org.au", - "edu.au", - "gov.au", - "asn.au", - "id.au", - "info.au", - "conf.au", - "oz.au", - "act.au", - "nsw.au", - "nt.au", - "qld.au", - "sa.au", - "tas.au", - "vic.au", - "wa.au", - "act.edu.au", - "nsw.edu.au", - "nt.edu.au", - "qld.edu.au", - "sa.edu.au", - "tas.edu.au", - "vic.edu.au", - "wa.edu.au", - "qld.gov.au", - "sa.gov.au", - "tas.gov.au", - "vic.gov.au", - "wa.gov.au", - "aw", - "com.aw", - "ax", - "az", - "com.az", - "net.az", - "int.az", - "gov.az", - "org.az", - "edu.az", - "info.az", - "pp.az", - "mil.az", - "name.az", - "pro.az", - "biz.az", - "ba", - "org.ba", - "net.ba", - "edu.ba", - "gov.ba", - "mil.ba", - "unsa.ba", - "unbi.ba", - "co.ba", - "com.ba", - "rs.ba", - "bb", - "biz.bb", - "co.bb", - "com.bb", - "edu.bb", - "gov.bb", - "info.bb", - "net.bb", - "org.bb", - "store.bb", - "tv.bb", - "*.bd", - "be", - "ac.be", - "bf", - "gov.bf", - "bg", - "a.bg", - "b.bg", - "c.bg", - "d.bg", - "e.bg", - "f.bg", - "g.bg", - "h.bg", - "i.bg", - "j.bg", - "k.bg", - "l.bg", - "m.bg", - "n.bg", - "o.bg", - "p.bg", - "q.bg", - "r.bg", - "s.bg", - "t.bg", - "u.bg", - "v.bg", - "w.bg", - "x.bg", - "y.bg", - "z.bg", - "0.bg", - "1.bg", - "2.bg", - "3.bg", - "4.bg", - "5.bg", - "6.bg", - "7.bg", - "8.bg", - "9.bg", - "bh", - "com.bh", - "edu.bh", - "net.bh", - "org.bh", - "gov.bh", - "bi", - "co.bi", - "com.bi", - "edu.bi", - "or.bi", - "org.bi", - "biz", - "bj", - "asso.bj", - "barreau.bj", - "gouv.bj", - "bm", - "com.bm", - "edu.bm", - "gov.bm", - "net.bm", - "org.bm", - "*.bn", - "bo", - "com.bo", - "edu.bo", - "gov.bo", - "gob.bo", - "int.bo", - "org.bo", - "net.bo", - "mil.bo", - "tv.bo", - "br", - "adm.br", - "adv.br", - "agr.br", - "am.br", - "arq.br", - "art.br", - "ato.br", - "b.br", - "bio.br", - "blog.br", - "bmd.br", - "cim.br", - "cng.br", - "cnt.br", - "com.br", - "coop.br", - "ecn.br", - "eco.br", - "edu.br", - "emp.br", - "eng.br", - "esp.br", - "etc.br", - "eti.br", - "far.br", - "flog.br", - "fm.br", - "fnd.br", - "fot.br", - "fst.br", - "g12.br", - "ggf.br", - "gov.br", - "imb.br", - "ind.br", - "inf.br", - "jor.br", - "jus.br", - "leg.br", - "lel.br", - "mat.br", - "med.br", - "mil.br", - "mp.br", - "mus.br", - "net.br", - "*.nom.br", - "not.br", - "ntr.br", - "odo.br", - "org.br", - "ppg.br", - "pro.br", - "psc.br", - "psi.br", - "qsl.br", - "radio.br", - "rec.br", - "slg.br", - "srv.br", - "taxi.br", - "teo.br", - "tmp.br", - "trd.br", - "tur.br", - "tv.br", - "vet.br", - "vlog.br", - "wiki.br", - "zlg.br", - "bs", - "com.bs", - "net.bs", - "org.bs", - "edu.bs", - "gov.bs", - "bt", - "com.bt", - "edu.bt", - "gov.bt", - "net.bt", - "org.bt", - "bv", - "bw", - "co.bw", - "org.bw", - "by", - "gov.by", - "mil.by", - "com.by", - "of.by", - "bz", - "com.bz", - "net.bz", - "org.bz", - "edu.bz", - "gov.bz", - "ca", - "ab.ca", - "bc.ca", - "mb.ca", - "nb.ca", - "nf.ca", - "nl.ca", - "ns.ca", - "nt.ca", - "nu.ca", - "on.ca", - "pe.ca", - "qc.ca", - "sk.ca", - "yk.ca", - "gc.ca", - "cat", - "cc", - "cd", - "gov.cd", - "cf", - "cg", - "ch", - "ci", - "org.ci", - "or.ci", - "com.ci", - "co.ci", - "edu.ci", - "ed.ci", - "ac.ci", - "net.ci", - "go.ci", - "asso.ci", - "xn--aroport-bya.ci", - "int.ci", - "presse.ci", - "md.ci", - "gouv.ci", - "*.ck", - "!www.ck", - "cl", - "gov.cl", - "gob.cl", - "co.cl", - "mil.cl", - "cm", - "co.cm", - "com.cm", - "gov.cm", - "net.cm", - "cn", - "ac.cn", - "com.cn", - "edu.cn", - "gov.cn", - "net.cn", - "org.cn", - "mil.cn", - "xn--55qx5d.cn", - "xn--io0a7i.cn", - "xn--od0alg.cn", - "ah.cn", - "bj.cn", - "cq.cn", - "fj.cn", - "gd.cn", - "gs.cn", - "gz.cn", - "gx.cn", - "ha.cn", - "hb.cn", - "he.cn", - "hi.cn", - "hl.cn", - "hn.cn", - "jl.cn", - "js.cn", - "jx.cn", - "ln.cn", - "nm.cn", - "nx.cn", - "qh.cn", - "sc.cn", - "sd.cn", - "sh.cn", - "sn.cn", - "sx.cn", - "tj.cn", - "xj.cn", - "xz.cn", - "yn.cn", - "zj.cn", - "hk.cn", - "mo.cn", - "tw.cn", - "co", - "arts.co", - "com.co", - "edu.co", - "firm.co", - "gov.co", - "info.co", - "int.co", - "mil.co", - "net.co", - "nom.co", - "org.co", - "rec.co", - "web.co", - "com", - "coop", - "cr", - "ac.cr", - "co.cr", - "ed.cr", - "fi.cr", - "go.cr", - "or.cr", - "sa.cr", - "cu", - "com.cu", - "edu.cu", - "org.cu", - "net.cu", - "gov.cu", - "inf.cu", - "cv", - "cw", - "com.cw", - "edu.cw", - "net.cw", - "org.cw", - "cx", - "gov.cx", - "ac.cy", - "biz.cy", - "com.cy", - "ekloges.cy", - "gov.cy", - "ltd.cy", - "name.cy", - "net.cy", - "org.cy", - "parliament.cy", - "press.cy", - "pro.cy", - "tm.cy", - "cz", - "de", - "dj", - "dk", - "dm", - "com.dm", - "net.dm", - "org.dm", - "edu.dm", - "gov.dm", - "do", - "art.do", - "com.do", - "edu.do", - "gob.do", - "gov.do", - "mil.do", - "net.do", - "org.do", - "sld.do", - "web.do", - "dz", - "com.dz", - "org.dz", - "net.dz", - "gov.dz", - "edu.dz", - "asso.dz", - "pol.dz", - "art.dz", - "ec", - "com.ec", - "info.ec", - "net.ec", - "fin.ec", - "k12.ec", - "med.ec", - "pro.ec", - "org.ec", - "edu.ec", - "gov.ec", - "gob.ec", - "mil.ec", - "edu", - "ee", - "edu.ee", - "gov.ee", - "riik.ee", - "lib.ee", - "med.ee", - "com.ee", - "pri.ee", - "aip.ee", - "org.ee", - "fie.ee", - "eg", - "com.eg", - "edu.eg", - "eun.eg", - "gov.eg", - "mil.eg", - "name.eg", - "net.eg", - "org.eg", - "sci.eg", - "*.er", - "es", - "com.es", - "nom.es", - "org.es", - "gob.es", - "edu.es", - "et", - "com.et", - "gov.et", - "org.et", - "edu.et", - "biz.et", - "name.et", - "info.et", - "net.et", - "eu", - "fi", - "aland.fi", - "*.fj", - "*.fk", - "fm", - "fo", - "fr", - "com.fr", - "asso.fr", - "nom.fr", - "prd.fr", - "presse.fr", - "tm.fr", - "aeroport.fr", - "assedic.fr", - "avocat.fr", - "avoues.fr", - "cci.fr", - "chambagri.fr", - "chirurgiens-dentistes.fr", - "experts-comptables.fr", - "geometre-expert.fr", - "gouv.fr", - "greta.fr", - "huissier-justice.fr", - "medecin.fr", - "notaires.fr", - "pharmacien.fr", - "port.fr", - "veterinaire.fr", - "ga", - "gb", - "gd", - "ge", - "com.ge", - "edu.ge", - "gov.ge", - "org.ge", - "mil.ge", - "net.ge", - "pvt.ge", - "gf", - "gg", - "co.gg", - "net.gg", - "org.gg", - "gh", - "com.gh", - "edu.gh", - "gov.gh", - "org.gh", - "mil.gh", - "gi", - "com.gi", - "ltd.gi", - "gov.gi", - "mod.gi", - "edu.gi", - "org.gi", - "gl", - "co.gl", - "com.gl", - "edu.gl", - "net.gl", - "org.gl", - "gm", - "gn", - "ac.gn", - "com.gn", - "edu.gn", - "gov.gn", - "org.gn", - "net.gn", - "gov", - "gp", - "com.gp", - "net.gp", - "mobi.gp", - "edu.gp", - "org.gp", - "asso.gp", - "gq", - "gr", - "com.gr", - "edu.gr", - "net.gr", - "org.gr", - "gov.gr", - "gs", - "gt", - "com.gt", - "edu.gt", - "gob.gt", - "ind.gt", - "mil.gt", - "net.gt", - "org.gt", - "*.gu", - "gw", - "gy", - "co.gy", - "com.gy", - "net.gy", - "hk", - "com.hk", - "edu.hk", - "gov.hk", - "idv.hk", - "net.hk", - "org.hk", - "xn--55qx5d.hk", - "xn--wcvs22d.hk", - "xn--lcvr32d.hk", - "xn--mxtq1m.hk", - "xn--gmqw5a.hk", - "xn--ciqpn.hk", - "xn--gmq050i.hk", - "xn--zf0avx.hk", - "xn--io0a7i.hk", - "xn--mk0axi.hk", - "xn--od0alg.hk", - "xn--od0aq3b.hk", - "xn--tn0ag.hk", - "xn--uc0atv.hk", - "xn--uc0ay4a.hk", - "hm", - "hn", - "com.hn", - "edu.hn", - "org.hn", - "net.hn", - "mil.hn", - "gob.hn", - "hr", - "iz.hr", - "from.hr", - "name.hr", - "com.hr", - "ht", - "com.ht", - "shop.ht", - "firm.ht", - "info.ht", - "adult.ht", - "net.ht", - "pro.ht", - "org.ht", - "med.ht", - "art.ht", - "coop.ht", - "pol.ht", - "asso.ht", - "edu.ht", - "rel.ht", - "gouv.ht", - "perso.ht", - "hu", - "co.hu", - "info.hu", - "org.hu", - "priv.hu", - "sport.hu", - "tm.hu", - "2000.hu", - "agrar.hu", - "bolt.hu", - "casino.hu", - "city.hu", - "erotica.hu", - "erotika.hu", - "film.hu", - "forum.hu", - "games.hu", - "hotel.hu", - "ingatlan.hu", - "jogasz.hu", - "konyvelo.hu", - "lakas.hu", - "media.hu", - "news.hu", - "reklam.hu", - "sex.hu", - "shop.hu", - "suli.hu", - "szex.hu", - "tozsde.hu", - "utazas.hu", - "video.hu", - "id", - "ac.id", - "biz.id", - "co.id", - "desa.id", - "go.id", - "mil.id", - "my.id", - "net.id", - "or.id", - "sch.id", - "web.id", - "ie", - "gov.ie", - "*.il", - "im", - "ac.im", - "co.im", - "com.im", - "ltd.co.im", - "net.im", - "org.im", - "plc.co.im", - "tt.im", - "tv.im", - "in", - "co.in", - "firm.in", - "net.in", - "org.in", - "gen.in", - "ind.in", - "nic.in", - "ac.in", - "edu.in", - "res.in", - "gov.in", - "mil.in", - "info", - "int", - "eu.int", - "io", - "com.io", - "iq", - "gov.iq", - "edu.iq", - "mil.iq", - "com.iq", - "org.iq", - "net.iq", - "ir", - "ac.ir", - "co.ir", - "gov.ir", - "id.ir", - "net.ir", - "org.ir", - "sch.ir", - "xn--mgba3a4f16a.ir", - "xn--mgba3a4fra.ir", - "is", - "net.is", - "com.is", - "edu.is", - "gov.is", - "org.is", - "int.is", - "it", - "gov.it", - "edu.it", - "abr.it", - "abruzzo.it", - "aosta-valley.it", - "aostavalley.it", - "bas.it", - "basilicata.it", - "cal.it", - "calabria.it", - "cam.it", - "campania.it", - "emilia-romagna.it", - "emiliaromagna.it", - "emr.it", - "friuli-v-giulia.it", - "friuli-ve-giulia.it", - "friuli-vegiulia.it", - "friuli-venezia-giulia.it", - "friuli-veneziagiulia.it", - "friuli-vgiulia.it", - "friuliv-giulia.it", - "friulive-giulia.it", - "friulivegiulia.it", - "friulivenezia-giulia.it", - "friuliveneziagiulia.it", - "friulivgiulia.it", - "fvg.it", - "laz.it", - "lazio.it", - "lig.it", - "liguria.it", - "lom.it", - "lombardia.it", - "lombardy.it", - "lucania.it", - "mar.it", - "marche.it", - "mol.it", - "molise.it", - "piedmont.it", - "piemonte.it", - "pmn.it", - "pug.it", - "puglia.it", - "sar.it", - "sardegna.it", - "sardinia.it", - "sic.it", - "sicilia.it", - "sicily.it", - "taa.it", - "tos.it", - "toscana.it", - "trentino-a-adige.it", - "trentino-aadige.it", - "trentino-alto-adige.it", - "trentino-altoadige.it", - "trentino-s-tirol.it", - "trentino-stirol.it", - "trentino-sud-tirol.it", - "trentino-sudtirol.it", - "trentino-sued-tirol.it", - "trentino-suedtirol.it", - "trentinoa-adige.it", - "trentinoaadige.it", - "trentinoalto-adige.it", - "trentinoaltoadige.it", - "trentinos-tirol.it", - "trentinostirol.it", - "trentinosud-tirol.it", - "trentinosudtirol.it", - "trentinosued-tirol.it", - "trentinosuedtirol.it", - "tuscany.it", - "umb.it", - "umbria.it", - "val-d-aosta.it", - "val-daosta.it", - "vald-aosta.it", - "valdaosta.it", - "valle-aosta.it", - "valle-d-aosta.it", - "valle-daosta.it", - "valleaosta.it", - "valled-aosta.it", - "valledaosta.it", - "vallee-aoste.it", - "valleeaoste.it", - "vao.it", - "vda.it", - "ven.it", - "veneto.it", - "ag.it", - "agrigento.it", - "al.it", - "alessandria.it", - "alto-adige.it", - "altoadige.it", - "an.it", - "ancona.it", - "andria-barletta-trani.it", - "andria-trani-barletta.it", - "andriabarlettatrani.it", - "andriatranibarletta.it", - "ao.it", - "aosta.it", - "aoste.it", - "ap.it", - "aq.it", - "aquila.it", - "ar.it", - "arezzo.it", - "ascoli-piceno.it", - "ascolipiceno.it", - "asti.it", - "at.it", - "av.it", - "avellino.it", - "ba.it", - "balsan.it", - "bari.it", - "barletta-trani-andria.it", - "barlettatraniandria.it", - "belluno.it", - "benevento.it", - "bergamo.it", - "bg.it", - "bi.it", - "biella.it", - "bl.it", - "bn.it", - "bo.it", - "bologna.it", - "bolzano.it", - "bozen.it", - "br.it", - "brescia.it", - "brindisi.it", - "bs.it", - "bt.it", - "bz.it", - "ca.it", - "cagliari.it", - "caltanissetta.it", - "campidano-medio.it", - "campidanomedio.it", - "campobasso.it", - "carbonia-iglesias.it", - "carboniaiglesias.it", - "carrara-massa.it", - "carraramassa.it", - "caserta.it", - "catania.it", - "catanzaro.it", - "cb.it", - "ce.it", - "cesena-forli.it", - "cesenaforli.it", - "ch.it", - "chieti.it", - "ci.it", - "cl.it", - "cn.it", - "co.it", - "como.it", - "cosenza.it", - "cr.it", - "cremona.it", - "crotone.it", - "cs.it", - "ct.it", - "cuneo.it", - "cz.it", - "dell-ogliastra.it", - "dellogliastra.it", - "en.it", - "enna.it", - "fc.it", - "fe.it", - "fermo.it", - "ferrara.it", - "fg.it", - "fi.it", - "firenze.it", - "florence.it", - "fm.it", - "foggia.it", - "forli-cesena.it", - "forlicesena.it", - "fr.it", - "frosinone.it", - "ge.it", - "genoa.it", - "genova.it", - "go.it", - "gorizia.it", - "gr.it", - "grosseto.it", - "iglesias-carbonia.it", - "iglesiascarbonia.it", - "im.it", - "imperia.it", - "is.it", - "isernia.it", - "kr.it", - "la-spezia.it", - "laquila.it", - "laspezia.it", - "latina.it", - "lc.it", - "le.it", - "lecce.it", - "lecco.it", - "li.it", - "livorno.it", - "lo.it", - "lodi.it", - "lt.it", - "lu.it", - "lucca.it", - "macerata.it", - "mantova.it", - "massa-carrara.it", - "massacarrara.it", - "matera.it", - "mb.it", - "mc.it", - "me.it", - "medio-campidano.it", - "mediocampidano.it", - "messina.it", - "mi.it", - "milan.it", - "milano.it", - "mn.it", - "mo.it", - "modena.it", - "monza-brianza.it", - "monza-e-della-brianza.it", - "monza.it", - "monzabrianza.it", - "monzaebrianza.it", - "monzaedellabrianza.it", - "ms.it", - "mt.it", - "na.it", - "naples.it", - "napoli.it", - "no.it", - "novara.it", - "nu.it", - "nuoro.it", - "og.it", - "ogliastra.it", - "olbia-tempio.it", - "olbiatempio.it", - "or.it", - "oristano.it", - "ot.it", - "pa.it", - "padova.it", - "padua.it", - "palermo.it", - "parma.it", - "pavia.it", - "pc.it", - "pd.it", - "pe.it", - "perugia.it", - "pesaro-urbino.it", - "pesarourbino.it", - "pescara.it", - "pg.it", - "pi.it", - "piacenza.it", - "pisa.it", - "pistoia.it", - "pn.it", - "po.it", - "pordenone.it", - "potenza.it", - "pr.it", - "prato.it", - "pt.it", - "pu.it", - "pv.it", - "pz.it", - "ra.it", - "ragusa.it", - "ravenna.it", - "rc.it", - "re.it", - "reggio-calabria.it", - "reggio-emilia.it", - "reggiocalabria.it", - "reggioemilia.it", - "rg.it", - "ri.it", - "rieti.it", - "rimini.it", - "rm.it", - "rn.it", - "ro.it", - "roma.it", - "rome.it", - "rovigo.it", - "sa.it", - "salerno.it", - "sassari.it", - "savona.it", - "si.it", - "siena.it", - "siracusa.it", - "so.it", - "sondrio.it", - "sp.it", - "sr.it", - "ss.it", - "suedtirol.it", - "sv.it", - "ta.it", - "taranto.it", - "te.it", - "tempio-olbia.it", - "tempioolbia.it", - "teramo.it", - "terni.it", - "tn.it", - "to.it", - "torino.it", - "tp.it", - "tr.it", - "trani-andria-barletta.it", - "trani-barletta-andria.it", - "traniandriabarletta.it", - "tranibarlettaandria.it", - "trapani.it", - "trentino.it", - "trento.it", - "treviso.it", - "trieste.it", - "ts.it", - "turin.it", - "tv.it", - "ud.it", - "udine.it", - "urbino-pesaro.it", - "urbinopesaro.it", - "va.it", - "varese.it", - "vb.it", - "vc.it", - "ve.it", - "venezia.it", - "venice.it", - "verbania.it", - "vercelli.it", - "verona.it", - "vi.it", - "vibo-valentia.it", - "vibovalentia.it", - "vicenza.it", - "viterbo.it", - "vr.it", - "vs.it", - "vt.it", - "vv.it", - "je", - "co.je", - "net.je", - "org.je", - "*.jm", - "jo", - "com.jo", - "org.jo", - "net.jo", - "edu.jo", - "sch.jo", - "gov.jo", - "mil.jo", - "name.jo", - "jobs", - "jp", - "ac.jp", - "ad.jp", - "co.jp", - "ed.jp", - "go.jp", - "gr.jp", - "lg.jp", - "ne.jp", - "or.jp", - "aichi.jp", - "akita.jp", - "aomori.jp", - "chiba.jp", - "ehime.jp", - "fukui.jp", - "fukuoka.jp", - "fukushima.jp", - "gifu.jp", - "gunma.jp", - "hiroshima.jp", - "hokkaido.jp", - "hyogo.jp", - "ibaraki.jp", - "ishikawa.jp", - "iwate.jp", - "kagawa.jp", - "kagoshima.jp", - "kanagawa.jp", - "kochi.jp", - "kumamoto.jp", - "kyoto.jp", - "mie.jp", - "miyagi.jp", - "miyazaki.jp", - "nagano.jp", - "nagasaki.jp", - "nara.jp", - "niigata.jp", - "oita.jp", - "okayama.jp", - "okinawa.jp", - "osaka.jp", - "saga.jp", - "saitama.jp", - "shiga.jp", - "shimane.jp", - "shizuoka.jp", - "tochigi.jp", - "tokushima.jp", - "tokyo.jp", - "tottori.jp", - "toyama.jp", - "wakayama.jp", - "yamagata.jp", - "yamaguchi.jp", - "yamanashi.jp", - "xn--4pvxs.jp", - "xn--vgu402c.jp", - "xn--c3s14m.jp", - "xn--f6qx53a.jp", - "xn--8pvr4u.jp", - "xn--uist22h.jp", - "xn--djrs72d6uy.jp", - "xn--mkru45i.jp", - "xn--0trq7p7nn.jp", - "xn--8ltr62k.jp", - "xn--2m4a15e.jp", - "xn--efvn9s.jp", - "xn--32vp30h.jp", - "xn--4it797k.jp", - "xn--1lqs71d.jp", - "xn--5rtp49c.jp", - "xn--5js045d.jp", - "xn--ehqz56n.jp", - "xn--1lqs03n.jp", - "xn--qqqt11m.jp", - "xn--kbrq7o.jp", - "xn--pssu33l.jp", - "xn--ntsq17g.jp", - "xn--uisz3g.jp", - "xn--6btw5a.jp", - "xn--1ctwo.jp", - "xn--6orx2r.jp", - "xn--rht61e.jp", - "xn--rht27z.jp", - "xn--djty4k.jp", - "xn--nit225k.jp", - "xn--rht3d.jp", - "xn--klty5x.jp", - "xn--kltx9a.jp", - "xn--kltp7d.jp", - "xn--uuwu58a.jp", - "xn--zbx025d.jp", - "xn--ntso0iqx3a.jp", - "xn--elqq16h.jp", - "xn--4it168d.jp", - "xn--klt787d.jp", - "xn--rny31h.jp", - "xn--7t0a264c.jp", - "xn--5rtq34k.jp", - "xn--k7yn95e.jp", - "xn--tor131o.jp", - "xn--d5qv7z876c.jp", - "*.kawasaki.jp", - "*.kitakyushu.jp", - "*.kobe.jp", - "*.nagoya.jp", - "*.sapporo.jp", - "*.sendai.jp", - "*.yokohama.jp", - "!city.kawasaki.jp", - "!city.kitakyushu.jp", - "!city.kobe.jp", - "!city.nagoya.jp", - "!city.sapporo.jp", - "!city.sendai.jp", - "!city.yokohama.jp", - "aisai.aichi.jp", - "ama.aichi.jp", - "anjo.aichi.jp", - "asuke.aichi.jp", - "chiryu.aichi.jp", - "chita.aichi.jp", - "fuso.aichi.jp", - "gamagori.aichi.jp", - "handa.aichi.jp", - "hazu.aichi.jp", - "hekinan.aichi.jp", - "higashiura.aichi.jp", - "ichinomiya.aichi.jp", - "inazawa.aichi.jp", - "inuyama.aichi.jp", - "isshiki.aichi.jp", - "iwakura.aichi.jp", - "kanie.aichi.jp", - "kariya.aichi.jp", - "kasugai.aichi.jp", - "kira.aichi.jp", - "kiyosu.aichi.jp", - "komaki.aichi.jp", - "konan.aichi.jp", - "kota.aichi.jp", - "mihama.aichi.jp", - "miyoshi.aichi.jp", - "nishio.aichi.jp", - "nisshin.aichi.jp", - "obu.aichi.jp", - "oguchi.aichi.jp", - "oharu.aichi.jp", - "okazaki.aichi.jp", - "owariasahi.aichi.jp", - "seto.aichi.jp", - "shikatsu.aichi.jp", - "shinshiro.aichi.jp", - "shitara.aichi.jp", - "tahara.aichi.jp", - "takahama.aichi.jp", - "tobishima.aichi.jp", - "toei.aichi.jp", - "togo.aichi.jp", - "tokai.aichi.jp", - "tokoname.aichi.jp", - "toyoake.aichi.jp", - "toyohashi.aichi.jp", - "toyokawa.aichi.jp", - "toyone.aichi.jp", - "toyota.aichi.jp", - "tsushima.aichi.jp", - "yatomi.aichi.jp", - "akita.akita.jp", - "daisen.akita.jp", - "fujisato.akita.jp", - "gojome.akita.jp", - "hachirogata.akita.jp", - "happou.akita.jp", - "higashinaruse.akita.jp", - "honjo.akita.jp", - "honjyo.akita.jp", - "ikawa.akita.jp", - "kamikoani.akita.jp", - "kamioka.akita.jp", - "katagami.akita.jp", - "kazuno.akita.jp", - "kitaakita.akita.jp", - "kosaka.akita.jp", - "kyowa.akita.jp", - "misato.akita.jp", - "mitane.akita.jp", - "moriyoshi.akita.jp", - "nikaho.akita.jp", - "noshiro.akita.jp", - "odate.akita.jp", - "oga.akita.jp", - "ogata.akita.jp", - "semboku.akita.jp", - "yokote.akita.jp", - "yurihonjo.akita.jp", - "aomori.aomori.jp", - "gonohe.aomori.jp", - "hachinohe.aomori.jp", - "hashikami.aomori.jp", - "hiranai.aomori.jp", - "hirosaki.aomori.jp", - "itayanagi.aomori.jp", - "kuroishi.aomori.jp", - "misawa.aomori.jp", - "mutsu.aomori.jp", - "nakadomari.aomori.jp", - "noheji.aomori.jp", - "oirase.aomori.jp", - "owani.aomori.jp", - "rokunohe.aomori.jp", - "sannohe.aomori.jp", - "shichinohe.aomori.jp", - "shingo.aomori.jp", - "takko.aomori.jp", - "towada.aomori.jp", - "tsugaru.aomori.jp", - "tsuruta.aomori.jp", - "abiko.chiba.jp", - "asahi.chiba.jp", - "chonan.chiba.jp", - "chosei.chiba.jp", - "choshi.chiba.jp", - "chuo.chiba.jp", - "funabashi.chiba.jp", - "futtsu.chiba.jp", - "hanamigawa.chiba.jp", - "ichihara.chiba.jp", - "ichikawa.chiba.jp", - "ichinomiya.chiba.jp", - "inzai.chiba.jp", - "isumi.chiba.jp", - "kamagaya.chiba.jp", - "kamogawa.chiba.jp", - "kashiwa.chiba.jp", - "katori.chiba.jp", - "katsuura.chiba.jp", - "kimitsu.chiba.jp", - "kisarazu.chiba.jp", - "kozaki.chiba.jp", - "kujukuri.chiba.jp", - "kyonan.chiba.jp", - "matsudo.chiba.jp", - "midori.chiba.jp", - "mihama.chiba.jp", - "minamiboso.chiba.jp", - "mobara.chiba.jp", - "mutsuzawa.chiba.jp", - "nagara.chiba.jp", - "nagareyama.chiba.jp", - "narashino.chiba.jp", - "narita.chiba.jp", - "noda.chiba.jp", - "oamishirasato.chiba.jp", - "omigawa.chiba.jp", - "onjuku.chiba.jp", - "otaki.chiba.jp", - "sakae.chiba.jp", - "sakura.chiba.jp", - "shimofusa.chiba.jp", - "shirako.chiba.jp", - "shiroi.chiba.jp", - "shisui.chiba.jp", - "sodegaura.chiba.jp", - "sosa.chiba.jp", - "tako.chiba.jp", - "tateyama.chiba.jp", - "togane.chiba.jp", - "tohnosho.chiba.jp", - "tomisato.chiba.jp", - "urayasu.chiba.jp", - "yachimata.chiba.jp", - "yachiyo.chiba.jp", - "yokaichiba.chiba.jp", - "yokoshibahikari.chiba.jp", - "yotsukaido.chiba.jp", - "ainan.ehime.jp", - "honai.ehime.jp", - "ikata.ehime.jp", - "imabari.ehime.jp", - "iyo.ehime.jp", - "kamijima.ehime.jp", - "kihoku.ehime.jp", - "kumakogen.ehime.jp", - "masaki.ehime.jp", - "matsuno.ehime.jp", - "matsuyama.ehime.jp", - "namikata.ehime.jp", - "niihama.ehime.jp", - "ozu.ehime.jp", - "saijo.ehime.jp", - "seiyo.ehime.jp", - "shikokuchuo.ehime.jp", - "tobe.ehime.jp", - "toon.ehime.jp", - "uchiko.ehime.jp", - "uwajima.ehime.jp", - "yawatahama.ehime.jp", - "echizen.fukui.jp", - "eiheiji.fukui.jp", - "fukui.fukui.jp", - "ikeda.fukui.jp", - "katsuyama.fukui.jp", - "mihama.fukui.jp", - "minamiechizen.fukui.jp", - "obama.fukui.jp", - "ohi.fukui.jp", - "ono.fukui.jp", - "sabae.fukui.jp", - "sakai.fukui.jp", - "takahama.fukui.jp", - "tsuruga.fukui.jp", - "wakasa.fukui.jp", - "ashiya.fukuoka.jp", - "buzen.fukuoka.jp", - "chikugo.fukuoka.jp", - "chikuho.fukuoka.jp", - "chikujo.fukuoka.jp", - "chikushino.fukuoka.jp", - "chikuzen.fukuoka.jp", - "chuo.fukuoka.jp", - "dazaifu.fukuoka.jp", - "fukuchi.fukuoka.jp", - "hakata.fukuoka.jp", - "higashi.fukuoka.jp", - "hirokawa.fukuoka.jp", - "hisayama.fukuoka.jp", - "iizuka.fukuoka.jp", - "inatsuki.fukuoka.jp", - "kaho.fukuoka.jp", - "kasuga.fukuoka.jp", - "kasuya.fukuoka.jp", - "kawara.fukuoka.jp", - "keisen.fukuoka.jp", - "koga.fukuoka.jp", - "kurate.fukuoka.jp", - "kurogi.fukuoka.jp", - "kurume.fukuoka.jp", - "minami.fukuoka.jp", - "miyako.fukuoka.jp", - "miyama.fukuoka.jp", - "miyawaka.fukuoka.jp", - "mizumaki.fukuoka.jp", - "munakata.fukuoka.jp", - "nakagawa.fukuoka.jp", - "nakama.fukuoka.jp", - "nishi.fukuoka.jp", - "nogata.fukuoka.jp", - "ogori.fukuoka.jp", - "okagaki.fukuoka.jp", - "okawa.fukuoka.jp", - "oki.fukuoka.jp", - "omuta.fukuoka.jp", - "onga.fukuoka.jp", - "onojo.fukuoka.jp", - "oto.fukuoka.jp", - "saigawa.fukuoka.jp", - "sasaguri.fukuoka.jp", - "shingu.fukuoka.jp", - "shinyoshitomi.fukuoka.jp", - "shonai.fukuoka.jp", - "soeda.fukuoka.jp", - "sue.fukuoka.jp", - "tachiarai.fukuoka.jp", - "tagawa.fukuoka.jp", - "takata.fukuoka.jp", - "toho.fukuoka.jp", - "toyotsu.fukuoka.jp", - "tsuiki.fukuoka.jp", - "ukiha.fukuoka.jp", - "umi.fukuoka.jp", - "usui.fukuoka.jp", - "yamada.fukuoka.jp", - "yame.fukuoka.jp", - "yanagawa.fukuoka.jp", - "yukuhashi.fukuoka.jp", - "aizubange.fukushima.jp", - "aizumisato.fukushima.jp", - "aizuwakamatsu.fukushima.jp", - "asakawa.fukushima.jp", - "bandai.fukushima.jp", - "date.fukushima.jp", - "fukushima.fukushima.jp", - "furudono.fukushima.jp", - "futaba.fukushima.jp", - "hanawa.fukushima.jp", - "higashi.fukushima.jp", - "hirata.fukushima.jp", - "hirono.fukushima.jp", - "iitate.fukushima.jp", - "inawashiro.fukushima.jp", - "ishikawa.fukushima.jp", - "iwaki.fukushima.jp", - "izumizaki.fukushima.jp", - "kagamiishi.fukushima.jp", - "kaneyama.fukushima.jp", - "kawamata.fukushima.jp", - "kitakata.fukushima.jp", - "kitashiobara.fukushima.jp", - "koori.fukushima.jp", - "koriyama.fukushima.jp", - "kunimi.fukushima.jp", - "miharu.fukushima.jp", - "mishima.fukushima.jp", - "namie.fukushima.jp", - "nango.fukushima.jp", - "nishiaizu.fukushima.jp", - "nishigo.fukushima.jp", - "okuma.fukushima.jp", - "omotego.fukushima.jp", - "ono.fukushima.jp", - "otama.fukushima.jp", - "samegawa.fukushima.jp", - "shimogo.fukushima.jp", - "shirakawa.fukushima.jp", - "showa.fukushima.jp", - "soma.fukushima.jp", - "sukagawa.fukushima.jp", - "taishin.fukushima.jp", - "tamakawa.fukushima.jp", - "tanagura.fukushima.jp", - "tenei.fukushima.jp", - "yabuki.fukushima.jp", - "yamato.fukushima.jp", - "yamatsuri.fukushima.jp", - "yanaizu.fukushima.jp", - "yugawa.fukushima.jp", - "anpachi.gifu.jp", - "ena.gifu.jp", - "gifu.gifu.jp", - "ginan.gifu.jp", - "godo.gifu.jp", - "gujo.gifu.jp", - "hashima.gifu.jp", - "hichiso.gifu.jp", - "hida.gifu.jp", - "higashishirakawa.gifu.jp", - "ibigawa.gifu.jp", - "ikeda.gifu.jp", - "kakamigahara.gifu.jp", - "kani.gifu.jp", - "kasahara.gifu.jp", - "kasamatsu.gifu.jp", - "kawaue.gifu.jp", - "kitagata.gifu.jp", - "mino.gifu.jp", - "minokamo.gifu.jp", - "mitake.gifu.jp", - "mizunami.gifu.jp", - "motosu.gifu.jp", - "nakatsugawa.gifu.jp", - "ogaki.gifu.jp", - "sakahogi.gifu.jp", - "seki.gifu.jp", - "sekigahara.gifu.jp", - "shirakawa.gifu.jp", - "tajimi.gifu.jp", - "takayama.gifu.jp", - "tarui.gifu.jp", - "toki.gifu.jp", - "tomika.gifu.jp", - "wanouchi.gifu.jp", - "yamagata.gifu.jp", - "yaotsu.gifu.jp", - "yoro.gifu.jp", - "annaka.gunma.jp", - "chiyoda.gunma.jp", - "fujioka.gunma.jp", - "higashiagatsuma.gunma.jp", - "isesaki.gunma.jp", - "itakura.gunma.jp", - "kanna.gunma.jp", - "kanra.gunma.jp", - "katashina.gunma.jp", - "kawaba.gunma.jp", - "kiryu.gunma.jp", - "kusatsu.gunma.jp", - "maebashi.gunma.jp", - "meiwa.gunma.jp", - "midori.gunma.jp", - "minakami.gunma.jp", - "naganohara.gunma.jp", - "nakanojo.gunma.jp", - "nanmoku.gunma.jp", - "numata.gunma.jp", - "oizumi.gunma.jp", - "ora.gunma.jp", - "ota.gunma.jp", - "shibukawa.gunma.jp", - "shimonita.gunma.jp", - "shinto.gunma.jp", - "showa.gunma.jp", - "takasaki.gunma.jp", - "takayama.gunma.jp", - "tamamura.gunma.jp", - "tatebayashi.gunma.jp", - "tomioka.gunma.jp", - "tsukiyono.gunma.jp", - "tsumagoi.gunma.jp", - "ueno.gunma.jp", - "yoshioka.gunma.jp", - "asaminami.hiroshima.jp", - "daiwa.hiroshima.jp", - "etajima.hiroshima.jp", - "fuchu.hiroshima.jp", - "fukuyama.hiroshima.jp", - "hatsukaichi.hiroshima.jp", - "higashihiroshima.hiroshima.jp", - "hongo.hiroshima.jp", - "jinsekikogen.hiroshima.jp", - "kaita.hiroshima.jp", - "kui.hiroshima.jp", - "kumano.hiroshima.jp", - "kure.hiroshima.jp", - "mihara.hiroshima.jp", - "miyoshi.hiroshima.jp", - "naka.hiroshima.jp", - "onomichi.hiroshima.jp", - "osakikamijima.hiroshima.jp", - "otake.hiroshima.jp", - "saka.hiroshima.jp", - "sera.hiroshima.jp", - "seranishi.hiroshima.jp", - "shinichi.hiroshima.jp", - "shobara.hiroshima.jp", - "takehara.hiroshima.jp", - "abashiri.hokkaido.jp", - "abira.hokkaido.jp", - "aibetsu.hokkaido.jp", - "akabira.hokkaido.jp", - "akkeshi.hokkaido.jp", - "asahikawa.hokkaido.jp", - "ashibetsu.hokkaido.jp", - "ashoro.hokkaido.jp", - "assabu.hokkaido.jp", - "atsuma.hokkaido.jp", - "bibai.hokkaido.jp", - "biei.hokkaido.jp", - "bifuka.hokkaido.jp", - "bihoro.hokkaido.jp", - "biratori.hokkaido.jp", - "chippubetsu.hokkaido.jp", - "chitose.hokkaido.jp", - "date.hokkaido.jp", - "ebetsu.hokkaido.jp", - "embetsu.hokkaido.jp", - "eniwa.hokkaido.jp", - "erimo.hokkaido.jp", - "esan.hokkaido.jp", - "esashi.hokkaido.jp", - "fukagawa.hokkaido.jp", - "fukushima.hokkaido.jp", - "furano.hokkaido.jp", - "furubira.hokkaido.jp", - "haboro.hokkaido.jp", - "hakodate.hokkaido.jp", - "hamatonbetsu.hokkaido.jp", - "hidaka.hokkaido.jp", - "higashikagura.hokkaido.jp", - "higashikawa.hokkaido.jp", - "hiroo.hokkaido.jp", - "hokuryu.hokkaido.jp", - "hokuto.hokkaido.jp", - "honbetsu.hokkaido.jp", - "horokanai.hokkaido.jp", - "horonobe.hokkaido.jp", - "ikeda.hokkaido.jp", - "imakane.hokkaido.jp", - "ishikari.hokkaido.jp", - "iwamizawa.hokkaido.jp", - "iwanai.hokkaido.jp", - "kamifurano.hokkaido.jp", - "kamikawa.hokkaido.jp", - "kamishihoro.hokkaido.jp", - "kamisunagawa.hokkaido.jp", - "kamoenai.hokkaido.jp", - "kayabe.hokkaido.jp", - "kembuchi.hokkaido.jp", - "kikonai.hokkaido.jp", - "kimobetsu.hokkaido.jp", - "kitahiroshima.hokkaido.jp", - "kitami.hokkaido.jp", - "kiyosato.hokkaido.jp", - "koshimizu.hokkaido.jp", - "kunneppu.hokkaido.jp", - "kuriyama.hokkaido.jp", - "kuromatsunai.hokkaido.jp", - "kushiro.hokkaido.jp", - "kutchan.hokkaido.jp", - "kyowa.hokkaido.jp", - "mashike.hokkaido.jp", - "matsumae.hokkaido.jp", - "mikasa.hokkaido.jp", - "minamifurano.hokkaido.jp", - "mombetsu.hokkaido.jp", - "moseushi.hokkaido.jp", - "mukawa.hokkaido.jp", - "muroran.hokkaido.jp", - "naie.hokkaido.jp", - "nakagawa.hokkaido.jp", - "nakasatsunai.hokkaido.jp", - "nakatombetsu.hokkaido.jp", - "nanae.hokkaido.jp", - "nanporo.hokkaido.jp", - "nayoro.hokkaido.jp", - "nemuro.hokkaido.jp", - "niikappu.hokkaido.jp", - "niki.hokkaido.jp", - "nishiokoppe.hokkaido.jp", - "noboribetsu.hokkaido.jp", - "numata.hokkaido.jp", - "obihiro.hokkaido.jp", - "obira.hokkaido.jp", - "oketo.hokkaido.jp", - "okoppe.hokkaido.jp", - "otaru.hokkaido.jp", - "otobe.hokkaido.jp", - "otofuke.hokkaido.jp", - "otoineppu.hokkaido.jp", - "oumu.hokkaido.jp", - "ozora.hokkaido.jp", - "pippu.hokkaido.jp", - "rankoshi.hokkaido.jp", - "rebun.hokkaido.jp", - "rikubetsu.hokkaido.jp", - "rishiri.hokkaido.jp", - "rishirifuji.hokkaido.jp", - "saroma.hokkaido.jp", - "sarufutsu.hokkaido.jp", - "shakotan.hokkaido.jp", - "shari.hokkaido.jp", - "shibecha.hokkaido.jp", - "shibetsu.hokkaido.jp", - "shikabe.hokkaido.jp", - "shikaoi.hokkaido.jp", - "shimamaki.hokkaido.jp", - "shimizu.hokkaido.jp", - "shimokawa.hokkaido.jp", - "shinshinotsu.hokkaido.jp", - "shintoku.hokkaido.jp", - "shiranuka.hokkaido.jp", - "shiraoi.hokkaido.jp", - "shiriuchi.hokkaido.jp", - "sobetsu.hokkaido.jp", - "sunagawa.hokkaido.jp", - "taiki.hokkaido.jp", - "takasu.hokkaido.jp", - "takikawa.hokkaido.jp", - "takinoue.hokkaido.jp", - "teshikaga.hokkaido.jp", - "tobetsu.hokkaido.jp", - "tohma.hokkaido.jp", - "tomakomai.hokkaido.jp", - "tomari.hokkaido.jp", - "toya.hokkaido.jp", - "toyako.hokkaido.jp", - "toyotomi.hokkaido.jp", - "toyoura.hokkaido.jp", - "tsubetsu.hokkaido.jp", - "tsukigata.hokkaido.jp", - "urakawa.hokkaido.jp", - "urausu.hokkaido.jp", - "uryu.hokkaido.jp", - "utashinai.hokkaido.jp", - "wakkanai.hokkaido.jp", - "wassamu.hokkaido.jp", - "yakumo.hokkaido.jp", - "yoichi.hokkaido.jp", - "aioi.hyogo.jp", - "akashi.hyogo.jp", - "ako.hyogo.jp", - "amagasaki.hyogo.jp", - "aogaki.hyogo.jp", - "asago.hyogo.jp", - "ashiya.hyogo.jp", - "awaji.hyogo.jp", - "fukusaki.hyogo.jp", - "goshiki.hyogo.jp", - "harima.hyogo.jp", - "himeji.hyogo.jp", - "ichikawa.hyogo.jp", - "inagawa.hyogo.jp", - "itami.hyogo.jp", - "kakogawa.hyogo.jp", - "kamigori.hyogo.jp", - "kamikawa.hyogo.jp", - "kasai.hyogo.jp", - "kasuga.hyogo.jp", - "kawanishi.hyogo.jp", - "miki.hyogo.jp", - "minamiawaji.hyogo.jp", - "nishinomiya.hyogo.jp", - "nishiwaki.hyogo.jp", - "ono.hyogo.jp", - "sanda.hyogo.jp", - "sannan.hyogo.jp", - "sasayama.hyogo.jp", - "sayo.hyogo.jp", - "shingu.hyogo.jp", - "shinonsen.hyogo.jp", - "shiso.hyogo.jp", - "sumoto.hyogo.jp", - "taishi.hyogo.jp", - "taka.hyogo.jp", - "takarazuka.hyogo.jp", - "takasago.hyogo.jp", - "takino.hyogo.jp", - "tamba.hyogo.jp", - "tatsuno.hyogo.jp", - "toyooka.hyogo.jp", - "yabu.hyogo.jp", - "yashiro.hyogo.jp", - "yoka.hyogo.jp", - "yokawa.hyogo.jp", - "ami.ibaraki.jp", - "asahi.ibaraki.jp", - "bando.ibaraki.jp", - "chikusei.ibaraki.jp", - "daigo.ibaraki.jp", - "fujishiro.ibaraki.jp", - "hitachi.ibaraki.jp", - "hitachinaka.ibaraki.jp", - "hitachiomiya.ibaraki.jp", - "hitachiota.ibaraki.jp", - "ibaraki.ibaraki.jp", - "ina.ibaraki.jp", - "inashiki.ibaraki.jp", - "itako.ibaraki.jp", - "iwama.ibaraki.jp", - "joso.ibaraki.jp", - "kamisu.ibaraki.jp", - "kasama.ibaraki.jp", - "kashima.ibaraki.jp", - "kasumigaura.ibaraki.jp", - "koga.ibaraki.jp", - "miho.ibaraki.jp", - "mito.ibaraki.jp", - "moriya.ibaraki.jp", - "naka.ibaraki.jp", - "namegata.ibaraki.jp", - "oarai.ibaraki.jp", - "ogawa.ibaraki.jp", - "omitama.ibaraki.jp", - "ryugasaki.ibaraki.jp", - "sakai.ibaraki.jp", - "sakuragawa.ibaraki.jp", - "shimodate.ibaraki.jp", - "shimotsuma.ibaraki.jp", - "shirosato.ibaraki.jp", - "sowa.ibaraki.jp", - "suifu.ibaraki.jp", - "takahagi.ibaraki.jp", - "tamatsukuri.ibaraki.jp", - "tokai.ibaraki.jp", - "tomobe.ibaraki.jp", - "tone.ibaraki.jp", - "toride.ibaraki.jp", - "tsuchiura.ibaraki.jp", - "tsukuba.ibaraki.jp", - "uchihara.ibaraki.jp", - "ushiku.ibaraki.jp", - "yachiyo.ibaraki.jp", - "yamagata.ibaraki.jp", - "yawara.ibaraki.jp", - "yuki.ibaraki.jp", - "anamizu.ishikawa.jp", - "hakui.ishikawa.jp", - "hakusan.ishikawa.jp", - "kaga.ishikawa.jp", - "kahoku.ishikawa.jp", - "kanazawa.ishikawa.jp", - "kawakita.ishikawa.jp", - "komatsu.ishikawa.jp", - "nakanoto.ishikawa.jp", - "nanao.ishikawa.jp", - "nomi.ishikawa.jp", - "nonoichi.ishikawa.jp", - "noto.ishikawa.jp", - "shika.ishikawa.jp", - "suzu.ishikawa.jp", - "tsubata.ishikawa.jp", - "tsurugi.ishikawa.jp", - "uchinada.ishikawa.jp", - "wajima.ishikawa.jp", - "fudai.iwate.jp", - "fujisawa.iwate.jp", - "hanamaki.iwate.jp", - "hiraizumi.iwate.jp", - "hirono.iwate.jp", - "ichinohe.iwate.jp", - "ichinoseki.iwate.jp", - "iwaizumi.iwate.jp", - "iwate.iwate.jp", - "joboji.iwate.jp", - "kamaishi.iwate.jp", - "kanegasaki.iwate.jp", - "karumai.iwate.jp", - "kawai.iwate.jp", - "kitakami.iwate.jp", - "kuji.iwate.jp", - "kunohe.iwate.jp", - "kuzumaki.iwate.jp", - "miyako.iwate.jp", - "mizusawa.iwate.jp", - "morioka.iwate.jp", - "ninohe.iwate.jp", - "noda.iwate.jp", - "ofunato.iwate.jp", - "oshu.iwate.jp", - "otsuchi.iwate.jp", - "rikuzentakata.iwate.jp", - "shiwa.iwate.jp", - "shizukuishi.iwate.jp", - "sumita.iwate.jp", - "tanohata.iwate.jp", - "tono.iwate.jp", - "yahaba.iwate.jp", - "yamada.iwate.jp", - "ayagawa.kagawa.jp", - "higashikagawa.kagawa.jp", - "kanonji.kagawa.jp", - "kotohira.kagawa.jp", - "manno.kagawa.jp", - "marugame.kagawa.jp", - "mitoyo.kagawa.jp", - "naoshima.kagawa.jp", - "sanuki.kagawa.jp", - "tadotsu.kagawa.jp", - "takamatsu.kagawa.jp", - "tonosho.kagawa.jp", - "uchinomi.kagawa.jp", - "utazu.kagawa.jp", - "zentsuji.kagawa.jp", - "akune.kagoshima.jp", - "amami.kagoshima.jp", - "hioki.kagoshima.jp", - "isa.kagoshima.jp", - "isen.kagoshima.jp", - "izumi.kagoshima.jp", - "kagoshima.kagoshima.jp", - "kanoya.kagoshima.jp", - "kawanabe.kagoshima.jp", - "kinko.kagoshima.jp", - "kouyama.kagoshima.jp", - "makurazaki.kagoshima.jp", - "matsumoto.kagoshima.jp", - "minamitane.kagoshima.jp", - "nakatane.kagoshima.jp", - "nishinoomote.kagoshima.jp", - "satsumasendai.kagoshima.jp", - "soo.kagoshima.jp", - "tarumizu.kagoshima.jp", - "yusui.kagoshima.jp", - "aikawa.kanagawa.jp", - "atsugi.kanagawa.jp", - "ayase.kanagawa.jp", - "chigasaki.kanagawa.jp", - "ebina.kanagawa.jp", - "fujisawa.kanagawa.jp", - "hadano.kanagawa.jp", - "hakone.kanagawa.jp", - "hiratsuka.kanagawa.jp", - "isehara.kanagawa.jp", - "kaisei.kanagawa.jp", - "kamakura.kanagawa.jp", - "kiyokawa.kanagawa.jp", - "matsuda.kanagawa.jp", - "minamiashigara.kanagawa.jp", - "miura.kanagawa.jp", - "nakai.kanagawa.jp", - "ninomiya.kanagawa.jp", - "odawara.kanagawa.jp", - "oi.kanagawa.jp", - "oiso.kanagawa.jp", - "sagamihara.kanagawa.jp", - "samukawa.kanagawa.jp", - "tsukui.kanagawa.jp", - "yamakita.kanagawa.jp", - "yamato.kanagawa.jp", - "yokosuka.kanagawa.jp", - "yugawara.kanagawa.jp", - "zama.kanagawa.jp", - "zushi.kanagawa.jp", - "aki.kochi.jp", - "geisei.kochi.jp", - "hidaka.kochi.jp", - "higashitsuno.kochi.jp", - "ino.kochi.jp", - "kagami.kochi.jp", - "kami.kochi.jp", - "kitagawa.kochi.jp", - "kochi.kochi.jp", - "mihara.kochi.jp", - "motoyama.kochi.jp", - "muroto.kochi.jp", - "nahari.kochi.jp", - "nakamura.kochi.jp", - "nankoku.kochi.jp", - "nishitosa.kochi.jp", - "niyodogawa.kochi.jp", - "ochi.kochi.jp", - "okawa.kochi.jp", - "otoyo.kochi.jp", - "otsuki.kochi.jp", - "sakawa.kochi.jp", - "sukumo.kochi.jp", - "susaki.kochi.jp", - "tosa.kochi.jp", - "tosashimizu.kochi.jp", - "toyo.kochi.jp", - "tsuno.kochi.jp", - "umaji.kochi.jp", - "yasuda.kochi.jp", - "yusuhara.kochi.jp", - "amakusa.kumamoto.jp", - "arao.kumamoto.jp", - "aso.kumamoto.jp", - "choyo.kumamoto.jp", - "gyokuto.kumamoto.jp", - "hitoyoshi.kumamoto.jp", - "kamiamakusa.kumamoto.jp", - "kashima.kumamoto.jp", - "kikuchi.kumamoto.jp", - "kosa.kumamoto.jp", - "kumamoto.kumamoto.jp", - "mashiki.kumamoto.jp", - "mifune.kumamoto.jp", - "minamata.kumamoto.jp", - "minamioguni.kumamoto.jp", - "nagasu.kumamoto.jp", - "nishihara.kumamoto.jp", - "oguni.kumamoto.jp", - "ozu.kumamoto.jp", - "sumoto.kumamoto.jp", - "takamori.kumamoto.jp", - "uki.kumamoto.jp", - "uto.kumamoto.jp", - "yamaga.kumamoto.jp", - "yamato.kumamoto.jp", - "yatsushiro.kumamoto.jp", - "ayabe.kyoto.jp", - "fukuchiyama.kyoto.jp", - "higashiyama.kyoto.jp", - "ide.kyoto.jp", - "ine.kyoto.jp", - "joyo.kyoto.jp", - "kameoka.kyoto.jp", - "kamo.kyoto.jp", - "kita.kyoto.jp", - "kizu.kyoto.jp", - "kumiyama.kyoto.jp", - "kyotamba.kyoto.jp", - "kyotanabe.kyoto.jp", - "kyotango.kyoto.jp", - "maizuru.kyoto.jp", - "minami.kyoto.jp", - "minamiyamashiro.kyoto.jp", - "miyazu.kyoto.jp", - "muko.kyoto.jp", - "nagaokakyo.kyoto.jp", - "nakagyo.kyoto.jp", - "nantan.kyoto.jp", - "oyamazaki.kyoto.jp", - "sakyo.kyoto.jp", - "seika.kyoto.jp", - "tanabe.kyoto.jp", - "uji.kyoto.jp", - "ujitawara.kyoto.jp", - "wazuka.kyoto.jp", - "yamashina.kyoto.jp", - "yawata.kyoto.jp", - "asahi.mie.jp", - "inabe.mie.jp", - "ise.mie.jp", - "kameyama.mie.jp", - "kawagoe.mie.jp", - "kiho.mie.jp", - "kisosaki.mie.jp", - "kiwa.mie.jp", - "komono.mie.jp", - "kumano.mie.jp", - "kuwana.mie.jp", - "matsusaka.mie.jp", - "meiwa.mie.jp", - "mihama.mie.jp", - "minamiise.mie.jp", - "misugi.mie.jp", - "miyama.mie.jp", - "nabari.mie.jp", - "shima.mie.jp", - "suzuka.mie.jp", - "tado.mie.jp", - "taiki.mie.jp", - "taki.mie.jp", - "tamaki.mie.jp", - "toba.mie.jp", - "tsu.mie.jp", - "udono.mie.jp", - "ureshino.mie.jp", - "watarai.mie.jp", - "yokkaichi.mie.jp", - "furukawa.miyagi.jp", - "higashimatsushima.miyagi.jp", - "ishinomaki.miyagi.jp", - "iwanuma.miyagi.jp", - "kakuda.miyagi.jp", - "kami.miyagi.jp", - "kawasaki.miyagi.jp", - "kesennuma.miyagi.jp", - "marumori.miyagi.jp", - "matsushima.miyagi.jp", - "minamisanriku.miyagi.jp", - "misato.miyagi.jp", - "murata.miyagi.jp", - "natori.miyagi.jp", - "ogawara.miyagi.jp", - "ohira.miyagi.jp", - "onagawa.miyagi.jp", - "osaki.miyagi.jp", - "rifu.miyagi.jp", - "semine.miyagi.jp", - "shibata.miyagi.jp", - "shichikashuku.miyagi.jp", - "shikama.miyagi.jp", - "shiogama.miyagi.jp", - "shiroishi.miyagi.jp", - "tagajo.miyagi.jp", - "taiwa.miyagi.jp", - "tome.miyagi.jp", - "tomiya.miyagi.jp", - "wakuya.miyagi.jp", - "watari.miyagi.jp", - "yamamoto.miyagi.jp", - "zao.miyagi.jp", - "aya.miyazaki.jp", - "ebino.miyazaki.jp", - "gokase.miyazaki.jp", - "hyuga.miyazaki.jp", - "kadogawa.miyazaki.jp", - "kawaminami.miyazaki.jp", - "kijo.miyazaki.jp", - "kitagawa.miyazaki.jp", - "kitakata.miyazaki.jp", - "kitaura.miyazaki.jp", - "kobayashi.miyazaki.jp", - "kunitomi.miyazaki.jp", - "kushima.miyazaki.jp", - "mimata.miyazaki.jp", - "miyakonojo.miyazaki.jp", - "miyazaki.miyazaki.jp", - "morotsuka.miyazaki.jp", - "nichinan.miyazaki.jp", - "nishimera.miyazaki.jp", - "nobeoka.miyazaki.jp", - "saito.miyazaki.jp", - "shiiba.miyazaki.jp", - "shintomi.miyazaki.jp", - "takaharu.miyazaki.jp", - "takanabe.miyazaki.jp", - "takazaki.miyazaki.jp", - "tsuno.miyazaki.jp", - "achi.nagano.jp", - "agematsu.nagano.jp", - "anan.nagano.jp", - "aoki.nagano.jp", - "asahi.nagano.jp", - "azumino.nagano.jp", - "chikuhoku.nagano.jp", - "chikuma.nagano.jp", - "chino.nagano.jp", - "fujimi.nagano.jp", - "hakuba.nagano.jp", - "hara.nagano.jp", - "hiraya.nagano.jp", - "iida.nagano.jp", - "iijima.nagano.jp", - "iiyama.nagano.jp", - "iizuna.nagano.jp", - "ikeda.nagano.jp", - "ikusaka.nagano.jp", - "ina.nagano.jp", - "karuizawa.nagano.jp", - "kawakami.nagano.jp", - "kiso.nagano.jp", - "kisofukushima.nagano.jp", - "kitaaiki.nagano.jp", - "komagane.nagano.jp", - "komoro.nagano.jp", - "matsukawa.nagano.jp", - "matsumoto.nagano.jp", - "miasa.nagano.jp", - "minamiaiki.nagano.jp", - "minamimaki.nagano.jp", - "minamiminowa.nagano.jp", - "minowa.nagano.jp", - "miyada.nagano.jp", - "miyota.nagano.jp", - "mochizuki.nagano.jp", - "nagano.nagano.jp", - "nagawa.nagano.jp", - "nagiso.nagano.jp", - "nakagawa.nagano.jp", - "nakano.nagano.jp", - "nozawaonsen.nagano.jp", - "obuse.nagano.jp", - "ogawa.nagano.jp", - "okaya.nagano.jp", - "omachi.nagano.jp", - "omi.nagano.jp", - "ookuwa.nagano.jp", - "ooshika.nagano.jp", - "otaki.nagano.jp", - "otari.nagano.jp", - "sakae.nagano.jp", - "sakaki.nagano.jp", - "saku.nagano.jp", - "sakuho.nagano.jp", - "shimosuwa.nagano.jp", - "shinanomachi.nagano.jp", - "shiojiri.nagano.jp", - "suwa.nagano.jp", - "suzaka.nagano.jp", - "takagi.nagano.jp", - "takamori.nagano.jp", - "takayama.nagano.jp", - "tateshina.nagano.jp", - "tatsuno.nagano.jp", - "togakushi.nagano.jp", - "togura.nagano.jp", - "tomi.nagano.jp", - "ueda.nagano.jp", - "wada.nagano.jp", - "yamagata.nagano.jp", - "yamanouchi.nagano.jp", - "yasaka.nagano.jp", - "yasuoka.nagano.jp", - "chijiwa.nagasaki.jp", - "futsu.nagasaki.jp", - "goto.nagasaki.jp", - "hasami.nagasaki.jp", - "hirado.nagasaki.jp", - "iki.nagasaki.jp", - "isahaya.nagasaki.jp", - "kawatana.nagasaki.jp", - "kuchinotsu.nagasaki.jp", - "matsuura.nagasaki.jp", - "nagasaki.nagasaki.jp", - "obama.nagasaki.jp", - "omura.nagasaki.jp", - "oseto.nagasaki.jp", - "saikai.nagasaki.jp", - "sasebo.nagasaki.jp", - "seihi.nagasaki.jp", - "shimabara.nagasaki.jp", - "shinkamigoto.nagasaki.jp", - "togitsu.nagasaki.jp", - "tsushima.nagasaki.jp", - "unzen.nagasaki.jp", - "ando.nara.jp", - "gose.nara.jp", - "heguri.nara.jp", - "higashiyoshino.nara.jp", - "ikaruga.nara.jp", - "ikoma.nara.jp", - "kamikitayama.nara.jp", - "kanmaki.nara.jp", - "kashiba.nara.jp", - "kashihara.nara.jp", - "katsuragi.nara.jp", - "kawai.nara.jp", - "kawakami.nara.jp", - "kawanishi.nara.jp", - "koryo.nara.jp", - "kurotaki.nara.jp", - "mitsue.nara.jp", - "miyake.nara.jp", - "nara.nara.jp", - "nosegawa.nara.jp", - "oji.nara.jp", - "ouda.nara.jp", - "oyodo.nara.jp", - "sakurai.nara.jp", - "sango.nara.jp", - "shimoichi.nara.jp", - "shimokitayama.nara.jp", - "shinjo.nara.jp", - "soni.nara.jp", - "takatori.nara.jp", - "tawaramoto.nara.jp", - "tenkawa.nara.jp", - "tenri.nara.jp", - "uda.nara.jp", - "yamatokoriyama.nara.jp", - "yamatotakada.nara.jp", - "yamazoe.nara.jp", - "yoshino.nara.jp", - "aga.niigata.jp", - "agano.niigata.jp", - "gosen.niigata.jp", - "itoigawa.niigata.jp", - "izumozaki.niigata.jp", - "joetsu.niigata.jp", - "kamo.niigata.jp", - "kariwa.niigata.jp", - "kashiwazaki.niigata.jp", - "minamiuonuma.niigata.jp", - "mitsuke.niigata.jp", - "muika.niigata.jp", - "murakami.niigata.jp", - "myoko.niigata.jp", - "nagaoka.niigata.jp", - "niigata.niigata.jp", - "ojiya.niigata.jp", - "omi.niigata.jp", - "sado.niigata.jp", - "sanjo.niigata.jp", - "seiro.niigata.jp", - "seirou.niigata.jp", - "sekikawa.niigata.jp", - "shibata.niigata.jp", - "tagami.niigata.jp", - "tainai.niigata.jp", - "tochio.niigata.jp", - "tokamachi.niigata.jp", - "tsubame.niigata.jp", - "tsunan.niigata.jp", - "uonuma.niigata.jp", - "yahiko.niigata.jp", - "yoita.niigata.jp", - "yuzawa.niigata.jp", - "beppu.oita.jp", - "bungoono.oita.jp", - "bungotakada.oita.jp", - "hasama.oita.jp", - "hiji.oita.jp", - "himeshima.oita.jp", - "hita.oita.jp", - "kamitsue.oita.jp", - "kokonoe.oita.jp", - "kuju.oita.jp", - "kunisaki.oita.jp", - "kusu.oita.jp", - "oita.oita.jp", - "saiki.oita.jp", - "taketa.oita.jp", - "tsukumi.oita.jp", - "usa.oita.jp", - "usuki.oita.jp", - "yufu.oita.jp", - "akaiwa.okayama.jp", - "asakuchi.okayama.jp", - "bizen.okayama.jp", - "hayashima.okayama.jp", - "ibara.okayama.jp", - "kagamino.okayama.jp", - "kasaoka.okayama.jp", - "kibichuo.okayama.jp", - "kumenan.okayama.jp", - "kurashiki.okayama.jp", - "maniwa.okayama.jp", - "misaki.okayama.jp", - "nagi.okayama.jp", - "niimi.okayama.jp", - "nishiawakura.okayama.jp", - "okayama.okayama.jp", - "satosho.okayama.jp", - "setouchi.okayama.jp", - "shinjo.okayama.jp", - "shoo.okayama.jp", - "soja.okayama.jp", - "takahashi.okayama.jp", - "tamano.okayama.jp", - "tsuyama.okayama.jp", - "wake.okayama.jp", - "yakage.okayama.jp", - "aguni.okinawa.jp", - "ginowan.okinawa.jp", - "ginoza.okinawa.jp", - "gushikami.okinawa.jp", - "haebaru.okinawa.jp", - "higashi.okinawa.jp", - "hirara.okinawa.jp", - "iheya.okinawa.jp", - "ishigaki.okinawa.jp", - "ishikawa.okinawa.jp", - "itoman.okinawa.jp", - "izena.okinawa.jp", - "kadena.okinawa.jp", - "kin.okinawa.jp", - "kitadaito.okinawa.jp", - "kitanakagusuku.okinawa.jp", - "kumejima.okinawa.jp", - "kunigami.okinawa.jp", - "minamidaito.okinawa.jp", - "motobu.okinawa.jp", - "nago.okinawa.jp", - "naha.okinawa.jp", - "nakagusuku.okinawa.jp", - "nakijin.okinawa.jp", - "nanjo.okinawa.jp", - "nishihara.okinawa.jp", - "ogimi.okinawa.jp", - "okinawa.okinawa.jp", - "onna.okinawa.jp", - "shimoji.okinawa.jp", - "taketomi.okinawa.jp", - "tarama.okinawa.jp", - "tokashiki.okinawa.jp", - "tomigusuku.okinawa.jp", - "tonaki.okinawa.jp", - "urasoe.okinawa.jp", - "uruma.okinawa.jp", - "yaese.okinawa.jp", - "yomitan.okinawa.jp", - "yonabaru.okinawa.jp", - "yonaguni.okinawa.jp", - "zamami.okinawa.jp", - "abeno.osaka.jp", - "chihayaakasaka.osaka.jp", - "chuo.osaka.jp", - "daito.osaka.jp", - "fujiidera.osaka.jp", - "habikino.osaka.jp", - "hannan.osaka.jp", - "higashiosaka.osaka.jp", - "higashisumiyoshi.osaka.jp", - "higashiyodogawa.osaka.jp", - "hirakata.osaka.jp", - "ibaraki.osaka.jp", - "ikeda.osaka.jp", - "izumi.osaka.jp", - "izumiotsu.osaka.jp", - "izumisano.osaka.jp", - "kadoma.osaka.jp", - "kaizuka.osaka.jp", - "kanan.osaka.jp", - "kashiwara.osaka.jp", - "katano.osaka.jp", - "kawachinagano.osaka.jp", - "kishiwada.osaka.jp", - "kita.osaka.jp", - "kumatori.osaka.jp", - "matsubara.osaka.jp", - "minato.osaka.jp", - "minoh.osaka.jp", - "misaki.osaka.jp", - "moriguchi.osaka.jp", - "neyagawa.osaka.jp", - "nishi.osaka.jp", - "nose.osaka.jp", - "osakasayama.osaka.jp", - "sakai.osaka.jp", - "sayama.osaka.jp", - "sennan.osaka.jp", - "settsu.osaka.jp", - "shijonawate.osaka.jp", - "shimamoto.osaka.jp", - "suita.osaka.jp", - "tadaoka.osaka.jp", - "taishi.osaka.jp", - "tajiri.osaka.jp", - "takaishi.osaka.jp", - "takatsuki.osaka.jp", - "tondabayashi.osaka.jp", - "toyonaka.osaka.jp", - "toyono.osaka.jp", - "yao.osaka.jp", - "ariake.saga.jp", - "arita.saga.jp", - "fukudomi.saga.jp", - "genkai.saga.jp", - "hamatama.saga.jp", - "hizen.saga.jp", - "imari.saga.jp", - "kamimine.saga.jp", - "kanzaki.saga.jp", - "karatsu.saga.jp", - "kashima.saga.jp", - "kitagata.saga.jp", - "kitahata.saga.jp", - "kiyama.saga.jp", - "kouhoku.saga.jp", - "kyuragi.saga.jp", - "nishiarita.saga.jp", - "ogi.saga.jp", - "omachi.saga.jp", - "ouchi.saga.jp", - "saga.saga.jp", - "shiroishi.saga.jp", - "taku.saga.jp", - "tara.saga.jp", - "tosu.saga.jp", - "yoshinogari.saga.jp", - "arakawa.saitama.jp", - "asaka.saitama.jp", - "chichibu.saitama.jp", - "fujimi.saitama.jp", - "fujimino.saitama.jp", - "fukaya.saitama.jp", - "hanno.saitama.jp", - "hanyu.saitama.jp", - "hasuda.saitama.jp", - "hatogaya.saitama.jp", - "hatoyama.saitama.jp", - "hidaka.saitama.jp", - "higashichichibu.saitama.jp", - "higashimatsuyama.saitama.jp", - "honjo.saitama.jp", - "ina.saitama.jp", - "iruma.saitama.jp", - "iwatsuki.saitama.jp", - "kamiizumi.saitama.jp", - "kamikawa.saitama.jp", - "kamisato.saitama.jp", - "kasukabe.saitama.jp", - "kawagoe.saitama.jp", - "kawaguchi.saitama.jp", - "kawajima.saitama.jp", - "kazo.saitama.jp", - "kitamoto.saitama.jp", - "koshigaya.saitama.jp", - "kounosu.saitama.jp", - "kuki.saitama.jp", - "kumagaya.saitama.jp", - "matsubushi.saitama.jp", - "minano.saitama.jp", - "misato.saitama.jp", - "miyashiro.saitama.jp", - "miyoshi.saitama.jp", - "moroyama.saitama.jp", - "nagatoro.saitama.jp", - "namegawa.saitama.jp", - "niiza.saitama.jp", - "ogano.saitama.jp", - "ogawa.saitama.jp", - "ogose.saitama.jp", - "okegawa.saitama.jp", - "omiya.saitama.jp", - "otaki.saitama.jp", - "ranzan.saitama.jp", - "ryokami.saitama.jp", - "saitama.saitama.jp", - "sakado.saitama.jp", - "satte.saitama.jp", - "sayama.saitama.jp", - "shiki.saitama.jp", - "shiraoka.saitama.jp", - "soka.saitama.jp", - "sugito.saitama.jp", - "toda.saitama.jp", - "tokigawa.saitama.jp", - "tokorozawa.saitama.jp", - "tsurugashima.saitama.jp", - "urawa.saitama.jp", - "warabi.saitama.jp", - "yashio.saitama.jp", - "yokoze.saitama.jp", - "yono.saitama.jp", - "yorii.saitama.jp", - "yoshida.saitama.jp", - "yoshikawa.saitama.jp", - "yoshimi.saitama.jp", - "aisho.shiga.jp", - "gamo.shiga.jp", - "higashiomi.shiga.jp", - "hikone.shiga.jp", - "koka.shiga.jp", - "konan.shiga.jp", - "kosei.shiga.jp", - "koto.shiga.jp", - "kusatsu.shiga.jp", - "maibara.shiga.jp", - "moriyama.shiga.jp", - "nagahama.shiga.jp", - "nishiazai.shiga.jp", - "notogawa.shiga.jp", - "omihachiman.shiga.jp", - "otsu.shiga.jp", - "ritto.shiga.jp", - "ryuoh.shiga.jp", - "takashima.shiga.jp", - "takatsuki.shiga.jp", - "torahime.shiga.jp", - "toyosato.shiga.jp", - "yasu.shiga.jp", - "akagi.shimane.jp", - "ama.shimane.jp", - "gotsu.shimane.jp", - "hamada.shimane.jp", - "higashiizumo.shimane.jp", - "hikawa.shimane.jp", - "hikimi.shimane.jp", - "izumo.shimane.jp", - "kakinoki.shimane.jp", - "masuda.shimane.jp", - "matsue.shimane.jp", - "misato.shimane.jp", - "nishinoshima.shimane.jp", - "ohda.shimane.jp", - "okinoshima.shimane.jp", - "okuizumo.shimane.jp", - "shimane.shimane.jp", - "tamayu.shimane.jp", - "tsuwano.shimane.jp", - "unnan.shimane.jp", - "yakumo.shimane.jp", - "yasugi.shimane.jp", - "yatsuka.shimane.jp", - "arai.shizuoka.jp", - "atami.shizuoka.jp", - "fuji.shizuoka.jp", - "fujieda.shizuoka.jp", - "fujikawa.shizuoka.jp", - "fujinomiya.shizuoka.jp", - "fukuroi.shizuoka.jp", - "gotemba.shizuoka.jp", - "haibara.shizuoka.jp", - "hamamatsu.shizuoka.jp", - "higashiizu.shizuoka.jp", - "ito.shizuoka.jp", - "iwata.shizuoka.jp", - "izu.shizuoka.jp", - "izunokuni.shizuoka.jp", - "kakegawa.shizuoka.jp", - "kannami.shizuoka.jp", - "kawanehon.shizuoka.jp", - "kawazu.shizuoka.jp", - "kikugawa.shizuoka.jp", - "kosai.shizuoka.jp", - "makinohara.shizuoka.jp", - "matsuzaki.shizuoka.jp", - "minamiizu.shizuoka.jp", - "mishima.shizuoka.jp", - "morimachi.shizuoka.jp", - "nishiizu.shizuoka.jp", - "numazu.shizuoka.jp", - "omaezaki.shizuoka.jp", - "shimada.shizuoka.jp", - "shimizu.shizuoka.jp", - "shimoda.shizuoka.jp", - "shizuoka.shizuoka.jp", - "susono.shizuoka.jp", - "yaizu.shizuoka.jp", - "yoshida.shizuoka.jp", - "ashikaga.tochigi.jp", - "bato.tochigi.jp", - "haga.tochigi.jp", - "ichikai.tochigi.jp", - "iwafune.tochigi.jp", - "kaminokawa.tochigi.jp", - "kanuma.tochigi.jp", - "karasuyama.tochigi.jp", - "kuroiso.tochigi.jp", - "mashiko.tochigi.jp", - "mibu.tochigi.jp", - "moka.tochigi.jp", - "motegi.tochigi.jp", - "nasu.tochigi.jp", - "nasushiobara.tochigi.jp", - "nikko.tochigi.jp", - "nishikata.tochigi.jp", - "nogi.tochigi.jp", - "ohira.tochigi.jp", - "ohtawara.tochigi.jp", - "oyama.tochigi.jp", - "sakura.tochigi.jp", - "sano.tochigi.jp", - "shimotsuke.tochigi.jp", - "shioya.tochigi.jp", - "takanezawa.tochigi.jp", - "tochigi.tochigi.jp", - "tsuga.tochigi.jp", - "ujiie.tochigi.jp", - "utsunomiya.tochigi.jp", - "yaita.tochigi.jp", - "aizumi.tokushima.jp", - "anan.tokushima.jp", - "ichiba.tokushima.jp", - "itano.tokushima.jp", - "kainan.tokushima.jp", - "komatsushima.tokushima.jp", - "matsushige.tokushima.jp", - "mima.tokushima.jp", - "minami.tokushima.jp", - "miyoshi.tokushima.jp", - "mugi.tokushima.jp", - "nakagawa.tokushima.jp", - "naruto.tokushima.jp", - "sanagochi.tokushima.jp", - "shishikui.tokushima.jp", - "tokushima.tokushima.jp", - "wajiki.tokushima.jp", - "adachi.tokyo.jp", - "akiruno.tokyo.jp", - "akishima.tokyo.jp", - "aogashima.tokyo.jp", - "arakawa.tokyo.jp", - "bunkyo.tokyo.jp", - "chiyoda.tokyo.jp", - "chofu.tokyo.jp", - "chuo.tokyo.jp", - "edogawa.tokyo.jp", - "fuchu.tokyo.jp", - "fussa.tokyo.jp", - "hachijo.tokyo.jp", - "hachioji.tokyo.jp", - "hamura.tokyo.jp", - "higashikurume.tokyo.jp", - "higashimurayama.tokyo.jp", - "higashiyamato.tokyo.jp", - "hino.tokyo.jp", - "hinode.tokyo.jp", - "hinohara.tokyo.jp", - "inagi.tokyo.jp", - "itabashi.tokyo.jp", - "katsushika.tokyo.jp", - "kita.tokyo.jp", - "kiyose.tokyo.jp", - "kodaira.tokyo.jp", - "koganei.tokyo.jp", - "kokubunji.tokyo.jp", - "komae.tokyo.jp", - "koto.tokyo.jp", - "kouzushima.tokyo.jp", - "kunitachi.tokyo.jp", - "machida.tokyo.jp", - "meguro.tokyo.jp", - "minato.tokyo.jp", - "mitaka.tokyo.jp", - "mizuho.tokyo.jp", - "musashimurayama.tokyo.jp", - "musashino.tokyo.jp", - "nakano.tokyo.jp", - "nerima.tokyo.jp", - "ogasawara.tokyo.jp", - "okutama.tokyo.jp", - "ome.tokyo.jp", - "oshima.tokyo.jp", - "ota.tokyo.jp", - "setagaya.tokyo.jp", - "shibuya.tokyo.jp", - "shinagawa.tokyo.jp", - "shinjuku.tokyo.jp", - "suginami.tokyo.jp", - "sumida.tokyo.jp", - "tachikawa.tokyo.jp", - "taito.tokyo.jp", - "tama.tokyo.jp", - "toshima.tokyo.jp", - "chizu.tottori.jp", - "hino.tottori.jp", - "kawahara.tottori.jp", - "koge.tottori.jp", - "kotoura.tottori.jp", - "misasa.tottori.jp", - "nanbu.tottori.jp", - "nichinan.tottori.jp", - "sakaiminato.tottori.jp", - "tottori.tottori.jp", - "wakasa.tottori.jp", - "yazu.tottori.jp", - "yonago.tottori.jp", - "asahi.toyama.jp", - "fuchu.toyama.jp", - "fukumitsu.toyama.jp", - "funahashi.toyama.jp", - "himi.toyama.jp", - "imizu.toyama.jp", - "inami.toyama.jp", - "johana.toyama.jp", - "kamiichi.toyama.jp", - "kurobe.toyama.jp", - "nakaniikawa.toyama.jp", - "namerikawa.toyama.jp", - "nanto.toyama.jp", - "nyuzen.toyama.jp", - "oyabe.toyama.jp", - "taira.toyama.jp", - "takaoka.toyama.jp", - "tateyama.toyama.jp", - "toga.toyama.jp", - "tonami.toyama.jp", - "toyama.toyama.jp", - "unazuki.toyama.jp", - "uozu.toyama.jp", - "yamada.toyama.jp", - "arida.wakayama.jp", - "aridagawa.wakayama.jp", - "gobo.wakayama.jp", - "hashimoto.wakayama.jp", - "hidaka.wakayama.jp", - "hirogawa.wakayama.jp", - "inami.wakayama.jp", - "iwade.wakayama.jp", - "kainan.wakayama.jp", - "kamitonda.wakayama.jp", - "katsuragi.wakayama.jp", - "kimino.wakayama.jp", - "kinokawa.wakayama.jp", - "kitayama.wakayama.jp", - "koya.wakayama.jp", - "koza.wakayama.jp", - "kozagawa.wakayama.jp", - "kudoyama.wakayama.jp", - "kushimoto.wakayama.jp", - "mihama.wakayama.jp", - "misato.wakayama.jp", - "nachikatsuura.wakayama.jp", - "shingu.wakayama.jp", - "shirahama.wakayama.jp", - "taiji.wakayama.jp", - "tanabe.wakayama.jp", - "wakayama.wakayama.jp", - "yuasa.wakayama.jp", - "yura.wakayama.jp", - "asahi.yamagata.jp", - "funagata.yamagata.jp", - "higashine.yamagata.jp", - "iide.yamagata.jp", - "kahoku.yamagata.jp", - "kaminoyama.yamagata.jp", - "kaneyama.yamagata.jp", - "kawanishi.yamagata.jp", - "mamurogawa.yamagata.jp", - "mikawa.yamagata.jp", - "murayama.yamagata.jp", - "nagai.yamagata.jp", - "nakayama.yamagata.jp", - "nanyo.yamagata.jp", - "nishikawa.yamagata.jp", - "obanazawa.yamagata.jp", - "oe.yamagata.jp", - "oguni.yamagata.jp", - "ohkura.yamagata.jp", - "oishida.yamagata.jp", - "sagae.yamagata.jp", - "sakata.yamagata.jp", - "sakegawa.yamagata.jp", - "shinjo.yamagata.jp", - "shirataka.yamagata.jp", - "shonai.yamagata.jp", - "takahata.yamagata.jp", - "tendo.yamagata.jp", - "tozawa.yamagata.jp", - "tsuruoka.yamagata.jp", - "yamagata.yamagata.jp", - "yamanobe.yamagata.jp", - "yonezawa.yamagata.jp", - "yuza.yamagata.jp", - "abu.yamaguchi.jp", - "hagi.yamaguchi.jp", - "hikari.yamaguchi.jp", - "hofu.yamaguchi.jp", - "iwakuni.yamaguchi.jp", - "kudamatsu.yamaguchi.jp", - "mitou.yamaguchi.jp", - "nagato.yamaguchi.jp", - "oshima.yamaguchi.jp", - "shimonoseki.yamaguchi.jp", - "shunan.yamaguchi.jp", - "tabuse.yamaguchi.jp", - "tokuyama.yamaguchi.jp", - "toyota.yamaguchi.jp", - "ube.yamaguchi.jp", - "yuu.yamaguchi.jp", - "chuo.yamanashi.jp", - "doshi.yamanashi.jp", - "fuefuki.yamanashi.jp", - "fujikawa.yamanashi.jp", - "fujikawaguchiko.yamanashi.jp", - "fujiyoshida.yamanashi.jp", - "hayakawa.yamanashi.jp", - "hokuto.yamanashi.jp", - "ichikawamisato.yamanashi.jp", - "kai.yamanashi.jp", - "kofu.yamanashi.jp", - "koshu.yamanashi.jp", - "kosuge.yamanashi.jp", - "minami-alps.yamanashi.jp", - "minobu.yamanashi.jp", - "nakamichi.yamanashi.jp", - "nanbu.yamanashi.jp", - "narusawa.yamanashi.jp", - "nirasaki.yamanashi.jp", - "nishikatsura.yamanashi.jp", - "oshino.yamanashi.jp", - "otsuki.yamanashi.jp", - "showa.yamanashi.jp", - "tabayama.yamanashi.jp", - "tsuru.yamanashi.jp", - "uenohara.yamanashi.jp", - "yamanakako.yamanashi.jp", - "yamanashi.yamanashi.jp", - "*.ke", - "kg", - "org.kg", - "net.kg", - "com.kg", - "edu.kg", - "gov.kg", - "mil.kg", - "*.kh", - "ki", - "edu.ki", - "biz.ki", - "net.ki", - "org.ki", - "gov.ki", - "info.ki", - "com.ki", - "km", - "org.km", - "nom.km", - "gov.km", - "prd.km", - "tm.km", - "edu.km", - "mil.km", - "ass.km", - "com.km", - "coop.km", - "asso.km", - "presse.km", - "medecin.km", - "notaires.km", - "pharmaciens.km", - "veterinaire.km", - "gouv.km", - "kn", - "net.kn", - "org.kn", - "edu.kn", - "gov.kn", - "kp", - "com.kp", - "edu.kp", - "gov.kp", - "org.kp", - "rep.kp", - "tra.kp", - "kr", - "ac.kr", - "co.kr", - "es.kr", - "go.kr", - "hs.kr", - "kg.kr", - "mil.kr", - "ms.kr", - "ne.kr", - "or.kr", - "pe.kr", - "re.kr", - "sc.kr", - "busan.kr", - "chungbuk.kr", - "chungnam.kr", - "daegu.kr", - "daejeon.kr", - "gangwon.kr", - "gwangju.kr", - "gyeongbuk.kr", - "gyeonggi.kr", - "gyeongnam.kr", - "incheon.kr", - "jeju.kr", - "jeonbuk.kr", - "jeonnam.kr", - "seoul.kr", - "ulsan.kr", - "*.kw", - "ky", - "edu.ky", - "gov.ky", - "com.ky", - "org.ky", - "net.ky", - "kz", - "org.kz", - "edu.kz", - "net.kz", - "gov.kz", - "mil.kz", - "com.kz", - "la", - "int.la", - "net.la", - "info.la", - "edu.la", - "gov.la", - "per.la", - "com.la", - "org.la", - "lb", - "com.lb", - "edu.lb", - "gov.lb", - "net.lb", - "org.lb", - "lc", - "com.lc", - "net.lc", - "co.lc", - "org.lc", - "edu.lc", - "gov.lc", - "li", - "lk", - "gov.lk", - "sch.lk", - "net.lk", - "int.lk", - "com.lk", - "org.lk", - "edu.lk", - "ngo.lk", - "soc.lk", - "web.lk", - "ltd.lk", - "assn.lk", - "grp.lk", - "hotel.lk", - "ac.lk", - "lr", - "com.lr", - "edu.lr", - "gov.lr", - "org.lr", - "net.lr", - "ls", - "co.ls", - "org.ls", - "lt", - "gov.lt", - "lu", - "lv", - "com.lv", - "edu.lv", - "gov.lv", - "org.lv", - "mil.lv", - "id.lv", - "net.lv", - "asn.lv", - "conf.lv", - "ly", - "com.ly", - "net.ly", - "gov.ly", - "plc.ly", - "edu.ly", - "sch.ly", - "med.ly", - "org.ly", - "id.ly", - "ma", - "co.ma", - "net.ma", - "gov.ma", - "org.ma", - "ac.ma", - "press.ma", - "mc", - "tm.mc", - "asso.mc", - "md", - "me", - "co.me", - "net.me", - "org.me", - "edu.me", - "ac.me", - "gov.me", - "its.me", - "priv.me", - "mg", - "org.mg", - "nom.mg", - "gov.mg", - "prd.mg", - "tm.mg", - "edu.mg", - "mil.mg", - "com.mg", - "mh", - "mil", - "mk", - "com.mk", - "org.mk", - "net.mk", - "edu.mk", - "gov.mk", - "inf.mk", - "name.mk", - "ml", - "com.ml", - "edu.ml", - "gouv.ml", - "gov.ml", - "net.ml", - "org.ml", - "presse.ml", - "*.mm", - "mn", - "gov.mn", - "edu.mn", - "org.mn", - "mo", - "com.mo", - "net.mo", - "org.mo", - "edu.mo", - "gov.mo", - "mobi", - "mp", - "mq", - "mr", - "gov.mr", - "ms", - "com.ms", - "edu.ms", - "gov.ms", - "net.ms", - "org.ms", - "mt", - "com.mt", - "edu.mt", - "net.mt", - "org.mt", - "mu", - "com.mu", - "net.mu", - "org.mu", - "gov.mu", - "ac.mu", - "co.mu", - "or.mu", - "museum", - "academy.museum", - "agriculture.museum", - "air.museum", - "airguard.museum", - "alabama.museum", - "alaska.museum", - "amber.museum", - "ambulance.museum", - "american.museum", - "americana.museum", - "americanantiques.museum", - "americanart.museum", - "amsterdam.museum", - "and.museum", - "annefrank.museum", - "anthro.museum", - "anthropology.museum", - "antiques.museum", - "aquarium.museum", - "arboretum.museum", - "archaeological.museum", - "archaeology.museum", - "architecture.museum", - "art.museum", - "artanddesign.museum", - "artcenter.museum", - "artdeco.museum", - "arteducation.museum", - "artgallery.museum", - "arts.museum", - "artsandcrafts.museum", - "asmatart.museum", - "assassination.museum", - "assisi.museum", - "association.museum", - "astronomy.museum", - "atlanta.museum", - "austin.museum", - "australia.museum", - "automotive.museum", - "aviation.museum", - "axis.museum", - "badajoz.museum", - "baghdad.museum", - "bahn.museum", - "bale.museum", - "baltimore.museum", - "barcelona.museum", - "baseball.museum", - "basel.museum", - "baths.museum", - "bauern.museum", - "beauxarts.museum", - "beeldengeluid.museum", - "bellevue.museum", - "bergbau.museum", - "berkeley.museum", - "berlin.museum", - "bern.museum", - "bible.museum", - "bilbao.museum", - "bill.museum", - "birdart.museum", - "birthplace.museum", - "bonn.museum", - "boston.museum", - "botanical.museum", - "botanicalgarden.museum", - "botanicgarden.museum", - "botany.museum", - "brandywinevalley.museum", - "brasil.museum", - "bristol.museum", - "british.museum", - "britishcolumbia.museum", - "broadcast.museum", - "brunel.museum", - "brussel.museum", - "brussels.museum", - "bruxelles.museum", - "building.museum", - "burghof.museum", - "bus.museum", - "bushey.museum", - "cadaques.museum", - "california.museum", - "cambridge.museum", - "can.museum", - "canada.museum", - "capebreton.museum", - "carrier.museum", - "cartoonart.museum", - "casadelamoneda.museum", - "castle.museum", - "castres.museum", - "celtic.museum", - "center.museum", - "chattanooga.museum", - "cheltenham.museum", - "chesapeakebay.museum", - "chicago.museum", - "children.museum", - "childrens.museum", - "childrensgarden.museum", - "chiropractic.museum", - "chocolate.museum", - "christiansburg.museum", - "cincinnati.museum", - "cinema.museum", - "circus.museum", - "civilisation.museum", - "civilization.museum", - "civilwar.museum", - "clinton.museum", - "clock.museum", - "coal.museum", - "coastaldefence.museum", - "cody.museum", - "coldwar.museum", - "collection.museum", - "colonialwilliamsburg.museum", - "coloradoplateau.museum", - "columbia.museum", - "columbus.museum", - "communication.museum", - "communications.museum", - "community.museum", - "computer.museum", - "computerhistory.museum", - "xn--comunicaes-v6a2o.museum", - "contemporary.museum", - "contemporaryart.museum", - "convent.museum", - "copenhagen.museum", - "corporation.museum", - "xn--correios-e-telecomunicaes-ghc29a.museum", - "corvette.museum", - "costume.museum", - "countryestate.museum", - "county.museum", - "crafts.museum", - "cranbrook.museum", - "creation.museum", - "cultural.museum", - "culturalcenter.museum", - "culture.museum", - "cyber.museum", - "cymru.museum", - "dali.museum", - "dallas.museum", - "database.museum", - "ddr.museum", - "decorativearts.museum", - "delaware.museum", - "delmenhorst.museum", - "denmark.museum", - "depot.museum", - "design.museum", - "detroit.museum", - "dinosaur.museum", - "discovery.museum", - "dolls.museum", - "donostia.museum", - "durham.museum", - "eastafrica.museum", - "eastcoast.museum", - "education.museum", - "educational.museum", - "egyptian.museum", - "eisenbahn.museum", - "elburg.museum", - "elvendrell.museum", - "embroidery.museum", - "encyclopedic.museum", - "england.museum", - "entomology.museum", - "environment.museum", - "environmentalconservation.museum", - "epilepsy.museum", - "essex.museum", - "estate.museum", - "ethnology.museum", - "exeter.museum", - "exhibition.museum", - "family.museum", - "farm.museum", - "farmequipment.museum", - "farmers.museum", - "farmstead.museum", - "field.museum", - "figueres.museum", - "filatelia.museum", - "film.museum", - "fineart.museum", - "finearts.museum", - "finland.museum", - "flanders.museum", - "florida.museum", - "force.museum", - "fortmissoula.museum", - "fortworth.museum", - "foundation.museum", - "francaise.museum", - "frankfurt.museum", - "franziskaner.museum", - "freemasonry.museum", - "freiburg.museum", - "fribourg.museum", - "frog.museum", - "fundacio.museum", - "furniture.museum", - "gallery.museum", - "garden.museum", - "gateway.museum", - "geelvinck.museum", - "gemological.museum", - "geology.museum", - "georgia.museum", - "giessen.museum", - "glas.museum", - "glass.museum", - "gorge.museum", - "grandrapids.museum", - "graz.museum", - "guernsey.museum", - "halloffame.museum", - "hamburg.museum", - "handson.museum", - "harvestcelebration.museum", - "hawaii.museum", - "health.museum", - "heimatunduhren.museum", - "hellas.museum", - "helsinki.museum", - "hembygdsforbund.museum", - "heritage.museum", - "histoire.museum", - "historical.museum", - "historicalsociety.museum", - "historichouses.museum", - "historisch.museum", - "historisches.museum", - "history.museum", - "historyofscience.museum", - "horology.museum", - "house.museum", - "humanities.museum", - "illustration.museum", - "imageandsound.museum", - "indian.museum", - "indiana.museum", - "indianapolis.museum", - "indianmarket.museum", - "intelligence.museum", - "interactive.museum", - "iraq.museum", - "iron.museum", - "isleofman.museum", - "jamison.museum", - "jefferson.museum", - "jerusalem.museum", - "jewelry.museum", - "jewish.museum", - "jewishart.museum", - "jfk.museum", - "journalism.museum", - "judaica.museum", - "judygarland.museum", - "juedisches.museum", - "juif.museum", - "karate.museum", - "karikatur.museum", - "kids.museum", - "koebenhavn.museum", - "koeln.museum", - "kunst.museum", - "kunstsammlung.museum", - "kunstunddesign.museum", - "labor.museum", - "labour.museum", - "lajolla.museum", - "lancashire.museum", - "landes.museum", - "lans.museum", - "xn--lns-qla.museum", - "larsson.museum", - "lewismiller.museum", - "lincoln.museum", - "linz.museum", - "living.museum", - "livinghistory.museum", - "localhistory.museum", - "london.museum", - "losangeles.museum", - "louvre.museum", - "loyalist.museum", - "lucerne.museum", - "luxembourg.museum", - "luzern.museum", - "mad.museum", - "madrid.museum", - "mallorca.museum", - "manchester.museum", - "mansion.museum", - "mansions.museum", - "manx.museum", - "marburg.museum", - "maritime.museum", - "maritimo.museum", - "maryland.museum", - "marylhurst.museum", - "media.museum", - "medical.museum", - "medizinhistorisches.museum", - "meeres.museum", - "memorial.museum", - "mesaverde.museum", - "michigan.museum", - "midatlantic.museum", - "military.museum", - "mill.museum", - "miners.museum", - "mining.museum", - "minnesota.museum", - "missile.museum", - "missoula.museum", - "modern.museum", - "moma.museum", - "money.museum", - "monmouth.museum", - "monticello.museum", - "montreal.museum", - "moscow.museum", - "motorcycle.museum", - "muenchen.museum", - "muenster.museum", - "mulhouse.museum", - "muncie.museum", - "museet.museum", - "museumcenter.museum", - "museumvereniging.museum", - "music.museum", - "national.museum", - "nationalfirearms.museum", - "nationalheritage.museum", - "nativeamerican.museum", - "naturalhistory.museum", - "naturalhistorymuseum.museum", - "naturalsciences.museum", - "nature.museum", - "naturhistorisches.museum", - "natuurwetenschappen.museum", - "naumburg.museum", - "naval.museum", - "nebraska.museum", - "neues.museum", - "newhampshire.museum", - "newjersey.museum", - "newmexico.museum", - "newport.museum", - "newspaper.museum", - "newyork.museum", - "niepce.museum", - "norfolk.museum", - "north.museum", - "nrw.museum", - "nuernberg.museum", - "nuremberg.museum", - "nyc.museum", - "nyny.museum", - "oceanographic.museum", - "oceanographique.museum", - "omaha.museum", - "online.museum", - "ontario.museum", - "openair.museum", - "oregon.museum", - "oregontrail.museum", - "otago.museum", - "oxford.museum", - "pacific.museum", - "paderborn.museum", - "palace.museum", - "paleo.museum", - "palmsprings.museum", - "panama.museum", - "paris.museum", - "pasadena.museum", - "pharmacy.museum", - "philadelphia.museum", - "philadelphiaarea.museum", - "philately.museum", - "phoenix.museum", - "photography.museum", - "pilots.museum", - "pittsburgh.museum", - "planetarium.museum", - "plantation.museum", - "plants.museum", - "plaza.museum", - "portal.museum", - "portland.museum", - "portlligat.museum", - "posts-and-telecommunications.museum", - "preservation.museum", - "presidio.museum", - "press.museum", - "project.museum", - "public.museum", - "pubol.museum", - "quebec.museum", - "railroad.museum", - "railway.museum", - "research.museum", - "resistance.museum", - "riodejaneiro.museum", - "rochester.museum", - "rockart.museum", - "roma.museum", - "russia.museum", - "saintlouis.museum", - "salem.museum", - "salvadordali.museum", - "salzburg.museum", - "sandiego.museum", - "sanfrancisco.museum", - "santabarbara.museum", - "santacruz.museum", - "santafe.museum", - "saskatchewan.museum", - "satx.museum", - "savannahga.museum", - "schlesisches.museum", - "schoenbrunn.museum", - "schokoladen.museum", - "school.museum", - "schweiz.museum", - "science.museum", - "scienceandhistory.museum", - "scienceandindustry.museum", - "sciencecenter.museum", - "sciencecenters.museum", - "science-fiction.museum", - "sciencehistory.museum", - "sciences.museum", - "sciencesnaturelles.museum", - "scotland.museum", - "seaport.museum", - "settlement.museum", - "settlers.museum", - "shell.museum", - "sherbrooke.museum", - "sibenik.museum", - "silk.museum", - "ski.museum", - "skole.museum", - "society.museum", - "sologne.museum", - "soundandvision.museum", - "southcarolina.museum", - "southwest.museum", - "space.museum", - "spy.museum", - "square.museum", - "stadt.museum", - "stalbans.museum", - "starnberg.museum", - "state.museum", - "stateofdelaware.museum", - "station.museum", - "steam.museum", - "steiermark.museum", - "stjohn.museum", - "stockholm.museum", - "stpetersburg.museum", - "stuttgart.museum", - "suisse.museum", - "surgeonshall.museum", - "surrey.museum", - "svizzera.museum", - "sweden.museum", - "sydney.museum", - "tank.museum", - "tcm.museum", - "technology.museum", - "telekommunikation.museum", - "television.museum", - "texas.museum", - "textile.museum", - "theater.museum", - "time.museum", - "timekeeping.museum", - "topology.museum", - "torino.museum", - "touch.museum", - "town.museum", - "transport.museum", - "tree.museum", - "trolley.museum", - "trust.museum", - "trustee.museum", - "uhren.museum", - "ulm.museum", - "undersea.museum", - "university.museum", - "usa.museum", - "usantiques.museum", - "usarts.museum", - "uscountryestate.museum", - "usculture.museum", - "usdecorativearts.museum", - "usgarden.museum", - "ushistory.museum", - "ushuaia.museum", - "uslivinghistory.museum", - "utah.museum", - "uvic.museum", - "valley.museum", - "vantaa.museum", - "versailles.museum", - "viking.museum", - "village.museum", - "virginia.museum", - "virtual.museum", - "virtuel.museum", - "vlaanderen.museum", - "volkenkunde.museum", - "wales.museum", - "wallonie.museum", - "war.museum", - "washingtondc.museum", - "watchandclock.museum", - "watch-and-clock.museum", - "western.museum", - "westfalen.museum", - "whaling.museum", - "wildlife.museum", - "williamsburg.museum", - "windmill.museum", - "workshop.museum", - "york.museum", - "yorkshire.museum", - "yosemite.museum", - "youth.museum", - "zoological.museum", - "zoology.museum", - "xn--9dbhblg6di.museum", - "xn--h1aegh.museum", - "mv", - "aero.mv", - "biz.mv", - "com.mv", - "coop.mv", - "edu.mv", - "gov.mv", - "info.mv", - "int.mv", - "mil.mv", - "museum.mv", - "name.mv", - "net.mv", - "org.mv", - "pro.mv", - "mw", - "ac.mw", - "biz.mw", - "co.mw", - "com.mw", - "coop.mw", - "edu.mw", - "gov.mw", - "int.mw", - "museum.mw", - "net.mw", - "org.mw", - "mx", - "com.mx", - "org.mx", - "gob.mx", - "edu.mx", - "net.mx", - "my", - "com.my", - "net.my", - "org.my", - "gov.my", - "edu.my", - "mil.my", - "name.my", - "*.mz", - "!teledata.mz", - "na", - "info.na", - "pro.na", - "name.na", - "school.na", - "or.na", - "dr.na", - "us.na", - "mx.na", - "ca.na", - "in.na", - "cc.na", - "tv.na", - "ws.na", - "mobi.na", - "co.na", - "com.na", - "org.na", - "name", - "nc", - "asso.nc", - "ne", - "net", - "nf", - "com.nf", - "net.nf", - "per.nf", - "rec.nf", - "web.nf", - "arts.nf", - "firm.nf", - "info.nf", - "other.nf", - "store.nf", - "ng", - "com.ng", - "edu.ng", - "name.ng", - "net.ng", - "org.ng", - "sch.ng", - "gov.ng", - "mil.ng", - "mobi.ng", - "*.ni", - "nl", - "bv.nl", - "no", - "fhs.no", - "vgs.no", - "fylkesbibl.no", - "folkebibl.no", - "museum.no", - "idrett.no", - "priv.no", - "mil.no", - "stat.no", - "dep.no", - "kommune.no", - "herad.no", - "aa.no", - "ah.no", - "bu.no", - "fm.no", - "hl.no", - "hm.no", - "jan-mayen.no", - "mr.no", - "nl.no", - "nt.no", - "of.no", - "ol.no", - "oslo.no", - "rl.no", - "sf.no", - "st.no", - "svalbard.no", - "tm.no", - "tr.no", - "va.no", - "vf.no", - "gs.aa.no", - "gs.ah.no", - "gs.bu.no", - "gs.fm.no", - "gs.hl.no", - "gs.hm.no", - "gs.jan-mayen.no", - "gs.mr.no", - "gs.nl.no", - "gs.nt.no", - "gs.of.no", - "gs.ol.no", - "gs.oslo.no", - "gs.rl.no", - "gs.sf.no", - "gs.st.no", - "gs.svalbard.no", - "gs.tm.no", - "gs.tr.no", - "gs.va.no", - "gs.vf.no", - "akrehamn.no", - "xn--krehamn-dxa.no", - "algard.no", - "xn--lgrd-poac.no", - "arna.no", - "brumunddal.no", - "bryne.no", - "bronnoysund.no", - "xn--brnnysund-m8ac.no", - "drobak.no", - "xn--drbak-wua.no", - "egersund.no", - "fetsund.no", - "floro.no", - "xn--flor-jra.no", - "fredrikstad.no", - "hokksund.no", - "honefoss.no", - "xn--hnefoss-q1a.no", - "jessheim.no", - "jorpeland.no", - "xn--jrpeland-54a.no", - "kirkenes.no", - "kopervik.no", - "krokstadelva.no", - "langevag.no", - "xn--langevg-jxa.no", - "leirvik.no", - "mjondalen.no", - "xn--mjndalen-64a.no", - "mo-i-rana.no", - "mosjoen.no", - "xn--mosjen-eya.no", - "nesoddtangen.no", - "orkanger.no", - "osoyro.no", - "xn--osyro-wua.no", - "raholt.no", - "xn--rholt-mra.no", - "sandnessjoen.no", - "xn--sandnessjen-ogb.no", - "skedsmokorset.no", - "slattum.no", - "spjelkavik.no", - "stathelle.no", - "stavern.no", - "stjordalshalsen.no", - "xn--stjrdalshalsen-sqb.no", - "tananger.no", - "tranby.no", - "vossevangen.no", - "afjord.no", - "xn--fjord-lra.no", - "agdenes.no", - "al.no", - "xn--l-1fa.no", - "alesund.no", - "xn--lesund-hua.no", - "alstahaug.no", - "alta.no", - "xn--lt-liac.no", - "alaheadju.no", - "xn--laheadju-7ya.no", - "alvdal.no", - "amli.no", - "xn--mli-tla.no", - "amot.no", - "xn--mot-tla.no", - "andebu.no", - "andoy.no", - "xn--andy-ira.no", - "andasuolo.no", - "ardal.no", - "xn--rdal-poa.no", - "aremark.no", - "arendal.no", - "xn--s-1fa.no", - "aseral.no", - "xn--seral-lra.no", - "asker.no", - "askim.no", - "askvoll.no", - "askoy.no", - "xn--asky-ira.no", - "asnes.no", - "xn--snes-poa.no", - "audnedaln.no", - "aukra.no", - "aure.no", - "aurland.no", - "aurskog-holand.no", - "xn--aurskog-hland-jnb.no", - "austevoll.no", - "austrheim.no", - "averoy.no", - "xn--avery-yua.no", - "balestrand.no", - "ballangen.no", - "balat.no", - "xn--blt-elab.no", - "balsfjord.no", - "bahccavuotna.no", - "xn--bhccavuotna-k7a.no", - "bamble.no", - "bardu.no", - "beardu.no", - "beiarn.no", - "bajddar.no", - "xn--bjddar-pta.no", - "baidar.no", - "xn--bidr-5nac.no", - "berg.no", - "bergen.no", - "berlevag.no", - "xn--berlevg-jxa.no", - "bearalvahki.no", - "xn--bearalvhki-y4a.no", - "bindal.no", - "birkenes.no", - "bjarkoy.no", - "xn--bjarky-fya.no", - "bjerkreim.no", - "bjugn.no", - "bodo.no", - "xn--bod-2na.no", - "badaddja.no", - "xn--bdddj-mrabd.no", - "budejju.no", - "bokn.no", - "bremanger.no", - "bronnoy.no", - "xn--brnny-wuac.no", - "bygland.no", - "bykle.no", - "barum.no", - "xn--brum-voa.no", - "bo.telemark.no", - "xn--b-5ga.telemark.no", - "bo.nordland.no", - "xn--b-5ga.nordland.no", - "bievat.no", - "xn--bievt-0qa.no", - "bomlo.no", - "xn--bmlo-gra.no", - "batsfjord.no", - "xn--btsfjord-9za.no", - "bahcavuotna.no", - "xn--bhcavuotna-s4a.no", - "dovre.no", - "drammen.no", - "drangedal.no", - "dyroy.no", - "xn--dyry-ira.no", - "donna.no", - "xn--dnna-gra.no", - "eid.no", - "eidfjord.no", - "eidsberg.no", - "eidskog.no", - "eidsvoll.no", - "eigersund.no", - "elverum.no", - "enebakk.no", - "engerdal.no", - "etne.no", - "etnedal.no", - "evenes.no", - "evenassi.no", - "xn--eveni-0qa01ga.no", - "evje-og-hornnes.no", - "farsund.no", - "fauske.no", - "fuossko.no", - "fuoisku.no", - "fedje.no", - "fet.no", - "finnoy.no", - "xn--finny-yua.no", - "fitjar.no", - "fjaler.no", - "fjell.no", - "flakstad.no", - "flatanger.no", - "flekkefjord.no", - "flesberg.no", - "flora.no", - "fla.no", - "xn--fl-zia.no", - "folldal.no", - "forsand.no", - "fosnes.no", - "frei.no", - "frogn.no", - "froland.no", - "frosta.no", - "frana.no", - "xn--frna-woa.no", - "froya.no", - "xn--frya-hra.no", - "fusa.no", - "fyresdal.no", - "forde.no", - "xn--frde-gra.no", - "gamvik.no", - "gangaviika.no", - "xn--ggaviika-8ya47h.no", - "gaular.no", - "gausdal.no", - "gildeskal.no", - "xn--gildeskl-g0a.no", - "giske.no", - "gjemnes.no", - "gjerdrum.no", - "gjerstad.no", - "gjesdal.no", - "gjovik.no", - "xn--gjvik-wua.no", - "gloppen.no", - "gol.no", - "gran.no", - "grane.no", - "granvin.no", - "gratangen.no", - "grimstad.no", - "grong.no", - "kraanghke.no", - "xn--kranghke-b0a.no", - "grue.no", - "gulen.no", - "hadsel.no", - "halden.no", - "halsa.no", - "hamar.no", - "hamaroy.no", - "habmer.no", - "xn--hbmer-xqa.no", - "hapmir.no", - "xn--hpmir-xqa.no", - "hammerfest.no", - "hammarfeasta.no", - "xn--hmmrfeasta-s4ac.no", - "haram.no", - "hareid.no", - "harstad.no", - "hasvik.no", - "aknoluokta.no", - "xn--koluokta-7ya57h.no", - "hattfjelldal.no", - "aarborte.no", - "haugesund.no", - "hemne.no", - "hemnes.no", - "hemsedal.no", - "heroy.more-og-romsdal.no", - "xn--hery-ira.xn--mre-og-romsdal-qqb.no", - "heroy.nordland.no", - "xn--hery-ira.nordland.no", - "hitra.no", - "hjartdal.no", - "hjelmeland.no", - "hobol.no", - "xn--hobl-ira.no", - "hof.no", - "hol.no", - "hole.no", - "holmestrand.no", - "holtalen.no", - "xn--holtlen-hxa.no", - "hornindal.no", - "horten.no", - "hurdal.no", - "hurum.no", - "hvaler.no", - "hyllestad.no", - "hagebostad.no", - "xn--hgebostad-g3a.no", - "hoyanger.no", - "xn--hyanger-q1a.no", - "hoylandet.no", - "xn--hylandet-54a.no", - "ha.no", - "xn--h-2fa.no", - "ibestad.no", - "inderoy.no", - "xn--indery-fya.no", - "iveland.no", - "jevnaker.no", - "jondal.no", - "jolster.no", - "xn--jlster-bya.no", - "karasjok.no", - "karasjohka.no", - "xn--krjohka-hwab49j.no", - "karlsoy.no", - "galsa.no", - "xn--gls-elac.no", - "karmoy.no", - "xn--karmy-yua.no", - "kautokeino.no", - "guovdageaidnu.no", - "klepp.no", - "klabu.no", - "xn--klbu-woa.no", - "kongsberg.no", - "kongsvinger.no", - "kragero.no", - "xn--krager-gya.no", - "kristiansand.no", - "kristiansund.no", - "krodsherad.no", - "xn--krdsherad-m8a.no", - "kvalsund.no", - "rahkkeravju.no", - "xn--rhkkervju-01af.no", - "kvam.no", - "kvinesdal.no", - "kvinnherad.no", - "kviteseid.no", - "kvitsoy.no", - "xn--kvitsy-fya.no", - "kvafjord.no", - "xn--kvfjord-nxa.no", - "giehtavuoatna.no", - "kvanangen.no", - "xn--kvnangen-k0a.no", - "navuotna.no", - "xn--nvuotna-hwa.no", - "kafjord.no", - "xn--kfjord-iua.no", - "gaivuotna.no", - "xn--givuotna-8ya.no", - "larvik.no", - "lavangen.no", - "lavagis.no", - "loabat.no", - "xn--loabt-0qa.no", - "lebesby.no", - "davvesiida.no", - "leikanger.no", - "leirfjord.no", - "leka.no", - "leksvik.no", - "lenvik.no", - "leangaviika.no", - "xn--leagaviika-52b.no", - "lesja.no", - "levanger.no", - "lier.no", - "lierne.no", - "lillehammer.no", - "lillesand.no", - "lindesnes.no", - "lindas.no", - "xn--linds-pra.no", - "lom.no", - "loppa.no", - "lahppi.no", - "xn--lhppi-xqa.no", - "lund.no", - "lunner.no", - "luroy.no", - "xn--lury-ira.no", - "luster.no", - "lyngdal.no", - "lyngen.no", - "ivgu.no", - "lardal.no", - "lerdal.no", - "xn--lrdal-sra.no", - "lodingen.no", - "xn--ldingen-q1a.no", - "lorenskog.no", - "xn--lrenskog-54a.no", - "loten.no", - "xn--lten-gra.no", - "malvik.no", - "masoy.no", - "xn--msy-ula0h.no", - "muosat.no", - "xn--muost-0qa.no", - "mandal.no", - "marker.no", - "marnardal.no", - "masfjorden.no", - "meland.no", - "meldal.no", - "melhus.no", - "meloy.no", - "xn--mely-ira.no", - "meraker.no", - "xn--merker-kua.no", - "moareke.no", - "xn--moreke-jua.no", - "midsund.no", - "midtre-gauldal.no", - "modalen.no", - "modum.no", - "molde.no", - "moskenes.no", - "moss.no", - "mosvik.no", - "malselv.no", - "xn--mlselv-iua.no", - "malatvuopmi.no", - "xn--mlatvuopmi-s4a.no", - "namdalseid.no", - "aejrie.no", - "namsos.no", - "namsskogan.no", - "naamesjevuemie.no", - "xn--nmesjevuemie-tcba.no", - "laakesvuemie.no", - "nannestad.no", - "narvik.no", - "narviika.no", - "naustdal.no", - "nedre-eiker.no", - "nes.akershus.no", - "nes.buskerud.no", - "nesna.no", - "nesodden.no", - "nesseby.no", - "unjarga.no", - "xn--unjrga-rta.no", - "nesset.no", - "nissedal.no", - "nittedal.no", - "nord-aurdal.no", - "nord-fron.no", - "nord-odal.no", - "norddal.no", - "nordkapp.no", - "davvenjarga.no", - "xn--davvenjrga-y4a.no", - "nordre-land.no", - "nordreisa.no", - "raisa.no", - "xn--risa-5na.no", - "nore-og-uvdal.no", - "notodden.no", - "naroy.no", - "xn--nry-yla5g.no", - "notteroy.no", - "xn--nttery-byae.no", - "odda.no", - "oksnes.no", - "xn--ksnes-uua.no", - "oppdal.no", - "oppegard.no", - "xn--oppegrd-ixa.no", - "orkdal.no", - "orland.no", - "xn--rland-uua.no", - "orskog.no", - "xn--rskog-uua.no", - "orsta.no", - "xn--rsta-fra.no", - "os.hedmark.no", - "os.hordaland.no", - "osen.no", - "osteroy.no", - "xn--ostery-fya.no", - "ostre-toten.no", - "xn--stre-toten-zcb.no", - "overhalla.no", - "ovre-eiker.no", - "xn--vre-eiker-k8a.no", - "oyer.no", - "xn--yer-zna.no", - "oygarden.no", - "xn--ygarden-p1a.no", - "oystre-slidre.no", - "xn--ystre-slidre-ujb.no", - "porsanger.no", - "porsangu.no", - "xn--porsgu-sta26f.no", - "porsgrunn.no", - "radoy.no", - "xn--rady-ira.no", - "rakkestad.no", - "rana.no", - "ruovat.no", - "randaberg.no", - "rauma.no", - "rendalen.no", - "rennebu.no", - "rennesoy.no", - "xn--rennesy-v1a.no", - "rindal.no", - "ringebu.no", - "ringerike.no", - "ringsaker.no", - "rissa.no", - "risor.no", - "xn--risr-ira.no", - "roan.no", - "rollag.no", - "rygge.no", - "ralingen.no", - "xn--rlingen-mxa.no", - "rodoy.no", - "xn--rdy-0nab.no", - "romskog.no", - "xn--rmskog-bya.no", - "roros.no", - "xn--rros-gra.no", - "rost.no", - "xn--rst-0na.no", - "royken.no", - "xn--ryken-vua.no", - "royrvik.no", - "xn--ryrvik-bya.no", - "rade.no", - "xn--rde-ula.no", - "salangen.no", - "siellak.no", - "saltdal.no", - "salat.no", - "xn--slt-elab.no", - "xn--slat-5na.no", - "samnanger.no", - "sande.more-og-romsdal.no", - "sande.xn--mre-og-romsdal-qqb.no", - "sande.vestfold.no", - "sandefjord.no", - "sandnes.no", - "sandoy.no", - "xn--sandy-yua.no", - "sarpsborg.no", - "sauda.no", - "sauherad.no", - "sel.no", - "selbu.no", - "selje.no", - "seljord.no", - "sigdal.no", - "siljan.no", - "sirdal.no", - "skaun.no", - "skedsmo.no", - "ski.no", - "skien.no", - "skiptvet.no", - "skjervoy.no", - "xn--skjervy-v1a.no", - "skierva.no", - "xn--skierv-uta.no", - "skjak.no", - "xn--skjk-soa.no", - "skodje.no", - "skanland.no", - "xn--sknland-fxa.no", - "skanit.no", - "xn--sknit-yqa.no", - "smola.no", - "xn--smla-hra.no", - "snillfjord.no", - "snasa.no", - "xn--snsa-roa.no", - "snoasa.no", - "snaase.no", - "xn--snase-nra.no", - "sogndal.no", - "sokndal.no", - "sola.no", - "solund.no", - "songdalen.no", - "sortland.no", - "spydeberg.no", - "stange.no", - "stavanger.no", - "steigen.no", - "steinkjer.no", - "stjordal.no", - "xn--stjrdal-s1a.no", - "stokke.no", - "stor-elvdal.no", - "stord.no", - "stordal.no", - "storfjord.no", - "omasvuotna.no", - "strand.no", - "stranda.no", - "stryn.no", - "sula.no", - "suldal.no", - "sund.no", - "sunndal.no", - "surnadal.no", - "sveio.no", - "svelvik.no", - "sykkylven.no", - "sogne.no", - "xn--sgne-gra.no", - "somna.no", - "xn--smna-gra.no", - "sondre-land.no", - "xn--sndre-land-0cb.no", - "sor-aurdal.no", - "xn--sr-aurdal-l8a.no", - "sor-fron.no", - "xn--sr-fron-q1a.no", - "sor-odal.no", - "xn--sr-odal-q1a.no", - "sor-varanger.no", - "xn--sr-varanger-ggb.no", - "matta-varjjat.no", - "xn--mtta-vrjjat-k7af.no", - "sorfold.no", - "xn--srfold-bya.no", - "sorreisa.no", - "xn--srreisa-q1a.no", - "sorum.no", - "xn--srum-gra.no", - "tana.no", - "deatnu.no", - "time.no", - "tingvoll.no", - "tinn.no", - "tjeldsund.no", - "dielddanuorri.no", - "tjome.no", - "xn--tjme-hra.no", - "tokke.no", - "tolga.no", - "torsken.no", - "tranoy.no", - "xn--trany-yua.no", - "tromso.no", - "xn--troms-zua.no", - "tromsa.no", - "romsa.no", - "trondheim.no", - "troandin.no", - "trysil.no", - "trana.no", - "xn--trna-woa.no", - "trogstad.no", - "xn--trgstad-r1a.no", - "tvedestrand.no", - "tydal.no", - "tynset.no", - "tysfjord.no", - "divtasvuodna.no", - "divttasvuotna.no", - "tysnes.no", - "tysvar.no", - "xn--tysvr-vra.no", - "tonsberg.no", - "xn--tnsberg-q1a.no", - "ullensaker.no", - "ullensvang.no", - "ulvik.no", - "utsira.no", - "vadso.no", - "xn--vads-jra.no", - "cahcesuolo.no", - "xn--hcesuolo-7ya35b.no", - "vaksdal.no", - "valle.no", - "vang.no", - "vanylven.no", - "vardo.no", - "xn--vard-jra.no", - "varggat.no", - "xn--vrggt-xqad.no", - "vefsn.no", - "vaapste.no", - "vega.no", - "vegarshei.no", - "xn--vegrshei-c0a.no", - "vennesla.no", - "verdal.no", - "verran.no", - "vestby.no", - "vestnes.no", - "vestre-slidre.no", - "vestre-toten.no", - "vestvagoy.no", - "xn--vestvgy-ixa6o.no", - "vevelstad.no", - "vik.no", - "vikna.no", - "vindafjord.no", - "volda.no", - "voss.no", - "varoy.no", - "xn--vry-yla5g.no", - "vagan.no", - "xn--vgan-qoa.no", - "voagat.no", - "vagsoy.no", - "xn--vgsy-qoa0j.no", - "vaga.no", - "xn--vg-yiab.no", - "valer.ostfold.no", - "xn--vler-qoa.xn--stfold-9xa.no", - "valer.hedmark.no", - "xn--vler-qoa.hedmark.no", - "*.np", - "nr", - "biz.nr", - "info.nr", - "gov.nr", - "edu.nr", - "org.nr", - "net.nr", - "com.nr", - "nu", - "nz", - "ac.nz", - "co.nz", - "cri.nz", - "geek.nz", - "gen.nz", - "govt.nz", - "health.nz", - "iwi.nz", - "kiwi.nz", - "maori.nz", - "mil.nz", - "xn--mori-qsa.nz", - "net.nz", - "org.nz", - "parliament.nz", - "school.nz", - "om", - "co.om", - "com.om", - "edu.om", - "gov.om", - "med.om", - "museum.om", - "net.om", - "org.om", - "pro.om", - "org", - "pa", - "ac.pa", - "gob.pa", - "com.pa", - "org.pa", - "sld.pa", - "edu.pa", - "net.pa", - "ing.pa", - "abo.pa", - "med.pa", - "nom.pa", - "pe", - "edu.pe", - "gob.pe", - "nom.pe", - "mil.pe", - "org.pe", - "com.pe", - "net.pe", - "pf", - "com.pf", - "org.pf", - "edu.pf", - "*.pg", - "ph", - "com.ph", - "net.ph", - "org.ph", - "gov.ph", - "edu.ph", - "ngo.ph", - "mil.ph", - "i.ph", - "pk", - "com.pk", - "net.pk", - "edu.pk", - "org.pk", - "fam.pk", - "biz.pk", - "web.pk", - "gov.pk", - "gob.pk", - "gok.pk", - "gon.pk", - "gop.pk", - "gos.pk", - "info.pk", - "pl", - "com.pl", - "net.pl", - "org.pl", - "aid.pl", - "agro.pl", - "atm.pl", - "auto.pl", - "biz.pl", - "edu.pl", - "gmina.pl", - "gsm.pl", - "info.pl", - "mail.pl", - "miasta.pl", - "media.pl", - "mil.pl", - "nieruchomosci.pl", - "nom.pl", - "pc.pl", - "powiat.pl", - "priv.pl", - "realestate.pl", - "rel.pl", - "sex.pl", - "shop.pl", - "sklep.pl", - "sos.pl", - "szkola.pl", - "targi.pl", - "tm.pl", - "tourism.pl", - "travel.pl", - "turystyka.pl", - "gov.pl", - "ap.gov.pl", - "ic.gov.pl", - "is.gov.pl", - "us.gov.pl", - "kmpsp.gov.pl", - "kppsp.gov.pl", - "kwpsp.gov.pl", - "psp.gov.pl", - "wskr.gov.pl", - "kwp.gov.pl", - "mw.gov.pl", - "ug.gov.pl", - "um.gov.pl", - "umig.gov.pl", - "ugim.gov.pl", - "upow.gov.pl", - "uw.gov.pl", - "starostwo.gov.pl", - "pa.gov.pl", - "po.gov.pl", - "psse.gov.pl", - "pup.gov.pl", - "rzgw.gov.pl", - "sa.gov.pl", - "so.gov.pl", - "sr.gov.pl", - "wsa.gov.pl", - "sko.gov.pl", - "uzs.gov.pl", - "wiih.gov.pl", - "winb.gov.pl", - "pinb.gov.pl", - "wios.gov.pl", - "witd.gov.pl", - "wzmiuw.gov.pl", - "piw.gov.pl", - "wiw.gov.pl", - "griw.gov.pl", - "wif.gov.pl", - "oum.gov.pl", - "sdn.gov.pl", - "zp.gov.pl", - "uppo.gov.pl", - "mup.gov.pl", - "wuoz.gov.pl", - "konsulat.gov.pl", - "oirm.gov.pl", - "augustow.pl", - "babia-gora.pl", - "bedzin.pl", - "beskidy.pl", - "bialowieza.pl", - "bialystok.pl", - "bielawa.pl", - "bieszczady.pl", - "boleslawiec.pl", - "bydgoszcz.pl", - "bytom.pl", - "cieszyn.pl", - "czeladz.pl", - "czest.pl", - "dlugoleka.pl", - "elblag.pl", - "elk.pl", - "glogow.pl", - "gniezno.pl", - "gorlice.pl", - "grajewo.pl", - "ilawa.pl", - "jaworzno.pl", - "jelenia-gora.pl", - "jgora.pl", - "kalisz.pl", - "kazimierz-dolny.pl", - "karpacz.pl", - "kartuzy.pl", - "kaszuby.pl", - "katowice.pl", - "kepno.pl", - "ketrzyn.pl", - "klodzko.pl", - "kobierzyce.pl", - "kolobrzeg.pl", - "konin.pl", - "konskowola.pl", - "kutno.pl", - "lapy.pl", - "lebork.pl", - "legnica.pl", - "lezajsk.pl", - "limanowa.pl", - "lomza.pl", - "lowicz.pl", - "lubin.pl", - "lukow.pl", - "malbork.pl", - "malopolska.pl", - "mazowsze.pl", - "mazury.pl", - "mielec.pl", - "mielno.pl", - "mragowo.pl", - "naklo.pl", - "nowaruda.pl", - "nysa.pl", - "olawa.pl", - "olecko.pl", - "olkusz.pl", - "olsztyn.pl", - "opoczno.pl", - "opole.pl", - "ostroda.pl", - "ostroleka.pl", - "ostrowiec.pl", - "ostrowwlkp.pl", - "pila.pl", - "pisz.pl", - "podhale.pl", - "podlasie.pl", - "polkowice.pl", - "pomorze.pl", - "pomorskie.pl", - "prochowice.pl", - "pruszkow.pl", - "przeworsk.pl", - "pulawy.pl", - "radom.pl", - "rawa-maz.pl", - "rybnik.pl", - "rzeszow.pl", - "sanok.pl", - "sejny.pl", - "slask.pl", - "slupsk.pl", - "sosnowiec.pl", - "stalowa-wola.pl", - "skoczow.pl", - "starachowice.pl", - "stargard.pl", - "suwalki.pl", - "swidnica.pl", - "swiebodzin.pl", - "swinoujscie.pl", - "szczecin.pl", - "szczytno.pl", - "tarnobrzeg.pl", - "tgory.pl", - "turek.pl", - "tychy.pl", - "ustka.pl", - "walbrzych.pl", - "warmia.pl", - "warszawa.pl", - "waw.pl", - "wegrow.pl", - "wielun.pl", - "wlocl.pl", - "wloclawek.pl", - "wodzislaw.pl", - "wolomin.pl", - "wroclaw.pl", - "zachpomor.pl", - "zagan.pl", - "zarow.pl", - "zgora.pl", - "zgorzelec.pl", - "pm", - "pn", - "gov.pn", - "co.pn", - "org.pn", - "edu.pn", - "net.pn", - "post", - "pr", - "com.pr", - "net.pr", - "org.pr", - "gov.pr", - "edu.pr", - "isla.pr", - "pro.pr", - "biz.pr", - "info.pr", - "name.pr", - "est.pr", - "prof.pr", - "ac.pr", - "pro", - "aca.pro", - "bar.pro", - "cpa.pro", - "jur.pro", - "law.pro", - "med.pro", - "eng.pro", - "ps", - "edu.ps", - "gov.ps", - "sec.ps", - "plo.ps", - "com.ps", - "org.ps", - "net.ps", - "pt", - "net.pt", - "gov.pt", - "org.pt", - "edu.pt", - "int.pt", - "publ.pt", - "com.pt", - "nome.pt", - "pw", - "co.pw", - "ne.pw", - "or.pw", - "ed.pw", - "go.pw", - "belau.pw", - "py", - "com.py", - "coop.py", - "edu.py", - "gov.py", - "mil.py", - "net.py", - "org.py", - "qa", - "com.qa", - "edu.qa", - "gov.qa", - "mil.qa", - "name.qa", - "net.qa", - "org.qa", - "sch.qa", - "re", - "com.re", - "asso.re", - "nom.re", - "ro", - "com.ro", - "org.ro", - "tm.ro", - "nt.ro", - "nom.ro", - "info.ro", - "rec.ro", - "arts.ro", - "firm.ro", - "store.ro", - "www.ro", - "rs", - "co.rs", - "org.rs", - "edu.rs", - "ac.rs", - "gov.rs", - "in.rs", - "ru", - "ac.ru", - "com.ru", - "edu.ru", - "int.ru", - "net.ru", - "org.ru", - "pp.ru", - "adygeya.ru", - "altai.ru", - "amur.ru", - "arkhangelsk.ru", - "astrakhan.ru", - "bashkiria.ru", - "belgorod.ru", - "bir.ru", - "bryansk.ru", - "buryatia.ru", - "cbg.ru", - "chel.ru", - "chelyabinsk.ru", - "chita.ru", - "chukotka.ru", - "chuvashia.ru", - "dagestan.ru", - "dudinka.ru", - "e-burg.ru", - "grozny.ru", - "irkutsk.ru", - "ivanovo.ru", - "izhevsk.ru", - "jar.ru", - "joshkar-ola.ru", - "kalmykia.ru", - "kaluga.ru", - "kamchatka.ru", - "karelia.ru", - "kazan.ru", - "kchr.ru", - "kemerovo.ru", - "khabarovsk.ru", - "khakassia.ru", - "khv.ru", - "kirov.ru", - "koenig.ru", - "komi.ru", - "kostroma.ru", - "krasnoyarsk.ru", - "kuban.ru", - "kurgan.ru", - "kursk.ru", - "lipetsk.ru", - "magadan.ru", - "mari.ru", - "mari-el.ru", - "marine.ru", - "mordovia.ru", - "msk.ru", - "murmansk.ru", - "nalchik.ru", - "nnov.ru", - "nov.ru", - "novosibirsk.ru", - "nsk.ru", - "omsk.ru", - "orenburg.ru", - "oryol.ru", - "palana.ru", - "penza.ru", - "perm.ru", - "ptz.ru", - "rnd.ru", - "ryazan.ru", - "sakhalin.ru", - "samara.ru", - "saratov.ru", - "simbirsk.ru", - "smolensk.ru", - "spb.ru", - "stavropol.ru", - "stv.ru", - "surgut.ru", - "tambov.ru", - "tatarstan.ru", - "tom.ru", - "tomsk.ru", - "tsaritsyn.ru", - "tsk.ru", - "tula.ru", - "tuva.ru", - "tver.ru", - "tyumen.ru", - "udm.ru", - "udmurtia.ru", - "ulan-ude.ru", - "vladikavkaz.ru", - "vladimir.ru", - "vladivostok.ru", - "volgograd.ru", - "vologda.ru", - "voronezh.ru", - "vrn.ru", - "vyatka.ru", - "yakutia.ru", - "yamal.ru", - "yaroslavl.ru", - "yekaterinburg.ru", - "yuzhno-sakhalinsk.ru", - "amursk.ru", - "baikal.ru", - "cmw.ru", - "fareast.ru", - "jamal.ru", - "kms.ru", - "k-uralsk.ru", - "kustanai.ru", - "kuzbass.ru", - "magnitka.ru", - "mytis.ru", - "nakhodka.ru", - "nkz.ru", - "norilsk.ru", - "oskol.ru", - "pyatigorsk.ru", - "rubtsovsk.ru", - "snz.ru", - "syzran.ru", - "vdonsk.ru", - "zgrad.ru", - "gov.ru", - "mil.ru", - "test.ru", - "rw", - "gov.rw", - "net.rw", - "edu.rw", - "ac.rw", - "com.rw", - "co.rw", - "int.rw", - "mil.rw", - "gouv.rw", - "sa", - "com.sa", - "net.sa", - "org.sa", - "gov.sa", - "med.sa", - "pub.sa", - "edu.sa", - "sch.sa", - "sb", - "com.sb", - "edu.sb", - "gov.sb", - "net.sb", - "org.sb", - "sc", - "com.sc", - "gov.sc", - "net.sc", - "org.sc", - "edu.sc", - "sd", - "com.sd", - "net.sd", - "org.sd", - "edu.sd", - "med.sd", - "tv.sd", - "gov.sd", - "info.sd", - "se", - "a.se", - "ac.se", - "b.se", - "bd.se", - "brand.se", - "c.se", - "d.se", - "e.se", - "f.se", - "fh.se", - "fhsk.se", - "fhv.se", - "g.se", - "h.se", - "i.se", - "k.se", - "komforb.se", - "kommunalforbund.se", - "komvux.se", - "l.se", - "lanbib.se", - "m.se", - "n.se", - "naturbruksgymn.se", - "o.se", - "org.se", - "p.se", - "parti.se", - "pp.se", - "press.se", - "r.se", - "s.se", - "t.se", - "tm.se", - "u.se", - "w.se", - "x.se", - "y.se", - "z.se", - "sg", - "com.sg", - "net.sg", - "org.sg", - "gov.sg", - "edu.sg", - "per.sg", - "sh", - "com.sh", - "net.sh", - "gov.sh", - "org.sh", - "mil.sh", - "si", - "sj", - "sk", - "sl", - "com.sl", - "net.sl", - "edu.sl", - "gov.sl", - "org.sl", - "sm", - "sn", - "art.sn", - "com.sn", - "edu.sn", - "gouv.sn", - "org.sn", - "perso.sn", - "univ.sn", - "so", - "com.so", - "net.so", - "org.so", - "sr", - "st", - "co.st", - "com.st", - "consulado.st", - "edu.st", - "embaixada.st", - "gov.st", - "mil.st", - "net.st", - "org.st", - "principe.st", - "saotome.st", - "store.st", - "su", - "adygeya.su", - "arkhangelsk.su", - "balashov.su", - "bashkiria.su", - "bryansk.su", - "dagestan.su", - "grozny.su", - "ivanovo.su", - "kalmykia.su", - "kaluga.su", - "karelia.su", - "khakassia.su", - "krasnodar.su", - "kurgan.su", - "lenug.su", - "mordovia.su", - "msk.su", - "murmansk.su", - "nalchik.su", - "nov.su", - "obninsk.su", - "penza.su", - "pokrovsk.su", - "sochi.su", - "spb.su", - "togliatti.su", - "troitsk.su", - "tula.su", - "tuva.su", - "vladikavkaz.su", - "vladimir.su", - "vologda.su", - "sv", - "com.sv", - "edu.sv", - "gob.sv", - "org.sv", - "red.sv", - "sx", - "gov.sx", - "sy", - "edu.sy", - "gov.sy", - "net.sy", - "mil.sy", - "com.sy", - "org.sy", - "sz", - "co.sz", - "ac.sz", - "org.sz", - "tc", - "td", - "tel", - "tf", - "tg", - "th", - "ac.th", - "co.th", - "go.th", - "in.th", - "mi.th", - "net.th", - "or.th", - "tj", - "ac.tj", - "biz.tj", - "co.tj", - "com.tj", - "edu.tj", - "go.tj", - "gov.tj", - "int.tj", - "mil.tj", - "name.tj", - "net.tj", - "nic.tj", - "org.tj", - "test.tj", - "web.tj", - "tk", - "tl", - "gov.tl", - "tm", - "com.tm", - "co.tm", - "org.tm", - "net.tm", - "nom.tm", - "gov.tm", - "mil.tm", - "edu.tm", - "tn", - "com.tn", - "ens.tn", - "fin.tn", - "gov.tn", - "ind.tn", - "intl.tn", - "nat.tn", - "net.tn", - "org.tn", - "info.tn", - "perso.tn", - "tourism.tn", - "edunet.tn", - "rnrt.tn", - "rns.tn", - "rnu.tn", - "mincom.tn", - "agrinet.tn", - "defense.tn", - "turen.tn", - "to", - "com.to", - "gov.to", - "net.to", - "org.to", - "edu.to", - "mil.to", - "tp", - "tr", - "com.tr", - "info.tr", - "biz.tr", - "net.tr", - "org.tr", - "web.tr", - "gen.tr", - "tv.tr", - "av.tr", - "dr.tr", - "bbs.tr", - "name.tr", - "tel.tr", - "gov.tr", - "bel.tr", - "pol.tr", - "mil.tr", - "k12.tr", - "edu.tr", - "kep.tr", - "nc.tr", - "gov.nc.tr", - "travel", - "tt", - "co.tt", - "com.tt", - "org.tt", - "net.tt", - "biz.tt", - "info.tt", - "pro.tt", - "int.tt", - "coop.tt", - "jobs.tt", - "mobi.tt", - "travel.tt", - "museum.tt", - "aero.tt", - "name.tt", - "gov.tt", - "edu.tt", - "tv", - "tw", - "edu.tw", - "gov.tw", - "mil.tw", - "com.tw", - "net.tw", - "org.tw", - "idv.tw", - "game.tw", - "ebiz.tw", - "club.tw", - "xn--zf0ao64a.tw", - "xn--uc0atv.tw", - "xn--czrw28b.tw", - "tz", - "ac.tz", - "co.tz", - "go.tz", - "hotel.tz", - "info.tz", - "me.tz", - "mil.tz", - "mobi.tz", - "ne.tz", - "or.tz", - "sc.tz", - "tv.tz", - "ua", - "com.ua", - "edu.ua", - "gov.ua", - "in.ua", - "net.ua", - "org.ua", - "cherkassy.ua", - "cherkasy.ua", - "chernigov.ua", - "chernihiv.ua", - "chernivtsi.ua", - "chernovtsy.ua", - "ck.ua", - "cn.ua", - "cr.ua", - "crimea.ua", - "cv.ua", - "dn.ua", - "dnepropetrovsk.ua", - "dnipropetrovsk.ua", - "dominic.ua", - "donetsk.ua", - "dp.ua", - "if.ua", - "ivano-frankivsk.ua", - "kh.ua", - "kharkiv.ua", - "kharkov.ua", - "kherson.ua", - "khmelnitskiy.ua", - "khmelnytskyi.ua", - "kiev.ua", - "kirovograd.ua", - "km.ua", - "kr.ua", - "krym.ua", - "ks.ua", - "kv.ua", - "kyiv.ua", - "lg.ua", - "lt.ua", - "lugansk.ua", - "lutsk.ua", - "lv.ua", - "lviv.ua", - "mk.ua", - "mykolaiv.ua", - "nikolaev.ua", - "od.ua", - "odesa.ua", - "odessa.ua", - "pl.ua", - "poltava.ua", - "rivne.ua", - "rovno.ua", - "rv.ua", - "sb.ua", - "sebastopol.ua", - "sevastopol.ua", - "sm.ua", - "sumy.ua", - "te.ua", - "ternopil.ua", - "uz.ua", - "uzhgorod.ua", - "vinnica.ua", - "vinnytsia.ua", - "vn.ua", - "volyn.ua", - "yalta.ua", - "zaporizhzhe.ua", - "zaporizhzhia.ua", - "zhitomir.ua", - "zhytomyr.ua", - "zp.ua", - "zt.ua", - "co.ua", - "pp.ua", - "ug", - "co.ug", - "or.ug", - "ac.ug", - "sc.ug", - "go.ug", - "ne.ug", - "com.ug", - "org.ug", - "uk", - "ac.uk", - "co.uk", - "gov.uk", - "ltd.uk", - "me.uk", - "net.uk", - "nhs.uk", - "org.uk", - "plc.uk", - "police.uk", - "*.sch.uk", - "us", - "dni.us", - "fed.us", - "isa.us", - "kids.us", - "nsn.us", - "ak.us", - "al.us", - "ar.us", - "as.us", - "az.us", - "ca.us", - "co.us", - "ct.us", - "dc.us", - "de.us", - "fl.us", - "ga.us", - "gu.us", - "hi.us", - "ia.us", - "id.us", - "il.us", - "in.us", - "ks.us", - "ky.us", - "la.us", - "ma.us", - "md.us", - "me.us", - "mi.us", - "mn.us", - "mo.us", - "ms.us", - "mt.us", - "nc.us", - "nd.us", - "ne.us", - "nh.us", - "nj.us", - "nm.us", - "nv.us", - "ny.us", - "oh.us", - "ok.us", - "or.us", - "pa.us", - "pr.us", - "ri.us", - "sc.us", - "sd.us", - "tn.us", - "tx.us", - "ut.us", - "vi.us", - "vt.us", - "va.us", - "wa.us", - "wi.us", - "wv.us", - "wy.us", - "k12.ak.us", - "k12.al.us", - "k12.ar.us", - "k12.as.us", - "k12.az.us", - "k12.ca.us", - "k12.co.us", - "k12.ct.us", - "k12.dc.us", - "k12.de.us", - "k12.fl.us", - "k12.ga.us", - "k12.gu.us", - "k12.ia.us", - "k12.id.us", - "k12.il.us", - "k12.in.us", - "k12.ks.us", - "k12.ky.us", - "k12.la.us", - "k12.ma.us", - "k12.md.us", - "k12.me.us", - "k12.mi.us", - "k12.mn.us", - "k12.mo.us", - "k12.ms.us", - "k12.mt.us", - "k12.nc.us", - "k12.ne.us", - "k12.nh.us", - "k12.nj.us", - "k12.nm.us", - "k12.nv.us", - "k12.ny.us", - "k12.oh.us", - "k12.ok.us", - "k12.or.us", - "k12.pa.us", - "k12.pr.us", - "k12.ri.us", - "k12.sc.us", - "k12.tn.us", - "k12.tx.us", - "k12.ut.us", - "k12.vi.us", - "k12.vt.us", - "k12.va.us", - "k12.wa.us", - "k12.wi.us", - "k12.wy.us", - "cc.ak.us", - "cc.al.us", - "cc.ar.us", - "cc.as.us", - "cc.az.us", - "cc.ca.us", - "cc.co.us", - "cc.ct.us", - "cc.dc.us", - "cc.de.us", - "cc.fl.us", - "cc.ga.us", - "cc.gu.us", - "cc.hi.us", - "cc.ia.us", - "cc.id.us", - "cc.il.us", - "cc.in.us", - "cc.ks.us", - "cc.ky.us", - "cc.la.us", - "cc.ma.us", - "cc.md.us", - "cc.me.us", - "cc.mi.us", - "cc.mn.us", - "cc.mo.us", - "cc.ms.us", - "cc.mt.us", - "cc.nc.us", - "cc.nd.us", - "cc.ne.us", - "cc.nh.us", - "cc.nj.us", - "cc.nm.us", - "cc.nv.us", - "cc.ny.us", - "cc.oh.us", - "cc.ok.us", - "cc.or.us", - "cc.pa.us", - "cc.pr.us", - "cc.ri.us", - "cc.sc.us", - "cc.sd.us", - "cc.tn.us", - "cc.tx.us", - "cc.ut.us", - "cc.vi.us", - "cc.vt.us", - "cc.va.us", - "cc.wa.us", - "cc.wi.us", - "cc.wv.us", - "cc.wy.us", - "lib.ak.us", - "lib.al.us", - "lib.ar.us", - "lib.as.us", - "lib.az.us", - "lib.ca.us", - "lib.co.us", - "lib.ct.us", - "lib.dc.us", - "lib.de.us", - "lib.fl.us", - "lib.ga.us", - "lib.gu.us", - "lib.hi.us", - "lib.ia.us", - "lib.id.us", - "lib.il.us", - "lib.in.us", - "lib.ks.us", - "lib.ky.us", - "lib.la.us", - "lib.ma.us", - "lib.md.us", - "lib.me.us", - "lib.mi.us", - "lib.mn.us", - "lib.mo.us", - "lib.ms.us", - "lib.mt.us", - "lib.nc.us", - "lib.nd.us", - "lib.ne.us", - "lib.nh.us", - "lib.nj.us", - "lib.nm.us", - "lib.nv.us", - "lib.ny.us", - "lib.oh.us", - "lib.ok.us", - "lib.or.us", - "lib.pa.us", - "lib.pr.us", - "lib.ri.us", - "lib.sc.us", - "lib.sd.us", - "lib.tn.us", - "lib.tx.us", - "lib.ut.us", - "lib.vi.us", - "lib.vt.us", - "lib.va.us", - "lib.wa.us", - "lib.wi.us", - "lib.wy.us", - "pvt.k12.ma.us", - "chtr.k12.ma.us", - "paroch.k12.ma.us", - "uy", - "com.uy", - "edu.uy", - "gub.uy", - "mil.uy", - "net.uy", - "org.uy", - "uz", - "co.uz", - "com.uz", - "net.uz", - "org.uz", - "va", - "vc", - "com.vc", - "net.vc", - "org.vc", - "gov.vc", - "mil.vc", - "edu.vc", - "ve", - "arts.ve", - "co.ve", - "com.ve", - "e12.ve", - "edu.ve", - "firm.ve", - "gob.ve", - "gov.ve", - "info.ve", - "int.ve", - "mil.ve", - "net.ve", - "org.ve", - "rec.ve", - "store.ve", - "tec.ve", - "web.ve", - "vg", - "vi", - "co.vi", - "com.vi", - "k12.vi", - "net.vi", - "org.vi", - "vn", - "com.vn", - "net.vn", - "org.vn", - "edu.vn", - "gov.vn", - "int.vn", - "ac.vn", - "biz.vn", - "info.vn", - "name.vn", - "pro.vn", - "health.vn", - "vu", - "com.vu", - "edu.vu", - "net.vu", - "org.vu", - "wf", - "ws", - "com.ws", - "net.ws", - "org.ws", - "gov.ws", - "edu.ws", - "yt", - "xn--mgbaam7a8h", - "xn--y9a3aq", - "xn--54b7fta0cc", - "xn--90ais", - "xn--fiqs8s", - "xn--fiqz9s", - "xn--lgbbat1ad8j", - "xn--wgbh1c", - "xn--node", - "xn--qxam", - "xn--j6w193g", - "xn--h2brj9c", - "xn--mgbbh1a71e", - "xn--fpcrj9c3d", - "xn--gecrj9c", - "xn--s9brj9c", - "xn--45brj9c", - "xn--xkc2dl3a5ee0h", - "xn--mgba3a4f16a", - "xn--mgba3a4fra", - "xn--mgbtx2b", - "xn--mgbayh7gpa", - "xn--3e0b707e", - "xn--80ao21a", - "xn--fzc2c9e2c", - "xn--xkc2al3hye2a", - "xn--mgbc0a9azcg", - "xn--d1alf", - "xn--l1acc", - "xn--mix891f", - "xn--mix082f", - "xn--mgbx4cd0ab", - "xn--mgb9awbf", - "xn--mgbai9azgqp6j", - "xn--mgbai9a5eva00b", - "xn--ygbi2ammx", - "xn--90a3ac", - "xn--o1ac.xn--90a3ac", - "xn--c1avg.xn--90a3ac", - "xn--90azh.xn--90a3ac", - "xn--d1at.xn--90a3ac", - "xn--o1ach.xn--90a3ac", - "xn--80au.xn--90a3ac", - "xn--p1ai", - "xn--wgbl6a", - "xn--mgberp4a5d4ar", - "xn--mgberp4a5d4a87g", - "xn--mgbqly7c0a67fbc", - "xn--mgbqly7cvafr", - "xn--mgbpl2fh", - "xn--yfro4i67o", - "xn--clchc0ea0b2g2a9gcd", - "xn--ogbpf8fl", - "xn--mgbtf8fl", - "xn--o3cw4h", - "xn--pgbs0dh", - "xn--kpry57d", - "xn--kprw13d", - "xn--nnx388a", - "xn--j1amh", - "xn--mgb2ddes", - "xxx", - "*.ye", - "ac.za", - "agrica.za", - "alt.za", - "co.za", - "edu.za", - "gov.za", - "grondar.za", - "law.za", - "mil.za", - "net.za", - "ngo.za", - "nis.za", - "nom.za", - "org.za", - "school.za", - "tm.za", - "web.za", - "*.zm", - "*.zw", - "aaa", - "aarp", - "abb", - "abbott", - "able", - "abogado", - "academy", - "accenture", - "accountant", - "accountants", - "aco", - "active", - "actor", - "ads", - "adult", - "aeg", - "aetna", - "afl", - "africa", - "africamagic", - "agakhan", - "agency", - "aig", - "airforce", - "airtel", - "akdn", - "alibaba", - "alipay", - "allfinanz", - "ally", - "alsace", - "amica", - "amsterdam", - "analytics", - "android", - "anquan", - "apartments", - "app", - "apple", - "aquarelle", - "aramco", - "archi", - "army", - "arte", - "associates", - "attorney", - "auction", - "audi", - "audible", - "audio", - "author", - "auto", - "autos", - "avianca", - "aws", - "axa", - "azure", - "baby", - "baidu", - "band", - "bank", - "bar", - "barcelona", - "barclaycard", - "barclays", - "barefoot", - "bargains", - "bauhaus", - "bayern", - "bbc", - "bbva", - "bcg", - "bcn", - "beats", - "beer", - "bentley", - "berlin", - "best", - "bet", - "bharti", - "bible", - "bid", - "bike", - "bing", - "bingo", - "bio", - "black", - "blackfriday", - "blog", - "bloomberg", - "blue", - "bms", - "bmw", - "bnl", - "bnpparibas", - "boats", - "bom", - "bond", - "boo", - "boots", - "bosch", - "bostik", - "bot", - "boutique", - "bradesco", - "bridgestone", - "broadway", - "broker", - "brother", - "brussels", - "budapest", - "build", - "builders", - "business", - "buy", - "buzz", - "bzh", - "cab", - "cafe", - "cal", - "call", - "camera", - "camp", - "cancerresearch", - "canon", - "capetown", - "capital", - "car", - "caravan", - "cards", - "care", - "career", - "careers", - "cars", - "cartier", - "casa", - "cash", - "casino", - "catering", - "cba", - "cbn", - "cbre", - "ceb", - "center", - "ceo", - "cern", - "cfa", - "cfd", - "chanel", - "channel", - "chase", - "chat", - "cheap", - "chintai", - "chloe", - "christmas", - "chrome", - "church", - "cipriani", - "circle", - "cisco", - "citic", - "city", - "cityeats", - "claims", - "cleaning", - "click", - "clinic", - "clothing", - "cloud", - "club", - "clubmed", - "coach", - "codes", - "coffee", - "college", - "cologne", - "commbank", - "community", - "company", - "computer", - "comsec", - "condos", - "construction", - "consulting", - "contact", - "contractors", - "cooking", - "cookingchannel", - "cool", - "corsica", - "country", - "coupon", - "coupons", - "courses", - "credit", - "creditcard", - "creditunion", - "cricket", - "crown", - "crs", - "cruises", - "csc", - "cuisinella", - "cymru", - "cyou", - "dabur", - "dad", - "dance", - "date", - "dating", - "datsun", - "day", - "dclk", - "dds", - "deal", - "dealer", - "deals", - "degree", - "delivery", - "dell", - "delta", - "democrat", - "dental", - "dentist", - "desi", - "design", - "dev", - "diamonds", - "diet", - "digital", - "direct", - "directory", - "discount", - "dnp", - "docs", - "dog", - "doha", - "domains", - "doosan", - "dot", - "download", - "drive", - "dstv", - "dtv", - "dubai", - "dunlop", - "dupont", - "durban", - "dvag", - "earth", - "eat", - "edeka", - "education", - "email", - "emerck", - "energy", - "engineer", - "engineering", - "enterprises", - "epson", - "equipment", - "erni", - "esq", - "estate", - "eurovision", - "eus", - "events", - "everbank", - "exchange", - "expert", - "exposed", - "express", - "extraspace", - "fage", - "fail", - "fairwinds", - "faith", - "family", - "fan", - "fans", - "farm", - "fashion", - "fast", - "feedback", - "ferrero", - "film", - "final", - "finance", - "financial", - "fire", - "firestone", - "firmdale", - "fish", - "fishing", - "fit", - "fitness", - "flickr", - "flights", - "florist", - "flowers", - "flsmidth", - "fly", - "foo", - "foodnetwork", - "football", - "ford", - "forex", - "forsale", - "forum", - "foundation", - "frl", - "frogans", - "frontdoor", - "frontier", - "fund", - "furniture", - "futbol", - "fyi", - "gal", - "gallery", - "gallo", - "gallup", - "game", - "games", - "garden", - "gbiz", - "gdn", - "gea", - "gent", - "genting", - "ggee", - "gift", - "gifts", - "gives", - "giving", - "glass", - "gle", - "global", - "globo", - "gmail", - "gmo", - "gmx", - "gold", - "goldpoint", - "golf", - "goo", - "goodyear", - "goog", - "google", - "gop", - "got", - "gotv", - "grainger", - "graphics", - "gratis", - "green", - "gripe", - "group", - "gucci", - "guge", - "guide", - "guitars", - "guru", - "hamburg", - "hangout", - "haus", - "hdfcbank", - "health", - "healthcare", - "help", - "helsinki", - "here", - "hermes", - "hgtv", - "hiphop", - "hitachi", - "hiv", - "hkt", - "hockey", - "holdings", - "holiday", - "homedepot", - "homes", - "honda", - "horse", - "host", - "hosting", - "hoteles", - "hotmail", - "house", - "how", - "hsbc", - "htc", - "ibm", - "icbc", - "ice", - "icu", - "ifm", - "iinet", - "imdb", - "immo", - "immobilien", - "industries", - "infiniti", - "ing", - "ink", - "institute", - "insurance", - "insure", - "international", - "investments", - "ipiranga", - "irish", - "iselect", - "ist", - "istanbul", - "itau", - "iwc", - "jaguar", - "java", - "jcb", - "jcp", - "jetzt", - "jewelry", - "jio", - "jlc", - "jll", - "jmp", - "jnj", - "joburg", - "jot", - "joy", - "jpmorgan", - "jprs", - "juegos", - "kaufen", - "kddi", - "kerryhotels", - "kerrylogistics", - "kerryproperties", - "kfh", - "kim", - "kinder", - "kindle", - "kitchen", - "kiwi", - "koeln", - "komatsu", - "kpmg", - "kpn", - "krd", - "kred", - "kuokgroup", - "kyknet", - "kyoto", - "lacaixa", - "lamborghini", - "lancaster", - "land", - "landrover", - "lasalle", - "lat", - "latrobe", - "law", - "lawyer", - "lds", - "lease", - "leclerc", - "legal", - "lexus", - "lgbt", - "liaison", - "lidl", - "life", - "lifeinsurance", - "lifestyle", - "lighting", - "like", - "limited", - "limo", - "lincoln", - "linde", - "link", - "lipsy", - "live", - "lixil", - "loan", - "loans", - "locker", - "locus", - "lol", - "london", - "lotte", - "lotto", - "love", - "ltd", - "ltda", - "lupin", - "luxe", - "luxury", - "madrid", - "maif", - "maison", - "makeup", - "man", - "management", - "mango", - "market", - "marketing", - "markets", - "marriott", - "mba", - "media", - "meet", - "melbourne", - "meme", - "memorial", - "men", - "menu", - "meo", - "metlife", - "miami", - "microsoft", - "mini", - "mit", - "mlb", - "mls", - "mma", - "mnet", - "mobily", - "moda", - "moe", - "moi", - "mom", - "monash", - "money", - "montblanc", - "mormon", - "mortgage", - "moscow", - "moto", - "motorcycles", - "mov", - "movie", - "movistar", - "mtn", - "mtpc", - "mtr", - "multichoice", - "mutual", - "mutuelle", - "mzansimagic", - "nadex", - "nagoya", - "naspers", - "natura", - "navy", - "nec", - "netbank", - "netflix", - "network", - "neustar", - "new", - "news", - "next", - "nextdirect", - "nexus", - "ngo", - "nhk", - "nico", - "nikon", - "ninja", - "nissan", - "nokia", - "northwesternmutual", - "norton", - "now", - "nowruz", - "nowtv", - "nra", - "nrw", - "ntt", - "nyc", - "obi", - "observer", - "office", - "okinawa", - "olayan", - "olayangroup", - "ollo", - "omega", - "one", - "ong", - "onl", - "online", - "ooo", - "oracle", - "orange", - "organic", - "orientexpress", - "osaka", - "otsuka", - "ott", - "ovh", - "page", - "pamperedchef", - "panerai", - "paris", - "pars", - "partners", - "parts", - "party", - "passagens", - "payu", - "pccw", - "pet", - "pharmacy", - "philips", - "photo", - "photography", - "photos", - "physio", - "piaget", - "pics", - "pictet", - "pictures", - "pid", - "pin", - "ping", - "pink", - "pizza", - "place", - "play", - "playstation", - "plumbing", - "plus", - "pnc", - "pohl", - "poker", - "porn", - "praxi", - "press", - "prime", - "prod", - "productions", - "prof", - "promo", - "properties", - "property", - "protection", - "pub", - "qpon", - "quebec", - "quest", - "racing", - "read", - "realtor", - "realty", - "recipes", - "red", - "redstone", - "redumbrella", - "rehab", - "reise", - "reisen", - "reit", - "reliance", - "ren", - "rent", - "rentals", - "repair", - "report", - "republican", - "rest", - "restaurant", - "review", - "reviews", - "rexroth", - "rich", - "richardli", - "ricoh", - "ril", - "rio", - "rip", - "rocher", - "rocks", - "rodeo", - "room", - "rsvp", - "ruhr", - "run", - "rwe", - "ryukyu", - "saarland", - "safe", - "safety", - "sakura", - "sale", - "salon", - "samsung", - "sandvik", - "sandvikcoromant", - "sanofi", - "sap", - "sapo", - "sarl", - "sas", - "save", - "saxo", - "sbi", - "sbs", - "sca", - "scb", - "schmidt", - "scholarships", - "school", - "schule", - "schwarz", - "science", - "scor", - "scot", - "seat", - "security", - "seek", - "sener", - "services", - "sew", - "sex", - "sexy", - "sharp", - "shaw", - "shia", - "shiksha", - "shoes", - "shouji", - "show", - "shriram", - "silk", - "sina", - "singles", - "site", - "ski", - "skin", - "sky", - "skype", - "smile", - "sncf", - "soccer", - "social", - "softbank", - "software", - "sohu", - "solar", - "solutions", - "song", - "sony", - "soy", - "space", - "spiegel", - "spot", - "spreadbetting", - "srl", - "stada", - "star", - "starhub", - "statebank", - "statoil", - "stc", - "stcgroup", - "stockholm", - "storage", - "store", - "studio", - "study", - "style", - "sucks", - "supersport", - "supplies", - "supply", - "support", - "surf", - "surgery", - "suzuki", - "swatch", - "swiss", - "sydney", - "symantec", - "systems", - "tab", - "taipei", - "talk", - "taobao", - "tatamotors", - "tatar", - "tattoo", - "tax", - "taxi", - "tci", - "tdk", - "team", - "tech", - "technology", - "telecity", - "telefonica", - "temasek", - "tennis", - "teva", - "thd", - "theater", - "theatre", - "theguardian", - "tickets", - "tienda", - "tiffany", - "tips", - "tires", - "tirol", - "tmall", - "today", - "tokyo", - "tools", - "top", - "toray", - "toshiba", - "tours", - "town", - "toyota", - "toys", - "trade", - "trading", - "training", - "travelchannel", - "travelers", - "travelersinsurance", - "trust", - "trv", - "tube", - "tui", - "tunes", - "tushu", - "tvs", - "ubs", - "university", - "uno", - "uol", - "ups", - "vacations", - "vana", - "vegas", - "ventures", - "versicherung", - "vet", - "viajes", - "video", - "vig", - "viking", - "villas", - "vin", - "vip", - "virgin", - "vision", - "vista", - "vistaprint", - "viva", - "vlaanderen", - "vodka", - "volkswagen", - "vote", - "voting", - "voto", - "voyage", - "vuelos", - "wales", - "walter", - "wang", - "wanggou", - "warman", - "watch", - "watches", - "weather", - "weatherchannel", - "webcam", - "weber", - "website", - "wed", - "wedding", - "weibo", - "weir", - "whoswho", - "wien", - "wiki", - "williamhill", - "win", - "windows", - "wine", - "wme", - "work", - "works", - "world", - "wtc", - "wtf", - "xbox", - "xerox", - "xihuan", - "xin", - "xn--11b4c3d", - "xn--1ck2e1b", - "xn--1qqw23a", - "xn--30rr7y", - "xn--3bst00m", - "xn--3ds443g", - "xn--3oq18vl8pn36a", - "xn--3pxu8k", - "xn--42c2d9a", - "xn--45q11c", - "xn--4gbrim", - "xn--55qw42g", - "xn--55qx5d", - "xn--5tzm5g", - "xn--6frz82g", - "xn--6qq986b3xl", - "xn--80adxhks", - "xn--80asehdb", - "xn--80aswg", - "xn--8y0a063a", - "xn--9dbq2a", - "xn--9et52u", - "xn--9krt00a", - "xn--b4w605ferd", - "xn--bck1b9a5dre4c", - "xn--c1avg", - "xn--c2br7g", - "xn--cck2b3b", - "xn--cg4bki", - "xn--czr694b", - "xn--czrs0t", - "xn--czru2d", - "xn--d1acj3b", - "xn--eckvdtc9d", - "xn--efvy88h", - "xn--estv75g", - "xn--fct429k", - "xn--fhbei", - "xn--fiq228c5hs", - "xn--fiq64b", - "xn--fjq720a", - "xn--flw351e", - "xn--fzys8d69uvgm", - "xn--g2xx48c", - "xn--gckr3f0f", - "xn--hxt814e", - "xn--i1b6b1a6a2e", - "xn--imr513n", - "xn--io0a7i", - "xn--j1aef", - "xn--jlq61u9w7b", - "xn--jvr189m", - "xn--kcrx77d1x4a", - "xn--kpu716f", - "xn--kput3i", - "xn--mgba3a3ejt", - "xn--mgba7c0bbn0a", - "xn--mgbab2bd", - "xn--mgbb9fbpob", - "xn--mgbt3dhd", - "xn--mk1bu44c", - "xn--mxtq1m", - "xn--ngbc5azd", - "xn--ngbe9e0a", - "xn--nqv7f", - "xn--nqv7fs00ema", - "xn--nyqy26a", - "xn--p1acf", - "xn--pbt977c", - "xn--pssy2u", - "xn--q9jyb4c", - "xn--qcka1pmc", - "xn--rhqv96g", - "xn--rovu88b", - "xn--ses554g", - "xn--t60b56a", - "xn--tckwe", - "xn--unup4y", - "xn--vermgensberater-ctb", - "xn--vermgensberatung-pwb", - "xn--vhquv", - "xn--vuq861b", - "xn--w4r85el8fhu5dnra", - "xn--xhq521b", - "xn--zfr164b", - "xperia", - "xyz", - "yachts", - "yahoo", - "yamaxun", - "yandex", - "yodobashi", - "yoga", - "yokohama", - "you", - "youtube", - "yun", - "zappos", - "zara", - "zero", - "zip", - "zippo", - "zone", - "zuerich", - "cloudfront.net", - "ap-northeast-1.compute.amazonaws.com", - "ap-southeast-1.compute.amazonaws.com", - "ap-southeast-2.compute.amazonaws.com", - "cn-north-1.compute.amazonaws.cn", - "compute.amazonaws.cn", - "compute.amazonaws.com", - "compute-1.amazonaws.com", - "eu-west-1.compute.amazonaws.com", - "eu-central-1.compute.amazonaws.com", - "sa-east-1.compute.amazonaws.com", - "us-east-1.amazonaws.com", - "us-gov-west-1.compute.amazonaws.com", - "us-west-1.compute.amazonaws.com", - "us-west-2.compute.amazonaws.com", - "z-1.compute-1.amazonaws.com", - "z-2.compute-1.amazonaws.com", - "elasticbeanstalk.com", - "elb.amazonaws.com", - "s3.amazonaws.com", - "s3-ap-northeast-1.amazonaws.com", - "s3-ap-southeast-1.amazonaws.com", - "s3-ap-southeast-2.amazonaws.com", - "s3-external-1.amazonaws.com", - "s3-external-2.amazonaws.com", - "s3-fips-us-gov-west-1.amazonaws.com", - "s3-eu-central-1.amazonaws.com", - "s3-eu-west-1.amazonaws.com", - "s3-sa-east-1.amazonaws.com", - "s3-us-gov-west-1.amazonaws.com", - "s3-us-west-1.amazonaws.com", - "s3-us-west-2.amazonaws.com", - "s3.cn-north-1.amazonaws.com.cn", - "s3.eu-central-1.amazonaws.com", - "betainabox.com", - "ae.org", - "ar.com", - "br.com", - "cn.com", - "com.de", - "com.se", - "de.com", - "eu.com", - "gb.com", - "gb.net", - "hu.com", - "hu.net", - "jp.net", - "jpn.com", - "kr.com", - "mex.com", - "no.com", - "qc.com", - "ru.com", - "sa.com", - "se.com", - "se.net", - "uk.com", - "uk.net", - "us.com", - "uy.com", - "za.bz", - "za.com", - "africa.com", - "gr.com", - "in.net", - "us.org", - "co.com", - "c.la", - "cloudcontrolled.com", - "cloudcontrolapp.com", - "co.ca", - "c.cdn77.org", - "cdn77-ssl.net", - "r.cdn77.net", - "rsc.cdn77.org", - "ssl.origin.cdn77-secure.org", - "co.nl", - "co.no", - "*.platform.sh", - "cupcake.is", - "dreamhosters.com", - "duckdns.org", - "dyndns-at-home.com", - "dyndns-at-work.com", - "dyndns-blog.com", - "dyndns-free.com", - "dyndns-home.com", - "dyndns-ip.com", - "dyndns-mail.com", - "dyndns-office.com", - "dyndns-pics.com", - "dyndns-remote.com", - "dyndns-server.com", - "dyndns-web.com", - "dyndns-wiki.com", - "dyndns-work.com", - "dyndns.biz", - "dyndns.info", - "dyndns.org", - "dyndns.tv", - "at-band-camp.net", - "ath.cx", - "barrel-of-knowledge.info", - "barrell-of-knowledge.info", - "better-than.tv", - "blogdns.com", - "blogdns.net", - "blogdns.org", - "blogsite.org", - "boldlygoingnowhere.org", - "broke-it.net", - "buyshouses.net", - "cechire.com", - "dnsalias.com", - "dnsalias.net", - "dnsalias.org", - "dnsdojo.com", - "dnsdojo.net", - "dnsdojo.org", - "does-it.net", - "doesntexist.com", - "doesntexist.org", - "dontexist.com", - "dontexist.net", - "dontexist.org", - "doomdns.com", - "doomdns.org", - "dvrdns.org", - "dyn-o-saur.com", - "dynalias.com", - "dynalias.net", - "dynalias.org", - "dynathome.net", - "dyndns.ws", - "endofinternet.net", - "endofinternet.org", - "endoftheinternet.org", - "est-a-la-maison.com", - "est-a-la-masion.com", - "est-le-patron.com", - "est-mon-blogueur.com", - "for-better.biz", - "for-more.biz", - "for-our.info", - "for-some.biz", - "for-the.biz", - "forgot.her.name", - "forgot.his.name", - "from-ak.com", - "from-al.com", - "from-ar.com", - "from-az.net", - "from-ca.com", - "from-co.net", - "from-ct.com", - "from-dc.com", - "from-de.com", - "from-fl.com", - "from-ga.com", - "from-hi.com", - "from-ia.com", - "from-id.com", - "from-il.com", - "from-in.com", - "from-ks.com", - "from-ky.com", - "from-la.net", - "from-ma.com", - "from-md.com", - "from-me.org", - "from-mi.com", - "from-mn.com", - "from-mo.com", - "from-ms.com", - "from-mt.com", - "from-nc.com", - "from-nd.com", - "from-ne.com", - "from-nh.com", - "from-nj.com", - "from-nm.com", - "from-nv.com", - "from-ny.net", - "from-oh.com", - "from-ok.com", - "from-or.com", - "from-pa.com", - "from-pr.com", - "from-ri.com", - "from-sc.com", - "from-sd.com", - "from-tn.com", - "from-tx.com", - "from-ut.com", - "from-va.com", - "from-vt.com", - "from-wa.com", - "from-wi.com", - "from-wv.com", - "from-wy.com", - "ftpaccess.cc", - "fuettertdasnetz.de", - "game-host.org", - "game-server.cc", - "getmyip.com", - "gets-it.net", - "go.dyndns.org", - "gotdns.com", - "gotdns.org", - "groks-the.info", - "groks-this.info", - "ham-radio-op.net", - "here-for-more.info", - "hobby-site.com", - "hobby-site.org", - "home.dyndns.org", - "homedns.org", - "homeftp.net", - "homeftp.org", - "homeip.net", - "homelinux.com", - "homelinux.net", - "homelinux.org", - "homeunix.com", - "homeunix.net", - "homeunix.org", - "iamallama.com", - "in-the-band.net", - "is-a-anarchist.com", - "is-a-blogger.com", - "is-a-bookkeeper.com", - "is-a-bruinsfan.org", - "is-a-bulls-fan.com", - "is-a-candidate.org", - "is-a-caterer.com", - "is-a-celticsfan.org", - "is-a-chef.com", - "is-a-chef.net", - "is-a-chef.org", - "is-a-conservative.com", - "is-a-cpa.com", - "is-a-cubicle-slave.com", - "is-a-democrat.com", - "is-a-designer.com", - "is-a-doctor.com", - "is-a-financialadvisor.com", - "is-a-geek.com", - "is-a-geek.net", - "is-a-geek.org", - "is-a-green.com", - "is-a-guru.com", - "is-a-hard-worker.com", - "is-a-hunter.com", - "is-a-knight.org", - "is-a-landscaper.com", - "is-a-lawyer.com", - "is-a-liberal.com", - "is-a-libertarian.com", - "is-a-linux-user.org", - "is-a-llama.com", - "is-a-musician.com", - "is-a-nascarfan.com", - "is-a-nurse.com", - "is-a-painter.com", - "is-a-patsfan.org", - "is-a-personaltrainer.com", - "is-a-photographer.com", - "is-a-player.com", - "is-a-republican.com", - "is-a-rockstar.com", - "is-a-socialist.com", - "is-a-soxfan.org", - "is-a-student.com", - "is-a-teacher.com", - "is-a-techie.com", - "is-a-therapist.com", - "is-an-accountant.com", - "is-an-actor.com", - "is-an-actress.com", - "is-an-anarchist.com", - "is-an-artist.com", - "is-an-engineer.com", - "is-an-entertainer.com", - "is-by.us", - "is-certified.com", - "is-found.org", - "is-gone.com", - "is-into-anime.com", - "is-into-cars.com", - "is-into-cartoons.com", - "is-into-games.com", - "is-leet.com", - "is-lost.org", - "is-not-certified.com", - "is-saved.org", - "is-slick.com", - "is-uberleet.com", - "is-very-bad.org", - "is-very-evil.org", - "is-very-good.org", - "is-very-nice.org", - "is-very-sweet.org", - "is-with-theband.com", - "isa-geek.com", - "isa-geek.net", - "isa-geek.org", - "isa-hockeynut.com", - "issmarterthanyou.com", - "isteingeek.de", - "istmein.de", - "kicks-ass.net", - "kicks-ass.org", - "knowsitall.info", - "land-4-sale.us", - "lebtimnetz.de", - "leitungsen.de", - "likes-pie.com", - "likescandy.com", - "merseine.nu", - "mine.nu", - "misconfused.org", - "mypets.ws", - "myphotos.cc", - "neat-url.com", - "office-on-the.net", - "on-the-web.tv", - "podzone.net", - "podzone.org", - "readmyblog.org", - "saves-the-whales.com", - "scrapper-site.net", - "scrapping.cc", - "selfip.biz", - "selfip.com", - "selfip.info", - "selfip.net", - "selfip.org", - "sells-for-less.com", - "sells-for-u.com", - "sells-it.net", - "sellsyourhome.org", - "servebbs.com", - "servebbs.net", - "servebbs.org", - "serveftp.net", - "serveftp.org", - "servegame.org", - "shacknet.nu", - "simple-url.com", - "space-to-rent.com", - "stuff-4-sale.org", - "stuff-4-sale.us", - "teaches-yoga.com", - "thruhere.net", - "traeumtgerade.de", - "webhop.biz", - "webhop.info", - "webhop.net", - "webhop.org", - "worse-than.tv", - "writesthisblog.com", - "eu.org", - "al.eu.org", - "asso.eu.org", - "at.eu.org", - "au.eu.org", - "be.eu.org", - "bg.eu.org", - "ca.eu.org", - "cd.eu.org", - "ch.eu.org", - "cn.eu.org", - "cy.eu.org", - "cz.eu.org", - "de.eu.org", - "dk.eu.org", - "edu.eu.org", - "ee.eu.org", - "es.eu.org", - "fi.eu.org", - "fr.eu.org", - "gr.eu.org", - "hr.eu.org", - "hu.eu.org", - "ie.eu.org", - "il.eu.org", - "in.eu.org", - "int.eu.org", - "is.eu.org", - "it.eu.org", - "jp.eu.org", - "kr.eu.org", - "lt.eu.org", - "lu.eu.org", - "lv.eu.org", - "mc.eu.org", - "me.eu.org", - "mk.eu.org", - "mt.eu.org", - "my.eu.org", - "net.eu.org", - "ng.eu.org", - "nl.eu.org", - "no.eu.org", - "nz.eu.org", - "paris.eu.org", - "pl.eu.org", - "pt.eu.org", - "q-a.eu.org", - "ro.eu.org", - "ru.eu.org", - "se.eu.org", - "si.eu.org", - "sk.eu.org", - "tr.eu.org", - "uk.eu.org", - "us.eu.org", - "a.ssl.fastly.net", - "b.ssl.fastly.net", - "global.ssl.fastly.net", - "a.prod.fastly.net", - "global.prod.fastly.net", - "firebaseapp.com", - "flynnhub.com", - "service.gov.uk", - "github.io", - "githubusercontent.com", - "ro.com", - "appspot.com", - "blogspot.ae", - "blogspot.al", - "blogspot.am", - "blogspot.ba", - "blogspot.be", - "blogspot.bg", - "blogspot.bj", - "blogspot.ca", - "blogspot.cf", - "blogspot.ch", - "blogspot.cl", - "blogspot.co.at", - "blogspot.co.id", - "blogspot.co.il", - "blogspot.co.ke", - "blogspot.co.nz", - "blogspot.co.uk", - "blogspot.co.za", - "blogspot.com", - "blogspot.com.ar", - "blogspot.com.au", - "blogspot.com.br", - "blogspot.com.by", - "blogspot.com.co", - "blogspot.com.cy", - "blogspot.com.ee", - "blogspot.com.eg", - "blogspot.com.es", - "blogspot.com.mt", - "blogspot.com.ng", - "blogspot.com.tr", - "blogspot.com.uy", - "blogspot.cv", - "blogspot.cz", - "blogspot.de", - "blogspot.dk", - "blogspot.fi", - "blogspot.fr", - "blogspot.gr", - "blogspot.hk", - "blogspot.hr", - "blogspot.hu", - "blogspot.ie", - "blogspot.in", - "blogspot.is", - "blogspot.it", - "blogspot.jp", - "blogspot.kr", - "blogspot.li", - "blogspot.lt", - "blogspot.lu", - "blogspot.md", - "blogspot.mk", - "blogspot.mr", - "blogspot.mx", - "blogspot.my", - "blogspot.nl", - "blogspot.no", - "blogspot.pe", - "blogspot.pt", - "blogspot.qa", - "blogspot.re", - "blogspot.ro", - "blogspot.rs", - "blogspot.ru", - "blogspot.se", - "blogspot.sg", - "blogspot.si", - "blogspot.sk", - "blogspot.sn", - "blogspot.td", - "blogspot.tw", - "blogspot.ug", - "blogspot.vn", - "codespot.com", - "googleapis.com", - "googlecode.com", - "pagespeedmobilizer.com", - "withgoogle.com", - "herokuapp.com", - "herokussl.com", - "iki.fi", - "biz.at", - "info.at", - "co.pl", - "azurewebsites.net", - "azure-mobile.net", - "cloudapp.net", - "4u.com", - "nfshost.com", - "nyc.mn", - "nid.io", - "operaunite.com", - "outsystemscloud.com", - "art.pl", - "gliwice.pl", - "krakow.pl", - "poznan.pl", - "wroc.pl", - "zakopane.pl", - "priv.at", - "rhcloud.com", - "sinaapp.com", - "vipsinaapp.com", - "1kapp.com", - "gda.pl", - "gdansk.pl", - "gdynia.pl", - "med.pl", - "sopot.pl", - "hk.com", - "hk.org", - "ltd.hk", - "inc.hk", - "yolasite.com", - "za.net", - "za.org", -} - -var nodeLabels = [...]string{ - "aaa", - "aarp", - "abb", - "abbott", - "able", - "abogado", - "ac", - "academy", - "accenture", - "accountant", - "accountants", - "aco", - "active", - "actor", - "ad", - "ads", - "adult", - "ae", - "aeg", - "aero", - "aetna", - "af", - "afl", - "africa", - "africamagic", - "ag", - "agakhan", - "agency", - "ai", - "aig", - "airforce", - "airtel", - "akdn", - "al", - "alibaba", - "alipay", - "allfinanz", - "ally", - "alsace", - "am", - "amica", - "amsterdam", - "an", - "analytics", - "android", - "anquan", - "ao", - "apartments", - "app", - "apple", - "aq", - "aquarelle", - "ar", - "aramco", - "archi", - "army", - "arpa", - "arte", - "as", - "asia", - "associates", - "at", - "attorney", - "au", - "auction", - "audi", - "audible", - "audio", - "author", - "auto", - "autos", - "avianca", - "aw", - "aws", - "ax", - "axa", - "az", - "azure", - "ba", - "baby", - "baidu", - "band", - "bank", - "bar", - "barcelona", - "barclaycard", - "barclays", - "barefoot", - "bargains", - "bauhaus", - "bayern", - "bb", - "bbc", - "bbva", - "bcg", - "bcn", - "bd", - "be", - "beats", - "beer", - "bentley", - "berlin", - "best", - "bet", - "bf", - "bg", - "bh", - "bharti", - "bi", - "bible", - "bid", - "bike", - "bing", - "bingo", - "bio", - "biz", - "bj", - "black", - "blackfriday", - "blog", - "bloomberg", - "blue", - "bm", - "bms", - "bmw", - "bn", - "bnl", - "bnpparibas", - "bo", - "boats", - "bom", - "bond", - "boo", - "boots", - "bosch", - "bostik", - "bot", - "boutique", - "br", - "bradesco", - "bridgestone", - "broadway", - "broker", - "brother", - "brussels", - "bs", - "bt", - "budapest", - "build", - "builders", - "business", - "buy", - "buzz", - "bv", - "bw", - "by", - "bz", - "bzh", - "ca", - "cab", - "cafe", - "cal", - "call", - "camera", - "camp", - "cancerresearch", - "canon", - "capetown", - "capital", - "car", - "caravan", - "cards", - "care", - "career", - "careers", - "cars", - "cartier", - "casa", - "cash", - "casino", - "cat", - "catering", - "cba", - "cbn", - "cbre", - "cc", - "cd", - "ceb", - "center", - "ceo", - "cern", - "cf", - "cfa", - "cfd", - "cg", - "ch", - "chanel", - "channel", - "chase", - "chat", - "cheap", - "chintai", - "chloe", - "christmas", - "chrome", - "church", - "ci", - "cipriani", - "circle", - "cisco", - "citic", - "city", - "cityeats", - "ck", - "cl", - "claims", - "cleaning", - "click", - "clinic", - "clothing", - "cloud", - "club", - "clubmed", - "cm", - "cn", - "co", - "coach", - "codes", - "coffee", - "college", - "cologne", - "com", - "commbank", - "community", - "company", - "computer", - "comsec", - "condos", - "construction", - "consulting", - "contact", - "contractors", - "cooking", - "cookingchannel", - "cool", - "coop", - "corsica", - "country", - "coupon", - "coupons", - "courses", - "cr", - "credit", - "creditcard", - "creditunion", - "cricket", - "crown", - "crs", - "cruises", - "csc", - "cu", - "cuisinella", - "cv", - "cw", - "cx", - "cy", - "cymru", - "cyou", - "cz", - "dabur", - "dad", - "dance", - "date", - "dating", - "datsun", - "day", - "dclk", - "dds", - "de", - "deal", - "dealer", - "deals", - "degree", - "delivery", - "dell", - "delta", - "democrat", - "dental", - "dentist", - "desi", - "design", - "dev", - "diamonds", - "diet", - "digital", - "direct", - "directory", - "discount", - "dj", - "dk", - "dm", - "dnp", - "do", - "docs", - "dog", - "doha", - "domains", - "doosan", - "dot", - "download", - "drive", - "dstv", - "dtv", - "dubai", - "dunlop", - "dupont", - "durban", - "dvag", - "dz", - "earth", - "eat", - "ec", - "edeka", - "edu", - "education", - "ee", - "eg", - "email", - "emerck", - "energy", - "engineer", - "engineering", - "enterprises", - "epson", - "equipment", - "er", - "erni", - "es", - "esq", - "estate", - "et", - "eu", - "eurovision", - "eus", - "events", - "everbank", - "exchange", - "expert", - "exposed", - "express", - "extraspace", - "fage", - "fail", - "fairwinds", - "faith", - "family", - "fan", - "fans", - "farm", - "fashion", - "fast", - "feedback", - "ferrero", - "fi", - "film", - "final", - "finance", - "financial", - "fire", - "firestone", - "firmdale", - "fish", - "fishing", - "fit", - "fitness", - "fj", - "fk", - "flickr", - "flights", - "florist", - "flowers", - "flsmidth", - "fly", - "fm", - "fo", - "foo", - "foodnetwork", - "football", - "ford", - "forex", - "forsale", - "forum", - "foundation", - "fr", - "frl", - "frogans", - "frontdoor", - "frontier", - "fund", - "furniture", - "futbol", - "fyi", - "ga", - "gal", - "gallery", - "gallo", - "gallup", - "game", - "games", - "garden", - "gb", - "gbiz", - "gd", - "gdn", - "ge", - "gea", - "gent", - "genting", - "gf", - "gg", - "ggee", - "gh", - "gi", - "gift", - "gifts", - "gives", - "giving", - "gl", - "glass", - "gle", - "global", - "globo", - "gm", - "gmail", - "gmo", - "gmx", - "gn", - "gold", - "goldpoint", - "golf", - "goo", - "goodyear", - "goog", - "google", - "gop", - "got", - "gotv", - "gov", - "gp", - "gq", - "gr", - "grainger", - "graphics", - "gratis", - "green", - "gripe", - "group", - "gs", - "gt", - "gu", - "gucci", - "guge", - "guide", - "guitars", - "guru", - "gw", - "gy", - "hamburg", - "hangout", - "haus", - "hdfcbank", - "health", - "healthcare", - "help", - "helsinki", - "here", - "hermes", - "hgtv", - "hiphop", - "hitachi", - "hiv", - "hk", - "hkt", - "hm", - "hn", - "hockey", - "holdings", - "holiday", - "homedepot", - "homes", - "honda", - "horse", - "host", - "hosting", - "hoteles", - "hotmail", - "house", - "how", - "hr", - "hsbc", - "ht", - "htc", - "hu", - "ibm", - "icbc", - "ice", - "icu", - "id", - "ie", - "ifm", - "iinet", - "il", - "im", - "imdb", - "immo", - "immobilien", - "in", - "industries", - "infiniti", - "info", - "ing", - "ink", - "institute", - "insurance", - "insure", - "int", - "international", - "investments", - "io", - "ipiranga", - "iq", - "ir", - "irish", - "is", - "iselect", - "ist", - "istanbul", - "it", - "itau", - "iwc", - "jaguar", - "java", - "jcb", - "jcp", - "je", - "jetzt", - "jewelry", - "jio", - "jlc", - "jll", - "jm", - "jmp", - "jnj", - "jo", - "jobs", - "joburg", - "jot", - "joy", - "jp", - "jpmorgan", - "jprs", - "juegos", - "kaufen", - "kddi", - "ke", - "kerryhotels", - "kerrylogistics", - "kerryproperties", - "kfh", - "kg", - "kh", - "ki", - "kim", - "kinder", - "kindle", - "kitchen", - "kiwi", - "km", - "kn", - "koeln", - "komatsu", - "kp", - "kpmg", - "kpn", - "kr", - "krd", - "kred", - "kuokgroup", - "kw", - "ky", - "kyknet", - "kyoto", - "kz", - "la", - "lacaixa", - "lamborghini", - "lancaster", - "land", - "landrover", - "lasalle", - "lat", - "latrobe", - "law", - "lawyer", - "lb", - "lc", - "lds", - "lease", - "leclerc", - "legal", - "lexus", - "lgbt", - "li", - "liaison", - "lidl", - "life", - "lifeinsurance", - "lifestyle", - "lighting", - "like", - "limited", - "limo", - "lincoln", - "linde", - "link", - "lipsy", - "live", - "lixil", - "lk", - "loan", - "loans", - "locker", - "locus", - "lol", - "london", - "lotte", - "lotto", - "love", - "lr", - "ls", - "lt", - "ltd", - "ltda", - "lu", - "lupin", - "luxe", - "luxury", - "lv", - "ly", - "ma", - "madrid", - "maif", - "maison", - "makeup", - "man", - "management", - "mango", - "market", - "marketing", - "markets", - "marriott", - "mba", - "mc", - "md", - "me", - "media", - "meet", - "melbourne", - "meme", - "memorial", - "men", - "menu", - "meo", - "metlife", - "mg", - "mh", - "miami", - "microsoft", - "mil", - "mini", - "mit", - "mk", - "ml", - "mlb", - "mls", - "mm", - "mma", - "mn", - "mnet", - "mo", - "mobi", - "mobily", - "moda", - "moe", - "moi", - "mom", - "monash", - "money", - "montblanc", - "mormon", - "mortgage", - "moscow", - "moto", - "motorcycles", - "mov", - "movie", - "movistar", - "mp", - "mq", - "mr", - "ms", - "mt", - "mtn", - "mtpc", - "mtr", - "mu", - "multichoice", - "museum", - "mutual", - "mutuelle", - "mv", - "mw", - "mx", - "my", - "mz", - "mzansimagic", - "na", - "nadex", - "nagoya", - "name", - "naspers", - "natura", - "navy", - "nc", - "ne", - "nec", - "net", - "netbank", - "netflix", - "network", - "neustar", - "new", - "news", - "next", - "nextdirect", - "nexus", - "nf", - "ng", - "ngo", - "nhk", - "ni", - "nico", - "nikon", - "ninja", - "nissan", - "nl", - "no", - "nokia", - "northwesternmutual", - "norton", - "now", - "nowruz", - "nowtv", - "np", - "nr", - "nra", - "nrw", - "ntt", - "nu", - "nyc", - "nz", - "obi", - "observer", - "office", - "okinawa", - "olayan", - "olayangroup", - "ollo", - "om", - "omega", - "one", - "ong", - "onl", - "online", - "ooo", - "oracle", - "orange", - "org", - "organic", - "orientexpress", - "osaka", - "otsuka", - "ott", - "ovh", - "pa", - "page", - "pamperedchef", - "panerai", - "paris", - "pars", - "partners", - "parts", - "party", - "passagens", - "payu", - "pccw", - "pe", - "pet", - "pf", - "pg", - "ph", - "pharmacy", - "philips", - "photo", - "photography", - "photos", - "physio", - "piaget", - "pics", - "pictet", - "pictures", - "pid", - "pin", - "ping", - "pink", - "pizza", - "pk", - "pl", - "place", - "play", - "playstation", - "plumbing", - "plus", - "pm", - "pn", - "pnc", - "pohl", - "poker", - "porn", - "post", - "pr", - "praxi", - "press", - "prime", - "pro", - "prod", - "productions", - "prof", - "promo", - "properties", - "property", - "protection", - "ps", - "pt", - "pub", - "pw", - "py", - "qa", - "qpon", - "quebec", - "quest", - "racing", - "re", - "read", - "realtor", - "realty", - "recipes", - "red", - "redstone", - "redumbrella", - "rehab", - "reise", - "reisen", - "reit", - "reliance", - "ren", - "rent", - "rentals", - "repair", - "report", - "republican", - "rest", - "restaurant", - "review", - "reviews", - "rexroth", - "rich", - "richardli", - "ricoh", - "ril", - "rio", - "rip", - "ro", - "rocher", - "rocks", - "rodeo", - "room", - "rs", - "rsvp", - "ru", - "ruhr", - "run", - "rw", - "rwe", - "ryukyu", - "sa", - "saarland", - "safe", - "safety", - "sakura", - "sale", - "salon", - "samsung", - "sandvik", - "sandvikcoromant", - "sanofi", - "sap", - "sapo", - "sarl", - "sas", - "save", - "saxo", - "sb", - "sbi", - "sbs", - "sc", - "sca", - "scb", - "schmidt", - "scholarships", - "school", - "schule", - "schwarz", - "science", - "scor", - "scot", - "sd", - "se", - "seat", - "security", - "seek", - "sener", - "services", - "sew", - "sex", - "sexy", - "sg", - "sh", - "sharp", - "shaw", - "shia", - "shiksha", - "shoes", - "shouji", - "show", - "shriram", - "si", - "silk", - "sina", - "singles", - "site", - "sj", - "sk", - "ski", - "skin", - "sky", - "skype", - "sl", - "sm", - "smile", - "sn", - "sncf", - "so", - "soccer", - "social", - "softbank", - "software", - "sohu", - "solar", - "solutions", - "song", - "sony", - "soy", - "space", - "spiegel", - "spot", - "spreadbetting", - "sr", - "srl", - "st", - "stada", - "star", - "starhub", - "statebank", - "statoil", - "stc", - "stcgroup", - "stockholm", - "storage", - "store", - "studio", - "study", - "style", - "su", - "sucks", - "supersport", - "supplies", - "supply", - "support", - "surf", - "surgery", - "suzuki", - "sv", - "swatch", - "swiss", - "sx", - "sy", - "sydney", - "symantec", - "systems", - "sz", - "tab", - "taipei", - "talk", - "taobao", - "tatamotors", - "tatar", - "tattoo", - "tax", - "taxi", - "tc", - "tci", - "td", - "tdk", - "team", - "tech", - "technology", - "tel", - "telecity", - "telefonica", - "temasek", - "tennis", - "teva", - "tf", - "tg", - "th", - "thd", - "theater", - "theatre", - "theguardian", - "tickets", - "tienda", - "tiffany", - "tips", - "tires", - "tirol", - "tj", - "tk", - "tl", - "tm", - "tmall", - "tn", - "to", - "today", - "tokyo", - "tools", - "top", - "toray", - "toshiba", - "tours", - "town", - "toyota", - "toys", - "tp", - "tr", - "trade", - "trading", - "training", - "travel", - "travelchannel", - "travelers", - "travelersinsurance", - "trust", - "trv", - "tt", - "tube", - "tui", - "tunes", - "tushu", - "tv", - "tvs", - "tw", - "tz", - "ua", - "ubs", - "ug", - "uk", - "university", - "uno", - "uol", - "ups", - "us", - "uy", - "uz", - "va", - "vacations", - "vana", - "vc", - "ve", - "vegas", - "ventures", - "versicherung", - "vet", - "vg", - "vi", - "viajes", - "video", - "vig", - "viking", - "villas", - "vin", - "vip", - "virgin", - "vision", - "vista", - "vistaprint", - "viva", - "vlaanderen", - "vn", - "vodka", - "volkswagen", - "vote", - "voting", - "voto", - "voyage", - "vu", - "vuelos", - "wales", - "walter", - "wang", - "wanggou", - "warman", - "watch", - "watches", - "weather", - "weatherchannel", - "webcam", - "weber", - "website", - "wed", - "wedding", - "weibo", - "weir", - "wf", - "whoswho", - "wien", - "wiki", - "williamhill", - "win", - "windows", - "wine", - "wme", - "work", - "works", - "world", - "ws", - "wtc", - "wtf", - "xbox", - "xerox", - "xihuan", - "xin", - "xn--11b4c3d", - "xn--1ck2e1b", - "xn--1qqw23a", - "xn--30rr7y", - "xn--3bst00m", - "xn--3ds443g", - "xn--3e0b707e", - "xn--3oq18vl8pn36a", - "xn--3pxu8k", - "xn--42c2d9a", - "xn--45brj9c", - "xn--45q11c", - "xn--4gbrim", - "xn--54b7fta0cc", - "xn--55qw42g", - "xn--55qx5d", - "xn--5tzm5g", - "xn--6frz82g", - "xn--6qq986b3xl", - "xn--80adxhks", - "xn--80ao21a", - "xn--80asehdb", - "xn--80aswg", - "xn--8y0a063a", - "xn--90a3ac", - "xn--90ais", - "xn--9dbq2a", - "xn--9et52u", - "xn--9krt00a", - "xn--b4w605ferd", - "xn--bck1b9a5dre4c", - "xn--c1avg", - "xn--c2br7g", - "xn--cck2b3b", - "xn--cg4bki", - "xn--clchc0ea0b2g2a9gcd", - "xn--czr694b", - "xn--czrs0t", - "xn--czru2d", - "xn--d1acj3b", - "xn--d1alf", - "xn--eckvdtc9d", - "xn--efvy88h", - "xn--estv75g", - "xn--fct429k", - "xn--fhbei", - "xn--fiq228c5hs", - "xn--fiq64b", - "xn--fiqs8s", - "xn--fiqz9s", - "xn--fjq720a", - "xn--flw351e", - "xn--fpcrj9c3d", - "xn--fzc2c9e2c", - "xn--fzys8d69uvgm", - "xn--g2xx48c", - "xn--gckr3f0f", - "xn--gecrj9c", - "xn--h2brj9c", - "xn--hxt814e", - "xn--i1b6b1a6a2e", - "xn--imr513n", - "xn--io0a7i", - "xn--j1aef", - "xn--j1amh", - "xn--j6w193g", - "xn--jlq61u9w7b", - "xn--jvr189m", - "xn--kcrx77d1x4a", - "xn--kprw13d", - "xn--kpry57d", - "xn--kpu716f", - "xn--kput3i", - "xn--l1acc", - "xn--lgbbat1ad8j", - "xn--mgb2ddes", - "xn--mgb9awbf", - "xn--mgba3a3ejt", - "xn--mgba3a4f16a", - "xn--mgba3a4fra", - "xn--mgba7c0bbn0a", - "xn--mgbaam7a8h", - "xn--mgbab2bd", - "xn--mgbai9a5eva00b", - "xn--mgbai9azgqp6j", - "xn--mgbayh7gpa", - "xn--mgbb9fbpob", - "xn--mgbbh1a71e", - "xn--mgbc0a9azcg", - "xn--mgberp4a5d4a87g", - "xn--mgberp4a5d4ar", - "xn--mgbpl2fh", - "xn--mgbqly7c0a67fbc", - "xn--mgbqly7cvafr", - "xn--mgbt3dhd", - "xn--mgbtf8fl", - "xn--mgbtx2b", - "xn--mgbx4cd0ab", - "xn--mix082f", - "xn--mix891f", - "xn--mk1bu44c", - "xn--mxtq1m", - "xn--ngbc5azd", - "xn--ngbe9e0a", - "xn--nnx388a", - "xn--node", - "xn--nqv7f", - "xn--nqv7fs00ema", - "xn--nyqy26a", - "xn--o3cw4h", - "xn--ogbpf8fl", - "xn--p1acf", - "xn--p1ai", - "xn--pbt977c", - "xn--pgbs0dh", - "xn--pssy2u", - "xn--q9jyb4c", - "xn--qcka1pmc", - "xn--qxam", - "xn--rhqv96g", - "xn--rovu88b", - "xn--s9brj9c", - "xn--ses554g", - "xn--t60b56a", - "xn--tckwe", - "xn--unup4y", - "xn--vermgensberater-ctb", - "xn--vermgensberatung-pwb", - "xn--vhquv", - "xn--vuq861b", - "xn--w4r85el8fhu5dnra", - "xn--wgbh1c", - "xn--wgbl6a", - "xn--xhq521b", - "xn--xkc2al3hye2a", - "xn--xkc2dl3a5ee0h", - "xn--y9a3aq", - "xn--yfro4i67o", - "xn--ygbi2ammx", - "xn--zfr164b", - "xperia", - "xxx", - "xyz", - "yachts", - "yahoo", - "yamaxun", - "yandex", - "ye", - "yodobashi", - "yoga", - "yokohama", - "you", - "youtube", - "yt", - "yun", - "za", - "zappos", - "zara", - "zero", - "zip", - "zippo", - "zm", - "zone", - "zuerich", - "zw", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "nom", - "ac", - "blogspot", - "co", - "gov", - "mil", - "net", - "org", - "sch", - "accident-investigation", - "accident-prevention", - "aerobatic", - "aeroclub", - "aerodrome", - "agents", - "air-surveillance", - "air-traffic-control", - "aircraft", - "airline", - "airport", - "airtraffic", - "ambulance", - "amusement", - "association", - "author", - "ballooning", - "broker", - "caa", - "cargo", - "catering", - "certification", - "championship", - "charter", - "civilaviation", - "club", - "conference", - "consultant", - "consulting", - "control", - "council", - "crew", - "design", - "dgca", - "educator", - "emergency", - "engine", - "engineer", - "entertainment", - "equipment", - "exchange", - "express", - "federation", - "flight", - "freight", - "fuel", - "gliding", - "government", - "groundhandling", - "group", - "hanggliding", - "homebuilt", - "insurance", - "journal", - "journalist", - "leasing", - "logistics", - "magazine", - "maintenance", - "marketplace", - "media", - "microlight", - "modelling", - "navigation", - "parachuting", - "paragliding", - "passenger-association", - "pilot", - "press", - "production", - "recreation", - "repbody", - "res", - "research", - "rotorcraft", - "safety", - "scientist", - "services", - "show", - "skydiving", - "software", - "student", - "taxi", - "trader", - "trading", - "trainer", - "union", - "workinggroup", - "works", - "com", - "edu", - "gov", - "net", - "org", - "co", - "com", - "net", - "nom", - "org", - "com", - "net", - "off", - "org", - "blogspot", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "blogspot", - "com", - "edu", - "net", - "org", - "co", - "ed", - "gv", - "it", - "og", - "pb", - "com", - "edu", - "gob", - "gov", - "int", - "mil", - "net", - "org", - "tur", - "blogspot", - "e164", - "in-addr", - "ip6", - "iris", - "uri", - "urn", - "gov", - "ac", - "biz", - "co", - "gv", - "info", - "or", - "priv", - "blogspot", - "act", - "asn", - "com", - "conf", - "edu", - "gov", - "id", - "info", - "net", - "nsw", - "nt", - "org", - "oz", - "qld", - "sa", - "tas", - "vic", - "wa", - "blogspot", - "act", - "nsw", - "nt", - "qld", - "sa", - "tas", - "vic", - "wa", - "qld", - "sa", - "tas", - "vic", - "wa", - "com", - "biz", - "com", - "edu", - "gov", - "info", - "int", - "mil", - "name", - "net", - "org", - "pp", - "pro", - "blogspot", - "co", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "rs", - "unbi", - "unsa", - "biz", - "co", - "com", - "edu", - "gov", - "info", - "net", - "org", - "store", - "tv", - "ac", - "blogspot", - "gov", - "0", - "1", - "2", - "3", - "4", - "5", - "6", - "7", - "8", - "9", - "a", - "b", - "blogspot", - "c", - "d", - "e", - "f", - "g", - "h", - "i", - "j", - "k", - "l", - "m", - "n", - "o", - "p", - "q", - "r", - "s", - "t", - "u", - "v", - "w", - "x", - "y", - "z", - "com", - "edu", - "gov", - "net", - "org", - "co", - "com", - "edu", - "or", - "org", - "dyndns", - "for-better", - "for-more", - "for-some", - "for-the", - "selfip", - "webhop", - "asso", - "barreau", - "blogspot", - "gouv", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gob", - "gov", - "int", - "mil", - "net", - "org", - "tv", - "adm", - "adv", - "agr", - "am", - "arq", - "art", - "ato", - "b", - "bio", - "blog", - "bmd", - "cim", - "cng", - "cnt", - "com", - "coop", - "ecn", - "eco", - "edu", - "emp", - "eng", - "esp", - "etc", - "eti", - "far", - "flog", - "fm", - "fnd", - "fot", - "fst", - "g12", - "ggf", - "gov", - "imb", - "ind", - "inf", - "jor", - "jus", - "leg", - "lel", - "mat", - "med", - "mil", - "mp", - "mus", - "net", - "nom", - "not", - "ntr", - "odo", - "org", - "ppg", - "pro", - "psc", - "psi", - "qsl", - "radio", - "rec", - "slg", - "srv", - "taxi", - "teo", - "tmp", - "trd", - "tur", - "tv", - "vet", - "vlog", - "wiki", - "zlg", - "blogspot", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gov", - "net", - "org", - "co", - "org", - "com", - "gov", - "mil", - "of", - "blogspot", - "com", - "edu", - "gov", - "net", - "org", - "za", - "ab", - "bc", - "blogspot", - "co", - "gc", - "mb", - "nb", - "nf", - "nl", - "ns", - "nt", - "nu", - "on", - "pe", - "qc", - "sk", - "yk", - "ftpaccess", - "game-server", - "myphotos", - "scrapping", - "gov", - "blogspot", - "blogspot", - "ac", - "asso", - "co", - "com", - "ed", - "edu", - "go", - "gouv", - "int", - "md", - "net", - "or", - "org", - "presse", - "xn--aroport-bya", - "www", - "blogspot", - "co", - "gob", - "gov", - "mil", - "co", - "com", - "gov", - "net", - "ac", - "ah", - "amazonaws", - "bj", - "com", - "cq", - "edu", - "fj", - "gd", - "gov", - "gs", - "gx", - "gz", - "ha", - "hb", - "he", - "hi", - "hk", - "hl", - "hn", - "jl", - "js", - "jx", - "ln", - "mil", - "mo", - "net", - "nm", - "nx", - "org", - "qh", - "sc", - "sd", - "sh", - "sn", - "sx", - "tj", - "tw", - "xj", - "xn--55qx5d", - "xn--io0a7i", - "xn--od0alg", - "xz", - "yn", - "zj", - "compute", - "cn-north-1", - "amazonaws", - "cn-north-1", - "s3", - "arts", - "com", - "edu", - "firm", - "gov", - "info", - "int", - "mil", - "net", - "nom", - "org", - "rec", - "web", - "blogspot", - "1kapp", - "4u", - "africa", - "amazonaws", - "appspot", - "ar", - "betainabox", - "blogdns", - "blogspot", - "br", - "cechire", - "cloudcontrolapp", - "cloudcontrolled", - "cn", - "co", - "codespot", - "de", - "dnsalias", - "dnsdojo", - "doesntexist", - "dontexist", - "doomdns", - "dreamhosters", - "dyn-o-saur", - "dynalias", - "dyndns-at-home", - "dyndns-at-work", - "dyndns-blog", - "dyndns-free", - "dyndns-home", - "dyndns-ip", - "dyndns-mail", - "dyndns-office", - "dyndns-pics", - "dyndns-remote", - "dyndns-server", - "dyndns-web", - "dyndns-wiki", - "dyndns-work", - "elasticbeanstalk", - "est-a-la-maison", - "est-a-la-masion", - "est-le-patron", - "est-mon-blogueur", - "eu", - "firebaseapp", - "flynnhub", - "from-ak", - "from-al", - "from-ar", - "from-ca", - "from-ct", - "from-dc", - "from-de", - "from-fl", - "from-ga", - "from-hi", - "from-ia", - "from-id", - "from-il", - "from-in", - "from-ks", - "from-ky", - "from-ma", - "from-md", - "from-mi", - "from-mn", - "from-mo", - "from-ms", - "from-mt", - "from-nc", - "from-nd", - "from-ne", - "from-nh", - "from-nj", - "from-nm", - "from-nv", - "from-oh", - "from-ok", - "from-or", - "from-pa", - "from-pr", - "from-ri", - "from-sc", - "from-sd", - "from-tn", - "from-tx", - "from-ut", - "from-va", - "from-vt", - "from-wa", - "from-wi", - "from-wv", - "from-wy", - "gb", - "getmyip", - "githubusercontent", - "googleapis", - "googlecode", - "gotdns", - "gr", - "herokuapp", - "herokussl", - "hk", - "hobby-site", - "homelinux", - "homeunix", - "hu", - "iamallama", - "is-a-anarchist", - "is-a-blogger", - "is-a-bookkeeper", - "is-a-bulls-fan", - "is-a-caterer", - "is-a-chef", - "is-a-conservative", - "is-a-cpa", - "is-a-cubicle-slave", - "is-a-democrat", - "is-a-designer", - "is-a-doctor", - "is-a-financialadvisor", - "is-a-geek", - "is-a-green", - "is-a-guru", - "is-a-hard-worker", - "is-a-hunter", - "is-a-landscaper", - "is-a-lawyer", - "is-a-liberal", - "is-a-libertarian", - "is-a-llama", - "is-a-musician", - "is-a-nascarfan", - "is-a-nurse", - "is-a-painter", - "is-a-personaltrainer", - "is-a-photographer", - "is-a-player", - "is-a-republican", - "is-a-rockstar", - "is-a-socialist", - "is-a-student", - "is-a-teacher", - "is-a-techie", - "is-a-therapist", - "is-an-accountant", - "is-an-actor", - "is-an-actress", - "is-an-anarchist", - "is-an-artist", - "is-an-engineer", - "is-an-entertainer", - "is-certified", - "is-gone", - "is-into-anime", - "is-into-cars", - "is-into-cartoons", - "is-into-games", - "is-leet", - "is-not-certified", - "is-slick", - "is-uberleet", - "is-with-theband", - "isa-geek", - "isa-hockeynut", - "issmarterthanyou", - "jpn", - "kr", - "likes-pie", - "likescandy", - "mex", - "neat-url", - "nfshost", - "no", - "operaunite", - "outsystemscloud", - "pagespeedmobilizer", - "qc", - "rhcloud", - "ro", - "ru", - "sa", - "saves-the-whales", - "se", - "selfip", - "sells-for-less", - "sells-for-u", - "servebbs", - "simple-url", - "sinaapp", - "space-to-rent", - "teaches-yoga", - "uk", - "us", - "uy", - "vipsinaapp", - "withgoogle", - "writesthisblog", - "yolasite", - "za", - "compute", - "compute-1", - "elb", - "eu-central-1", - "s3", - "s3-ap-northeast-1", - "s3-ap-southeast-1", - "s3-ap-southeast-2", - "s3-eu-central-1", - "s3-eu-west-1", - "s3-external-1", - "s3-external-2", - "s3-fips-us-gov-west-1", - "s3-sa-east-1", - "s3-us-gov-west-1", - "s3-us-west-1", - "s3-us-west-2", - "us-east-1", - "ap-northeast-1", - "ap-southeast-1", - "ap-southeast-2", - "eu-central-1", - "eu-west-1", - "sa-east-1", - "us-gov-west-1", - "us-west-1", - "us-west-2", - "z-1", - "z-2", - "s3", - "ac", - "co", - "ed", - "fi", - "go", - "or", - "sa", - "com", - "edu", - "gov", - "inf", - "net", - "org", - "blogspot", - "com", - "edu", - "net", - "org", - "ath", - "gov", - "ac", - "biz", - "com", - "ekloges", - "gov", - "ltd", - "name", - "net", - "org", - "parliament", - "press", - "pro", - "tm", - "blogspot", - "blogspot", - "blogspot", - "com", - "fuettertdasnetz", - "isteingeek", - "istmein", - "lebtimnetz", - "leitungsen", - "traeumtgerade", - "blogspot", - "com", - "edu", - "gov", - "net", - "org", - "art", - "com", - "edu", - "gob", - "gov", - "mil", - "net", - "org", - "sld", - "web", - "art", - "asso", - "com", - "edu", - "gov", - "net", - "org", - "pol", - "com", - "edu", - "fin", - "gob", - "gov", - "info", - "k12", - "med", - "mil", - "net", - "org", - "pro", - "aip", - "com", - "edu", - "fie", - "gov", - "lib", - "med", - "org", - "pri", - "riik", - "blogspot", - "com", - "edu", - "eun", - "gov", - "mil", - "name", - "net", - "org", - "sci", - "blogspot", - "com", - "edu", - "gob", - "nom", - "org", - "blogspot", - "biz", - "com", - "edu", - "gov", - "info", - "name", - "net", - "org", - "aland", - "blogspot", - "iki", - "aeroport", - "assedic", - "asso", - "avocat", - "avoues", - "blogspot", - "cci", - "chambagri", - "chirurgiens-dentistes", - "com", - "experts-comptables", - "geometre-expert", - "gouv", - "greta", - "huissier-justice", - "medecin", - "nom", - "notaires", - "pharmacien", - "port", - "prd", - "presse", - "tm", - "veterinaire", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "pvt", - "co", - "net", - "org", - "com", - "edu", - "gov", - "mil", - "org", - "com", - "edu", - "gov", - "ltd", - "mod", - "org", - "co", - "com", - "edu", - "net", - "org", - "ac", - "com", - "edu", - "gov", - "net", - "org", - "asso", - "com", - "edu", - "mobi", - "net", - "org", - "blogspot", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gob", - "ind", - "mil", - "net", - "org", - "co", - "com", - "net", - "blogspot", - "com", - "edu", - "gov", - "idv", - "inc", - "ltd", - "net", - "org", - "xn--55qx5d", - "xn--ciqpn", - "xn--gmq050i", - "xn--gmqw5a", - "xn--io0a7i", - "xn--lcvr32d", - "xn--mk0axi", - "xn--mxtq1m", - "xn--od0alg", - "xn--od0aq3b", - "xn--tn0ag", - "xn--uc0atv", - "xn--uc0ay4a", - "xn--wcvs22d", - "xn--zf0avx", - "com", - "edu", - "gob", - "mil", - "net", - "org", - "blogspot", - "com", - "from", - "iz", - "name", - "adult", - "art", - "asso", - "com", - "coop", - "edu", - "firm", - "gouv", - "info", - "med", - "net", - "org", - "perso", - "pol", - "pro", - "rel", - "shop", - "2000", - "agrar", - "blogspot", - "bolt", - "casino", - "city", - "co", - "erotica", - "erotika", - "film", - "forum", - "games", - "hotel", - "info", - "ingatlan", - "jogasz", - "konyvelo", - "lakas", - "media", - "news", - "org", - "priv", - "reklam", - "sex", - "shop", - "sport", - "suli", - "szex", - "tm", - "tozsde", - "utazas", - "video", - "ac", - "biz", - "co", - "desa", - "go", - "mil", - "my", - "net", - "or", - "sch", - "web", - "blogspot", - "blogspot", - "gov", - "co", - "blogspot", - "ac", - "co", - "com", - "net", - "org", - "tt", - "tv", - "ltd", - "plc", - "ac", - "blogspot", - "co", - "edu", - "firm", - "gen", - "gov", - "ind", - "mil", - "net", - "nic", - "org", - "res", - "barrel-of-knowledge", - "barrell-of-knowledge", - "dyndns", - "for-our", - "groks-the", - "groks-this", - "here-for-more", - "knowsitall", - "selfip", - "webhop", - "eu", - "com", - "github", - "nid", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "ac", - "co", - "gov", - "id", - "net", - "org", - "sch", - "xn--mgba3a4f16a", - "xn--mgba3a4fra", - "blogspot", - "com", - "cupcake", - "edu", - "gov", - "int", - "net", - "org", - "abr", - "abruzzo", - "ag", - "agrigento", - "al", - "alessandria", - "alto-adige", - "altoadige", - "an", - "ancona", - "andria-barletta-trani", - "andria-trani-barletta", - "andriabarlettatrani", - "andriatranibarletta", - "ao", - "aosta", - "aosta-valley", - "aostavalley", - "aoste", - "ap", - "aq", - "aquila", - "ar", - "arezzo", - "ascoli-piceno", - "ascolipiceno", - "asti", - "at", - "av", - "avellino", - "ba", - "balsan", - "bari", - "barletta-trani-andria", - "barlettatraniandria", - "bas", - "basilicata", - "belluno", - "benevento", - "bergamo", - "bg", - "bi", - "biella", - "bl", - "blogspot", - "bn", - "bo", - "bologna", - "bolzano", - "bozen", - "br", - "brescia", - "brindisi", - "bs", - "bt", - "bz", - "ca", - "cagliari", - "cal", - "calabria", - "caltanissetta", - "cam", - "campania", - "campidano-medio", - "campidanomedio", - "campobasso", - "carbonia-iglesias", - "carboniaiglesias", - "carrara-massa", - "carraramassa", - "caserta", - "catania", - "catanzaro", - "cb", - "ce", - "cesena-forli", - "cesenaforli", - "ch", - "chieti", - "ci", - "cl", - "cn", - "co", - "como", - "cosenza", - "cr", - "cremona", - "crotone", - "cs", - "ct", - "cuneo", - "cz", - "dell-ogliastra", - "dellogliastra", - "edu", - "emilia-romagna", - "emiliaromagna", - "emr", - "en", - "enna", - "fc", - "fe", - "fermo", - "ferrara", - "fg", - "fi", - "firenze", - "florence", - "fm", - "foggia", - "forli-cesena", - "forlicesena", - "fr", - "friuli-v-giulia", - "friuli-ve-giulia", - "friuli-vegiulia", - "friuli-venezia-giulia", - "friuli-veneziagiulia", - "friuli-vgiulia", - "friuliv-giulia", - "friulive-giulia", - "friulivegiulia", - "friulivenezia-giulia", - "friuliveneziagiulia", - "friulivgiulia", - "frosinone", - "fvg", - "ge", - "genoa", - "genova", - "go", - "gorizia", - "gov", - "gr", - "grosseto", - "iglesias-carbonia", - "iglesiascarbonia", - "im", - "imperia", - "is", - "isernia", - "kr", - "la-spezia", - "laquila", - "laspezia", - "latina", - "laz", - "lazio", - "lc", - "le", - "lecce", - "lecco", - "li", - "lig", - "liguria", - "livorno", - "lo", - "lodi", - "lom", - "lombardia", - "lombardy", - "lt", - "lu", - "lucania", - "lucca", - "macerata", - "mantova", - "mar", - "marche", - "massa-carrara", - "massacarrara", - "matera", - "mb", - "mc", - "me", - "medio-campidano", - "mediocampidano", - "messina", - "mi", - "milan", - "milano", - "mn", - "mo", - "modena", - "mol", - "molise", - "monza", - "monza-brianza", - "monza-e-della-brianza", - "monzabrianza", - "monzaebrianza", - "monzaedellabrianza", - "ms", - "mt", - "na", - "naples", - "napoli", - "no", - "novara", - "nu", - "nuoro", - "og", - "ogliastra", - "olbia-tempio", - "olbiatempio", - "or", - "oristano", - "ot", - "pa", - "padova", - "padua", - "palermo", - "parma", - "pavia", - "pc", - "pd", - "pe", - "perugia", - "pesaro-urbino", - "pesarourbino", - "pescara", - "pg", - "pi", - "piacenza", - "piedmont", - "piemonte", - "pisa", - "pistoia", - "pmn", - "pn", - "po", - "pordenone", - "potenza", - "pr", - "prato", - "pt", - "pu", - "pug", - "puglia", - "pv", - "pz", - "ra", - "ragusa", - "ravenna", - "rc", - "re", - "reggio-calabria", - "reggio-emilia", - "reggiocalabria", - "reggioemilia", - "rg", - "ri", - "rieti", - "rimini", - "rm", - "rn", - "ro", - "roma", - "rome", - "rovigo", - "sa", - "salerno", - "sar", - "sardegna", - "sardinia", - "sassari", - "savona", - "si", - "sic", - "sicilia", - "sicily", - "siena", - "siracusa", - "so", - "sondrio", - "sp", - "sr", - "ss", - "suedtirol", - "sv", - "ta", - "taa", - "taranto", - "te", - "tempio-olbia", - "tempioolbia", - "teramo", - "terni", - "tn", - "to", - "torino", - "tos", - "toscana", - "tp", - "tr", - "trani-andria-barletta", - "trani-barletta-andria", - "traniandriabarletta", - "tranibarlettaandria", - "trapani", - "trentino", - "trentino-a-adige", - "trentino-aadige", - "trentino-alto-adige", - "trentino-altoadige", - "trentino-s-tirol", - "trentino-stirol", - "trentino-sud-tirol", - "trentino-sudtirol", - "trentino-sued-tirol", - "trentino-suedtirol", - "trentinoa-adige", - "trentinoaadige", - "trentinoalto-adige", - "trentinoaltoadige", - "trentinos-tirol", - "trentinostirol", - "trentinosud-tirol", - "trentinosudtirol", - "trentinosued-tirol", - "trentinosuedtirol", - "trento", - "treviso", - "trieste", - "ts", - "turin", - "tuscany", - "tv", - "ud", - "udine", - "umb", - "umbria", - "urbino-pesaro", - "urbinopesaro", - "va", - "val-d-aosta", - "val-daosta", - "vald-aosta", - "valdaosta", - "valle-aosta", - "valle-d-aosta", - "valle-daosta", - "valleaosta", - "valled-aosta", - "valledaosta", - "vallee-aoste", - "valleeaoste", - "vao", - "varese", - "vb", - "vc", - "vda", - "ve", - "ven", - "veneto", - "venezia", - "venice", - "verbania", - "vercelli", - "verona", - "vi", - "vibo-valentia", - "vibovalentia", - "vicenza", - "viterbo", - "vr", - "vs", - "vt", - "vv", - "co", - "net", - "org", - "com", - "edu", - "gov", - "mil", - "name", - "net", - "org", - "sch", - "ac", - "ad", - "aichi", - "akita", - "aomori", - "blogspot", - "chiba", - "co", - "ed", - "ehime", - "fukui", - "fukuoka", - "fukushima", - "gifu", - "go", - "gr", - "gunma", - "hiroshima", - "hokkaido", - "hyogo", - "ibaraki", - "ishikawa", - "iwate", - "kagawa", - "kagoshima", - "kanagawa", - "kawasaki", - "kitakyushu", - "kobe", - "kochi", - "kumamoto", - "kyoto", - "lg", - "mie", - "miyagi", - "miyazaki", - "nagano", - "nagasaki", - "nagoya", - "nara", - "ne", - "niigata", - "oita", - "okayama", - "okinawa", - "or", - "osaka", - "saga", - "saitama", - "sapporo", - "sendai", - "shiga", - "shimane", - "shizuoka", - "tochigi", - "tokushima", - "tokyo", - "tottori", - "toyama", - "wakayama", - "xn--0trq7p7nn", - "xn--1ctwo", - "xn--1lqs03n", - "xn--1lqs71d", - "xn--2m4a15e", - "xn--32vp30h", - "xn--4it168d", - "xn--4it797k", - "xn--4pvxs", - "xn--5js045d", - "xn--5rtp49c", - "xn--5rtq34k", - "xn--6btw5a", - "xn--6orx2r", - "xn--7t0a264c", - "xn--8ltr62k", - "xn--8pvr4u", - "xn--c3s14m", - "xn--d5qv7z876c", - "xn--djrs72d6uy", - "xn--djty4k", - "xn--efvn9s", - "xn--ehqz56n", - "xn--elqq16h", - "xn--f6qx53a", - "xn--k7yn95e", - "xn--kbrq7o", - "xn--klt787d", - "xn--kltp7d", - "xn--kltx9a", - "xn--klty5x", - "xn--mkru45i", - "xn--nit225k", - "xn--ntso0iqx3a", - "xn--ntsq17g", - "xn--pssu33l", - "xn--qqqt11m", - "xn--rht27z", - "xn--rht3d", - "xn--rht61e", - "xn--rny31h", - "xn--tor131o", - "xn--uist22h", - "xn--uisz3g", - "xn--uuwu58a", - "xn--vgu402c", - "xn--zbx025d", - "yamagata", - "yamaguchi", - "yamanashi", - "yokohama", - "aisai", - "ama", - "anjo", - "asuke", - "chiryu", - "chita", - "fuso", - "gamagori", - "handa", - "hazu", - "hekinan", - "higashiura", - "ichinomiya", - "inazawa", - "inuyama", - "isshiki", - "iwakura", - "kanie", - "kariya", - "kasugai", - "kira", - "kiyosu", - "komaki", - "konan", - "kota", - "mihama", - "miyoshi", - "nishio", - "nisshin", - "obu", - "oguchi", - "oharu", - "okazaki", - "owariasahi", - "seto", - "shikatsu", - "shinshiro", - "shitara", - "tahara", - "takahama", - "tobishima", - "toei", - "togo", - "tokai", - "tokoname", - "toyoake", - "toyohashi", - "toyokawa", - "toyone", - "toyota", - "tsushima", - "yatomi", - "akita", - "daisen", - "fujisato", - "gojome", - "hachirogata", - "happou", - "higashinaruse", - "honjo", - "honjyo", - "ikawa", - "kamikoani", - "kamioka", - "katagami", - "kazuno", - "kitaakita", - "kosaka", - "kyowa", - "misato", - "mitane", - "moriyoshi", - "nikaho", - "noshiro", - "odate", - "oga", - "ogata", - "semboku", - "yokote", - "yurihonjo", - "aomori", - "gonohe", - "hachinohe", - "hashikami", - "hiranai", - "hirosaki", - "itayanagi", - "kuroishi", - "misawa", - "mutsu", - "nakadomari", - "noheji", - "oirase", - "owani", - "rokunohe", - "sannohe", - "shichinohe", - "shingo", - "takko", - "towada", - "tsugaru", - "tsuruta", - "abiko", - "asahi", - "chonan", - "chosei", - "choshi", - "chuo", - "funabashi", - "futtsu", - "hanamigawa", - "ichihara", - "ichikawa", - "ichinomiya", - "inzai", - "isumi", - "kamagaya", - "kamogawa", - "kashiwa", - "katori", - "katsuura", - "kimitsu", - "kisarazu", - "kozaki", - "kujukuri", - "kyonan", - "matsudo", - "midori", - "mihama", - "minamiboso", - "mobara", - "mutsuzawa", - "nagara", - "nagareyama", - "narashino", - "narita", - "noda", - "oamishirasato", - "omigawa", - "onjuku", - "otaki", - "sakae", - "sakura", - "shimofusa", - "shirako", - "shiroi", - "shisui", - "sodegaura", - "sosa", - "tako", - "tateyama", - "togane", - "tohnosho", - "tomisato", - "urayasu", - "yachimata", - "yachiyo", - "yokaichiba", - "yokoshibahikari", - "yotsukaido", - "ainan", - "honai", - "ikata", - "imabari", - "iyo", - "kamijima", - "kihoku", - "kumakogen", - "masaki", - "matsuno", - "matsuyama", - "namikata", - "niihama", - "ozu", - "saijo", - "seiyo", - "shikokuchuo", - "tobe", - "toon", - "uchiko", - "uwajima", - "yawatahama", - "echizen", - "eiheiji", - "fukui", - "ikeda", - "katsuyama", - "mihama", - "minamiechizen", - "obama", - "ohi", - "ono", - "sabae", - "sakai", - "takahama", - "tsuruga", - "wakasa", - "ashiya", - "buzen", - "chikugo", - "chikuho", - "chikujo", - "chikushino", - "chikuzen", - "chuo", - "dazaifu", - "fukuchi", - "hakata", - "higashi", - "hirokawa", - "hisayama", - "iizuka", - "inatsuki", - "kaho", - "kasuga", - "kasuya", - "kawara", - "keisen", - "koga", - "kurate", - "kurogi", - "kurume", - "minami", - "miyako", - "miyama", - "miyawaka", - "mizumaki", - "munakata", - "nakagawa", - "nakama", - "nishi", - "nogata", - "ogori", - "okagaki", - "okawa", - "oki", - "omuta", - "onga", - "onojo", - "oto", - "saigawa", - "sasaguri", - "shingu", - "shinyoshitomi", - "shonai", - "soeda", - "sue", - "tachiarai", - "tagawa", - "takata", - "toho", - "toyotsu", - "tsuiki", - "ukiha", - "umi", - "usui", - "yamada", - "yame", - "yanagawa", - "yukuhashi", - "aizubange", - "aizumisato", - "aizuwakamatsu", - "asakawa", - "bandai", - "date", - "fukushima", - "furudono", - "futaba", - "hanawa", - "higashi", - "hirata", - "hirono", - "iitate", - "inawashiro", - "ishikawa", - "iwaki", - "izumizaki", - "kagamiishi", - "kaneyama", - "kawamata", - "kitakata", - "kitashiobara", - "koori", - "koriyama", - "kunimi", - "miharu", - "mishima", - "namie", - "nango", - "nishiaizu", - "nishigo", - "okuma", - "omotego", - "ono", - "otama", - "samegawa", - "shimogo", - "shirakawa", - "showa", - "soma", - "sukagawa", - "taishin", - "tamakawa", - "tanagura", - "tenei", - "yabuki", - "yamato", - "yamatsuri", - "yanaizu", - "yugawa", - "anpachi", - "ena", - "gifu", - "ginan", - "godo", - "gujo", - "hashima", - "hichiso", - "hida", - "higashishirakawa", - "ibigawa", - "ikeda", - "kakamigahara", - "kani", - "kasahara", - "kasamatsu", - "kawaue", - "kitagata", - "mino", - "minokamo", - "mitake", - "mizunami", - "motosu", - "nakatsugawa", - "ogaki", - "sakahogi", - "seki", - "sekigahara", - "shirakawa", - "tajimi", - "takayama", - "tarui", - "toki", - "tomika", - "wanouchi", - "yamagata", - "yaotsu", - "yoro", - "annaka", - "chiyoda", - "fujioka", - "higashiagatsuma", - "isesaki", - "itakura", - "kanna", - "kanra", - "katashina", - "kawaba", - "kiryu", - "kusatsu", - "maebashi", - "meiwa", - "midori", - "minakami", - "naganohara", - "nakanojo", - "nanmoku", - "numata", - "oizumi", - "ora", - "ota", - "shibukawa", - "shimonita", - "shinto", - "showa", - "takasaki", - "takayama", - "tamamura", - "tatebayashi", - "tomioka", - "tsukiyono", - "tsumagoi", - "ueno", - "yoshioka", - "asaminami", - "daiwa", - "etajima", - "fuchu", - "fukuyama", - "hatsukaichi", - "higashihiroshima", - "hongo", - "jinsekikogen", - "kaita", - "kui", - "kumano", - "kure", - "mihara", - "miyoshi", - "naka", - "onomichi", - "osakikamijima", - "otake", - "saka", - "sera", - "seranishi", - "shinichi", - "shobara", - "takehara", - "abashiri", - "abira", - "aibetsu", - "akabira", - "akkeshi", - "asahikawa", - "ashibetsu", - "ashoro", - "assabu", - "atsuma", - "bibai", - "biei", - "bifuka", - "bihoro", - "biratori", - "chippubetsu", - "chitose", - "date", - "ebetsu", - "embetsu", - "eniwa", - "erimo", - "esan", - "esashi", - "fukagawa", - "fukushima", - "furano", - "furubira", - "haboro", - "hakodate", - "hamatonbetsu", - "hidaka", - "higashikagura", - "higashikawa", - "hiroo", - "hokuryu", - "hokuto", - "honbetsu", - "horokanai", - "horonobe", - "ikeda", - "imakane", - "ishikari", - "iwamizawa", - "iwanai", - "kamifurano", - "kamikawa", - "kamishihoro", - "kamisunagawa", - "kamoenai", - "kayabe", - "kembuchi", - "kikonai", - "kimobetsu", - "kitahiroshima", - "kitami", - "kiyosato", - "koshimizu", - "kunneppu", - "kuriyama", - "kuromatsunai", - "kushiro", - "kutchan", - "kyowa", - "mashike", - "matsumae", - "mikasa", - "minamifurano", - "mombetsu", - "moseushi", - "mukawa", - "muroran", - "naie", - "nakagawa", - "nakasatsunai", - "nakatombetsu", - "nanae", - "nanporo", - "nayoro", - "nemuro", - "niikappu", - "niki", - "nishiokoppe", - "noboribetsu", - "numata", - "obihiro", - "obira", - "oketo", - "okoppe", - "otaru", - "otobe", - "otofuke", - "otoineppu", - "oumu", - "ozora", - "pippu", - "rankoshi", - "rebun", - "rikubetsu", - "rishiri", - "rishirifuji", - "saroma", - "sarufutsu", - "shakotan", - "shari", - "shibecha", - "shibetsu", - "shikabe", - "shikaoi", - "shimamaki", - "shimizu", - "shimokawa", - "shinshinotsu", - "shintoku", - "shiranuka", - "shiraoi", - "shiriuchi", - "sobetsu", - "sunagawa", - "taiki", - "takasu", - "takikawa", - "takinoue", - "teshikaga", - "tobetsu", - "tohma", - "tomakomai", - "tomari", - "toya", - "toyako", - "toyotomi", - "toyoura", - "tsubetsu", - "tsukigata", - "urakawa", - "urausu", - "uryu", - "utashinai", - "wakkanai", - "wassamu", - "yakumo", - "yoichi", - "aioi", - "akashi", - "ako", - "amagasaki", - "aogaki", - "asago", - "ashiya", - "awaji", - "fukusaki", - "goshiki", - "harima", - "himeji", - "ichikawa", - "inagawa", - "itami", - "kakogawa", - "kamigori", - "kamikawa", - "kasai", - "kasuga", - "kawanishi", - "miki", - "minamiawaji", - "nishinomiya", - "nishiwaki", - "ono", - "sanda", - "sannan", - "sasayama", - "sayo", - "shingu", - "shinonsen", - "shiso", - "sumoto", - "taishi", - "taka", - "takarazuka", - "takasago", - "takino", - "tamba", - "tatsuno", - "toyooka", - "yabu", - "yashiro", - "yoka", - "yokawa", - "ami", - "asahi", - "bando", - "chikusei", - "daigo", - "fujishiro", - "hitachi", - "hitachinaka", - "hitachiomiya", - "hitachiota", - "ibaraki", - "ina", - "inashiki", - "itako", - "iwama", - "joso", - "kamisu", - "kasama", - "kashima", - "kasumigaura", - "koga", - "miho", - "mito", - "moriya", - "naka", - "namegata", - "oarai", - "ogawa", - "omitama", - "ryugasaki", - "sakai", - "sakuragawa", - "shimodate", - "shimotsuma", - "shirosato", - "sowa", - "suifu", - "takahagi", - "tamatsukuri", - "tokai", - "tomobe", - "tone", - "toride", - "tsuchiura", - "tsukuba", - "uchihara", - "ushiku", - "yachiyo", - "yamagata", - "yawara", - "yuki", - "anamizu", - "hakui", - "hakusan", - "kaga", - "kahoku", - "kanazawa", - "kawakita", - "komatsu", - "nakanoto", - "nanao", - "nomi", - "nonoichi", - "noto", - "shika", - "suzu", - "tsubata", - "tsurugi", - "uchinada", - "wajima", - "fudai", - "fujisawa", - "hanamaki", - "hiraizumi", - "hirono", - "ichinohe", - "ichinoseki", - "iwaizumi", - "iwate", - "joboji", - "kamaishi", - "kanegasaki", - "karumai", - "kawai", - "kitakami", - "kuji", - "kunohe", - "kuzumaki", - "miyako", - "mizusawa", - "morioka", - "ninohe", - "noda", - "ofunato", - "oshu", - "otsuchi", - "rikuzentakata", - "shiwa", - "shizukuishi", - "sumita", - "tanohata", - "tono", - "yahaba", - "yamada", - "ayagawa", - "higashikagawa", - "kanonji", - "kotohira", - "manno", - "marugame", - "mitoyo", - "naoshima", - "sanuki", - "tadotsu", - "takamatsu", - "tonosho", - "uchinomi", - "utazu", - "zentsuji", - "akune", - "amami", - "hioki", - "isa", - "isen", - "izumi", - "kagoshima", - "kanoya", - "kawanabe", - "kinko", - "kouyama", - "makurazaki", - "matsumoto", - "minamitane", - "nakatane", - "nishinoomote", - "satsumasendai", - "soo", - "tarumizu", - "yusui", - "aikawa", - "atsugi", - "ayase", - "chigasaki", - "ebina", - "fujisawa", - "hadano", - "hakone", - "hiratsuka", - "isehara", - "kaisei", - "kamakura", - "kiyokawa", - "matsuda", - "minamiashigara", - "miura", - "nakai", - "ninomiya", - "odawara", - "oi", - "oiso", - "sagamihara", - "samukawa", - "tsukui", - "yamakita", - "yamato", - "yokosuka", - "yugawara", - "zama", - "zushi", - "city", - "city", - "city", - "aki", - "geisei", - "hidaka", - "higashitsuno", - "ino", - "kagami", - "kami", - "kitagawa", - "kochi", - "mihara", - "motoyama", - "muroto", - "nahari", - "nakamura", - "nankoku", - "nishitosa", - "niyodogawa", - "ochi", - "okawa", - "otoyo", - "otsuki", - "sakawa", - "sukumo", - "susaki", - "tosa", - "tosashimizu", - "toyo", - "tsuno", - "umaji", - "yasuda", - "yusuhara", - "amakusa", - "arao", - "aso", - "choyo", - "gyokuto", - "hitoyoshi", - "kamiamakusa", - "kashima", - "kikuchi", - "kosa", - "kumamoto", - "mashiki", - "mifune", - "minamata", - "minamioguni", - "nagasu", - "nishihara", - "oguni", - "ozu", - "sumoto", - "takamori", - "uki", - "uto", - "yamaga", - "yamato", - "yatsushiro", - "ayabe", - "fukuchiyama", - "higashiyama", - "ide", - "ine", - "joyo", - "kameoka", - "kamo", - "kita", - "kizu", - "kumiyama", - "kyotamba", - "kyotanabe", - "kyotango", - "maizuru", - "minami", - "minamiyamashiro", - "miyazu", - "muko", - "nagaokakyo", - "nakagyo", - "nantan", - "oyamazaki", - "sakyo", - "seika", - "tanabe", - "uji", - "ujitawara", - "wazuka", - "yamashina", - "yawata", - "asahi", - "inabe", - "ise", - "kameyama", - "kawagoe", - "kiho", - "kisosaki", - "kiwa", - "komono", - "kumano", - "kuwana", - "matsusaka", - "meiwa", - "mihama", - "minamiise", - "misugi", - "miyama", - "nabari", - "shima", - "suzuka", - "tado", - "taiki", - "taki", - "tamaki", - "toba", - "tsu", - "udono", - "ureshino", - "watarai", - "yokkaichi", - "furukawa", - "higashimatsushima", - "ishinomaki", - "iwanuma", - "kakuda", - "kami", - "kawasaki", - "kesennuma", - "marumori", - "matsushima", - "minamisanriku", - "misato", - "murata", - "natori", - "ogawara", - "ohira", - "onagawa", - "osaki", - "rifu", - "semine", - "shibata", - "shichikashuku", - "shikama", - "shiogama", - "shiroishi", - "tagajo", - "taiwa", - "tome", - "tomiya", - "wakuya", - "watari", - "yamamoto", - "zao", - "aya", - "ebino", - "gokase", - "hyuga", - "kadogawa", - "kawaminami", - "kijo", - "kitagawa", - "kitakata", - "kitaura", - "kobayashi", - "kunitomi", - "kushima", - "mimata", - "miyakonojo", - "miyazaki", - "morotsuka", - "nichinan", - "nishimera", - "nobeoka", - "saito", - "shiiba", - "shintomi", - "takaharu", - "takanabe", - "takazaki", - "tsuno", - "achi", - "agematsu", - "anan", - "aoki", - "asahi", - "azumino", - "chikuhoku", - "chikuma", - "chino", - "fujimi", - "hakuba", - "hara", - "hiraya", - "iida", - "iijima", - "iiyama", - "iizuna", - "ikeda", - "ikusaka", - "ina", - "karuizawa", - "kawakami", - "kiso", - "kisofukushima", - "kitaaiki", - "komagane", - "komoro", - "matsukawa", - "matsumoto", - "miasa", - "minamiaiki", - "minamimaki", - "minamiminowa", - "minowa", - "miyada", - "miyota", - "mochizuki", - "nagano", - "nagawa", - "nagiso", - "nakagawa", - "nakano", - "nozawaonsen", - "obuse", - "ogawa", - "okaya", - "omachi", - "omi", - "ookuwa", - "ooshika", - "otaki", - "otari", - "sakae", - "sakaki", - "saku", - "sakuho", - "shimosuwa", - "shinanomachi", - "shiojiri", - "suwa", - "suzaka", - "takagi", - "takamori", - "takayama", - "tateshina", - "tatsuno", - "togakushi", - "togura", - "tomi", - "ueda", - "wada", - "yamagata", - "yamanouchi", - "yasaka", - "yasuoka", - "chijiwa", - "futsu", - "goto", - "hasami", - "hirado", - "iki", - "isahaya", - "kawatana", - "kuchinotsu", - "matsuura", - "nagasaki", - "obama", - "omura", - "oseto", - "saikai", - "sasebo", - "seihi", - "shimabara", - "shinkamigoto", - "togitsu", - "tsushima", - "unzen", - "city", - "ando", - "gose", - "heguri", - "higashiyoshino", - "ikaruga", - "ikoma", - "kamikitayama", - "kanmaki", - "kashiba", - "kashihara", - "katsuragi", - "kawai", - "kawakami", - "kawanishi", - "koryo", - "kurotaki", - "mitsue", - "miyake", - "nara", - "nosegawa", - "oji", - "ouda", - "oyodo", - "sakurai", - "sango", - "shimoichi", - "shimokitayama", - "shinjo", - "soni", - "takatori", - "tawaramoto", - "tenkawa", - "tenri", - "uda", - "yamatokoriyama", - "yamatotakada", - "yamazoe", - "yoshino", - "aga", - "agano", - "gosen", - "itoigawa", - "izumozaki", - "joetsu", - "kamo", - "kariwa", - "kashiwazaki", - "minamiuonuma", - "mitsuke", - "muika", - "murakami", - "myoko", - "nagaoka", - "niigata", - "ojiya", - "omi", - "sado", - "sanjo", - "seiro", - "seirou", - "sekikawa", - "shibata", - "tagami", - "tainai", - "tochio", - "tokamachi", - "tsubame", - "tsunan", - "uonuma", - "yahiko", - "yoita", - "yuzawa", - "beppu", - "bungoono", - "bungotakada", - "hasama", - "hiji", - "himeshima", - "hita", - "kamitsue", - "kokonoe", - "kuju", - "kunisaki", - "kusu", - "oita", - "saiki", - "taketa", - "tsukumi", - "usa", - "usuki", - "yufu", - "akaiwa", - "asakuchi", - "bizen", - "hayashima", - "ibara", - "kagamino", - "kasaoka", - "kibichuo", - "kumenan", - "kurashiki", - "maniwa", - "misaki", - "nagi", - "niimi", - "nishiawakura", - "okayama", - "satosho", - "setouchi", - "shinjo", - "shoo", - "soja", - "takahashi", - "tamano", - "tsuyama", - "wake", - "yakage", - "aguni", - "ginowan", - "ginoza", - "gushikami", - "haebaru", - "higashi", - "hirara", - "iheya", - "ishigaki", - "ishikawa", - "itoman", - "izena", - "kadena", - "kin", - "kitadaito", - "kitanakagusuku", - "kumejima", - "kunigami", - "minamidaito", - "motobu", - "nago", - "naha", - "nakagusuku", - "nakijin", - "nanjo", - "nishihara", - "ogimi", - "okinawa", - "onna", - "shimoji", - "taketomi", - "tarama", - "tokashiki", - "tomigusuku", - "tonaki", - "urasoe", - "uruma", - "yaese", - "yomitan", - "yonabaru", - "yonaguni", - "zamami", - "abeno", - "chihayaakasaka", - "chuo", - "daito", - "fujiidera", - "habikino", - "hannan", - "higashiosaka", - "higashisumiyoshi", - "higashiyodogawa", - "hirakata", - "ibaraki", - "ikeda", - "izumi", - "izumiotsu", - "izumisano", - "kadoma", - "kaizuka", - "kanan", - "kashiwara", - "katano", - "kawachinagano", - "kishiwada", - "kita", - "kumatori", - "matsubara", - "minato", - "minoh", - "misaki", - "moriguchi", - "neyagawa", - "nishi", - "nose", - "osakasayama", - "sakai", - "sayama", - "sennan", - "settsu", - "shijonawate", - "shimamoto", - "suita", - "tadaoka", - "taishi", - "tajiri", - "takaishi", - "takatsuki", - "tondabayashi", - "toyonaka", - "toyono", - "yao", - "ariake", - "arita", - "fukudomi", - "genkai", - "hamatama", - "hizen", - "imari", - "kamimine", - "kanzaki", - "karatsu", - "kashima", - "kitagata", - "kitahata", - "kiyama", - "kouhoku", - "kyuragi", - "nishiarita", - "ogi", - "omachi", - "ouchi", - "saga", - "shiroishi", - "taku", - "tara", - "tosu", - "yoshinogari", - "arakawa", - "asaka", - "chichibu", - "fujimi", - "fujimino", - "fukaya", - "hanno", - "hanyu", - "hasuda", - "hatogaya", - "hatoyama", - "hidaka", - "higashichichibu", - "higashimatsuyama", - "honjo", - "ina", - "iruma", - "iwatsuki", - "kamiizumi", - "kamikawa", - "kamisato", - "kasukabe", - "kawagoe", - "kawaguchi", - "kawajima", - "kazo", - "kitamoto", - "koshigaya", - "kounosu", - "kuki", - "kumagaya", - "matsubushi", - "minano", - "misato", - "miyashiro", - "miyoshi", - "moroyama", - "nagatoro", - "namegawa", - "niiza", - "ogano", - "ogawa", - "ogose", - "okegawa", - "omiya", - "otaki", - "ranzan", - "ryokami", - "saitama", - "sakado", - "satte", - "sayama", - "shiki", - "shiraoka", - "soka", - "sugito", - "toda", - "tokigawa", - "tokorozawa", - "tsurugashima", - "urawa", - "warabi", - "yashio", - "yokoze", - "yono", - "yorii", - "yoshida", - "yoshikawa", - "yoshimi", - "city", - "city", - "aisho", - "gamo", - "higashiomi", - "hikone", - "koka", - "konan", - "kosei", - "koto", - "kusatsu", - "maibara", - "moriyama", - "nagahama", - "nishiazai", - "notogawa", - "omihachiman", - "otsu", - "ritto", - "ryuoh", - "takashima", - "takatsuki", - "torahime", - "toyosato", - "yasu", - "akagi", - "ama", - "gotsu", - "hamada", - "higashiizumo", - "hikawa", - "hikimi", - "izumo", - "kakinoki", - "masuda", - "matsue", - "misato", - "nishinoshima", - "ohda", - "okinoshima", - "okuizumo", - "shimane", - "tamayu", - "tsuwano", - "unnan", - "yakumo", - "yasugi", - "yatsuka", - "arai", - "atami", - "fuji", - "fujieda", - "fujikawa", - "fujinomiya", - "fukuroi", - "gotemba", - "haibara", - "hamamatsu", - "higashiizu", - "ito", - "iwata", - "izu", - "izunokuni", - "kakegawa", - "kannami", - "kawanehon", - "kawazu", - "kikugawa", - "kosai", - "makinohara", - "matsuzaki", - "minamiizu", - "mishima", - "morimachi", - "nishiizu", - "numazu", - "omaezaki", - "shimada", - "shimizu", - "shimoda", - "shizuoka", - "susono", - "yaizu", - "yoshida", - "ashikaga", - "bato", - "haga", - "ichikai", - "iwafune", - "kaminokawa", - "kanuma", - "karasuyama", - "kuroiso", - "mashiko", - "mibu", - "moka", - "motegi", - "nasu", - "nasushiobara", - "nikko", - "nishikata", - "nogi", - "ohira", - "ohtawara", - "oyama", - "sakura", - "sano", - "shimotsuke", - "shioya", - "takanezawa", - "tochigi", - "tsuga", - "ujiie", - "utsunomiya", - "yaita", - "aizumi", - "anan", - "ichiba", - "itano", - "kainan", - "komatsushima", - "matsushige", - "mima", - "minami", - "miyoshi", - "mugi", - "nakagawa", - "naruto", - "sanagochi", - "shishikui", - "tokushima", - "wajiki", - "adachi", - "akiruno", - "akishima", - "aogashima", - "arakawa", - "bunkyo", - "chiyoda", - "chofu", - "chuo", - "edogawa", - "fuchu", - "fussa", - "hachijo", - "hachioji", - "hamura", - "higashikurume", - "higashimurayama", - "higashiyamato", - "hino", - "hinode", - "hinohara", - "inagi", - "itabashi", - "katsushika", - "kita", - "kiyose", - "kodaira", - "koganei", - "kokubunji", - "komae", - "koto", - "kouzushima", - "kunitachi", - "machida", - "meguro", - "minato", - "mitaka", - "mizuho", - "musashimurayama", - "musashino", - "nakano", - "nerima", - "ogasawara", - "okutama", - "ome", - "oshima", - "ota", - "setagaya", - "shibuya", - "shinagawa", - "shinjuku", - "suginami", - "sumida", - "tachikawa", - "taito", - "tama", - "toshima", - "chizu", - "hino", - "kawahara", - "koge", - "kotoura", - "misasa", - "nanbu", - "nichinan", - "sakaiminato", - "tottori", - "wakasa", - "yazu", - "yonago", - "asahi", - "fuchu", - "fukumitsu", - "funahashi", - "himi", - "imizu", - "inami", - "johana", - "kamiichi", - "kurobe", - "nakaniikawa", - "namerikawa", - "nanto", - "nyuzen", - "oyabe", - "taira", - "takaoka", - "tateyama", - "toga", - "tonami", - "toyama", - "unazuki", - "uozu", - "yamada", - "arida", - "aridagawa", - "gobo", - "hashimoto", - "hidaka", - "hirogawa", - "inami", - "iwade", - "kainan", - "kamitonda", - "katsuragi", - "kimino", - "kinokawa", - "kitayama", - "koya", - "koza", - "kozagawa", - "kudoyama", - "kushimoto", - "mihama", - "misato", - "nachikatsuura", - "shingu", - "shirahama", - "taiji", - "tanabe", - "wakayama", - "yuasa", - "yura", - "asahi", - "funagata", - "higashine", - "iide", - "kahoku", - "kaminoyama", - "kaneyama", - "kawanishi", - "mamurogawa", - "mikawa", - "murayama", - "nagai", - "nakayama", - "nanyo", - "nishikawa", - "obanazawa", - "oe", - "oguni", - "ohkura", - "oishida", - "sagae", - "sakata", - "sakegawa", - "shinjo", - "shirataka", - "shonai", - "takahata", - "tendo", - "tozawa", - "tsuruoka", - "yamagata", - "yamanobe", - "yonezawa", - "yuza", - "abu", - "hagi", - "hikari", - "hofu", - "iwakuni", - "kudamatsu", - "mitou", - "nagato", - "oshima", - "shimonoseki", - "shunan", - "tabuse", - "tokuyama", - "toyota", - "ube", - "yuu", - "chuo", - "doshi", - "fuefuki", - "fujikawa", - "fujikawaguchiko", - "fujiyoshida", - "hayakawa", - "hokuto", - "ichikawamisato", - "kai", - "kofu", - "koshu", - "kosuge", - "minami-alps", - "minobu", - "nakamichi", - "nanbu", - "narusawa", - "nirasaki", - "nishikatsura", - "oshino", - "otsuki", - "showa", - "tabayama", - "tsuru", - "uenohara", - "yamanakako", - "yamanashi", - "city", - "co", - "blogspot", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "biz", - "com", - "edu", - "gov", - "info", - "net", - "org", - "ass", - "asso", - "com", - "coop", - "edu", - "gouv", - "gov", - "medecin", - "mil", - "nom", - "notaires", - "org", - "pharmaciens", - "prd", - "presse", - "tm", - "veterinaire", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gov", - "org", - "rep", - "tra", - "ac", - "blogspot", - "busan", - "chungbuk", - "chungnam", - "co", - "daegu", - "daejeon", - "es", - "gangwon", - "go", - "gwangju", - "gyeongbuk", - "gyeonggi", - "gyeongnam", - "hs", - "incheon", - "jeju", - "jeonbuk", - "jeonnam", - "kg", - "mil", - "ms", - "ne", - "or", - "pe", - "re", - "sc", - "seoul", - "ulsan", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "c", - "com", - "edu", - "gov", - "info", - "int", - "net", - "org", - "per", - "com", - "edu", - "gov", - "net", - "org", - "co", - "com", - "edu", - "gov", - "net", - "org", - "blogspot", - "ac", - "assn", - "com", - "edu", - "gov", - "grp", - "hotel", - "int", - "ltd", - "net", - "ngo", - "org", - "sch", - "soc", - "web", - "com", - "edu", - "gov", - "net", - "org", - "co", - "org", - "blogspot", - "gov", - "blogspot", - "asn", - "com", - "conf", - "edu", - "gov", - "id", - "mil", - "net", - "org", - "com", - "edu", - "gov", - "id", - "med", - "net", - "org", - "plc", - "sch", - "ac", - "co", - "gov", - "net", - "org", - "press", - "asso", - "tm", - "blogspot", - "ac", - "co", - "edu", - "gov", - "its", - "net", - "org", - "priv", - "com", - "edu", - "gov", - "mil", - "nom", - "org", - "prd", - "tm", - "blogspot", - "com", - "edu", - "gov", - "inf", - "name", - "net", - "org", - "com", - "edu", - "gouv", - "gov", - "net", - "org", - "presse", - "edu", - "gov", - "nyc", - "org", - "com", - "edu", - "gov", - "net", - "org", - "blogspot", - "gov", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "net", - "org", - "blogspot", - "ac", - "co", - "com", - "gov", - "net", - "or", - "org", - "academy", - "agriculture", - "air", - "airguard", - "alabama", - "alaska", - "amber", - "ambulance", - "american", - "americana", - "americanantiques", - "americanart", - "amsterdam", - "and", - "annefrank", - "anthro", - "anthropology", - "antiques", - "aquarium", - "arboretum", - "archaeological", - "archaeology", - "architecture", - "art", - "artanddesign", - "artcenter", - "artdeco", - "arteducation", - "artgallery", - "arts", - "artsandcrafts", - "asmatart", - "assassination", - "assisi", - "association", - "astronomy", - "atlanta", - "austin", - "australia", - "automotive", - "aviation", - "axis", - "badajoz", - "baghdad", - "bahn", - "bale", - "baltimore", - "barcelona", - "baseball", - "basel", - "baths", - "bauern", - "beauxarts", - "beeldengeluid", - "bellevue", - "bergbau", - "berkeley", - "berlin", - "bern", - "bible", - "bilbao", - "bill", - "birdart", - "birthplace", - "bonn", - "boston", - "botanical", - "botanicalgarden", - "botanicgarden", - "botany", - "brandywinevalley", - "brasil", - "bristol", - "british", - "britishcolumbia", - "broadcast", - "brunel", - "brussel", - "brussels", - "bruxelles", - "building", - "burghof", - "bus", - "bushey", - "cadaques", - "california", - "cambridge", - "can", - "canada", - "capebreton", - "carrier", - "cartoonart", - "casadelamoneda", - "castle", - "castres", - "celtic", - "center", - "chattanooga", - "cheltenham", - "chesapeakebay", - "chicago", - "children", - "childrens", - "childrensgarden", - "chiropractic", - "chocolate", - "christiansburg", - "cincinnati", - "cinema", - "circus", - "civilisation", - "civilization", - "civilwar", - "clinton", - "clock", - "coal", - "coastaldefence", - "cody", - "coldwar", - "collection", - "colonialwilliamsburg", - "coloradoplateau", - "columbia", - "columbus", - "communication", - "communications", - "community", - "computer", - "computerhistory", - "contemporary", - "contemporaryart", - "convent", - "copenhagen", - "corporation", - "corvette", - "costume", - "countryestate", - "county", - "crafts", - "cranbrook", - "creation", - "cultural", - "culturalcenter", - "culture", - "cyber", - "cymru", - "dali", - "dallas", - "database", - "ddr", - "decorativearts", - "delaware", - "delmenhorst", - "denmark", - "depot", - "design", - "detroit", - "dinosaur", - "discovery", - "dolls", - "donostia", - "durham", - "eastafrica", - "eastcoast", - "education", - "educational", - "egyptian", - "eisenbahn", - "elburg", - "elvendrell", - "embroidery", - "encyclopedic", - "england", - "entomology", - "environment", - "environmentalconservation", - "epilepsy", - "essex", - "estate", - "ethnology", - "exeter", - "exhibition", - "family", - "farm", - "farmequipment", - "farmers", - "farmstead", - "field", - "figueres", - "filatelia", - "film", - "fineart", - "finearts", - "finland", - "flanders", - "florida", - "force", - "fortmissoula", - "fortworth", - "foundation", - "francaise", - "frankfurt", - "franziskaner", - "freemasonry", - "freiburg", - "fribourg", - "frog", - "fundacio", - "furniture", - "gallery", - "garden", - "gateway", - "geelvinck", - "gemological", - "geology", - "georgia", - "giessen", - "glas", - "glass", - "gorge", - "grandrapids", - "graz", - "guernsey", - "halloffame", - "hamburg", - "handson", - "harvestcelebration", - "hawaii", - "health", - "heimatunduhren", - "hellas", - "helsinki", - "hembygdsforbund", - "heritage", - "histoire", - "historical", - "historicalsociety", - "historichouses", - "historisch", - "historisches", - "history", - "historyofscience", - "horology", - "house", - "humanities", - "illustration", - "imageandsound", - "indian", - "indiana", - "indianapolis", - "indianmarket", - "intelligence", - "interactive", - "iraq", - "iron", - "isleofman", - "jamison", - "jefferson", - "jerusalem", - "jewelry", - "jewish", - "jewishart", - "jfk", - "journalism", - "judaica", - "judygarland", - "juedisches", - "juif", - "karate", - "karikatur", - "kids", - "koebenhavn", - "koeln", - "kunst", - "kunstsammlung", - "kunstunddesign", - "labor", - "labour", - "lajolla", - "lancashire", - "landes", - "lans", - "larsson", - "lewismiller", - "lincoln", - "linz", - "living", - "livinghistory", - "localhistory", - "london", - "losangeles", - "louvre", - "loyalist", - "lucerne", - "luxembourg", - "luzern", - "mad", - "madrid", - "mallorca", - "manchester", - "mansion", - "mansions", - "manx", - "marburg", - "maritime", - "maritimo", - "maryland", - "marylhurst", - "media", - "medical", - "medizinhistorisches", - "meeres", - "memorial", - "mesaverde", - "michigan", - "midatlantic", - "military", - "mill", - "miners", - "mining", - "minnesota", - "missile", - "missoula", - "modern", - "moma", - "money", - "monmouth", - "monticello", - "montreal", - "moscow", - "motorcycle", - "muenchen", - "muenster", - "mulhouse", - "muncie", - "museet", - "museumcenter", - "museumvereniging", - "music", - "national", - "nationalfirearms", - "nationalheritage", - "nativeamerican", - "naturalhistory", - "naturalhistorymuseum", - "naturalsciences", - "nature", - "naturhistorisches", - "natuurwetenschappen", - "naumburg", - "naval", - "nebraska", - "neues", - "newhampshire", - "newjersey", - "newmexico", - "newport", - "newspaper", - "newyork", - "niepce", - "norfolk", - "north", - "nrw", - "nuernberg", - "nuremberg", - "nyc", - "nyny", - "oceanographic", - "oceanographique", - "omaha", - "online", - "ontario", - "openair", - "oregon", - "oregontrail", - "otago", - "oxford", - "pacific", - "paderborn", - "palace", - "paleo", - "palmsprings", - "panama", - "paris", - "pasadena", - "pharmacy", - "philadelphia", - "philadelphiaarea", - "philately", - "phoenix", - "photography", - "pilots", - "pittsburgh", - "planetarium", - "plantation", - "plants", - "plaza", - "portal", - "portland", - "portlligat", - "posts-and-telecommunications", - "preservation", - "presidio", - "press", - "project", - "public", - "pubol", - "quebec", - "railroad", - "railway", - "research", - "resistance", - "riodejaneiro", - "rochester", - "rockart", - "roma", - "russia", - "saintlouis", - "salem", - "salvadordali", - "salzburg", - "sandiego", - "sanfrancisco", - "santabarbara", - "santacruz", - "santafe", - "saskatchewan", - "satx", - "savannahga", - "schlesisches", - "schoenbrunn", - "schokoladen", - "school", - "schweiz", - "science", - "science-fiction", - "scienceandhistory", - "scienceandindustry", - "sciencecenter", - "sciencecenters", - "sciencehistory", - "sciences", - "sciencesnaturelles", - "scotland", - "seaport", - "settlement", - "settlers", - "shell", - "sherbrooke", - "sibenik", - "silk", - "ski", - "skole", - "society", - "sologne", - "soundandvision", - "southcarolina", - "southwest", - "space", - "spy", - "square", - "stadt", - "stalbans", - "starnberg", - "state", - "stateofdelaware", - "station", - "steam", - "steiermark", - "stjohn", - "stockholm", - "stpetersburg", - "stuttgart", - "suisse", - "surgeonshall", - "surrey", - "svizzera", - "sweden", - "sydney", - "tank", - "tcm", - "technology", - "telekommunikation", - "television", - "texas", - "textile", - "theater", - "time", - "timekeeping", - "topology", - "torino", - "touch", - "town", - "transport", - "tree", - "trolley", - "trust", - "trustee", - "uhren", - "ulm", - "undersea", - "university", - "usa", - "usantiques", - "usarts", - "uscountryestate", - "usculture", - "usdecorativearts", - "usgarden", - "ushistory", - "ushuaia", - "uslivinghistory", - "utah", - "uvic", - "valley", - "vantaa", - "versailles", - "viking", - "village", - "virginia", - "virtual", - "virtuel", - "vlaanderen", - "volkenkunde", - "wales", - "wallonie", - "war", - "washingtondc", - "watch-and-clock", - "watchandclock", - "western", - "westfalen", - "whaling", - "wildlife", - "williamsburg", - "windmill", - "workshop", - "xn--9dbhblg6di", - "xn--comunicaes-v6a2o", - "xn--correios-e-telecomunicaes-ghc29a", - "xn--h1aegh", - "xn--lns-qla", - "york", - "yorkshire", - "yosemite", - "youth", - "zoological", - "zoology", - "aero", - "biz", - "com", - "coop", - "edu", - "gov", - "info", - "int", - "mil", - "museum", - "name", - "net", - "org", - "pro", - "ac", - "biz", - "co", - "com", - "coop", - "edu", - "gov", - "int", - "museum", - "net", - "org", - "blogspot", - "com", - "edu", - "gob", - "net", - "org", - "blogspot", - "com", - "edu", - "gov", - "mil", - "name", - "net", - "org", - "teledata", - "ca", - "cc", - "co", - "com", - "dr", - "in", - "info", - "mobi", - "mx", - "name", - "or", - "org", - "pro", - "school", - "tv", - "us", - "ws", - "her", - "his", - "forgot", - "forgot", - "asso", - "at-band-camp", - "azure-mobile", - "azurewebsites", - "blogdns", - "broke-it", - "buyshouses", - "cdn77", - "cdn77-ssl", - "cloudapp", - "cloudfront", - "dnsalias", - "dnsdojo", - "does-it", - "dontexist", - "dynalias", - "dynathome", - "endofinternet", - "fastly", - "from-az", - "from-co", - "from-la", - "from-ny", - "gb", - "gets-it", - "ham-radio-op", - "homeftp", - "homeip", - "homelinux", - "homeunix", - "hu", - "in", - "in-the-band", - "is-a-chef", - "is-a-geek", - "isa-geek", - "jp", - "kicks-ass", - "office-on-the", - "podzone", - "scrapper-site", - "se", - "selfip", - "sells-it", - "servebbs", - "serveftp", - "thruhere", - "uk", - "webhop", - "za", - "r", - "prod", - "ssl", - "a", - "global", - "a", - "b", - "global", - "arts", - "com", - "firm", - "info", - "net", - "other", - "per", - "rec", - "store", - "web", - "com", - "edu", - "gov", - "mil", - "mobi", - "name", - "net", - "org", - "sch", - "blogspot", - "blogspot", - "bv", - "co", - "aa", - "aarborte", - "aejrie", - "afjord", - "agdenes", - "ah", - "akershus", - "aknoluokta", - "akrehamn", - "al", - "alaheadju", - "alesund", - "algard", - "alstahaug", - "alta", - "alvdal", - "amli", - "amot", - "andasuolo", - "andebu", - "andoy", - "ardal", - "aremark", - "arendal", - "arna", - "aseral", - "asker", - "askim", - "askoy", - "askvoll", - "asnes", - "audnedaln", - "aukra", - "aure", - "aurland", - "aurskog-holand", - "austevoll", - "austrheim", - "averoy", - "badaddja", - "bahcavuotna", - "bahccavuotna", - "baidar", - "bajddar", - "balat", - "balestrand", - "ballangen", - "balsfjord", - "bamble", - "bardu", - "barum", - "batsfjord", - "bearalvahki", - "beardu", - "beiarn", - "berg", - "bergen", - "berlevag", - "bievat", - "bindal", - "birkenes", - "bjarkoy", - "bjerkreim", - "bjugn", - "blogspot", - "bodo", - "bokn", - "bomlo", - "bremanger", - "bronnoy", - "bronnoysund", - "brumunddal", - "bryne", - "bu", - "budejju", - "buskerud", - "bygland", - "bykle", - "cahcesuolo", - "co", - "davvenjarga", - "davvesiida", - "deatnu", - "dep", - "dielddanuorri", - "divtasvuodna", - "divttasvuotna", - "donna", - "dovre", - "drammen", - "drangedal", - "drobak", - "dyroy", - "egersund", - "eid", - "eidfjord", - "eidsberg", - "eidskog", - "eidsvoll", - "eigersund", - "elverum", - "enebakk", - "engerdal", - "etne", - "etnedal", - "evenassi", - "evenes", - "evje-og-hornnes", - "farsund", - "fauske", - "fedje", - "fet", - "fetsund", - "fhs", - "finnoy", - "fitjar", - "fjaler", - "fjell", - "fla", - "flakstad", - "flatanger", - "flekkefjord", - "flesberg", - "flora", - "floro", - "fm", - "folkebibl", - "folldal", - "forde", - "forsand", - "fosnes", - "frana", - "fredrikstad", - "frei", - "frogn", - "froland", - "frosta", - "froya", - "fuoisku", - "fuossko", - "fusa", - "fylkesbibl", - "fyresdal", - "gaivuotna", - "galsa", - "gamvik", - "gangaviika", - "gaular", - "gausdal", - "giehtavuoatna", - "gildeskal", - "giske", - "gjemnes", - "gjerdrum", - "gjerstad", - "gjesdal", - "gjovik", - "gloppen", - "gol", - "gran", - "grane", - "granvin", - "gratangen", - "grimstad", - "grong", - "grue", - "gulen", - "guovdageaidnu", - "ha", - "habmer", - "hadsel", - "hagebostad", - "halden", - "halsa", - "hamar", - "hamaroy", - "hammarfeasta", - "hammerfest", - "hapmir", - "haram", - "hareid", - "harstad", - "hasvik", - "hattfjelldal", - "haugesund", - "hedmark", - "hemne", - "hemnes", - "hemsedal", - "herad", - "hitra", - "hjartdal", - "hjelmeland", - "hl", - "hm", - "hobol", - "hof", - "hokksund", - "hol", - "hole", - "holmestrand", - "holtalen", - "honefoss", - "hordaland", - "hornindal", - "horten", - "hoyanger", - "hoylandet", - "hurdal", - "hurum", - "hvaler", - "hyllestad", - "ibestad", - "idrett", - "inderoy", - "iveland", - "ivgu", - "jan-mayen", - "jessheim", - "jevnaker", - "jolster", - "jondal", - "jorpeland", - "kafjord", - "karasjohka", - "karasjok", - "karlsoy", - "karmoy", - "kautokeino", - "kirkenes", - "klabu", - "klepp", - "kommune", - "kongsberg", - "kongsvinger", - "kopervik", - "kraanghke", - "kragero", - "kristiansand", - "kristiansund", - "krodsherad", - "krokstadelva", - "kvafjord", - "kvalsund", - "kvam", - "kvanangen", - "kvinesdal", - "kvinnherad", - "kviteseid", - "kvitsoy", - "laakesvuemie", - "lahppi", - "langevag", - "lardal", - "larvik", - "lavagis", - "lavangen", - "leangaviika", - "lebesby", - "leikanger", - "leirfjord", - "leirvik", - "leka", - "leksvik", - "lenvik", - "lerdal", - "lesja", - "levanger", - "lier", - "lierne", - "lillehammer", - "lillesand", - "lindas", - "lindesnes", - "loabat", - "lodingen", - "lom", - "loppa", - "lorenskog", - "loten", - "lund", - "lunner", - "luroy", - "luster", - "lyngdal", - "lyngen", - "malatvuopmi", - "malselv", - "malvik", - "mandal", - "marker", - "marnardal", - "masfjorden", - "masoy", - "matta-varjjat", - "meland", - "meldal", - "melhus", - "meloy", - "meraker", - "midsund", - "midtre-gauldal", - "mil", - "mjondalen", - "mo-i-rana", - "moareke", - "modalen", - "modum", - "molde", - "more-og-romsdal", - "mosjoen", - "moskenes", - "moss", - "mosvik", - "mr", - "muosat", - "museum", - "naamesjevuemie", - "namdalseid", - "namsos", - "namsskogan", - "nannestad", - "naroy", - "narviika", - "narvik", - "naustdal", - "navuotna", - "nedre-eiker", - "nesna", - "nesodden", - "nesoddtangen", - "nesseby", - "nesset", - "nissedal", - "nittedal", - "nl", - "nord-aurdal", - "nord-fron", - "nord-odal", - "norddal", - "nordkapp", - "nordland", - "nordre-land", - "nordreisa", - "nore-og-uvdal", - "notodden", - "notteroy", - "nt", - "odda", - "of", - "oksnes", - "ol", - "omasvuotna", - "oppdal", - "oppegard", - "orkanger", - "orkdal", - "orland", - "orskog", - "orsta", - "osen", - "oslo", - "osoyro", - "osteroy", - "ostfold", - "ostre-toten", - "overhalla", - "ovre-eiker", - "oyer", - "oygarden", - "oystre-slidre", - "porsanger", - "porsangu", - "porsgrunn", - "priv", - "rade", - "radoy", - "rahkkeravju", - "raholt", - "raisa", - "rakkestad", - "ralingen", - "rana", - "randaberg", - "rauma", - "rendalen", - "rennebu", - "rennesoy", - "rindal", - "ringebu", - "ringerike", - "ringsaker", - "risor", - "rissa", - "rl", - "roan", - "rodoy", - "rollag", - "romsa", - "romskog", - "roros", - "rost", - "royken", - "royrvik", - "ruovat", - "rygge", - "salangen", - "salat", - "saltdal", - "samnanger", - "sandefjord", - "sandnes", - "sandnessjoen", - "sandoy", - "sarpsborg", - "sauda", - "sauherad", - "sel", - "selbu", - "selje", - "seljord", - "sf", - "siellak", - "sigdal", - "siljan", - "sirdal", - "skanit", - "skanland", - "skaun", - "skedsmo", - "skedsmokorset", - "ski", - "skien", - "skierva", - "skiptvet", - "skjak", - "skjervoy", - "skodje", - "slattum", - "smola", - "snaase", - "snasa", - "snillfjord", - "snoasa", - "sogndal", - "sogne", - "sokndal", - "sola", - "solund", - "somna", - "sondre-land", - "songdalen", - "sor-aurdal", - "sor-fron", - "sor-odal", - "sor-varanger", - "sorfold", - "sorreisa", - "sortland", - "sorum", - "spjelkavik", - "spydeberg", - "st", - "stange", - "stat", - "stathelle", - "stavanger", - "stavern", - "steigen", - "steinkjer", - "stjordal", - "stjordalshalsen", - "stokke", - "stor-elvdal", - "stord", - "stordal", - "storfjord", - "strand", - "stranda", - "stryn", - "sula", - "suldal", - "sund", - "sunndal", - "surnadal", - "svalbard", - "sveio", - "svelvik", - "sykkylven", - "tana", - "tananger", - "telemark", - "time", - "tingvoll", - "tinn", - "tjeldsund", - "tjome", - "tm", - "tokke", - "tolga", - "tonsberg", - "torsken", - "tr", - "trana", - "tranby", - "tranoy", - "troandin", - "trogstad", - "tromsa", - "tromso", - "trondheim", - "trysil", - "tvedestrand", - "tydal", - "tynset", - "tysfjord", - "tysnes", - "tysvar", - "ullensaker", - "ullensvang", - "ulvik", - "unjarga", - "utsira", - "va", - "vaapste", - "vadso", - "vaga", - "vagan", - "vagsoy", - "vaksdal", - "valle", - "vang", - "vanylven", - "vardo", - "varggat", - "varoy", - "vefsn", - "vega", - "vegarshei", - "vennesla", - "verdal", - "verran", - "vestby", - "vestfold", - "vestnes", - "vestre-slidre", - "vestre-toten", - "vestvagoy", - "vevelstad", - "vf", - "vgs", - "vik", - "vikna", - "vindafjord", - "voagat", - "volda", - "voss", - "vossevangen", - "xn--andy-ira", - "xn--asky-ira", - "xn--aurskog-hland-jnb", - "xn--avery-yua", - "xn--bdddj-mrabd", - "xn--bearalvhki-y4a", - "xn--berlevg-jxa", - "xn--bhcavuotna-s4a", - "xn--bhccavuotna-k7a", - "xn--bidr-5nac", - "xn--bievt-0qa", - "xn--bjarky-fya", - "xn--bjddar-pta", - "xn--blt-elab", - "xn--bmlo-gra", - "xn--bod-2na", - "xn--brnny-wuac", - "xn--brnnysund-m8ac", - "xn--brum-voa", - "xn--btsfjord-9za", - "xn--davvenjrga-y4a", - "xn--dnna-gra", - "xn--drbak-wua", - "xn--dyry-ira", - "xn--eveni-0qa01ga", - "xn--finny-yua", - "xn--fjord-lra", - "xn--fl-zia", - "xn--flor-jra", - "xn--frde-gra", - "xn--frna-woa", - "xn--frya-hra", - "xn--ggaviika-8ya47h", - "xn--gildeskl-g0a", - "xn--givuotna-8ya", - "xn--gjvik-wua", - "xn--gls-elac", - "xn--h-2fa", - "xn--hbmer-xqa", - "xn--hcesuolo-7ya35b", - "xn--hgebostad-g3a", - "xn--hmmrfeasta-s4ac", - "xn--hnefoss-q1a", - "xn--hobl-ira", - "xn--holtlen-hxa", - "xn--hpmir-xqa", - "xn--hyanger-q1a", - "xn--hylandet-54a", - "xn--indery-fya", - "xn--jlster-bya", - "xn--jrpeland-54a", - "xn--karmy-yua", - "xn--kfjord-iua", - "xn--klbu-woa", - "xn--koluokta-7ya57h", - "xn--krager-gya", - "xn--kranghke-b0a", - "xn--krdsherad-m8a", - "xn--krehamn-dxa", - "xn--krjohka-hwab49j", - "xn--ksnes-uua", - "xn--kvfjord-nxa", - "xn--kvitsy-fya", - "xn--kvnangen-k0a", - "xn--l-1fa", - "xn--laheadju-7ya", - "xn--langevg-jxa", - "xn--ldingen-q1a", - "xn--leagaviika-52b", - "xn--lesund-hua", - "xn--lgrd-poac", - "xn--lhppi-xqa", - "xn--linds-pra", - "xn--loabt-0qa", - "xn--lrdal-sra", - "xn--lrenskog-54a", - "xn--lt-liac", - "xn--lten-gra", - "xn--lury-ira", - "xn--mely-ira", - "xn--merker-kua", - "xn--mjndalen-64a", - "xn--mlatvuopmi-s4a", - "xn--mli-tla", - "xn--mlselv-iua", - "xn--moreke-jua", - "xn--mosjen-eya", - "xn--mot-tla", - "xn--mre-og-romsdal-qqb", - "xn--msy-ula0h", - "xn--mtta-vrjjat-k7af", - "xn--muost-0qa", - "xn--nmesjevuemie-tcba", - "xn--nry-yla5g", - "xn--nttery-byae", - "xn--nvuotna-hwa", - "xn--oppegrd-ixa", - "xn--ostery-fya", - "xn--osyro-wua", - "xn--porsgu-sta26f", - "xn--rady-ira", - "xn--rdal-poa", - "xn--rde-ula", - "xn--rdy-0nab", - "xn--rennesy-v1a", - "xn--rhkkervju-01af", - "xn--rholt-mra", - "xn--risa-5na", - "xn--risr-ira", - "xn--rland-uua", - "xn--rlingen-mxa", - "xn--rmskog-bya", - "xn--rros-gra", - "xn--rskog-uua", - "xn--rst-0na", - "xn--rsta-fra", - "xn--ryken-vua", - "xn--ryrvik-bya", - "xn--s-1fa", - "xn--sandnessjen-ogb", - "xn--sandy-yua", - "xn--seral-lra", - "xn--sgne-gra", - "xn--skierv-uta", - "xn--skjervy-v1a", - "xn--skjk-soa", - "xn--sknit-yqa", - "xn--sknland-fxa", - "xn--slat-5na", - "xn--slt-elab", - "xn--smla-hra", - "xn--smna-gra", - "xn--snase-nra", - "xn--sndre-land-0cb", - "xn--snes-poa", - "xn--snsa-roa", - "xn--sr-aurdal-l8a", - "xn--sr-fron-q1a", - "xn--sr-odal-q1a", - "xn--sr-varanger-ggb", - "xn--srfold-bya", - "xn--srreisa-q1a", - "xn--srum-gra", - "xn--stfold-9xa", - "xn--stjrdal-s1a", - "xn--stjrdalshalsen-sqb", - "xn--stre-toten-zcb", - "xn--tjme-hra", - "xn--tnsberg-q1a", - "xn--trany-yua", - "xn--trgstad-r1a", - "xn--trna-woa", - "xn--troms-zua", - "xn--tysvr-vra", - "xn--unjrga-rta", - "xn--vads-jra", - "xn--vard-jra", - "xn--vegrshei-c0a", - "xn--vestvgy-ixa6o", - "xn--vg-yiab", - "xn--vgan-qoa", - "xn--vgsy-qoa0j", - "xn--vre-eiker-k8a", - "xn--vrggt-xqad", - "xn--vry-yla5g", - "xn--yer-zna", - "xn--ygarden-p1a", - "xn--ystre-slidre-ujb", - "gs", - "gs", - "nes", - "gs", - "nes", - "gs", - "os", - "valer", - "xn--vler-qoa", - "gs", - "gs", - "os", - "gs", - "heroy", - "sande", - "gs", - "gs", - "bo", - "heroy", - "xn--b-5ga", - "xn--hery-ira", - "gs", - "gs", - "gs", - "gs", - "valer", - "gs", - "gs", - "gs", - "gs", - "bo", - "xn--b-5ga", - "gs", - "gs", - "gs", - "sande", - "gs", - "sande", - "xn--hery-ira", - "xn--vler-qoa", - "biz", - "com", - "edu", - "gov", - "info", - "net", - "org", - "merseine", - "mine", - "shacknet", - "ac", - "co", - "cri", - "geek", - "gen", - "govt", - "health", - "iwi", - "kiwi", - "maori", - "mil", - "net", - "org", - "parliament", - "school", - "xn--mori-qsa", - "blogspot", - "co", - "com", - "edu", - "gov", - "med", - "museum", - "net", - "org", - "pro", - "ae", - "blogdns", - "blogsite", - "boldlygoingnowhere", - "cdn77", - "cdn77-secure", - "dnsalias", - "dnsdojo", - "doesntexist", - "dontexist", - "doomdns", - "duckdns", - "dvrdns", - "dynalias", - "dyndns", - "endofinternet", - "endoftheinternet", - "eu", - "from-me", - "game-host", - "gotdns", - "hk", - "hobby-site", - "homedns", - "homeftp", - "homelinux", - "homeunix", - "is-a-bruinsfan", - "is-a-candidate", - "is-a-celticsfan", - "is-a-chef", - "is-a-geek", - "is-a-knight", - "is-a-linux-user", - "is-a-patsfan", - "is-a-soxfan", - "is-found", - "is-lost", - "is-saved", - "is-very-bad", - "is-very-evil", - "is-very-good", - "is-very-nice", - "is-very-sweet", - "isa-geek", - "kicks-ass", - "misconfused", - "podzone", - "readmyblog", - "selfip", - "sellsyourhome", - "servebbs", - "serveftp", - "servegame", - "stuff-4-sale", - "us", - "webhop", - "za", - "c", - "rsc", - "origin", - "ssl", - "go", - "home", - "al", - "asso", - "at", - "au", - "be", - "bg", - "ca", - "cd", - "ch", - "cn", - "cy", - "cz", - "de", - "dk", - "edu", - "ee", - "es", - "fi", - "fr", - "gr", - "hr", - "hu", - "ie", - "il", - "in", - "int", - "is", - "it", - "jp", - "kr", - "lt", - "lu", - "lv", - "mc", - "me", - "mk", - "mt", - "my", - "net", - "ng", - "nl", - "no", - "nz", - "paris", - "pl", - "pt", - "q-a", - "ro", - "ru", - "se", - "si", - "sk", - "tr", - "uk", - "us", - "abo", - "ac", - "com", - "edu", - "gob", - "ing", - "med", - "net", - "nom", - "org", - "sld", - "blogspot", - "com", - "edu", - "gob", - "mil", - "net", - "nom", - "org", - "com", - "edu", - "org", - "com", - "edu", - "gov", - "i", - "mil", - "net", - "ngo", - "org", - "biz", - "com", - "edu", - "fam", - "gob", - "gok", - "gon", - "gop", - "gos", - "gov", - "info", - "net", - "org", - "web", - "agro", - "aid", - "art", - "atm", - "augustow", - "auto", - "babia-gora", - "bedzin", - "beskidy", - "bialowieza", - "bialystok", - "bielawa", - "bieszczady", - "biz", - "boleslawiec", - "bydgoszcz", - "bytom", - "cieszyn", - "co", - "com", - "czeladz", - "czest", - "dlugoleka", - "edu", - "elblag", - "elk", - "gda", - "gdansk", - "gdynia", - "gliwice", - "glogow", - "gmina", - "gniezno", - "gorlice", - "gov", - "grajewo", - "gsm", - "ilawa", - "info", - "jaworzno", - "jelenia-gora", - "jgora", - "kalisz", - "karpacz", - "kartuzy", - "kaszuby", - "katowice", - "kazimierz-dolny", - "kepno", - "ketrzyn", - "klodzko", - "kobierzyce", - "kolobrzeg", - "konin", - "konskowola", - "krakow", - "kutno", - "lapy", - "lebork", - "legnica", - "lezajsk", - "limanowa", - "lomza", - "lowicz", - "lubin", - "lukow", - "mail", - "malbork", - "malopolska", - "mazowsze", - "mazury", - "med", - "media", - "miasta", - "mielec", - "mielno", - "mil", - "mragowo", - "naklo", - "net", - "nieruchomosci", - "nom", - "nowaruda", - "nysa", - "olawa", - "olecko", - "olkusz", - "olsztyn", - "opoczno", - "opole", - "org", - "ostroda", - "ostroleka", - "ostrowiec", - "ostrowwlkp", - "pc", - "pila", - "pisz", - "podhale", - "podlasie", - "polkowice", - "pomorskie", - "pomorze", - "powiat", - "poznan", - "priv", - "prochowice", - "pruszkow", - "przeworsk", - "pulawy", - "radom", - "rawa-maz", - "realestate", - "rel", - "rybnik", - "rzeszow", - "sanok", - "sejny", - "sex", - "shop", - "sklep", - "skoczow", - "slask", - "slupsk", - "sopot", - "sos", - "sosnowiec", - "stalowa-wola", - "starachowice", - "stargard", - "suwalki", - "swidnica", - "swiebodzin", - "swinoujscie", - "szczecin", - "szczytno", - "szkola", - "targi", - "tarnobrzeg", - "tgory", - "tm", - "tourism", - "travel", - "turek", - "turystyka", - "tychy", - "ustka", - "walbrzych", - "warmia", - "warszawa", - "waw", - "wegrow", - "wielun", - "wlocl", - "wloclawek", - "wodzislaw", - "wolomin", - "wroc", - "wroclaw", - "zachpomor", - "zagan", - "zakopane", - "zarow", - "zgora", - "zgorzelec", - "ap", - "griw", - "ic", - "is", - "kmpsp", - "konsulat", - "kppsp", - "kwp", - "kwpsp", - "mup", - "mw", - "oirm", - "oum", - "pa", - "pinb", - "piw", - "po", - "psp", - "psse", - "pup", - "rzgw", - "sa", - "sdn", - "sko", - "so", - "sr", - "starostwo", - "ug", - "ugim", - "um", - "umig", - "upow", - "uppo", - "us", - "uw", - "uzs", - "wif", - "wiih", - "winb", - "wios", - "witd", - "wiw", - "wsa", - "wskr", - "wuoz", - "wzmiuw", - "zp", - "co", - "edu", - "gov", - "net", - "org", - "ac", - "biz", - "com", - "edu", - "est", - "gov", - "info", - "isla", - "name", - "net", - "org", - "pro", - "prof", - "aca", - "bar", - "cpa", - "eng", - "jur", - "law", - "med", - "com", - "edu", - "gov", - "net", - "org", - "plo", - "sec", - "blogspot", - "com", - "edu", - "gov", - "int", - "net", - "nome", - "org", - "publ", - "belau", - "co", - "ed", - "go", - "ne", - "or", - "com", - "coop", - "edu", - "gov", - "mil", - "net", - "org", - "blogspot", - "com", - "edu", - "gov", - "mil", - "name", - "net", - "org", - "sch", - "asso", - "blogspot", - "com", - "nom", - "arts", - "blogspot", - "com", - "firm", - "info", - "nom", - "nt", - "org", - "rec", - "store", - "tm", - "www", - "ac", - "blogspot", - "co", - "edu", - "gov", - "in", - "org", - "ac", - "adygeya", - "altai", - "amur", - "amursk", - "arkhangelsk", - "astrakhan", - "baikal", - "bashkiria", - "belgorod", - "bir", - "blogspot", - "bryansk", - "buryatia", - "cbg", - "chel", - "chelyabinsk", - "chita", - "chukotka", - "chuvashia", - "cmw", - "com", - "dagestan", - "dudinka", - "e-burg", - "edu", - "fareast", - "gov", - "grozny", - "int", - "irkutsk", - "ivanovo", - "izhevsk", - "jamal", - "jar", - "joshkar-ola", - "k-uralsk", - "kalmykia", - "kaluga", - "kamchatka", - "karelia", - "kazan", - "kchr", - "kemerovo", - "khabarovsk", - "khakassia", - "khv", - "kirov", - "kms", - "koenig", - "komi", - "kostroma", - "krasnoyarsk", - "kuban", - "kurgan", - "kursk", - "kustanai", - "kuzbass", - "lipetsk", - "magadan", - "magnitka", - "mari", - "mari-el", - "marine", - "mil", - "mordovia", - "msk", - "murmansk", - "mytis", - "nakhodka", - "nalchik", - "net", - "nkz", - "nnov", - "norilsk", - "nov", - "novosibirsk", - "nsk", - "omsk", - "orenburg", - "org", - "oryol", - "oskol", - "palana", - "penza", - "perm", - "pp", - "ptz", - "pyatigorsk", - "rnd", - "rubtsovsk", - "ryazan", - "sakhalin", - "samara", - "saratov", - "simbirsk", - "smolensk", - "snz", - "spb", - "stavropol", - "stv", - "surgut", - "syzran", - "tambov", - "tatarstan", - "test", - "tom", - "tomsk", - "tsaritsyn", - "tsk", - "tula", - "tuva", - "tver", - "tyumen", - "udm", - "udmurtia", - "ulan-ude", - "vdonsk", - "vladikavkaz", - "vladimir", - "vladivostok", - "volgograd", - "vologda", - "voronezh", - "vrn", - "vyatka", - "yakutia", - "yamal", - "yaroslavl", - "yekaterinburg", - "yuzhno-sakhalinsk", - "zgrad", - "ac", - "co", - "com", - "edu", - "gouv", - "gov", - "int", - "mil", - "net", - "com", - "edu", - "gov", - "med", - "net", - "org", - "pub", - "sch", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gov", - "net", - "org", - "com", - "edu", - "gov", - "info", - "med", - "net", - "org", - "tv", - "a", - "ac", - "b", - "bd", - "blogspot", - "brand", - "c", - "com", - "d", - "e", - "f", - "fh", - "fhsk", - "fhv", - "g", - "h", - "i", - "k", - "komforb", - "kommunalforbund", - "komvux", - "l", - "lanbib", - "m", - "n", - "naturbruksgymn", - "o", - "org", - "p", - "parti", - "pp", - "press", - "r", - "s", - "t", - "tm", - "u", - "w", - "x", - "y", - "z", - "blogspot", - "com", - "edu", - "gov", - "net", - "org", - "per", - "com", - "gov", - "mil", - "net", - "org", - "platform", - "blogspot", - "blogspot", - "com", - "edu", - "gov", - "net", - "org", - "art", - "blogspot", - "com", - "edu", - "gouv", - "org", - "perso", - "univ", - "com", - "net", - "org", - "co", - "com", - "consulado", - "edu", - "embaixada", - "gov", - "mil", - "net", - "org", - "principe", - "saotome", - "store", - "adygeya", - "arkhangelsk", - "balashov", - "bashkiria", - "bryansk", - "dagestan", - "grozny", - "ivanovo", - "kalmykia", - "kaluga", - "karelia", - "khakassia", - "krasnodar", - "kurgan", - "lenug", - "mordovia", - "msk", - "murmansk", - "nalchik", - "nov", - "obninsk", - "penza", - "pokrovsk", - "sochi", - "spb", - "togliatti", - "troitsk", - "tula", - "tuva", - "vladikavkaz", - "vladimir", - "vologda", - "com", - "edu", - "gob", - "org", - "red", - "gov", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "ac", - "co", - "org", - "blogspot", - "ac", - "co", - "go", - "in", - "mi", - "net", - "or", - "ac", - "biz", - "co", - "com", - "edu", - "go", - "gov", - "int", - "mil", - "name", - "net", - "nic", - "org", - "test", - "web", - "gov", - "co", - "com", - "edu", - "gov", - "mil", - "net", - "nom", - "org", - "agrinet", - "com", - "defense", - "edunet", - "ens", - "fin", - "gov", - "ind", - "info", - "intl", - "mincom", - "nat", - "net", - "org", - "perso", - "rnrt", - "rns", - "rnu", - "tourism", - "turen", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "av", - "bbs", - "bel", - "biz", - "com", - "dr", - "edu", - "gen", - "gov", - "info", - "k12", - "kep", - "mil", - "name", - "nc", - "net", - "org", - "pol", - "tel", - "tv", - "web", - "blogspot", - "gov", - "aero", - "biz", - "co", - "com", - "coop", - "edu", - "gov", - "info", - "int", - "jobs", - "mobi", - "museum", - "name", - "net", - "org", - "pro", - "travel", - "better-than", - "dyndns", - "on-the-web", - "worse-than", - "blogspot", - "club", - "com", - "ebiz", - "edu", - "game", - "gov", - "idv", - "mil", - "net", - "org", - "xn--czrw28b", - "xn--uc0atv", - "xn--zf0ao64a", - "ac", - "co", - "go", - "hotel", - "info", - "me", - "mil", - "mobi", - "ne", - "or", - "sc", - "tv", - "cherkassy", - "cherkasy", - "chernigov", - "chernihiv", - "chernivtsi", - "chernovtsy", - "ck", - "cn", - "co", - "com", - "cr", - "crimea", - "cv", - "dn", - "dnepropetrovsk", - "dnipropetrovsk", - "dominic", - "donetsk", - "dp", - "edu", - "gov", - "if", - "in", - "ivano-frankivsk", - "kh", - "kharkiv", - "kharkov", - "kherson", - "khmelnitskiy", - "khmelnytskyi", - "kiev", - "kirovograd", - "km", - "kr", - "krym", - "ks", - "kv", - "kyiv", - "lg", - "lt", - "lugansk", - "lutsk", - "lv", - "lviv", - "mk", - "mykolaiv", - "net", - "nikolaev", - "od", - "odesa", - "odessa", - "org", - "pl", - "poltava", - "pp", - "rivne", - "rovno", - "rv", - "sb", - "sebastopol", - "sevastopol", - "sm", - "sumy", - "te", - "ternopil", - "uz", - "uzhgorod", - "vinnica", - "vinnytsia", - "vn", - "volyn", - "yalta", - "zaporizhzhe", - "zaporizhzhia", - "zhitomir", - "zhytomyr", - "zp", - "zt", - "ac", - "blogspot", - "co", - "com", - "go", - "ne", - "or", - "org", - "sc", - "ac", - "co", - "gov", - "ltd", - "me", - "net", - "nhs", - "org", - "plc", - "police", - "sch", - "blogspot", - "service", - "ak", - "al", - "ar", - "as", - "az", - "ca", - "co", - "ct", - "dc", - "de", - "dni", - "fed", - "fl", - "ga", - "gu", - "hi", - "ia", - "id", - "il", - "in", - "is-by", - "isa", - "kids", - "ks", - "ky", - "la", - "land-4-sale", - "ma", - "md", - "me", - "mi", - "mn", - "mo", - "ms", - "mt", - "nc", - "nd", - "ne", - "nh", - "nj", - "nm", - "nsn", - "nv", - "ny", - "oh", - "ok", - "or", - "pa", - "pr", - "ri", - "sc", - "sd", - "stuff-4-sale", - "tn", - "tx", - "ut", - "va", - "vi", - "vt", - "wa", - "wi", - "wv", - "wy", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "chtr", - "paroch", - "pvt", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "k12", - "lib", - "cc", - "cc", - "k12", - "lib", - "com", - "edu", - "gub", - "mil", - "net", - "org", - "blogspot", - "co", - "com", - "net", - "org", - "com", - "edu", - "gov", - "mil", - "net", - "org", - "arts", - "co", - "com", - "e12", - "edu", - "firm", - "gob", - "gov", - "info", - "int", - "mil", - "net", - "org", - "rec", - "store", - "tec", - "web", - "co", - "com", - "k12", - "net", - "org", - "ac", - "biz", - "blogspot", - "com", - "edu", - "gov", - "health", - "info", - "int", - "name", - "net", - "org", - "pro", - "com", - "edu", - "net", - "org", - "com", - "dyndns", - "edu", - "gov", - "mypets", - "net", - "org", - "xn--80au", - "xn--90azh", - "xn--c1avg", - "xn--d1at", - "xn--o1ac", - "xn--o1ach", - "ac", - "agrica", - "alt", - "co", - "edu", - "gov", - "grondar", - "law", - "mil", - "net", - "ngo", - "nis", - "nom", - "org", - "school", - "tm", - "web", - "blogspot", -} diff --git a/vendor/golang.org/x/net/trace/events.go b/vendor/golang.org/x/net/trace/events.go deleted file mode 100644 index e66c7e32..00000000 --- a/vendor/golang.org/x/net/trace/events.go +++ /dev/null @@ -1,524 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -import ( - "bytes" - "fmt" - "html/template" - "io" - "log" - "net/http" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - "text/tabwriter" - "time" -) - -var eventsTmpl = template.Must(template.New("events").Funcs(template.FuncMap{ - "elapsed": elapsed, - "trimSpace": strings.TrimSpace, -}).Parse(eventsHTML)) - -const maxEventsPerLog = 100 - -type bucket struct { - MaxErrAge time.Duration - String string -} - -var buckets = []bucket{ - {0, "total"}, - {10 * time.Second, "errs<10s"}, - {1 * time.Minute, "errs<1m"}, - {10 * time.Minute, "errs<10m"}, - {1 * time.Hour, "errs<1h"}, - {10 * time.Hour, "errs<10h"}, - {24000 * time.Hour, "errors"}, -} - -// RenderEvents renders the HTML page typically served at /debug/events. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. -func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) { - now := time.Now() - data := &struct { - Families []string // family names - Buckets []bucket - Counts [][]int // eventLog count per family/bucket - - // Set when a bucket has been selected. - Family string - Bucket int - EventLogs eventLogs - Expanded bool - }{ - Buckets: buckets, - } - - data.Families = make([]string, 0, len(families)) - famMu.RLock() - for name := range families { - data.Families = append(data.Families, name) - } - famMu.RUnlock() - sort.Strings(data.Families) - - // Count the number of eventLogs in each family for each error age. - data.Counts = make([][]int, len(data.Families)) - for i, name := range data.Families { - // TODO(sameer): move this loop under the family lock. - f := getEventFamily(name) - data.Counts[i] = make([]int, len(data.Buckets)) - for j, b := range data.Buckets { - data.Counts[i][j] = f.Count(now, b.MaxErrAge) - } - } - - if req != nil { - var ok bool - data.Family, data.Bucket, ok = parseEventsArgs(req) - if !ok { - // No-op - } else { - data.EventLogs = getEventFamily(data.Family).Copy(now, buckets[data.Bucket].MaxErrAge) - } - if data.EventLogs != nil { - defer data.EventLogs.Free() - sort.Sort(data.EventLogs) - } - if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { - data.Expanded = exp - } - } - - famMu.RLock() - defer famMu.RUnlock() - if err := eventsTmpl.Execute(w, data); err != nil { - log.Printf("net/trace: Failed executing template: %v", err) - } -} - -func parseEventsArgs(req *http.Request) (fam string, b int, ok bool) { - fam, bStr := req.FormValue("fam"), req.FormValue("b") - if fam == "" || bStr == "" { - return "", 0, false - } - b, err := strconv.Atoi(bStr) - if err != nil || b < 0 || b >= len(buckets) { - return "", 0, false - } - return fam, b, true -} - -// An EventLog provides a log of events associated with a specific object. -type EventLog interface { - // Printf formats its arguments with fmt.Sprintf and adds the - // result to the event log. - Printf(format string, a ...interface{}) - - // Errorf is like Printf, but it marks this event as an error. - Errorf(format string, a ...interface{}) - - // Finish declares that this event log is complete. - // The event log should not be used after calling this method. - Finish() -} - -// NewEventLog returns a new EventLog with the specified family name -// and title. -func NewEventLog(family, title string) EventLog { - el := newEventLog() - el.ref() - el.Family, el.Title = family, title - el.Start = time.Now() - el.events = make([]logEntry, 0, maxEventsPerLog) - el.stack = make([]uintptr, 32) - n := runtime.Callers(2, el.stack) - el.stack = el.stack[:n] - - getEventFamily(family).add(el) - return el -} - -func (el *eventLog) Finish() { - getEventFamily(el.Family).remove(el) - el.unref() // matches ref in New -} - -var ( - famMu sync.RWMutex - families = make(map[string]*eventFamily) // family name => family -) - -func getEventFamily(fam string) *eventFamily { - famMu.Lock() - defer famMu.Unlock() - f := families[fam] - if f == nil { - f = &eventFamily{} - families[fam] = f - } - return f -} - -type eventFamily struct { - mu sync.RWMutex - eventLogs eventLogs -} - -func (f *eventFamily) add(el *eventLog) { - f.mu.Lock() - f.eventLogs = append(f.eventLogs, el) - f.mu.Unlock() -} - -func (f *eventFamily) remove(el *eventLog) { - f.mu.Lock() - defer f.mu.Unlock() - for i, el0 := range f.eventLogs { - if el == el0 { - copy(f.eventLogs[i:], f.eventLogs[i+1:]) - f.eventLogs = f.eventLogs[:len(f.eventLogs)-1] - return - } - } -} - -func (f *eventFamily) Count(now time.Time, maxErrAge time.Duration) (n int) { - f.mu.RLock() - defer f.mu.RUnlock() - for _, el := range f.eventLogs { - if el.hasRecentError(now, maxErrAge) { - n++ - } - } - return -} - -func (f *eventFamily) Copy(now time.Time, maxErrAge time.Duration) (els eventLogs) { - f.mu.RLock() - defer f.mu.RUnlock() - els = make(eventLogs, 0, len(f.eventLogs)) - for _, el := range f.eventLogs { - if el.hasRecentError(now, maxErrAge) { - el.ref() - els = append(els, el) - } - } - return -} - -type eventLogs []*eventLog - -// Free calls unref on each element of the list. -func (els eventLogs) Free() { - for _, el := range els { - el.unref() - } -} - -// eventLogs may be sorted in reverse chronological order. -func (els eventLogs) Len() int { return len(els) } -func (els eventLogs) Less(i, j int) bool { return els[i].Start.After(els[j].Start) } -func (els eventLogs) Swap(i, j int) { els[i], els[j] = els[j], els[i] } - -// A logEntry is a timestamped log entry in an event log. -type logEntry struct { - When time.Time - Elapsed time.Duration // since previous event in log - NewDay bool // whether this event is on a different day to the previous event - What string - IsErr bool -} - -// WhenString returns a string representation of the elapsed time of the event. -// It will include the date if midnight was crossed. -func (e logEntry) WhenString() string { - if e.NewDay { - return e.When.Format("2006/01/02 15:04:05.000000") - } - return e.When.Format("15:04:05.000000") -} - -// An eventLog represents an active event log. -type eventLog struct { - // Family is the top-level grouping of event logs to which this belongs. - Family string - - // Title is the title of this event log. - Title string - - // Timing information. - Start time.Time - - // Call stack where this event log was created. - stack []uintptr - - // Append-only sequence of events. - // - // TODO(sameer): change this to a ring buffer to avoid the array copy - // when we hit maxEventsPerLog. - mu sync.RWMutex - events []logEntry - LastErrorTime time.Time - discarded int - - refs int32 // how many buckets this is in -} - -func (el *eventLog) reset() { - // Clear all but the mutex. Mutexes may not be copied, even when unlocked. - el.Family = "" - el.Title = "" - el.Start = time.Time{} - el.stack = nil - el.events = nil - el.LastErrorTime = time.Time{} - el.discarded = 0 - el.refs = 0 -} - -func (el *eventLog) hasRecentError(now time.Time, maxErrAge time.Duration) bool { - if maxErrAge == 0 { - return true - } - el.mu.RLock() - defer el.mu.RUnlock() - return now.Sub(el.LastErrorTime) < maxErrAge -} - -// delta returns the elapsed time since the last event or the log start, -// and whether it spans midnight. -// L >= el.mu -func (el *eventLog) delta(t time.Time) (time.Duration, bool) { - if len(el.events) == 0 { - return t.Sub(el.Start), false - } - prev := el.events[len(el.events)-1].When - return t.Sub(prev), prev.Day() != t.Day() - -} - -func (el *eventLog) Printf(format string, a ...interface{}) { - el.printf(false, format, a...) -} - -func (el *eventLog) Errorf(format string, a ...interface{}) { - el.printf(true, format, a...) -} - -func (el *eventLog) printf(isErr bool, format string, a ...interface{}) { - e := logEntry{When: time.Now(), IsErr: isErr, What: fmt.Sprintf(format, a...)} - el.mu.Lock() - e.Elapsed, e.NewDay = el.delta(e.When) - if len(el.events) < maxEventsPerLog { - el.events = append(el.events, e) - } else { - // Discard the oldest event. - if el.discarded == 0 { - // el.discarded starts at two to count for the event it - // is replacing, plus the next one that we are about to - // drop. - el.discarded = 2 - } else { - el.discarded++ - } - // TODO(sameer): if this causes allocations on a critical path, - // change eventLog.What to be a fmt.Stringer, as in trace.go. - el.events[0].What = fmt.Sprintf("(%d events discarded)", el.discarded) - // The timestamp of the discarded meta-event should be - // the time of the last event it is representing. - el.events[0].When = el.events[1].When - copy(el.events[1:], el.events[2:]) - el.events[maxEventsPerLog-1] = e - } - if e.IsErr { - el.LastErrorTime = e.When - } - el.mu.Unlock() -} - -func (el *eventLog) ref() { - atomic.AddInt32(&el.refs, 1) -} - -func (el *eventLog) unref() { - if atomic.AddInt32(&el.refs, -1) == 0 { - freeEventLog(el) - } -} - -func (el *eventLog) When() string { - return el.Start.Format("2006/01/02 15:04:05.000000") -} - -func (el *eventLog) ElapsedTime() string { - elapsed := time.Since(el.Start) - return fmt.Sprintf("%.6f", elapsed.Seconds()) -} - -func (el *eventLog) Stack() string { - buf := new(bytes.Buffer) - tw := tabwriter.NewWriter(buf, 1, 8, 1, '\t', 0) - printStackRecord(tw, el.stack) - tw.Flush() - return buf.String() -} - -// printStackRecord prints the function + source line information -// for a single stack trace. -// Adapted from runtime/pprof/pprof.go. -func printStackRecord(w io.Writer, stk []uintptr) { - for _, pc := range stk { - f := runtime.FuncForPC(pc) - if f == nil { - continue - } - file, line := f.FileLine(pc) - name := f.Name() - // Hide runtime.goexit and any runtime functions at the beginning. - if strings.HasPrefix(name, "runtime.") { - continue - } - fmt.Fprintf(w, "# %s\t%s:%d\n", name, file, line) - } -} - -func (el *eventLog) Events() []logEntry { - el.mu.RLock() - defer el.mu.RUnlock() - return el.events -} - -// freeEventLogs is a freelist of *eventLog -var freeEventLogs = make(chan *eventLog, 1000) - -// newEventLog returns a event log ready to use. -func newEventLog() *eventLog { - select { - case el := <-freeEventLogs: - return el - default: - return new(eventLog) - } -} - -// freeEventLog adds el to freeEventLogs if there's room. -// This is non-blocking. -func freeEventLog(el *eventLog) { - el.reset() - select { - case freeEventLogs <- el: - default: - } -} - -const eventsHTML = ` -<html> - <head> - <title>events</title> - </head> - <style type="text/css"> - body { - font-family: sans-serif; - } - table#req-status td.family { - padding-right: 2em; - } - table#req-status td.active { - padding-right: 1em; - } - table#req-status td.empty { - color: #aaa; - } - table#reqs { - margin-top: 1em; - } - table#reqs tr.first { - {{if $.Expanded}}font-weight: bold;{{end}} - } - table#reqs td { - font-family: monospace; - } - table#reqs td.when { - text-align: right; - white-space: nowrap; - } - table#reqs td.elapsed { - padding: 0 0.5em; - text-align: right; - white-space: pre; - width: 10em; - } - address { - font-size: smaller; - margin-top: 5em; - } - </style> - <body> - -<h1>/debug/events</h1> - -<table id="req-status"> - {{range $i, $fam := .Families}} - <tr> - <td class="family">{{$fam}}</td> - - {{range $j, $bucket := $.Buckets}} - {{$n := index $.Counts $i $j}} - <td class="{{if not $bucket.MaxErrAge}}active{{end}}{{if not $n}}empty{{end}}"> - {{if $n}}<a href="?fam={{$fam}}&b={{$j}}{{if $.Expanded}}&exp=1{{end}}">{{end}} - [{{$n}} {{$bucket.String}}] - {{if $n}}</a>{{end}} - </td> - {{end}} - - </tr>{{end}} -</table> - -{{if $.EventLogs}} -<hr /> -<h3>Family: {{$.Family}}</h3> - -{{if $.Expanded}}<a href="?fam={{$.Family}}&b={{$.Bucket}}">{{end}} -[Summary]{{if $.Expanded}}</a>{{end}} - -{{if not $.Expanded}}<a href="?fam={{$.Family}}&b={{$.Bucket}}&exp=1">{{end}} -[Expanded]{{if not $.Expanded}}</a>{{end}} - -<table id="reqs"> - <tr><th>When</th><th>Elapsed</th></tr> - {{range $el := $.EventLogs}} - <tr class="first"> - <td class="when">{{$el.When}}</td> - <td class="elapsed">{{$el.ElapsedTime}}</td> - <td>{{$el.Title}} - </tr> - {{if $.Expanded}} - <tr> - <td class="when"></td> - <td class="elapsed"></td> - <td><pre>{{$el.Stack|trimSpace}}</pre></td> - </tr> - {{range $el.Events}} - <tr> - <td class="when">{{.WhenString}}</td> - <td class="elapsed">{{elapsed .Elapsed}}</td> - <td>.{{if .IsErr}}E{{else}}.{{end}}. {{.What}}</td> - </tr> - {{end}} - {{end}} - {{end}} -</table> -{{end}} - </body> -</html> -` diff --git a/vendor/golang.org/x/net/trace/histogram.go b/vendor/golang.org/x/net/trace/histogram.go deleted file mode 100644 index bb42aa53..00000000 --- a/vendor/golang.org/x/net/trace/histogram.go +++ /dev/null @@ -1,356 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -// This file implements histogramming for RPC statistics collection. - -import ( - "bytes" - "fmt" - "html/template" - "log" - "math" - - "golang.org/x/net/internal/timeseries" -) - -const ( - bucketCount = 38 -) - -// histogram keeps counts of values in buckets that are spaced -// out in powers of 2: 0-1, 2-3, 4-7... -// histogram implements timeseries.Observable -type histogram struct { - sum int64 // running total of measurements - sumOfSquares float64 // square of running total - buckets []int64 // bucketed values for histogram - value int // holds a single value as an optimization - valueCount int64 // number of values recorded for single value -} - -// AddMeasurement records a value measurement observation to the histogram. -func (h *histogram) addMeasurement(value int64) { - // TODO: assert invariant - h.sum += value - h.sumOfSquares += float64(value) * float64(value) - - bucketIndex := getBucket(value) - - if h.valueCount == 0 || (h.valueCount > 0 && h.value == bucketIndex) { - h.value = bucketIndex - h.valueCount++ - } else { - h.allocateBuckets() - h.buckets[bucketIndex]++ - } -} - -func (h *histogram) allocateBuckets() { - if h.buckets == nil { - h.buckets = make([]int64, bucketCount) - h.buckets[h.value] = h.valueCount - h.value = 0 - h.valueCount = -1 - } -} - -func log2(i int64) int { - n := 0 - for ; i >= 0x100; i >>= 8 { - n += 8 - } - for ; i > 0; i >>= 1 { - n += 1 - } - return n -} - -func getBucket(i int64) (index int) { - index = log2(i) - 1 - if index < 0 { - index = 0 - } - if index >= bucketCount { - index = bucketCount - 1 - } - return -} - -// Total returns the number of recorded observations. -func (h *histogram) total() (total int64) { - if h.valueCount >= 0 { - total = h.valueCount - } - for _, val := range h.buckets { - total += int64(val) - } - return -} - -// Average returns the average value of recorded observations. -func (h *histogram) average() float64 { - t := h.total() - if t == 0 { - return 0 - } - return float64(h.sum) / float64(t) -} - -// Variance returns the variance of recorded observations. -func (h *histogram) variance() float64 { - t := float64(h.total()) - if t == 0 { - return 0 - } - s := float64(h.sum) / t - return h.sumOfSquares/t - s*s -} - -// StandardDeviation returns the standard deviation of recorded observations. -func (h *histogram) standardDeviation() float64 { - return math.Sqrt(h.variance()) -} - -// PercentileBoundary estimates the value that the given fraction of recorded -// observations are less than. -func (h *histogram) percentileBoundary(percentile float64) int64 { - total := h.total() - - // Corner cases (make sure result is strictly less than Total()) - if total == 0 { - return 0 - } else if total == 1 { - return int64(h.average()) - } - - percentOfTotal := round(float64(total) * percentile) - var runningTotal int64 - - for i := range h.buckets { - value := h.buckets[i] - runningTotal += value - if runningTotal == percentOfTotal { - // We hit an exact bucket boundary. If the next bucket has data, it is a - // good estimate of the value. If the bucket is empty, we interpolate the - // midpoint between the next bucket's boundary and the next non-zero - // bucket. If the remaining buckets are all empty, then we use the - // boundary for the next bucket as the estimate. - j := uint8(i + 1) - min := bucketBoundary(j) - if runningTotal < total { - for h.buckets[j] == 0 { - j++ - } - } - max := bucketBoundary(j) - return min + round(float64(max-min)/2) - } else if runningTotal > percentOfTotal { - // The value is in this bucket. Interpolate the value. - delta := runningTotal - percentOfTotal - percentBucket := float64(value-delta) / float64(value) - bucketMin := bucketBoundary(uint8(i)) - nextBucketMin := bucketBoundary(uint8(i + 1)) - bucketSize := nextBucketMin - bucketMin - return bucketMin + round(percentBucket*float64(bucketSize)) - } - } - return bucketBoundary(bucketCount - 1) -} - -// Median returns the estimated median of the observed values. -func (h *histogram) median() int64 { - return h.percentileBoundary(0.5) -} - -// Add adds other to h. -func (h *histogram) Add(other timeseries.Observable) { - o := other.(*histogram) - if o.valueCount == 0 { - // Other histogram is empty - } else if h.valueCount >= 0 && o.valueCount > 0 && h.value == o.value { - // Both have a single bucketed value, aggregate them - h.valueCount += o.valueCount - } else { - // Two different values necessitate buckets in this histogram - h.allocateBuckets() - if o.valueCount >= 0 { - h.buckets[o.value] += o.valueCount - } else { - for i := range h.buckets { - h.buckets[i] += o.buckets[i] - } - } - } - h.sumOfSquares += o.sumOfSquares - h.sum += o.sum -} - -// Clear resets the histogram to an empty state, removing all observed values. -func (h *histogram) Clear() { - h.buckets = nil - h.value = 0 - h.valueCount = 0 - h.sum = 0 - h.sumOfSquares = 0 -} - -// CopyFrom copies from other, which must be a *histogram, into h. -func (h *histogram) CopyFrom(other timeseries.Observable) { - o := other.(*histogram) - if o.valueCount == -1 { - h.allocateBuckets() - copy(h.buckets, o.buckets) - } - h.sum = o.sum - h.sumOfSquares = o.sumOfSquares - h.value = o.value - h.valueCount = o.valueCount -} - -// Multiply scales the histogram by the specified ratio. -func (h *histogram) Multiply(ratio float64) { - if h.valueCount == -1 { - for i := range h.buckets { - h.buckets[i] = int64(float64(h.buckets[i]) * ratio) - } - } else { - h.valueCount = int64(float64(h.valueCount) * ratio) - } - h.sum = int64(float64(h.sum) * ratio) - h.sumOfSquares = h.sumOfSquares * ratio -} - -// New creates a new histogram. -func (h *histogram) New() timeseries.Observable { - r := new(histogram) - r.Clear() - return r -} - -func (h *histogram) String() string { - return fmt.Sprintf("%d, %f, %d, %d, %v", - h.sum, h.sumOfSquares, h.value, h.valueCount, h.buckets) -} - -// round returns the closest int64 to the argument -func round(in float64) int64 { - return int64(math.Floor(in + 0.5)) -} - -// bucketBoundary returns the first value in the bucket. -func bucketBoundary(bucket uint8) int64 { - if bucket == 0 { - return 0 - } - return 1 << bucket -} - -// bucketData holds data about a specific bucket for use in distTmpl. -type bucketData struct { - Lower, Upper int64 - N int64 - Pct, CumulativePct float64 - GraphWidth int -} - -// data holds data about a Distribution for use in distTmpl. -type data struct { - Buckets []*bucketData - Count, Median int64 - Mean, StandardDeviation float64 -} - -// maxHTMLBarWidth is the maximum width of the HTML bar for visualizing buckets. -const maxHTMLBarWidth = 350.0 - -// newData returns data representing h for use in distTmpl. -func (h *histogram) newData() *data { - // Force the allocation of buckets to simplify the rendering implementation - h.allocateBuckets() - // We scale the bars on the right so that the largest bar is - // maxHTMLBarWidth pixels in width. - maxBucket := int64(0) - for _, n := range h.buckets { - if n > maxBucket { - maxBucket = n - } - } - total := h.total() - barsizeMult := maxHTMLBarWidth / float64(maxBucket) - var pctMult float64 - if total == 0 { - pctMult = 1.0 - } else { - pctMult = 100.0 / float64(total) - } - - buckets := make([]*bucketData, len(h.buckets)) - runningTotal := int64(0) - for i, n := range h.buckets { - if n == 0 { - continue - } - runningTotal += n - var upperBound int64 - if i < bucketCount-1 { - upperBound = bucketBoundary(uint8(i + 1)) - } else { - upperBound = math.MaxInt64 - } - buckets[i] = &bucketData{ - Lower: bucketBoundary(uint8(i)), - Upper: upperBound, - N: n, - Pct: float64(n) * pctMult, - CumulativePct: float64(runningTotal) * pctMult, - GraphWidth: int(float64(n) * barsizeMult), - } - } - return &data{ - Buckets: buckets, - Count: total, - Median: h.median(), - Mean: h.average(), - StandardDeviation: h.standardDeviation(), - } -} - -func (h *histogram) html() template.HTML { - buf := new(bytes.Buffer) - if err := distTmpl.Execute(buf, h.newData()); err != nil { - buf.Reset() - log.Printf("net/trace: couldn't execute template: %v", err) - } - return template.HTML(buf.String()) -} - -// Input: data -var distTmpl = template.Must(template.New("distTmpl").Parse(` -<table> -<tr> - <td style="padding:0.25em">Count: {{.Count}}</td> - <td style="padding:0.25em">Mean: {{printf "%.0f" .Mean}}</td> - <td style="padding:0.25em">StdDev: {{printf "%.0f" .StandardDeviation}}</td> - <td style="padding:0.25em">Median: {{.Median}}</td> -</tr> -</table> -<hr> -<table> -{{range $b := .Buckets}} -{{if $b}} - <tr> - <td style="padding:0 0 0 0.25em">[</td> - <td style="text-align:right;padding:0 0.25em">{{.Lower}},</td> - <td style="text-align:right;padding:0 0.25em">{{.Upper}})</td> - <td style="text-align:right;padding:0 0.25em">{{.N}}</td> - <td style="text-align:right;padding:0 0.25em">{{printf "%#.3f" .Pct}}%</td> - <td style="text-align:right;padding:0 0.25em">{{printf "%#.3f" .CumulativePct}}%</td> - <td><div style="background-color: blue; height: 1em; width: {{.GraphWidth}};"></div></td> - </tr> -{{end}} -{{end}} -</table> -`)) diff --git a/vendor/golang.org/x/net/trace/histogram_test.go b/vendor/golang.org/x/net/trace/histogram_test.go deleted file mode 100644 index d384b933..00000000 --- a/vendor/golang.org/x/net/trace/histogram_test.go +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -import ( - "math" - "testing" -) - -type sumTest struct { - value int64 - sum int64 - sumOfSquares float64 - total int64 -} - -var sumTests = []sumTest{ - {100, 100, 10000, 1}, - {50, 150, 12500, 2}, - {50, 200, 15000, 3}, - {50, 250, 17500, 4}, -} - -type bucketingTest struct { - in int64 - log int - bucket int -} - -var bucketingTests = []bucketingTest{ - {0, 0, 0}, - {1, 1, 0}, - {2, 2, 1}, - {3, 2, 1}, - {4, 3, 2}, - {1000, 10, 9}, - {1023, 10, 9}, - {1024, 11, 10}, - {1000000, 20, 19}, -} - -type multiplyTest struct { - in int64 - ratio float64 - expectedSum int64 - expectedTotal int64 - expectedSumOfSquares float64 -} - -var multiplyTests = []multiplyTest{ - {15, 2.5, 37, 2, 562.5}, - {128, 4.6, 758, 13, 77953.9}, -} - -type percentileTest struct { - fraction float64 - expected int64 -} - -var percentileTests = []percentileTest{ - {0.25, 48}, - {0.5, 96}, - {0.6, 109}, - {0.75, 128}, - {0.90, 205}, - {0.95, 230}, - {0.99, 256}, -} - -func TestSum(t *testing.T) { - var h histogram - - for _, test := range sumTests { - h.addMeasurement(test.value) - sum := h.sum - if sum != test.sum { - t.Errorf("h.Sum = %v WANT: %v", sum, test.sum) - } - - sumOfSquares := h.sumOfSquares - if sumOfSquares != test.sumOfSquares { - t.Errorf("h.SumOfSquares = %v WANT: %v", sumOfSquares, test.sumOfSquares) - } - - total := h.total() - if total != test.total { - t.Errorf("h.Total = %v WANT: %v", total, test.total) - } - } -} - -func TestMultiply(t *testing.T) { - var h histogram - for i, test := range multiplyTests { - h.addMeasurement(test.in) - h.Multiply(test.ratio) - if h.sum != test.expectedSum { - t.Errorf("#%v: h.sum = %v WANT: %v", i, h.sum, test.expectedSum) - } - if h.total() != test.expectedTotal { - t.Errorf("#%v: h.total = %v WANT: %v", i, h.total(), test.expectedTotal) - } - if h.sumOfSquares != test.expectedSumOfSquares { - t.Errorf("#%v: h.SumOfSquares = %v WANT: %v", i, test.expectedSumOfSquares, h.sumOfSquares) - } - } -} - -func TestBucketingFunctions(t *testing.T) { - for _, test := range bucketingTests { - log := log2(test.in) - if log != test.log { - t.Errorf("log2 = %v WANT: %v", log, test.log) - } - - bucket := getBucket(test.in) - if bucket != test.bucket { - t.Errorf("getBucket = %v WANT: %v", bucket, test.bucket) - } - } -} - -func TestAverage(t *testing.T) { - a := new(histogram) - average := a.average() - if average != 0 { - t.Errorf("Average of empty histogram was %v WANT: 0", average) - } - - a.addMeasurement(1) - a.addMeasurement(1) - a.addMeasurement(3) - const expected = float64(5) / float64(3) - average = a.average() - - if !isApproximate(average, expected) { - t.Errorf("Average = %g WANT: %v", average, expected) - } -} - -func TestStandardDeviation(t *testing.T) { - a := new(histogram) - add(a, 10, 1<<4) - add(a, 10, 1<<5) - add(a, 10, 1<<6) - stdDev := a.standardDeviation() - const expected = 19.95 - - if !isApproximate(stdDev, expected) { - t.Errorf("StandardDeviation = %v WANT: %v", stdDev, expected) - } - - // No values - a = new(histogram) - stdDev = a.standardDeviation() - - if !isApproximate(stdDev, 0) { - t.Errorf("StandardDeviation = %v WANT: 0", stdDev) - } - - add(a, 1, 1<<4) - if !isApproximate(stdDev, 0) { - t.Errorf("StandardDeviation = %v WANT: 0", stdDev) - } - - add(a, 10, 1<<4) - if !isApproximate(stdDev, 0) { - t.Errorf("StandardDeviation = %v WANT: 0", stdDev) - } -} - -func TestPercentileBoundary(t *testing.T) { - a := new(histogram) - add(a, 5, 1<<4) - add(a, 10, 1<<6) - add(a, 5, 1<<7) - - for _, test := range percentileTests { - percentile := a.percentileBoundary(test.fraction) - if percentile != test.expected { - t.Errorf("h.PercentileBoundary (fraction=%v) = %v WANT: %v", test.fraction, percentile, test.expected) - } - } -} - -func TestCopyFrom(t *testing.T) { - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - b := histogram{6, 36, []int64{2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39}, 5, -1} - - a.CopyFrom(&b) - - if a.String() != b.String() { - t.Errorf("a.String = %s WANT: %s", a.String(), b.String()) - } -} - -func TestClear(t *testing.T) { - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - - a.Clear() - - expected := "0, 0.000000, 0, 0, []" - if a.String() != expected { - t.Errorf("a.String = %s WANT %s", a.String(), expected) - } -} - -func TestNew(t *testing.T) { - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - b := a.New() - - expected := "0, 0.000000, 0, 0, []" - if b.(*histogram).String() != expected { - t.Errorf("b.(*histogram).String = %s WANT: %s", b.(*histogram).String(), expected) - } -} - -func TestAdd(t *testing.T) { - // The tests here depend on the associativity of addMeasurement and Add. - // Add empty observation - a := histogram{5, 25, []int64{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38}, 4, -1} - b := a.New() - - expected := a.String() - a.Add(b) - if a.String() != expected { - t.Errorf("a.String = %s WANT: %s", a.String(), expected) - } - - // Add same bucketed value, no new buckets - c := new(histogram) - d := new(histogram) - e := new(histogram) - c.addMeasurement(12) - d.addMeasurement(11) - e.addMeasurement(12) - e.addMeasurement(11) - c.Add(d) - if c.String() != e.String() { - t.Errorf("c.String = %s WANT: %s", c.String(), e.String()) - } - - // Add bucketed values - f := new(histogram) - g := new(histogram) - h := new(histogram) - f.addMeasurement(4) - f.addMeasurement(12) - f.addMeasurement(100) - g.addMeasurement(18) - g.addMeasurement(36) - g.addMeasurement(255) - h.addMeasurement(4) - h.addMeasurement(12) - h.addMeasurement(100) - h.addMeasurement(18) - h.addMeasurement(36) - h.addMeasurement(255) - f.Add(g) - if f.String() != h.String() { - t.Errorf("f.String = %q WANT: %q", f.String(), h.String()) - } - - // add buckets to no buckets - i := new(histogram) - j := new(histogram) - k := new(histogram) - j.addMeasurement(18) - j.addMeasurement(36) - j.addMeasurement(255) - k.addMeasurement(18) - k.addMeasurement(36) - k.addMeasurement(255) - i.Add(j) - if i.String() != k.String() { - t.Errorf("i.String = %q WANT: %q", i.String(), k.String()) - } - - // add buckets to single value (no overlap) - l := new(histogram) - m := new(histogram) - n := new(histogram) - l.addMeasurement(0) - m.addMeasurement(18) - m.addMeasurement(36) - m.addMeasurement(255) - n.addMeasurement(0) - n.addMeasurement(18) - n.addMeasurement(36) - n.addMeasurement(255) - l.Add(m) - if l.String() != n.String() { - t.Errorf("l.String = %q WANT: %q", l.String(), n.String()) - } - - // mixed order - o := new(histogram) - p := new(histogram) - o.addMeasurement(0) - o.addMeasurement(2) - o.addMeasurement(0) - p.addMeasurement(0) - p.addMeasurement(0) - p.addMeasurement(2) - if o.String() != p.String() { - t.Errorf("o.String = %q WANT: %q", o.String(), p.String()) - } -} - -func add(h *histogram, times int, val int64) { - for i := 0; i < times; i++ { - h.addMeasurement(val) - } -} - -func isApproximate(x, y float64) bool { - return math.Abs(x-y) < 1e-2 -} diff --git a/vendor/golang.org/x/net/trace/trace.go b/vendor/golang.org/x/net/trace/trace.go deleted file mode 100644 index c44cb7ec..00000000 --- a/vendor/golang.org/x/net/trace/trace.go +++ /dev/null @@ -1,1057 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package trace implements tracing of requests and long-lived objects. -It exports HTTP interfaces on /debug/requests and /debug/events. - -A trace.Trace provides tracing for short-lived objects, usually requests. -A request handler might be implemented like this: - - func fooHandler(w http.ResponseWriter, req *http.Request) { - tr := trace.New("mypkg.Foo", req.URL.Path) - defer tr.Finish() - ... - tr.LazyPrintf("some event %q happened", str) - ... - if err := somethingImportant(); err != nil { - tr.LazyPrintf("somethingImportant failed: %v", err) - tr.SetError() - } - } - -The /debug/requests HTTP endpoint organizes the traces by family, -errors, and duration. It also provides histogram of request duration -for each family. - -A trace.EventLog provides tracing for long-lived objects, such as RPC -connections. - - // A Fetcher fetches URL paths for a single domain. - type Fetcher struct { - domain string - events trace.EventLog - } - - func NewFetcher(domain string) *Fetcher { - return &Fetcher{ - domain, - trace.NewEventLog("mypkg.Fetcher", domain), - } - } - - func (f *Fetcher) Fetch(path string) (string, error) { - resp, err := http.Get("http://" + f.domain + "/" + path) - if err != nil { - f.events.Errorf("Get(%q) = %v", path, err) - return "", err - } - f.events.Printf("Get(%q) = %s", path, resp.Status) - ... - } - - func (f *Fetcher) Close() error { - f.events.Finish() - return nil - } - -The /debug/events HTTP endpoint organizes the event logs by family and -by time since the last error. The expanded view displays recent log -entries and the log's call stack. -*/ -package trace // import "golang.org/x/net/trace" - -import ( - "bytes" - "fmt" - "html/template" - "io" - "log" - "net" - "net/http" - "runtime" - "sort" - "strconv" - "sync" - "sync/atomic" - "time" - - "golang.org/x/net/context" - "golang.org/x/net/internal/timeseries" -) - -// DebugUseAfterFinish controls whether to debug uses of Trace values after finishing. -// FOR DEBUGGING ONLY. This will slow down the program. -var DebugUseAfterFinish = false - -// AuthRequest determines whether a specific request is permitted to load the -// /debug/requests or /debug/events pages. -// -// It returns two bools; the first indicates whether the page may be viewed at all, -// and the second indicates whether sensitive events will be shown. -// -// AuthRequest may be replaced by a program to customise its authorisation requirements. -// -// The default AuthRequest function returns (true, true) iff the request comes from localhost/127.0.0.1/[::1]. -var AuthRequest = func(req *http.Request) (any, sensitive bool) { - host, _, err := net.SplitHostPort(req.RemoteAddr) - switch { - case err != nil: // Badly formed address; fail closed. - return false, false - case host == "localhost" || host == "127.0.0.1" || host == "::1": - return true, true - default: - return false, false - } -} - -func init() { - http.HandleFunc("/debug/requests", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - Render(w, req, sensitive) - }) - http.HandleFunc("/debug/events", func(w http.ResponseWriter, req *http.Request) { - any, sensitive := AuthRequest(req) - if !any { - http.Error(w, "not allowed", http.StatusUnauthorized) - return - } - RenderEvents(w, req, sensitive) - }) -} - -// Render renders the HTML page typically served at /debug/requests. -// It does not do any auth checking; see AuthRequest for the default auth check -// used by the handler registered on http.DefaultServeMux. -// req may be nil. -func Render(w io.Writer, req *http.Request, sensitive bool) { - data := &struct { - Families []string - ActiveTraceCount map[string]int - CompletedTraces map[string]*family - - // Set when a bucket has been selected. - Traces traceList - Family string - Bucket int - Expanded bool - Traced bool - Active bool - ShowSensitive bool // whether to show sensitive events - - Histogram template.HTML - HistogramWindow string // e.g. "last minute", "last hour", "all time" - - // If non-zero, the set of traces is a partial set, - // and this is the total number. - Total int - }{ - CompletedTraces: completedTraces, - } - - data.ShowSensitive = sensitive - if req != nil { - // Allow show_sensitive=0 to force hiding of sensitive data for testing. - // This only goes one way; you can't use show_sensitive=1 to see things. - if req.FormValue("show_sensitive") == "0" { - data.ShowSensitive = false - } - - if exp, err := strconv.ParseBool(req.FormValue("exp")); err == nil { - data.Expanded = exp - } - if exp, err := strconv.ParseBool(req.FormValue("rtraced")); err == nil { - data.Traced = exp - } - } - - completedMu.RLock() - data.Families = make([]string, 0, len(completedTraces)) - for fam, _ := range completedTraces { - data.Families = append(data.Families, fam) - } - completedMu.RUnlock() - sort.Strings(data.Families) - - // We are careful here to minimize the time spent locking activeMu, - // since that lock is required every time an RPC starts and finishes. - data.ActiveTraceCount = make(map[string]int, len(data.Families)) - activeMu.RLock() - for fam, s := range activeTraces { - data.ActiveTraceCount[fam] = s.Len() - } - activeMu.RUnlock() - - var ok bool - data.Family, data.Bucket, ok = parseArgs(req) - switch { - case !ok: - // No-op - case data.Bucket == -1: - data.Active = true - n := data.ActiveTraceCount[data.Family] - data.Traces = getActiveTraces(data.Family) - if len(data.Traces) < n { - data.Total = n - } - case data.Bucket < bucketsPerFamily: - if b := lookupBucket(data.Family, data.Bucket); b != nil { - data.Traces = b.Copy(data.Traced) - } - default: - if f := getFamily(data.Family, false); f != nil { - var obs timeseries.Observable - f.LatencyMu.RLock() - switch o := data.Bucket - bucketsPerFamily; o { - case 0: - obs = f.Latency.Minute() - data.HistogramWindow = "last minute" - case 1: - obs = f.Latency.Hour() - data.HistogramWindow = "last hour" - case 2: - obs = f.Latency.Total() - data.HistogramWindow = "all time" - } - f.LatencyMu.RUnlock() - if obs != nil { - data.Histogram = obs.(*histogram).html() - } - } - } - - if data.Traces != nil { - defer data.Traces.Free() - sort.Sort(data.Traces) - } - - completedMu.RLock() - defer completedMu.RUnlock() - if err := pageTmpl.ExecuteTemplate(w, "Page", data); err != nil { - log.Printf("net/trace: Failed executing template: %v", err) - } -} - -func parseArgs(req *http.Request) (fam string, b int, ok bool) { - if req == nil { - return "", 0, false - } - fam, bStr := req.FormValue("fam"), req.FormValue("b") - if fam == "" || bStr == "" { - return "", 0, false - } - b, err := strconv.Atoi(bStr) - if err != nil || b < -1 { - return "", 0, false - } - - return fam, b, true -} - -func lookupBucket(fam string, b int) *traceBucket { - f := getFamily(fam, false) - if f == nil || b < 0 || b >= len(f.Buckets) { - return nil - } - return f.Buckets[b] -} - -type contextKeyT string - -var contextKey = contextKeyT("golang.org/x/net/trace.Trace") - -// NewContext returns a copy of the parent context -// and associates it with a Trace. -func NewContext(ctx context.Context, tr Trace) context.Context { - return context.WithValue(ctx, contextKey, tr) -} - -// FromContext returns the Trace bound to the context, if any. -func FromContext(ctx context.Context) (tr Trace, ok bool) { - tr, ok = ctx.Value(contextKey).(Trace) - return -} - -// Trace represents an active request. -type Trace interface { - // LazyLog adds x to the event log. It will be evaluated each time the - // /debug/requests page is rendered. Any memory referenced by x will be - // pinned until the trace is finished and later discarded. - LazyLog(x fmt.Stringer, sensitive bool) - - // LazyPrintf evaluates its arguments with fmt.Sprintf each time the - // /debug/requests page is rendered. Any memory referenced by a will be - // pinned until the trace is finished and later discarded. - LazyPrintf(format string, a ...interface{}) - - // SetError declares that this trace resulted in an error. - SetError() - - // SetRecycler sets a recycler for the trace. - // f will be called for each event passed to LazyLog at a time when - // it is no longer required, whether while the trace is still active - // and the event is discarded, or when a completed trace is discarded. - SetRecycler(f func(interface{})) - - // SetTraceInfo sets the trace info for the trace. - // This is currently unused. - SetTraceInfo(traceID, spanID uint64) - - // SetMaxEvents sets the maximum number of events that will be stored - // in the trace. This has no effect if any events have already been - // added to the trace. - SetMaxEvents(m int) - - // Finish declares that this trace is complete. - // The trace should not be used after calling this method. - Finish() -} - -type lazySprintf struct { - format string - a []interface{} -} - -func (l *lazySprintf) String() string { - return fmt.Sprintf(l.format, l.a...) -} - -// New returns a new Trace with the specified family and title. -func New(family, title string) Trace { - tr := newTrace() - tr.ref() - tr.Family, tr.Title = family, title - tr.Start = time.Now() - tr.events = make([]event, 0, maxEventsPerTrace) - - activeMu.RLock() - s := activeTraces[tr.Family] - activeMu.RUnlock() - if s == nil { - activeMu.Lock() - s = activeTraces[tr.Family] // check again - if s == nil { - s = new(traceSet) - activeTraces[tr.Family] = s - } - activeMu.Unlock() - } - s.Add(tr) - - // Trigger allocation of the completed trace structure for this family. - // This will cause the family to be present in the request page during - // the first trace of this family. We don't care about the return value, - // nor is there any need for this to run inline, so we execute it in its - // own goroutine, but only if the family isn't allocated yet. - completedMu.RLock() - if _, ok := completedTraces[tr.Family]; !ok { - go allocFamily(tr.Family) - } - completedMu.RUnlock() - - return tr -} - -func (tr *trace) Finish() { - tr.Elapsed = time.Now().Sub(tr.Start) - if DebugUseAfterFinish { - buf := make([]byte, 4<<10) // 4 KB should be enough - n := runtime.Stack(buf, false) - tr.finishStack = buf[:n] - } - - activeMu.RLock() - m := activeTraces[tr.Family] - activeMu.RUnlock() - m.Remove(tr) - - f := getFamily(tr.Family, true) - for _, b := range f.Buckets { - if b.Cond.match(tr) { - b.Add(tr) - } - } - // Add a sample of elapsed time as microseconds to the family's timeseries - h := new(histogram) - h.addMeasurement(tr.Elapsed.Nanoseconds() / 1e3) - f.LatencyMu.Lock() - f.Latency.Add(h) - f.LatencyMu.Unlock() - - tr.unref() // matches ref in New -} - -const ( - bucketsPerFamily = 9 - tracesPerBucket = 10 - maxActiveTraces = 20 // Maximum number of active traces to show. - maxEventsPerTrace = 10 - numHistogramBuckets = 38 -) - -var ( - // The active traces. - activeMu sync.RWMutex - activeTraces = make(map[string]*traceSet) // family -> traces - - // Families of completed traces. - completedMu sync.RWMutex - completedTraces = make(map[string]*family) // family -> traces -) - -type traceSet struct { - mu sync.RWMutex - m map[*trace]bool - - // We could avoid the entire map scan in FirstN by having a slice of all the traces - // ordered by start time, and an index into that from the trace struct, with a periodic - // repack of the slice after enough traces finish; we could also use a skip list or similar. - // However, that would shift some of the expense from /debug/requests time to RPC time, - // which is probably the wrong trade-off. -} - -func (ts *traceSet) Len() int { - ts.mu.RLock() - defer ts.mu.RUnlock() - return len(ts.m) -} - -func (ts *traceSet) Add(tr *trace) { - ts.mu.Lock() - if ts.m == nil { - ts.m = make(map[*trace]bool) - } - ts.m[tr] = true - ts.mu.Unlock() -} - -func (ts *traceSet) Remove(tr *trace) { - ts.mu.Lock() - delete(ts.m, tr) - ts.mu.Unlock() -} - -// FirstN returns the first n traces ordered by time. -func (ts *traceSet) FirstN(n int) traceList { - ts.mu.RLock() - defer ts.mu.RUnlock() - - if n > len(ts.m) { - n = len(ts.m) - } - trl := make(traceList, 0, n) - - // Fast path for when no selectivity is needed. - if n == len(ts.m) { - for tr := range ts.m { - tr.ref() - trl = append(trl, tr) - } - sort.Sort(trl) - return trl - } - - // Pick the oldest n traces. - // This is inefficient. See the comment in the traceSet struct. - for tr := range ts.m { - // Put the first n traces into trl in the order they occur. - // When we have n, sort trl, and thereafter maintain its order. - if len(trl) < n { - tr.ref() - trl = append(trl, tr) - if len(trl) == n { - // This is guaranteed to happen exactly once during this loop. - sort.Sort(trl) - } - continue - } - if tr.Start.After(trl[n-1].Start) { - continue - } - - // Find where to insert this one. - tr.ref() - i := sort.Search(n, func(i int) bool { return trl[i].Start.After(tr.Start) }) - trl[n-1].unref() - copy(trl[i+1:], trl[i:]) - trl[i] = tr - } - - return trl -} - -func getActiveTraces(fam string) traceList { - activeMu.RLock() - s := activeTraces[fam] - activeMu.RUnlock() - if s == nil { - return nil - } - return s.FirstN(maxActiveTraces) -} - -func getFamily(fam string, allocNew bool) *family { - completedMu.RLock() - f := completedTraces[fam] - completedMu.RUnlock() - if f == nil && allocNew { - f = allocFamily(fam) - } - return f -} - -func allocFamily(fam string) *family { - completedMu.Lock() - defer completedMu.Unlock() - f := completedTraces[fam] - if f == nil { - f = newFamily() - completedTraces[fam] = f - } - return f -} - -// family represents a set of trace buckets and associated latency information. -type family struct { - // traces may occur in multiple buckets. - Buckets [bucketsPerFamily]*traceBucket - - // latency time series - LatencyMu sync.RWMutex - Latency *timeseries.MinuteHourSeries -} - -func newFamily() *family { - return &family{ - Buckets: [bucketsPerFamily]*traceBucket{ - {Cond: minCond(0)}, - {Cond: minCond(50 * time.Millisecond)}, - {Cond: minCond(100 * time.Millisecond)}, - {Cond: minCond(200 * time.Millisecond)}, - {Cond: minCond(500 * time.Millisecond)}, - {Cond: minCond(1 * time.Second)}, - {Cond: minCond(10 * time.Second)}, - {Cond: minCond(100 * time.Second)}, - {Cond: errorCond{}}, - }, - Latency: timeseries.NewMinuteHourSeries(func() timeseries.Observable { return new(histogram) }), - } -} - -// traceBucket represents a size-capped bucket of historic traces, -// along with a condition for a trace to belong to the bucket. -type traceBucket struct { - Cond cond - - // Ring buffer implementation of a fixed-size FIFO queue. - mu sync.RWMutex - buf [tracesPerBucket]*trace - start int // < tracesPerBucket - length int // <= tracesPerBucket -} - -func (b *traceBucket) Add(tr *trace) { - b.mu.Lock() - defer b.mu.Unlock() - - i := b.start + b.length - if i >= tracesPerBucket { - i -= tracesPerBucket - } - if b.length == tracesPerBucket { - // "Remove" an element from the bucket. - b.buf[i].unref() - b.start++ - if b.start == tracesPerBucket { - b.start = 0 - } - } - b.buf[i] = tr - if b.length < tracesPerBucket { - b.length++ - } - tr.ref() -} - -// Copy returns a copy of the traces in the bucket. -// If tracedOnly is true, only the traces with trace information will be returned. -// The logs will be ref'd before returning; the caller should call -// the Free method when it is done with them. -// TODO(dsymonds): keep track of traced requests in separate buckets. -func (b *traceBucket) Copy(tracedOnly bool) traceList { - b.mu.RLock() - defer b.mu.RUnlock() - - trl := make(traceList, 0, b.length) - for i, x := 0, b.start; i < b.length; i++ { - tr := b.buf[x] - if !tracedOnly || tr.spanID != 0 { - tr.ref() - trl = append(trl, tr) - } - x++ - if x == b.length { - x = 0 - } - } - return trl -} - -func (b *traceBucket) Empty() bool { - b.mu.RLock() - defer b.mu.RUnlock() - return b.length == 0 -} - -// cond represents a condition on a trace. -type cond interface { - match(t *trace) bool - String() string -} - -type minCond time.Duration - -func (m minCond) match(t *trace) bool { return t.Elapsed >= time.Duration(m) } -func (m minCond) String() string { return fmt.Sprintf("≥%gs", time.Duration(m).Seconds()) } - -type errorCond struct{} - -func (e errorCond) match(t *trace) bool { return t.IsError } -func (e errorCond) String() string { return "errors" } - -type traceList []*trace - -// Free calls unref on each element of the list. -func (trl traceList) Free() { - for _, t := range trl { - t.unref() - } -} - -// traceList may be sorted in reverse chronological order. -func (trl traceList) Len() int { return len(trl) } -func (trl traceList) Less(i, j int) bool { return trl[i].Start.After(trl[j].Start) } -func (trl traceList) Swap(i, j int) { trl[i], trl[j] = trl[j], trl[i] } - -// An event is a timestamped log entry in a trace. -type event struct { - When time.Time - Elapsed time.Duration // since previous event in trace - NewDay bool // whether this event is on a different day to the previous event - Recyclable bool // whether this event was passed via LazyLog - What interface{} // string or fmt.Stringer - Sensitive bool // whether this event contains sensitive information -} - -// WhenString returns a string representation of the elapsed time of the event. -// It will include the date if midnight was crossed. -func (e event) WhenString() string { - if e.NewDay { - return e.When.Format("2006/01/02 15:04:05.000000") - } - return e.When.Format("15:04:05.000000") -} - -// discarded represents a number of discarded events. -// It is stored as *discarded to make it easier to update in-place. -type discarded int - -func (d *discarded) String() string { - return fmt.Sprintf("(%d events discarded)", int(*d)) -} - -// trace represents an active or complete request, -// either sent or received by this program. -type trace struct { - // Family is the top-level grouping of traces to which this belongs. - Family string - - // Title is the title of this trace. - Title string - - // Timing information. - Start time.Time - Elapsed time.Duration // zero while active - - // Trace information if non-zero. - traceID uint64 - spanID uint64 - - // Whether this trace resulted in an error. - IsError bool - - // Append-only sequence of events (modulo discards). - mu sync.RWMutex - events []event - - refs int32 // how many buckets this is in - recycler func(interface{}) - disc discarded // scratch space to avoid allocation - - finishStack []byte // where finish was called, if DebugUseAfterFinish is set -} - -func (tr *trace) reset() { - // Clear all but the mutex. Mutexes may not be copied, even when unlocked. - tr.Family = "" - tr.Title = "" - tr.Start = time.Time{} - tr.Elapsed = 0 - tr.traceID = 0 - tr.spanID = 0 - tr.IsError = false - tr.events = nil - tr.refs = 0 - tr.recycler = nil - tr.disc = 0 - tr.finishStack = nil -} - -// delta returns the elapsed time since the last event or the trace start, -// and whether it spans midnight. -// L >= tr.mu -func (tr *trace) delta(t time.Time) (time.Duration, bool) { - if len(tr.events) == 0 { - return t.Sub(tr.Start), false - } - prev := tr.events[len(tr.events)-1].When - return t.Sub(prev), prev.Day() != t.Day() -} - -func (tr *trace) addEvent(x interface{}, recyclable, sensitive bool) { - if DebugUseAfterFinish && tr.finishStack != nil { - buf := make([]byte, 4<<10) // 4 KB should be enough - n := runtime.Stack(buf, false) - log.Printf("net/trace: trace used after finish:\nFinished at:\n%s\nUsed at:\n%s", tr.finishStack, buf[:n]) - } - - /* - NOTE TO DEBUGGERS - - If you are here because your program panicked in this code, - it is almost definitely the fault of code using this package, - and very unlikely to be the fault of this code. - - The most likely scenario is that some code elsewhere is using - a requestz.Trace after its Finish method is called. - You can temporarily set the DebugUseAfterFinish var - to help discover where that is; do not leave that var set, - since it makes this package much less efficient. - */ - - e := event{When: time.Now(), What: x, Recyclable: recyclable, Sensitive: sensitive} - tr.mu.Lock() - e.Elapsed, e.NewDay = tr.delta(e.When) - if len(tr.events) < cap(tr.events) { - tr.events = append(tr.events, e) - } else { - // Discard the middle events. - di := int((cap(tr.events) - 1) / 2) - if d, ok := tr.events[di].What.(*discarded); ok { - (*d)++ - } else { - // disc starts at two to count for the event it is replacing, - // plus the next one that we are about to drop. - tr.disc = 2 - if tr.recycler != nil && tr.events[di].Recyclable { - go tr.recycler(tr.events[di].What) - } - tr.events[di].What = &tr.disc - } - // The timestamp of the discarded meta-event should be - // the time of the last event it is representing. - tr.events[di].When = tr.events[di+1].When - - if tr.recycler != nil && tr.events[di+1].Recyclable { - go tr.recycler(tr.events[di+1].What) - } - copy(tr.events[di+1:], tr.events[di+2:]) - tr.events[cap(tr.events)-1] = e - } - tr.mu.Unlock() -} - -func (tr *trace) LazyLog(x fmt.Stringer, sensitive bool) { - tr.addEvent(x, true, sensitive) -} - -func (tr *trace) LazyPrintf(format string, a ...interface{}) { - tr.addEvent(&lazySprintf{format, a}, false, false) -} - -func (tr *trace) SetError() { tr.IsError = true } - -func (tr *trace) SetRecycler(f func(interface{})) { - tr.recycler = f -} - -func (tr *trace) SetTraceInfo(traceID, spanID uint64) { - tr.traceID, tr.spanID = traceID, spanID -} - -func (tr *trace) SetMaxEvents(m int) { - // Always keep at least three events: first, discarded count, last. - if len(tr.events) == 0 && m > 3 { - tr.events = make([]event, 0, m) - } -} - -func (tr *trace) ref() { - atomic.AddInt32(&tr.refs, 1) -} - -func (tr *trace) unref() { - if atomic.AddInt32(&tr.refs, -1) == 0 { - if tr.recycler != nil { - // freeTrace clears tr, so we hold tr.recycler and tr.events here. - go func(f func(interface{}), es []event) { - for _, e := range es { - if e.Recyclable { - f(e.What) - } - } - }(tr.recycler, tr.events) - } - - freeTrace(tr) - } -} - -func (tr *trace) When() string { - return tr.Start.Format("2006/01/02 15:04:05.000000") -} - -func (tr *trace) ElapsedTime() string { - t := tr.Elapsed - if t == 0 { - // Active trace. - t = time.Since(tr.Start) - } - return fmt.Sprintf("%.6f", t.Seconds()) -} - -func (tr *trace) Events() []event { - tr.mu.RLock() - defer tr.mu.RUnlock() - return tr.events -} - -var traceFreeList = make(chan *trace, 1000) // TODO(dsymonds): Use sync.Pool? - -// newTrace returns a trace ready to use. -func newTrace() *trace { - select { - case tr := <-traceFreeList: - return tr - default: - return new(trace) - } -} - -// freeTrace adds tr to traceFreeList if there's room. -// This is non-blocking. -func freeTrace(tr *trace) { - if DebugUseAfterFinish { - return // never reuse - } - tr.reset() - select { - case traceFreeList <- tr: - default: - } -} - -func elapsed(d time.Duration) string { - b := []byte(fmt.Sprintf("%.6f", d.Seconds())) - - // For subsecond durations, blank all zeros before decimal point, - // and all zeros between the decimal point and the first non-zero digit. - if d < time.Second { - dot := bytes.IndexByte(b, '.') - for i := 0; i < dot; i++ { - b[i] = ' ' - } - for i := dot + 1; i < len(b); i++ { - if b[i] == '0' { - b[i] = ' ' - } else { - break - } - } - } - - return string(b) -} - -var pageTmpl = template.Must(template.New("Page").Funcs(template.FuncMap{ - "elapsed": elapsed, - "add": func(a, b int) int { return a + b }, -}).Parse(pageHTML)) - -const pageHTML = ` -{{template "Prolog" .}} -{{template "StatusTable" .}} -{{template "Epilog" .}} - -{{define "Prolog"}} -<html> - <head> - <title>/debug/requests</title> - <style type="text/css"> - body { - font-family: sans-serif; - } - table#tr-status td.family { - padding-right: 2em; - } - table#tr-status td.active { - padding-right: 1em; - } - table#tr-status td.latency-first { - padding-left: 1em; - } - table#tr-status td.empty { - color: #aaa; - } - table#reqs { - margin-top: 1em; - } - table#reqs tr.first { - {{if $.Expanded}}font-weight: bold;{{end}} - } - table#reqs td { - font-family: monospace; - } - table#reqs td.when { - text-align: right; - white-space: nowrap; - } - table#reqs td.elapsed { - padding: 0 0.5em; - text-align: right; - white-space: pre; - width: 10em; - } - address { - font-size: smaller; - margin-top: 5em; - } - </style> - </head> - <body> - -<h1>/debug/requests</h1> -{{end}} {{/* end of Prolog */}} - -{{define "StatusTable"}} -<table id="tr-status"> - {{range $fam := .Families}} - <tr> - <td class="family">{{$fam}}</td> - - {{$n := index $.ActiveTraceCount $fam}} - <td class="active {{if not $n}}empty{{end}}"> - {{if $n}}<a href="?fam={{$fam}}&b=-1{{if $.Expanded}}&exp=1{{end}}">{{end}} - [{{$n}} active] - {{if $n}}</a>{{end}} - </td> - - {{$f := index $.CompletedTraces $fam}} - {{range $i, $b := $f.Buckets}} - {{$empty := $b.Empty}} - <td {{if $empty}}class="empty"{{end}}> - {{if not $empty}}<a href="?fam={{$fam}}&b={{$i}}{{if $.Expanded}}&exp=1{{end}}">{{end}} - [{{.Cond}}] - {{if not $empty}}</a>{{end}} - </td> - {{end}} - - {{$nb := len $f.Buckets}} - <td class="latency-first"> - <a href="?fam={{$fam}}&b={{$nb}}">[minute]</a> - </td> - <td> - <a href="?fam={{$fam}}&b={{add $nb 1}}">[hour]</a> - </td> - <td> - <a href="?fam={{$fam}}&b={{add $nb 2}}">[total]</a> - </td> - - </tr> - {{end}} -</table> -{{end}} {{/* end of StatusTable */}} - -{{define "Epilog"}} -{{if $.Traces}} -<hr /> -<h3>Family: {{$.Family}}</h3> - -{{if or $.Expanded $.Traced}} - <a href="?fam={{$.Family}}&b={{$.Bucket}}">[Normal/Summary]</a> -{{else}} - [Normal/Summary] -{{end}} - -{{if or (not $.Expanded) $.Traced}} - <a href="?fam={{$.Family}}&b={{$.Bucket}}&exp=1">[Normal/Expanded]</a> -{{else}} - [Normal/Expanded] -{{end}} - -{{if not $.Active}} - {{if or $.Expanded (not $.Traced)}} - <a href="?fam={{$.Family}}&b={{$.Bucket}}&rtraced=1">[Traced/Summary]</a> - {{else}} - [Traced/Summary] - {{end}} - {{if or (not $.Expanded) (not $.Traced)}} - <a href="?fam={{$.Family}}&b={{$.Bucket}}&exp=1&rtraced=1">[Traced/Expanded]</a> - {{else}} - [Traced/Expanded] - {{end}} -{{end}} - -{{if $.Total}} -<p><em>Showing <b>{{len $.Traces}}</b> of <b>{{$.Total}}</b> traces.</em></p> -{{end}} - -<table id="reqs"> - <caption> - {{if $.Active}}Active{{else}}Completed{{end}} Requests - </caption> - <tr><th>When</th><th>Elapsed&nbsp;(s)</th></tr> - {{range $tr := $.Traces}} - <tr class="first"> - <td class="when">{{$tr.When}}</td> - <td class="elapsed">{{$tr.ElapsedTime}}</td> - <td>{{$tr.Title}}</td> - {{/* TODO: include traceID/spanID */}} - </tr> - {{if $.Expanded}} - {{range $tr.Events}} - <tr> - <td class="when">{{.WhenString}}</td> - <td class="elapsed">{{elapsed .Elapsed}}</td> - <td>{{if or $.ShowSensitive (not .Sensitive)}}... {{.What}}{{else}}<em>[redacted]</em>{{end}}</td> - </tr> - {{end}} - {{end}} - {{end}} -</table> -{{end}} {{/* if $.Traces */}} - -{{if $.Histogram}} -<h4>Latency (&micro;s) of {{$.Family}} over {{$.HistogramWindow}}</h4> -{{$.Histogram}} -{{end}} {{/* if $.Histogram */}} - - </body> -</html> -{{end}} {{/* end of Epilog */}} -` diff --git a/vendor/golang.org/x/net/trace/trace_test.go b/vendor/golang.org/x/net/trace/trace_test.go deleted file mode 100644 index c2f5fcba..00000000 --- a/vendor/golang.org/x/net/trace/trace_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package trace - -import ( - "reflect" - "testing" -) - -type s struct{} - -func (s) String() string { return "lazy string" } - -// TestReset checks whether all the fields are zeroed after reset. -func TestReset(t *testing.T) { - tr := New("foo", "bar") - tr.LazyLog(s{}, false) - tr.LazyPrintf("%d", 1) - tr.SetRecycler(func(_ interface{}) {}) - tr.SetTraceInfo(3, 4) - tr.SetMaxEvents(100) - tr.SetError() - tr.Finish() - - tr.(*trace).reset() - - if !reflect.DeepEqual(tr, new(trace)) { - t.Errorf("reset didn't clear all fields: %+v", tr) - } -} - -// TestResetLog checks whether all the fields are zeroed after reset. -func TestResetLog(t *testing.T) { - el := NewEventLog("foo", "bar") - el.Printf("message") - el.Errorf("error") - el.Finish() - - el.(*eventLog).reset() - - if !reflect.DeepEqual(el, new(eventLog)) { - t.Errorf("reset didn't clear all fields: %+v", el) - } -} diff --git a/vendor/golang.org/x/net/webdav/file.go b/vendor/golang.org/x/net/webdav/file.go deleted file mode 100644 index 9ba1ca16..00000000 --- a/vendor/golang.org/x/net/webdav/file.go +++ /dev/null @@ -1,795 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "io" - "net/http" - "os" - "path" - "path/filepath" - "strings" - "sync" - "time" - - "golang.org/x/net/webdav/internal/xml" -) - -// slashClean is equivalent to but slightly more efficient than -// path.Clean("/" + name). -func slashClean(name string) string { - if name == "" || name[0] != '/' { - name = "/" + name - } - return path.Clean(name) -} - -// A FileSystem implements access to a collection of named files. The elements -// in a file path are separated by slash ('/', U+002F) characters, regardless -// of host operating system convention. -// -// Each method has the same semantics as the os package's function of the same -// name. -// -// Note that the os.Rename documentation says that "OS-specific restrictions -// might apply". In particular, whether or not renaming a file or directory -// overwriting another existing file or directory is an error is OS-dependent. -type FileSystem interface { - Mkdir(name string, perm os.FileMode) error - OpenFile(name string, flag int, perm os.FileMode) (File, error) - RemoveAll(name string) error - Rename(oldName, newName string) error - Stat(name string) (os.FileInfo, error) -} - -// A File is returned by a FileSystem's OpenFile method and can be served by a -// Handler. -// -// A File may optionally implement the DeadPropsHolder interface, if it can -// load and save dead properties. -type File interface { - http.File - io.Writer -} - -// A Dir implements FileSystem using the native file system restricted to a -// specific directory tree. -// -// While the FileSystem.OpenFile method takes '/'-separated paths, a Dir's -// string value is a filename on the native file system, not a URL, so it is -// separated by filepath.Separator, which isn't necessarily '/'. -// -// An empty Dir is treated as ".". -type Dir string - -func (d Dir) resolve(name string) string { - // This implementation is based on Dir.Open's code in the standard net/http package. - if filepath.Separator != '/' && strings.IndexRune(name, filepath.Separator) >= 0 || - strings.Contains(name, "\x00") { - return "" - } - dir := string(d) - if dir == "" { - dir = "." - } - return filepath.Join(dir, filepath.FromSlash(slashClean(name))) -} - -func (d Dir) Mkdir(name string, perm os.FileMode) error { - if name = d.resolve(name); name == "" { - return os.ErrNotExist - } - return os.Mkdir(name, perm) -} - -func (d Dir) OpenFile(name string, flag int, perm os.FileMode) (File, error) { - if name = d.resolve(name); name == "" { - return nil, os.ErrNotExist - } - f, err := os.OpenFile(name, flag, perm) - if err != nil { - return nil, err - } - return f, nil -} - -func (d Dir) RemoveAll(name string) error { - if name = d.resolve(name); name == "" { - return os.ErrNotExist - } - if name == filepath.Clean(string(d)) { - // Prohibit removing the virtual root directory. - return os.ErrInvalid - } - return os.RemoveAll(name) -} - -func (d Dir) Rename(oldName, newName string) error { - if oldName = d.resolve(oldName); oldName == "" { - return os.ErrNotExist - } - if newName = d.resolve(newName); newName == "" { - return os.ErrNotExist - } - if root := filepath.Clean(string(d)); root == oldName || root == newName { - // Prohibit renaming from or to the virtual root directory. - return os.ErrInvalid - } - return os.Rename(oldName, newName) -} - -func (d Dir) Stat(name string) (os.FileInfo, error) { - if name = d.resolve(name); name == "" { - return nil, os.ErrNotExist - } - return os.Stat(name) -} - -// NewMemFS returns a new in-memory FileSystem implementation. -func NewMemFS() FileSystem { - return &memFS{ - root: memFSNode{ - children: make(map[string]*memFSNode), - mode: 0660 | os.ModeDir, - modTime: time.Now(), - }, - } -} - -// A memFS implements FileSystem, storing all metadata and actual file data -// in-memory. No limits on filesystem size are used, so it is not recommended -// this be used where the clients are untrusted. -// -// Concurrent access is permitted. The tree structure is protected by a mutex, -// and each node's contents and metadata are protected by a per-node mutex. -// -// TODO: Enforce file permissions. -type memFS struct { - mu sync.Mutex - root memFSNode -} - -// TODO: clean up and rationalize the walk/find code. - -// walk walks the directory tree for the fullname, calling f at each step. If f -// returns an error, the walk will be aborted and return that same error. -// -// dir is the directory at that step, frag is the name fragment, and final is -// whether it is the final step. For example, walking "/foo/bar/x" will result -// in 3 calls to f: -// - "/", "foo", false -// - "/foo/", "bar", false -// - "/foo/bar/", "x", true -// The frag argument will be empty only if dir is the root node and the walk -// ends at that root node. -func (fs *memFS) walk(op, fullname string, f func(dir *memFSNode, frag string, final bool) error) error { - original := fullname - fullname = slashClean(fullname) - - // Strip any leading "/"s to make fullname a relative path, as the walk - // starts at fs.root. - if fullname[0] == '/' { - fullname = fullname[1:] - } - dir := &fs.root - - for { - frag, remaining := fullname, "" - i := strings.IndexRune(fullname, '/') - final := i < 0 - if !final { - frag, remaining = fullname[:i], fullname[i+1:] - } - if frag == "" && dir != &fs.root { - panic("webdav: empty path fragment for a clean path") - } - if err := f(dir, frag, final); err != nil { - return &os.PathError{ - Op: op, - Path: original, - Err: err, - } - } - if final { - break - } - child := dir.children[frag] - if child == nil { - return &os.PathError{ - Op: op, - Path: original, - Err: os.ErrNotExist, - } - } - if !child.mode.IsDir() { - return &os.PathError{ - Op: op, - Path: original, - Err: os.ErrInvalid, - } - } - dir, fullname = child, remaining - } - return nil -} - -// find returns the parent of the named node and the relative name fragment -// from the parent to the child. For example, if finding "/foo/bar/baz" then -// parent will be the node for "/foo/bar" and frag will be "baz". -// -// If the fullname names the root node, then parent, frag and err will be zero. -// -// find returns an error if the parent does not already exist or the parent -// isn't a directory, but it will not return an error per se if the child does -// not already exist. The error returned is either nil or an *os.PathError -// whose Op is op. -func (fs *memFS) find(op, fullname string) (parent *memFSNode, frag string, err error) { - err = fs.walk(op, fullname, func(parent0 *memFSNode, frag0 string, final bool) error { - if !final { - return nil - } - if frag0 != "" { - parent, frag = parent0, frag0 - } - return nil - }) - return parent, frag, err -} - -func (fs *memFS) Mkdir(name string, perm os.FileMode) error { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("mkdir", name) - if err != nil { - return err - } - if dir == nil { - // We can't create the root. - return os.ErrInvalid - } - if _, ok := dir.children[frag]; ok { - return os.ErrExist - } - dir.children[frag] = &memFSNode{ - children: make(map[string]*memFSNode), - mode: perm.Perm() | os.ModeDir, - modTime: time.Now(), - } - return nil -} - -func (fs *memFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("open", name) - if err != nil { - return nil, err - } - var n *memFSNode - if dir == nil { - // We're opening the root. - if flag&(os.O_WRONLY|os.O_RDWR) != 0 { - return nil, os.ErrPermission - } - n, frag = &fs.root, "/" - - } else { - n = dir.children[frag] - if flag&(os.O_SYNC|os.O_APPEND) != 0 { - // memFile doesn't support these flags yet. - return nil, os.ErrInvalid - } - if flag&os.O_CREATE != 0 { - if flag&os.O_EXCL != 0 && n != nil { - return nil, os.ErrExist - } - if n == nil { - n = &memFSNode{ - mode: perm.Perm(), - } - dir.children[frag] = n - } - } - if n == nil { - return nil, os.ErrNotExist - } - if flag&(os.O_WRONLY|os.O_RDWR) != 0 && flag&os.O_TRUNC != 0 { - n.mu.Lock() - n.data = nil - n.mu.Unlock() - } - } - - children := make([]os.FileInfo, 0, len(n.children)) - for cName, c := range n.children { - children = append(children, c.stat(cName)) - } - return &memFile{ - n: n, - nameSnapshot: frag, - childrenSnapshot: children, - }, nil -} - -func (fs *memFS) RemoveAll(name string) error { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("remove", name) - if err != nil { - return err - } - if dir == nil { - // We can't remove the root. - return os.ErrInvalid - } - delete(dir.children, frag) - return nil -} - -func (fs *memFS) Rename(oldName, newName string) error { - fs.mu.Lock() - defer fs.mu.Unlock() - - oldName = slashClean(oldName) - newName = slashClean(newName) - if oldName == newName { - return nil - } - if strings.HasPrefix(newName, oldName+"/") { - // We can't rename oldName to be a sub-directory of itself. - return os.ErrInvalid - } - - oDir, oFrag, err := fs.find("rename", oldName) - if err != nil { - return err - } - if oDir == nil { - // We can't rename from the root. - return os.ErrInvalid - } - - nDir, nFrag, err := fs.find("rename", newName) - if err != nil { - return err - } - if nDir == nil { - // We can't rename to the root. - return os.ErrInvalid - } - - oNode, ok := oDir.children[oFrag] - if !ok { - return os.ErrNotExist - } - if oNode.children != nil { - if nNode, ok := nDir.children[nFrag]; ok { - if nNode.children == nil { - return errNotADirectory - } - if len(nNode.children) != 0 { - return errDirectoryNotEmpty - } - } - } - delete(oDir.children, oFrag) - nDir.children[nFrag] = oNode - return nil -} - -func (fs *memFS) Stat(name string) (os.FileInfo, error) { - fs.mu.Lock() - defer fs.mu.Unlock() - - dir, frag, err := fs.find("stat", name) - if err != nil { - return nil, err - } - if dir == nil { - // We're stat'ting the root. - return fs.root.stat("/"), nil - } - if n, ok := dir.children[frag]; ok { - return n.stat(path.Base(name)), nil - } - return nil, os.ErrNotExist -} - -// A memFSNode represents a single entry in the in-memory filesystem and also -// implements os.FileInfo. -type memFSNode struct { - // children is protected by memFS.mu. - children map[string]*memFSNode - - mu sync.Mutex - data []byte - mode os.FileMode - modTime time.Time - deadProps map[xml.Name]Property -} - -func (n *memFSNode) stat(name string) *memFileInfo { - n.mu.Lock() - defer n.mu.Unlock() - return &memFileInfo{ - name: name, - size: int64(len(n.data)), - mode: n.mode, - modTime: n.modTime, - } -} - -func (n *memFSNode) DeadProps() (map[xml.Name]Property, error) { - n.mu.Lock() - defer n.mu.Unlock() - if len(n.deadProps) == 0 { - return nil, nil - } - ret := make(map[xml.Name]Property, len(n.deadProps)) - for k, v := range n.deadProps { - ret[k] = v - } - return ret, nil -} - -func (n *memFSNode) Patch(patches []Proppatch) ([]Propstat, error) { - n.mu.Lock() - defer n.mu.Unlock() - pstat := Propstat{Status: http.StatusOK} - for _, patch := range patches { - for _, p := range patch.Props { - pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) - if patch.Remove { - delete(n.deadProps, p.XMLName) - continue - } - if n.deadProps == nil { - n.deadProps = map[xml.Name]Property{} - } - n.deadProps[p.XMLName] = p - } - } - return []Propstat{pstat}, nil -} - -type memFileInfo struct { - name string - size int64 - mode os.FileMode - modTime time.Time -} - -func (f *memFileInfo) Name() string { return f.name } -func (f *memFileInfo) Size() int64 { return f.size } -func (f *memFileInfo) Mode() os.FileMode { return f.mode } -func (f *memFileInfo) ModTime() time.Time { return f.modTime } -func (f *memFileInfo) IsDir() bool { return f.mode.IsDir() } -func (f *memFileInfo) Sys() interface{} { return nil } - -// A memFile is a File implementation for a memFSNode. It is a per-file (not -// per-node) read/write position, and a snapshot of the memFS' tree structure -// (a node's name and children) for that node. -type memFile struct { - n *memFSNode - nameSnapshot string - childrenSnapshot []os.FileInfo - // pos is protected by n.mu. - pos int -} - -// A *memFile implements the optional DeadPropsHolder interface. -var _ DeadPropsHolder = (*memFile)(nil) - -func (f *memFile) DeadProps() (map[xml.Name]Property, error) { return f.n.DeadProps() } -func (f *memFile) Patch(patches []Proppatch) ([]Propstat, error) { return f.n.Patch(patches) } - -func (f *memFile) Close() error { - return nil -} - -func (f *memFile) Read(p []byte) (int, error) { - f.n.mu.Lock() - defer f.n.mu.Unlock() - if f.n.mode.IsDir() { - return 0, os.ErrInvalid - } - if f.pos >= len(f.n.data) { - return 0, io.EOF - } - n := copy(p, f.n.data[f.pos:]) - f.pos += n - return n, nil -} - -func (f *memFile) Readdir(count int) ([]os.FileInfo, error) { - f.n.mu.Lock() - defer f.n.mu.Unlock() - if !f.n.mode.IsDir() { - return nil, os.ErrInvalid - } - old := f.pos - if old >= len(f.childrenSnapshot) { - // The os.File Readdir docs say that at the end of a directory, - // the error is io.EOF if count > 0 and nil if count <= 0. - if count > 0 { - return nil, io.EOF - } - return nil, nil - } - if count > 0 { - f.pos += count - if f.pos > len(f.childrenSnapshot) { - f.pos = len(f.childrenSnapshot) - } - } else { - f.pos = len(f.childrenSnapshot) - old = 0 - } - return f.childrenSnapshot[old:f.pos], nil -} - -func (f *memFile) Seek(offset int64, whence int) (int64, error) { - f.n.mu.Lock() - defer f.n.mu.Unlock() - npos := f.pos - // TODO: How to handle offsets greater than the size of system int? - switch whence { - case os.SEEK_SET: - npos = int(offset) - case os.SEEK_CUR: - npos += int(offset) - case os.SEEK_END: - npos = len(f.n.data) + int(offset) - default: - npos = -1 - } - if npos < 0 { - return 0, os.ErrInvalid - } - f.pos = npos - return int64(f.pos), nil -} - -func (f *memFile) Stat() (os.FileInfo, error) { - return f.n.stat(f.nameSnapshot), nil -} - -func (f *memFile) Write(p []byte) (int, error) { - lenp := len(p) - f.n.mu.Lock() - defer f.n.mu.Unlock() - - if f.n.mode.IsDir() { - return 0, os.ErrInvalid - } - if f.pos < len(f.n.data) { - n := copy(f.n.data[f.pos:], p) - f.pos += n - p = p[n:] - } else if f.pos > len(f.n.data) { - // Write permits the creation of holes, if we've seek'ed past the - // existing end of file. - if f.pos <= cap(f.n.data) { - oldLen := len(f.n.data) - f.n.data = f.n.data[:f.pos] - hole := f.n.data[oldLen:] - for i := range hole { - hole[i] = 0 - } - } else { - d := make([]byte, f.pos, f.pos+len(p)) - copy(d, f.n.data) - f.n.data = d - } - } - - if len(p) > 0 { - // We should only get here if f.pos == len(f.n.data). - f.n.data = append(f.n.data, p...) - f.pos = len(f.n.data) - } - f.n.modTime = time.Now() - return lenp, nil -} - -// moveFiles moves files and/or directories from src to dst. -// -// See section 9.9.4 for when various HTTP status codes apply. -func moveFiles(fs FileSystem, src, dst string, overwrite bool) (status int, err error) { - created := false - if _, err := fs.Stat(dst); err != nil { - if !os.IsNotExist(err) { - return http.StatusForbidden, err - } - created = true - } else if overwrite { - // Section 9.9.3 says that "If a resource exists at the destination - // and the Overwrite header is "T", then prior to performing the move, - // the server must perform a DELETE with "Depth: infinity" on the - // destination resource. - if err := fs.RemoveAll(dst); err != nil { - return http.StatusForbidden, err - } - } else { - return http.StatusPreconditionFailed, os.ErrExist - } - if err := fs.Rename(src, dst); err != nil { - return http.StatusForbidden, err - } - if created { - return http.StatusCreated, nil - } - return http.StatusNoContent, nil -} - -func copyProps(dst, src File) error { - d, ok := dst.(DeadPropsHolder) - if !ok { - return nil - } - s, ok := src.(DeadPropsHolder) - if !ok { - return nil - } - m, err := s.DeadProps() - if err != nil { - return err - } - props := make([]Property, 0, len(m)) - for _, prop := range m { - props = append(props, prop) - } - _, err = d.Patch([]Proppatch{{Props: props}}) - return err -} - -// copyFiles copies files and/or directories from src to dst. -// -// See section 9.8.5 for when various HTTP status codes apply. -func copyFiles(fs FileSystem, src, dst string, overwrite bool, depth int, recursion int) (status int, err error) { - if recursion == 1000 { - return http.StatusInternalServerError, errRecursionTooDeep - } - recursion++ - - // TODO: section 9.8.3 says that "Note that an infinite-depth COPY of /A/ - // into /A/B/ could lead to infinite recursion if not handled correctly." - - srcFile, err := fs.OpenFile(src, os.O_RDONLY, 0) - if err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusInternalServerError, err - } - defer srcFile.Close() - srcStat, err := srcFile.Stat() - if err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusInternalServerError, err - } - srcPerm := srcStat.Mode() & os.ModePerm - - created := false - if _, err := fs.Stat(dst); err != nil { - if os.IsNotExist(err) { - created = true - } else { - return http.StatusForbidden, err - } - } else { - if !overwrite { - return http.StatusPreconditionFailed, os.ErrExist - } - if err := fs.RemoveAll(dst); err != nil && !os.IsNotExist(err) { - return http.StatusForbidden, err - } - } - - if srcStat.IsDir() { - if err := fs.Mkdir(dst, srcPerm); err != nil { - return http.StatusForbidden, err - } - if depth == infiniteDepth { - children, err := srcFile.Readdir(-1) - if err != nil { - return http.StatusForbidden, err - } - for _, c := range children { - name := c.Name() - s := path.Join(src, name) - d := path.Join(dst, name) - cStatus, cErr := copyFiles(fs, s, d, overwrite, depth, recursion) - if cErr != nil { - // TODO: MultiStatus. - return cStatus, cErr - } - } - } - - } else { - dstFile, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, srcPerm) - if err != nil { - if os.IsNotExist(err) { - return http.StatusConflict, err - } - return http.StatusForbidden, err - - } - _, copyErr := io.Copy(dstFile, srcFile) - propsErr := copyProps(dstFile, srcFile) - closeErr := dstFile.Close() - if copyErr != nil { - return http.StatusInternalServerError, copyErr - } - if propsErr != nil { - return http.StatusInternalServerError, propsErr - } - if closeErr != nil { - return http.StatusInternalServerError, closeErr - } - } - - if created { - return http.StatusCreated, nil - } - return http.StatusNoContent, nil -} - -// walkFS traverses filesystem fs starting at name up to depth levels. -// -// Allowed values for depth are 0, 1 or infiniteDepth. For each visited node, -// walkFS calls walkFn. If a visited file system node is a directory and -// walkFn returns filepath.SkipDir, walkFS will skip traversal of this node. -func walkFS(fs FileSystem, depth int, name string, info os.FileInfo, walkFn filepath.WalkFunc) error { - // This implementation is based on Walk's code in the standard path/filepath package. - err := walkFn(name, info, nil) - if err != nil { - if info.IsDir() && err == filepath.SkipDir { - return nil - } - return err - } - if !info.IsDir() || depth == 0 { - return nil - } - if depth == 1 { - depth = 0 - } - - // Read directory names. - f, err := fs.OpenFile(name, os.O_RDONLY, 0) - if err != nil { - return walkFn(name, info, err) - } - fileInfos, err := f.Readdir(0) - f.Close() - if err != nil { - return walkFn(name, info, err) - } - - for _, fileInfo := range fileInfos { - filename := path.Join(name, fileInfo.Name()) - fileInfo, err := fs.Stat(filename) - if err != nil { - if err := walkFn(filename, fileInfo, err); err != nil && err != filepath.SkipDir { - return err - } - } else { - err = walkFS(fs, depth, filename, fileInfo, walkFn) - if err != nil { - if !fileInfo.IsDir() || err != filepath.SkipDir { - return err - } - } - } - } - return nil -} diff --git a/vendor/golang.org/x/net/webdav/file_test.go b/vendor/golang.org/x/net/webdav/file_test.go deleted file mode 100644 index 99547e16..00000000 --- a/vendor/golang.org/x/net/webdav/file_test.go +++ /dev/null @@ -1,1167 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "path" - "path/filepath" - "reflect" - "runtime" - "sort" - "strconv" - "strings" - "testing" - - "golang.org/x/net/webdav/internal/xml" -) - -func TestSlashClean(t *testing.T) { - testCases := []string{ - "", - ".", - "/", - "/./", - "//", - "//.", - "//a", - "/a", - "/a/b/c", - "/a//b/./../c/d/", - "a", - "a/b/c", - } - for _, tc := range testCases { - got := slashClean(tc) - want := path.Clean("/" + tc) - if got != want { - t.Errorf("tc=%q: got %q, want %q", tc, got, want) - } - } -} - -func TestDirResolve(t *testing.T) { - testCases := []struct { - dir, name, want string - }{ - {"/", "", "/"}, - {"/", "/", "/"}, - {"/", ".", "/"}, - {"/", "./a", "/a"}, - {"/", "..", "/"}, - {"/", "..", "/"}, - {"/", "../", "/"}, - {"/", "../.", "/"}, - {"/", "../a", "/a"}, - {"/", "../..", "/"}, - {"/", "../bar/a", "/bar/a"}, - {"/", "../baz/a", "/baz/a"}, - {"/", "...", "/..."}, - {"/", ".../a", "/.../a"}, - {"/", ".../..", "/"}, - {"/", "a", "/a"}, - {"/", "a/./b", "/a/b"}, - {"/", "a/../../b", "/b"}, - {"/", "a/../b", "/b"}, - {"/", "a/b", "/a/b"}, - {"/", "a/b/c/../../d", "/a/d"}, - {"/", "a/b/c/../../../d", "/d"}, - {"/", "a/b/c/../../../../d", "/d"}, - {"/", "a/b/c/d", "/a/b/c/d"}, - - {"/foo/bar", "", "/foo/bar"}, - {"/foo/bar", "/", "/foo/bar"}, - {"/foo/bar", ".", "/foo/bar"}, - {"/foo/bar", "./a", "/foo/bar/a"}, - {"/foo/bar", "..", "/foo/bar"}, - {"/foo/bar", "../", "/foo/bar"}, - {"/foo/bar", "../.", "/foo/bar"}, - {"/foo/bar", "../a", "/foo/bar/a"}, - {"/foo/bar", "../..", "/foo/bar"}, - {"/foo/bar", "../bar/a", "/foo/bar/bar/a"}, - {"/foo/bar", "../baz/a", "/foo/bar/baz/a"}, - {"/foo/bar", "...", "/foo/bar/..."}, - {"/foo/bar", ".../a", "/foo/bar/.../a"}, - {"/foo/bar", ".../..", "/foo/bar"}, - {"/foo/bar", "a", "/foo/bar/a"}, - {"/foo/bar", "a/./b", "/foo/bar/a/b"}, - {"/foo/bar", "a/../../b", "/foo/bar/b"}, - {"/foo/bar", "a/../b", "/foo/bar/b"}, - {"/foo/bar", "a/b", "/foo/bar/a/b"}, - {"/foo/bar", "a/b/c/../../d", "/foo/bar/a/d"}, - {"/foo/bar", "a/b/c/../../../d", "/foo/bar/d"}, - {"/foo/bar", "a/b/c/../../../../d", "/foo/bar/d"}, - {"/foo/bar", "a/b/c/d", "/foo/bar/a/b/c/d"}, - - {"/foo/bar/", "", "/foo/bar"}, - {"/foo/bar/", "/", "/foo/bar"}, - {"/foo/bar/", ".", "/foo/bar"}, - {"/foo/bar/", "./a", "/foo/bar/a"}, - {"/foo/bar/", "..", "/foo/bar"}, - - {"/foo//bar///", "", "/foo/bar"}, - {"/foo//bar///", "/", "/foo/bar"}, - {"/foo//bar///", ".", "/foo/bar"}, - {"/foo//bar///", "./a", "/foo/bar/a"}, - {"/foo//bar///", "..", "/foo/bar"}, - - {"/x/y/z", "ab/c\x00d/ef", ""}, - - {".", "", "."}, - {".", "/", "."}, - {".", ".", "."}, - {".", "./a", "a"}, - {".", "..", "."}, - {".", "..", "."}, - {".", "../", "."}, - {".", "../.", "."}, - {".", "../a", "a"}, - {".", "../..", "."}, - {".", "../bar/a", "bar/a"}, - {".", "../baz/a", "baz/a"}, - {".", "...", "..."}, - {".", ".../a", ".../a"}, - {".", ".../..", "."}, - {".", "a", "a"}, - {".", "a/./b", "a/b"}, - {".", "a/../../b", "b"}, - {".", "a/../b", "b"}, - {".", "a/b", "a/b"}, - {".", "a/b/c/../../d", "a/d"}, - {".", "a/b/c/../../../d", "d"}, - {".", "a/b/c/../../../../d", "d"}, - {".", "a/b/c/d", "a/b/c/d"}, - - {"", "", "."}, - {"", "/", "."}, - {"", ".", "."}, - {"", "./a", "a"}, - {"", "..", "."}, - } - - for _, tc := range testCases { - d := Dir(filepath.FromSlash(tc.dir)) - if got := filepath.ToSlash(d.resolve(tc.name)); got != tc.want { - t.Errorf("dir=%q, name=%q: got %q, want %q", tc.dir, tc.name, got, tc.want) - } - } -} - -func TestWalk(t *testing.T) { - type walkStep struct { - name, frag string - final bool - } - - testCases := []struct { - dir string - want []walkStep - }{ - {"", []walkStep{ - {"", "", true}, - }}, - {"/", []walkStep{ - {"", "", true}, - }}, - {"/a", []walkStep{ - {"", "a", true}, - }}, - {"/a/", []walkStep{ - {"", "a", true}, - }}, - {"/a/b", []walkStep{ - {"", "a", false}, - {"a", "b", true}, - }}, - {"/a/b/", []walkStep{ - {"", "a", false}, - {"a", "b", true}, - }}, - {"/a/b/c", []walkStep{ - {"", "a", false}, - {"a", "b", false}, - {"b", "c", true}, - }}, - // The following test case is the one mentioned explicitly - // in the method description. - {"/foo/bar/x", []walkStep{ - {"", "foo", false}, - {"foo", "bar", false}, - {"bar", "x", true}, - }}, - } - - for _, tc := range testCases { - fs := NewMemFS().(*memFS) - - parts := strings.Split(tc.dir, "/") - for p := 2; p < len(parts); p++ { - d := strings.Join(parts[:p], "/") - if err := fs.Mkdir(d, 0666); err != nil { - t.Errorf("tc.dir=%q: mkdir: %q: %v", tc.dir, d, err) - } - } - - i, prevFrag := 0, "" - err := fs.walk("test", tc.dir, func(dir *memFSNode, frag string, final bool) error { - got := walkStep{ - name: prevFrag, - frag: frag, - final: final, - } - want := tc.want[i] - - if got != want { - return fmt.Errorf("got %+v, want %+v", got, want) - } - i, prevFrag = i+1, frag - return nil - }) - if err != nil { - t.Errorf("tc.dir=%q: %v", tc.dir, err) - } - } -} - -// find appends to ss the names of the named file and its children. It is -// analogous to the Unix find command. -// -// The returned strings are not guaranteed to be in any particular order. -func find(ss []string, fs FileSystem, name string) ([]string, error) { - stat, err := fs.Stat(name) - if err != nil { - return nil, err - } - ss = append(ss, name) - if stat.IsDir() { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer f.Close() - children, err := f.Readdir(-1) - if err != nil { - return nil, err - } - for _, c := range children { - ss, err = find(ss, fs, path.Join(name, c.Name())) - if err != nil { - return nil, err - } - } - } - return ss, nil -} - -func testFS(t *testing.T, fs FileSystem) { - errStr := func(err error) string { - switch { - case os.IsExist(err): - return "errExist" - case os.IsNotExist(err): - return "errNotExist" - case err != nil: - return "err" - } - return "ok" - } - - // The non-"find" non-"stat" test cases should change the file system state. The - // indentation of the "find"s and "stat"s helps distinguish such test cases. - testCases := []string{ - " stat / want dir", - " stat /a want errNotExist", - " stat /d want errNotExist", - " stat /d/e want errNotExist", - "create /a A want ok", - " stat /a want 1", - "create /d/e EEE want errNotExist", - "mk-dir /a want errExist", - "mk-dir /d/m want errNotExist", - "mk-dir /d want ok", - " stat /d want dir", - "create /d/e EEE want ok", - " stat /d/e want 3", - " find / /a /d /d/e", - "create /d/f FFFF want ok", - "create /d/g GGGGGGG want ok", - "mk-dir /d/m want ok", - "mk-dir /d/m want errExist", - "create /d/m/p PPPPP want ok", - " stat /d/e want 3", - " stat /d/f want 4", - " stat /d/g want 7", - " stat /d/h want errNotExist", - " stat /d/m want dir", - " stat /d/m/p want 5", - " find / /a /d /d/e /d/f /d/g /d/m /d/m/p", - "rm-all /d want ok", - " stat /a want 1", - " stat /d want errNotExist", - " stat /d/e want errNotExist", - " stat /d/f want errNotExist", - " stat /d/g want errNotExist", - " stat /d/m want errNotExist", - " stat /d/m/p want errNotExist", - " find / /a", - "mk-dir /d/m want errNotExist", - "mk-dir /d want ok", - "create /d/f FFFF want ok", - "rm-all /d/f want ok", - "mk-dir /d/m want ok", - "rm-all /z want ok", - "rm-all / want err", - "create /b BB want ok", - " stat / want dir", - " stat /a want 1", - " stat /b want 2", - " stat /c want errNotExist", - " stat /d want dir", - " stat /d/m want dir", - " find / /a /b /d /d/m", - "move__ o=F /b /c want ok", - " stat /b want errNotExist", - " stat /c want 2", - " stat /d/m want dir", - " stat /d/n want errNotExist", - " find / /a /c /d /d/m", - "move__ o=F /d/m /d/n want ok", - "create /d/n/q QQQQ want ok", - " stat /d/m want errNotExist", - " stat /d/n want dir", - " stat /d/n/q want 4", - "move__ o=F /d /d/n/z want err", - "move__ o=T /c /d/n/q want ok", - " stat /c want errNotExist", - " stat /d/n/q want 2", - " find / /a /d /d/n /d/n/q", - "create /d/n/r RRRRR want ok", - "mk-dir /u want ok", - "mk-dir /u/v want ok", - "move__ o=F /d/n /u want errExist", - "create /t TTTTTT want ok", - "move__ o=F /d/n /t want errExist", - "rm-all /t want ok", - "move__ o=F /d/n /t want ok", - " stat /d want dir", - " stat /d/n want errNotExist", - " stat /d/n/r want errNotExist", - " stat /t want dir", - " stat /t/q want 2", - " stat /t/r want 5", - " find / /a /d /t /t/q /t/r /u /u/v", - "move__ o=F /t / want errExist", - "move__ o=T /t /u/v want ok", - " stat /u/v/r want 5", - "move__ o=F / /z want err", - " find / /a /d /u /u/v /u/v/q /u/v/r", - " stat /a want 1", - " stat /b want errNotExist", - " stat /c want errNotExist", - " stat /u/v/r want 5", - "copy__ o=F d=0 /a /b want ok", - "copy__ o=T d=0 /a /c want ok", - " stat /a want 1", - " stat /b want 1", - " stat /c want 1", - " stat /u/v/r want 5", - "copy__ o=F d=0 /u/v/r /b want errExist", - " stat /b want 1", - "copy__ o=T d=0 /u/v/r /b want ok", - " stat /a want 1", - " stat /b want 5", - " stat /u/v/r want 5", - "rm-all /a want ok", - "rm-all /b want ok", - "mk-dir /u/v/w want ok", - "create /u/v/w/s SSSSSSSS want ok", - " stat /d want dir", - " stat /d/x want errNotExist", - " stat /d/y want errNotExist", - " stat /u/v/r want 5", - " stat /u/v/w/s want 8", - " find / /c /d /u /u/v /u/v/q /u/v/r /u/v/w /u/v/w/s", - "copy__ o=T d=0 /u/v /d/x want ok", - "copy__ o=T d=∞ /u/v /d/y want ok", - "rm-all /u want ok", - " stat /d/x want dir", - " stat /d/x/q want errNotExist", - " stat /d/x/r want errNotExist", - " stat /d/x/w want errNotExist", - " stat /d/x/w/s want errNotExist", - " stat /d/y want dir", - " stat /d/y/q want 2", - " stat /d/y/r want 5", - " stat /d/y/w want dir", - " stat /d/y/w/s want 8", - " stat /u want errNotExist", - " find / /c /d /d/x /d/y /d/y/q /d/y/r /d/y/w /d/y/w/s", - "copy__ o=F d=∞ /d/y /d/x want errExist", - } - - for i, tc := range testCases { - tc = strings.TrimSpace(tc) - j := strings.IndexByte(tc, ' ') - if j < 0 { - t.Fatalf("test case #%d %q: invalid command", i, tc) - } - op, arg := tc[:j], tc[j+1:] - - switch op { - default: - t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) - - case "create": - parts := strings.Split(arg, " ") - if len(parts) != 4 || parts[2] != "want" { - t.Fatalf("test case #%d %q: invalid write", i, tc) - } - f, opErr := fs.OpenFile(parts[0], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if got := errStr(opErr); got != parts[3] { - t.Fatalf("test case #%d %q: OpenFile: got %q (%v), want %q", i, tc, got, opErr, parts[3]) - } - if f != nil { - if _, err := f.Write([]byte(parts[1])); err != nil { - t.Fatalf("test case #%d %q: Write: %v", i, tc, err) - } - if err := f.Close(); err != nil { - t.Fatalf("test case #%d %q: Close: %v", i, tc, err) - } - } - - case "find": - got, err := find(nil, fs, "/") - if err != nil { - t.Fatalf("test case #%d %q: find: %v", i, tc, err) - } - sort.Strings(got) - want := strings.Split(arg, " ") - if !reflect.DeepEqual(got, want) { - t.Fatalf("test case #%d %q:\ngot %s\nwant %s", i, tc, got, want) - } - - case "copy__", "mk-dir", "move__", "rm-all", "stat": - nParts := 3 - switch op { - case "copy__": - nParts = 6 - case "move__": - nParts = 5 - } - parts := strings.Split(arg, " ") - if len(parts) != nParts { - t.Fatalf("test case #%d %q: invalid %s", i, tc, op) - } - - got, opErr := "", error(nil) - switch op { - case "copy__": - depth := 0 - if parts[1] == "d=∞" { - depth = infiniteDepth - } - _, opErr = copyFiles(fs, parts[2], parts[3], parts[0] == "o=T", depth, 0) - case "mk-dir": - opErr = fs.Mkdir(parts[0], 0777) - case "move__": - _, opErr = moveFiles(fs, parts[1], parts[2], parts[0] == "o=T") - case "rm-all": - opErr = fs.RemoveAll(parts[0]) - case "stat": - var stat os.FileInfo - fileName := parts[0] - if stat, opErr = fs.Stat(fileName); opErr == nil { - if stat.IsDir() { - got = "dir" - } else { - got = strconv.Itoa(int(stat.Size())) - } - - if fileName == "/" { - // For a Dir FileSystem, the virtual file system root maps to a - // real file system name like "/tmp/webdav-test012345", which does - // not end with "/". We skip such cases. - } else if statName := stat.Name(); path.Base(fileName) != statName { - t.Fatalf("test case #%d %q: file name %q inconsistent with stat name %q", - i, tc, fileName, statName) - } - } - } - if got == "" { - got = errStr(opErr) - } - - if parts[len(parts)-2] != "want" { - t.Fatalf("test case #%d %q: invalid %s", i, tc, op) - } - if want := parts[len(parts)-1]; got != want { - t.Fatalf("test case #%d %q: got %q (%v), want %q", i, tc, got, opErr, want) - } - } - } -} - -func TestDir(t *testing.T) { - switch runtime.GOOS { - case "nacl": - t.Skip("see golang.org/issue/12004") - case "plan9": - t.Skip("see golang.org/issue/11453") - } - - td, err := ioutil.TempDir("", "webdav-test") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(td) - testFS(t, Dir(td)) -} - -func TestMemFS(t *testing.T) { - testFS(t, NewMemFS()) -} - -func TestMemFSRoot(t *testing.T) { - fs := NewMemFS() - for i := 0; i < 5; i++ { - stat, err := fs.Stat("/") - if err != nil { - t.Fatalf("i=%d: Stat: %v", i, err) - } - if !stat.IsDir() { - t.Fatalf("i=%d: Stat.IsDir is false, want true", i) - } - - f, err := fs.OpenFile("/", os.O_RDONLY, 0) - if err != nil { - t.Fatalf("i=%d: OpenFile: %v", i, err) - } - defer f.Close() - children, err := f.Readdir(-1) - if err != nil { - t.Fatalf("i=%d: Readdir: %v", i, err) - } - if len(children) != i { - t.Fatalf("i=%d: got %d children, want %d", i, len(children), i) - } - - if _, err := f.Write(make([]byte, 1)); err == nil { - t.Fatalf("i=%d: Write: got nil error, want non-nil", i) - } - - if err := fs.Mkdir(fmt.Sprintf("/dir%d", i), 0777); err != nil { - t.Fatalf("i=%d: Mkdir: %v", i, err) - } - } -} - -func TestMemFileReaddir(t *testing.T) { - fs := NewMemFS() - if err := fs.Mkdir("/foo", 0777); err != nil { - t.Fatalf("Mkdir: %v", err) - } - readdir := func(count int) ([]os.FileInfo, error) { - f, err := fs.OpenFile("/foo", os.O_RDONLY, 0) - if err != nil { - t.Fatalf("OpenFile: %v", err) - } - defer f.Close() - return f.Readdir(count) - } - if got, err := readdir(-1); len(got) != 0 || err != nil { - t.Fatalf("readdir(-1): got %d fileInfos with err=%v, want 0, <nil>", len(got), err) - } - if got, err := readdir(+1); len(got) != 0 || err != io.EOF { - t.Fatalf("readdir(+1): got %d fileInfos with err=%v, want 0, EOF", len(got), err) - } -} - -func TestMemFile(t *testing.T) { - testCases := []string{ - "wantData ", - "wantSize 0", - "write abc", - "wantData abc", - "write de", - "wantData abcde", - "wantSize 5", - "write 5*x", - "write 4*y+2*z", - "write 3*st", - "wantData abcdexxxxxyyyyzzststst", - "wantSize 22", - "seek set 4 want 4", - "write EFG", - "wantData abcdEFGxxxyyyyzzststst", - "wantSize 22", - "seek set 2 want 2", - "read cdEF", - "read Gx", - "seek cur 0 want 8", - "seek cur 2 want 10", - "seek cur -1 want 9", - "write J", - "wantData abcdEFGxxJyyyyzzststst", - "wantSize 22", - "seek cur -4 want 6", - "write ghijk", - "wantData abcdEFghijkyyyzzststst", - "wantSize 22", - "read yyyz", - "seek cur 0 want 15", - "write ", - "seek cur 0 want 15", - "read ", - "seek cur 0 want 15", - "seek end -3 want 19", - "write ZZ", - "wantData abcdEFghijkyyyzzstsZZt", - "wantSize 22", - "write 4*A", - "wantData abcdEFghijkyyyzzstsZZAAAA", - "wantSize 25", - "seek end 0 want 25", - "seek end -5 want 20", - "read Z+4*A", - "write 5*B", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB", - "wantSize 30", - "seek end 10 want 40", - "write C", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........C", - "wantSize 41", - "write D", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD", - "wantSize 42", - "seek set 43 want 43", - "write E", - "wantData abcdEFghijkyyyzzstsZZAAAABBBBB..........CD.E", - "wantSize 44", - "seek set 0 want 0", - "write 5*123456789_", - "wantData 123456789_123456789_123456789_123456789_123456789_", - "wantSize 50", - "seek cur 0 want 50", - "seek cur -99 want err", - } - - const filename = "/foo" - fs := NewMemFS() - f, err := fs.OpenFile(filename, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - t.Fatalf("OpenFile: %v", err) - } - defer f.Close() - - for i, tc := range testCases { - j := strings.IndexByte(tc, ' ') - if j < 0 { - t.Fatalf("test case #%d %q: invalid command", i, tc) - } - op, arg := tc[:j], tc[j+1:] - - // Expand an arg like "3*a+2*b" to "aaabb". - parts := strings.Split(arg, "+") - for j, part := range parts { - if k := strings.IndexByte(part, '*'); k >= 0 { - repeatCount, repeatStr := part[:k], part[k+1:] - n, err := strconv.Atoi(repeatCount) - if err != nil { - t.Fatalf("test case #%d %q: invalid repeat count %q", i, tc, repeatCount) - } - parts[j] = strings.Repeat(repeatStr, n) - } - } - arg = strings.Join(parts, "") - - switch op { - default: - t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) - - case "read": - buf := make([]byte, len(arg)) - if _, err := io.ReadFull(f, buf); err != nil { - t.Fatalf("test case #%d %q: ReadFull: %v", i, tc, err) - } - if got := string(buf); got != arg { - t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) - } - - case "seek": - parts := strings.Split(arg, " ") - if len(parts) != 4 { - t.Fatalf("test case #%d %q: invalid seek", i, tc) - } - - whence := 0 - switch parts[0] { - default: - t.Fatalf("test case #%d %q: invalid seek whence", i, tc) - case "set": - whence = os.SEEK_SET - case "cur": - whence = os.SEEK_CUR - case "end": - whence = os.SEEK_END - } - offset, err := strconv.Atoi(parts[1]) - if err != nil { - t.Fatalf("test case #%d %q: invalid offset %q", i, tc, parts[1]) - } - - if parts[2] != "want" { - t.Fatalf("test case #%d %q: invalid seek", i, tc) - } - if parts[3] == "err" { - _, err := f.Seek(int64(offset), whence) - if err == nil { - t.Fatalf("test case #%d %q: Seek returned nil error, want non-nil", i, tc) - } - } else { - got, err := f.Seek(int64(offset), whence) - if err != nil { - t.Fatalf("test case #%d %q: Seek: %v", i, tc, err) - } - want, err := strconv.Atoi(parts[3]) - if err != nil { - t.Fatalf("test case #%d %q: invalid want %q", i, tc, parts[3]) - } - if got != int64(want) { - t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) - } - } - - case "write": - n, err := f.Write([]byte(arg)) - if err != nil { - t.Fatalf("test case #%d %q: write: %v", i, tc, err) - } - if n != len(arg) { - t.Fatalf("test case #%d %q: write returned %d bytes, want %d", i, tc, n, len(arg)) - } - - case "wantData": - g, err := fs.OpenFile(filename, os.O_RDONLY, 0666) - if err != nil { - t.Fatalf("test case #%d %q: OpenFile: %v", i, tc, err) - } - gotBytes, err := ioutil.ReadAll(g) - if err != nil { - t.Fatalf("test case #%d %q: ReadAll: %v", i, tc, err) - } - for i, c := range gotBytes { - if c == '\x00' { - gotBytes[i] = '.' - } - } - got := string(gotBytes) - if got != arg { - t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, arg) - } - if err := g.Close(); err != nil { - t.Fatalf("test case #%d %q: Close: %v", i, tc, err) - } - - case "wantSize": - n, err := strconv.Atoi(arg) - if err != nil { - t.Fatalf("test case #%d %q: invalid size %q", i, tc, arg) - } - fi, err := fs.Stat(filename) - if err != nil { - t.Fatalf("test case #%d %q: Stat: %v", i, tc, err) - } - if got, want := fi.Size(), int64(n); got != want { - t.Fatalf("test case #%d %q: got %d, want %d", i, tc, got, want) - } - } - } -} - -// TestMemFileWriteAllocs tests that writing N consecutive 1KiB chunks to a -// memFile doesn't allocate a new buffer for each of those N times. Otherwise, -// calling io.Copy(aMemFile, src) is likely to have quadratic complexity. -func TestMemFileWriteAllocs(t *testing.T) { - fs := NewMemFS() - f, err := fs.OpenFile("/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - t.Fatalf("OpenFile: %v", err) - } - defer f.Close() - - xxx := make([]byte, 1024) - for i := range xxx { - xxx[i] = 'x' - } - - a := testing.AllocsPerRun(100, func() { - f.Write(xxx) - }) - // AllocsPerRun returns an integral value, so we compare the rounded-down - // number to zero. - if a > 0 { - t.Fatalf("%v allocs per run, want 0", a) - } -} - -func BenchmarkMemFileWrite(b *testing.B) { - fs := NewMemFS() - xxx := make([]byte, 1024) - for i := range xxx { - xxx[i] = 'x' - } - - b.ResetTimer() - for i := 0; i < b.N; i++ { - f, err := fs.OpenFile("/xxx", os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - b.Fatalf("OpenFile: %v", err) - } - for j := 0; j < 100; j++ { - f.Write(xxx) - } - if err := f.Close(); err != nil { - b.Fatalf("Close: %v", err) - } - if err := fs.RemoveAll("/xxx"); err != nil { - b.Fatalf("RemoveAll: %v", err) - } - } -} - -func TestCopyMoveProps(t *testing.T) { - fs := NewMemFS() - create := func(name string) error { - f, err := fs.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return err - } - _, wErr := f.Write([]byte("contents")) - cErr := f.Close() - if wErr != nil { - return wErr - } - return cErr - } - patch := func(name string, patches ...Proppatch) error { - f, err := fs.OpenFile(name, os.O_RDWR, 0666) - if err != nil { - return err - } - _, pErr := f.(DeadPropsHolder).Patch(patches) - cErr := f.Close() - if pErr != nil { - return pErr - } - return cErr - } - props := func(name string) (map[xml.Name]Property, error) { - f, err := fs.OpenFile(name, os.O_RDWR, 0666) - if err != nil { - return nil, err - } - m, pErr := f.(DeadPropsHolder).DeadProps() - cErr := f.Close() - if pErr != nil { - return nil, pErr - } - if cErr != nil { - return nil, cErr - } - return m, nil - } - - p0 := Property{ - XMLName: xml.Name{Space: "x:", Local: "boat"}, - InnerXML: []byte("pea-green"), - } - p1 := Property{ - XMLName: xml.Name{Space: "x:", Local: "ring"}, - InnerXML: []byte("1 shilling"), - } - p2 := Property{ - XMLName: xml.Name{Space: "x:", Local: "spoon"}, - InnerXML: []byte("runcible"), - } - p3 := Property{ - XMLName: xml.Name{Space: "x:", Local: "moon"}, - InnerXML: []byte("light"), - } - - if err := create("/src"); err != nil { - t.Fatalf("create /src: %v", err) - } - if err := patch("/src", Proppatch{Props: []Property{p0, p1}}); err != nil { - t.Fatalf("patch /src +p0 +p1: %v", err) - } - if _, err := copyFiles(fs, "/src", "/tmp", true, infiniteDepth, 0); err != nil { - t.Fatalf("copyFiles /src /tmp: %v", err) - } - if _, err := moveFiles(fs, "/tmp", "/dst", true); err != nil { - t.Fatalf("moveFiles /tmp /dst: %v", err) - } - if err := patch("/src", Proppatch{Props: []Property{p0}, Remove: true}); err != nil { - t.Fatalf("patch /src -p0: %v", err) - } - if err := patch("/src", Proppatch{Props: []Property{p2}}); err != nil { - t.Fatalf("patch /src +p2: %v", err) - } - if err := patch("/dst", Proppatch{Props: []Property{p1}, Remove: true}); err != nil { - t.Fatalf("patch /dst -p1: %v", err) - } - if err := patch("/dst", Proppatch{Props: []Property{p3}}); err != nil { - t.Fatalf("patch /dst +p3: %v", err) - } - - gotSrc, err := props("/src") - if err != nil { - t.Fatalf("props /src: %v", err) - } - wantSrc := map[xml.Name]Property{ - p1.XMLName: p1, - p2.XMLName: p2, - } - if !reflect.DeepEqual(gotSrc, wantSrc) { - t.Fatalf("props /src:\ngot %v\nwant %v", gotSrc, wantSrc) - } - - gotDst, err := props("/dst") - if err != nil { - t.Fatalf("props /dst: %v", err) - } - wantDst := map[xml.Name]Property{ - p0.XMLName: p0, - p3.XMLName: p3, - } - if !reflect.DeepEqual(gotDst, wantDst) { - t.Fatalf("props /dst:\ngot %v\nwant %v", gotDst, wantDst) - } -} - -func TestWalkFS(t *testing.T) { - testCases := []struct { - desc string - buildfs []string - startAt string - depth int - walkFn filepath.WalkFunc - want []string - }{{ - "just root", - []string{}, - "/", - infiniteDepth, - nil, - []string{ - "/", - }, - }, { - "infinite walk from root", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/d", - "mkdir /e", - "touch /f", - }, - "/", - infiniteDepth, - nil, - []string{ - "/", - "/a", - "/a/b", - "/a/b/c", - "/a/d", - "/e", - "/f", - }, - }, { - "infinite walk from subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/d", - "mkdir /e", - "touch /f", - }, - "/a", - infiniteDepth, - nil, - []string{ - "/a", - "/a/b", - "/a/b/c", - "/a/d", - }, - }, { - "depth 1 walk from root", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/d", - "mkdir /e", - "touch /f", - }, - "/", - 1, - nil, - []string{ - "/", - "/a", - "/e", - "/f", - }, - }, { - "depth 1 walk from subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/b/g", - "mkdir /a/b/g/h", - "touch /a/b/g/i", - "touch /a/b/g/h/j", - }, - "/a/b", - 1, - nil, - []string{ - "/a/b", - "/a/b/c", - "/a/b/g", - }, - }, { - "depth 0 walk from subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/b/g", - "mkdir /a/b/g/h", - "touch /a/b/g/i", - "touch /a/b/g/h/j", - }, - "/a/b", - 0, - nil, - []string{ - "/a/b", - }, - }, { - "infinite walk from file", - []string{ - "mkdir /a", - "touch /a/b", - "touch /a/c", - }, - "/a/b", - 0, - nil, - []string{ - "/a/b", - }, - }, { - "infinite walk with skipped subdir", - []string{ - "mkdir /a", - "mkdir /a/b", - "touch /a/b/c", - "mkdir /a/b/g", - "mkdir /a/b/g/h", - "touch /a/b/g/i", - "touch /a/b/g/h/j", - "touch /a/b/z", - }, - "/", - infiniteDepth, - func(path string, info os.FileInfo, err error) error { - if path == "/a/b/g" { - return filepath.SkipDir - } - return nil - }, - []string{ - "/", - "/a", - "/a/b", - "/a/b/c", - "/a/b/z", - }, - }} - for _, tc := range testCases { - fs, err := buildTestFS(tc.buildfs) - if err != nil { - t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) - } - var got []string - traceFn := func(path string, info os.FileInfo, err error) error { - if tc.walkFn != nil { - err = tc.walkFn(path, info, err) - if err != nil { - return err - } - } - got = append(got, path) - return nil - } - fi, err := fs.Stat(tc.startAt) - if err != nil { - t.Fatalf("%s: cannot stat: %v", tc.desc, err) - } - err = walkFS(fs, tc.depth, tc.startAt, fi, traceFn) - if err != nil { - t.Errorf("%s:\ngot error %v, want nil", tc.desc, err) - continue - } - sort.Strings(got) - sort.Strings(tc.want) - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("%s:\ngot %q\nwant %q", tc.desc, got, tc.want) - continue - } - } -} - -func buildTestFS(buildfs []string) (FileSystem, error) { - // TODO: Could this be merged with the build logic in TestFS? - - fs := NewMemFS() - for _, b := range buildfs { - op := strings.Split(b, " ") - switch op[0] { - case "mkdir": - err := fs.Mkdir(op[1], os.ModeDir|0777) - if err != nil { - return nil, err - } - case "touch": - f, err := fs.OpenFile(op[1], os.O_RDWR|os.O_CREATE, 0666) - if err != nil { - return nil, err - } - f.Close() - case "write": - f, err := fs.OpenFile(op[1], os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return nil, err - } - _, err = f.Write([]byte(op[2])) - f.Close() - if err != nil { - return nil, err - } - default: - return nil, fmt.Errorf("unknown file operation %q", op[0]) - } - } - return fs, nil -} diff --git a/vendor/golang.org/x/net/webdav/if.go b/vendor/golang.org/x/net/webdav/if.go deleted file mode 100644 index 416e81cd..00000000 --- a/vendor/golang.org/x/net/webdav/if.go +++ /dev/null @@ -1,173 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -// The If header is covered by Section 10.4. -// http://www.webdav.org/specs/rfc4918.html#HEADER_If - -import ( - "strings" -) - -// ifHeader is a disjunction (OR) of ifLists. -type ifHeader struct { - lists []ifList -} - -// ifList is a conjunction (AND) of Conditions, and an optional resource tag. -type ifList struct { - resourceTag string - conditions []Condition -} - -// parseIfHeader parses the "If: foo bar" HTTP header. The httpHeader string -// should omit the "If:" prefix and have any "\r\n"s collapsed to a " ", as is -// returned by req.Header.Get("If") for a http.Request req. -func parseIfHeader(httpHeader string) (h ifHeader, ok bool) { - s := strings.TrimSpace(httpHeader) - switch tokenType, _, _ := lex(s); tokenType { - case '(': - return parseNoTagLists(s) - case angleTokenType: - return parseTaggedLists(s) - default: - return ifHeader{}, false - } -} - -func parseNoTagLists(s string) (h ifHeader, ok bool) { - for { - l, remaining, ok := parseList(s) - if !ok { - return ifHeader{}, false - } - h.lists = append(h.lists, l) - if remaining == "" { - return h, true - } - s = remaining - } -} - -func parseTaggedLists(s string) (h ifHeader, ok bool) { - resourceTag, n := "", 0 - for first := true; ; first = false { - tokenType, tokenStr, remaining := lex(s) - switch tokenType { - case angleTokenType: - if !first && n == 0 { - return ifHeader{}, false - } - resourceTag, n = tokenStr, 0 - s = remaining - case '(': - n++ - l, remaining, ok := parseList(s) - if !ok { - return ifHeader{}, false - } - l.resourceTag = resourceTag - h.lists = append(h.lists, l) - if remaining == "" { - return h, true - } - s = remaining - default: - return ifHeader{}, false - } - } -} - -func parseList(s string) (l ifList, remaining string, ok bool) { - tokenType, _, s := lex(s) - if tokenType != '(' { - return ifList{}, "", false - } - for { - tokenType, _, remaining = lex(s) - if tokenType == ')' { - if len(l.conditions) == 0 { - return ifList{}, "", false - } - return l, remaining, true - } - c, remaining, ok := parseCondition(s) - if !ok { - return ifList{}, "", false - } - l.conditions = append(l.conditions, c) - s = remaining - } -} - -func parseCondition(s string) (c Condition, remaining string, ok bool) { - tokenType, tokenStr, s := lex(s) - if tokenType == notTokenType { - c.Not = true - tokenType, tokenStr, s = lex(s) - } - switch tokenType { - case strTokenType, angleTokenType: - c.Token = tokenStr - case squareTokenType: - c.ETag = tokenStr - default: - return Condition{}, "", false - } - return c, s, true -} - -// Single-rune tokens like '(' or ')' have a token type equal to their rune. -// All other tokens have a negative token type. -const ( - errTokenType = rune(-1) - eofTokenType = rune(-2) - strTokenType = rune(-3) - notTokenType = rune(-4) - angleTokenType = rune(-5) - squareTokenType = rune(-6) -) - -func lex(s string) (tokenType rune, tokenStr string, remaining string) { - // The net/textproto Reader that parses the HTTP header will collapse - // Linear White Space that spans multiple "\r\n" lines to a single " ", - // so we don't need to look for '\r' or '\n'. - for len(s) > 0 && (s[0] == '\t' || s[0] == ' ') { - s = s[1:] - } - if len(s) == 0 { - return eofTokenType, "", "" - } - i := 0 -loop: - for ; i < len(s); i++ { - switch s[i] { - case '\t', ' ', '(', ')', '<', '>', '[', ']': - break loop - } - } - - if i != 0 { - tokenStr, remaining = s[:i], s[i:] - if tokenStr == "Not" { - return notTokenType, "", remaining - } - return strTokenType, tokenStr, remaining - } - - j := 0 - switch s[0] { - case '<': - j, tokenType = strings.IndexByte(s, '>'), angleTokenType - case '[': - j, tokenType = strings.IndexByte(s, ']'), squareTokenType - default: - return rune(s[0]), "", s[1:] - } - if j < 0 { - return errTokenType, "", "" - } - return tokenType, s[1:j], s[j+1:] -} diff --git a/vendor/golang.org/x/net/webdav/if_test.go b/vendor/golang.org/x/net/webdav/if_test.go deleted file mode 100644 index aad61a40..00000000 --- a/vendor/golang.org/x/net/webdav/if_test.go +++ /dev/null @@ -1,322 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "reflect" - "strings" - "testing" -) - -func TestParseIfHeader(t *testing.T) { - // The "section x.y.z" test cases come from section x.y.z of the spec at - // http://www.webdav.org/specs/rfc4918.html - testCases := []struct { - desc string - input string - want ifHeader - }{{ - "bad: empty", - ``, - ifHeader{}, - }, { - "bad: no parens", - `foobar`, - ifHeader{}, - }, { - "bad: empty list #1", - `()`, - ifHeader{}, - }, { - "bad: empty list #2", - `(a) (b c) () (d)`, - ifHeader{}, - }, { - "bad: no list after resource #1", - `<foo>`, - ifHeader{}, - }, { - "bad: no list after resource #2", - `<foo> <bar> (a)`, - ifHeader{}, - }, { - "bad: no list after resource #3", - `<foo> (a) (b) <bar>`, - ifHeader{}, - }, { - "bad: no-tag-list followed by tagged-list", - `(a) (b) <foo> (c)`, - ifHeader{}, - }, { - "bad: unfinished list", - `(a`, - ifHeader{}, - }, { - "bad: unfinished ETag", - `([b`, - ifHeader{}, - }, { - "bad: unfinished Notted list", - `(Not a`, - ifHeader{}, - }, { - "bad: double Not", - `(Not Not a)`, - ifHeader{}, - }, { - "good: one list with a Token", - `(a)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `a`, - }}, - }}, - }, - }, { - "good: one list with an ETag", - `([a])`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - ETag: `a`, - }}, - }}, - }, - }, { - "good: one list with three Nots", - `(Not a Not b Not [d])`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Not: true, - Token: `a`, - }, { - Not: true, - Token: `b`, - }, { - Not: true, - ETag: `d`, - }}, - }}, - }, - }, { - "good: two lists", - `(a) (b)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `a`, - }}, - }, { - conditions: []Condition{{ - Token: `b`, - }}, - }}, - }, - }, { - "good: two Notted lists", - `(Not a) (Not b)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Not: true, - Token: `a`, - }}, - }, { - conditions: []Condition{{ - Not: true, - Token: `b`, - }}, - }}, - }, - }, { - "section 7.5.1", - `<http://www.example.com/users/f/fielding/index.html> - (<urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>)`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://www.example.com/users/f/fielding/index.html`, - conditions: []Condition{{ - Token: `urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6`, - }}, - }}, - }, - }, { - "section 7.5.2 #1", - `(<urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf>)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, - }}, - }}, - }, - }, { - "section 7.5.2 #2", - `<http://example.com/locked/> - (<urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf>)`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://example.com/locked/`, - conditions: []Condition{{ - Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, - }}, - }}, - }, - }, { - "section 7.5.2 #3", - `<http://example.com/locked/member> - (<urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf>)`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://example.com/locked/member`, - conditions: []Condition{{ - Token: `urn:uuid:150852e2-3847-42d5-8cbe-0f4f296f26cf`, - }}, - }}, - }, - }, { - "section 9.9.6", - `(<urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4>) - (<urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77>)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:fe184f2e-6eec-41d0-c765-01adc56e6bb4`, - }}, - }, { - conditions: []Condition{{ - Token: `urn:uuid:e454f3f3-acdc-452a-56c7-00a5c91e4b77`, - }}, - }}, - }, - }, { - "section 9.10.8", - `(<urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:e71d4fae-5dec-22d6-fea5-00a0c91e6be4`, - }}, - }}, - }, - }, { - "section 10.4.6", - `(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> - ["I am an ETag"]) - (["I am another ETag"])`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }, { - ETag: `"I am an ETag"`, - }}, - }, { - conditions: []Condition{{ - ETag: `"I am another ETag"`, - }}, - }}, - }, - }, { - "section 10.4.7", - `(Not <urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> - <urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092>)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Not: true, - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }, { - Token: `urn:uuid:58f202ac-22cf-11d1-b12d-002035b29092`, - }}, - }}, - }, - }, { - "section 10.4.8", - `(<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>) - (Not <DAV:no-lock>)`, - ifHeader{ - lists: []ifList{{ - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }}, - }, { - conditions: []Condition{{ - Not: true, - Token: `DAV:no-lock`, - }}, - }}, - }, - }, { - "section 10.4.9", - `</resource1> - (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2> - [W/"A weak ETag"]) (["strong ETag"])`, - ifHeader{ - lists: []ifList{{ - resourceTag: `/resource1`, - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }, { - ETag: `W/"A weak ETag"`, - }}, - }, { - resourceTag: `/resource1`, - conditions: []Condition{{ - ETag: `"strong ETag"`, - }}, - }}, - }, - }, { - "section 10.4.10", - `<http://www.example.com/specs/> - (<urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2>)`, - ifHeader{ - lists: []ifList{{ - resourceTag: `http://www.example.com/specs/`, - conditions: []Condition{{ - Token: `urn:uuid:181d4fae-7d8c-11d0-a765-00a0c91e6bf2`, - }}, - }}, - }, - }, { - "section 10.4.11 #1", - `</specs/rfc2518.doc> (["4217"])`, - ifHeader{ - lists: []ifList{{ - resourceTag: `/specs/rfc2518.doc`, - conditions: []Condition{{ - ETag: `"4217"`, - }}, - }}, - }, - }, { - "section 10.4.11 #2", - `</specs/rfc2518.doc> (Not ["4217"])`, - ifHeader{ - lists: []ifList{{ - resourceTag: `/specs/rfc2518.doc`, - conditions: []Condition{{ - Not: true, - ETag: `"4217"`, - }}, - }}, - }, - }} - - for _, tc := range testCases { - got, ok := parseIfHeader(strings.Replace(tc.input, "\n", "", -1)) - if gotEmpty := reflect.DeepEqual(got, ifHeader{}); gotEmpty == ok { - t.Errorf("%s: should be different: empty header == %t, ok == %t", tc.desc, gotEmpty, ok) - continue - } - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("%s:\ngot %v\nwant %v", tc.desc, got, tc.want) - continue - } - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/README b/vendor/golang.org/x/net/webdav/internal/xml/README deleted file mode 100644 index 89656f48..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/README +++ /dev/null @@ -1,11 +0,0 @@ -This is a fork of the encoding/xml package at ca1d6c4, the last commit before -https://go.googlesource.com/go/+/c0d6d33 "encoding/xml: restore Go 1.4 name -space behavior" made late in the lead-up to the Go 1.5 release. - -The list of encoding/xml changes is at -https://go.googlesource.com/go/+log/master/src/encoding/xml - -This fork is temporary, and I (nigeltao) expect to revert it after Go 1.6 is -released. - -See http://golang.org/issue/11841 diff --git a/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go b/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go deleted file mode 100644 index a7128431..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/atom_test.go +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import "time" - -var atomValue = &Feed{ - XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, - Title: "Example Feed", - Link: []Link{{Href: "http://example.org/"}}, - Updated: ParseTime("2003-12-13T18:30:02Z"), - Author: Person{Name: "John Doe"}, - Id: "urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6", - - Entry: []Entry{ - { - Title: "Atom-Powered Robots Run Amok", - Link: []Link{{Href: "http://example.org/2003/12/13/atom03"}}, - Id: "urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a", - Updated: ParseTime("2003-12-13T18:30:02Z"), - Summary: NewText("Some text."), - }, - }, -} - -var atomXml = `` + - `<feed xmlns="http://www.w3.org/2005/Atom" updated="2003-12-13T18:30:02Z">` + - `<title>Example Feed</title>` + - `<id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6</id>` + - `<link href="http://example.org/"></link>` + - `<author><name>John Doe</name><uri></uri><email></email></author>` + - `<entry>` + - `<title>Atom-Powered Robots Run Amok</title>` + - `<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>` + - `<link href="http://example.org/2003/12/13/atom03"></link>` + - `<updated>2003-12-13T18:30:02Z</updated>` + - `<author><name></name><uri></uri><email></email></author>` + - `<summary>Some text.</summary>` + - `</entry>` + - `</feed>` - -func ParseTime(str string) time.Time { - t, err := time.Parse(time.RFC3339, str) - if err != nil { - panic(err) - } - return t -} - -func NewText(text string) Text { - return Text{ - Body: text, - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go b/vendor/golang.org/x/net/webdav/internal/xml/example_test.go deleted file mode 100644 index becedd58..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/example_test.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml_test - -import ( - "encoding/xml" - "fmt" - "os" -) - -func ExampleMarshalIndent() { - type Address struct { - City, State string - } - type Person struct { - XMLName xml.Name `xml:"person"` - Id int `xml:"id,attr"` - FirstName string `xml:"name>first"` - LastName string `xml:"name>last"` - Age int `xml:"age"` - Height float32 `xml:"height,omitempty"` - Married bool - Address - Comment string `xml:",comment"` - } - - v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} - v.Comment = " Need more details. " - v.Address = Address{"Hanga Roa", "Easter Island"} - - output, err := xml.MarshalIndent(v, " ", " ") - if err != nil { - fmt.Printf("error: %v\n", err) - } - - os.Stdout.Write(output) - // Output: - // <person id="13"> - // <name> - // <first>John</first> - // <last>Doe</last> - // </name> - // <age>42</age> - // <Married>false</Married> - // <City>Hanga Roa</City> - // <State>Easter Island</State> - // <!-- Need more details. --> - // </person> -} - -func ExampleEncoder() { - type Address struct { - City, State string - } - type Person struct { - XMLName xml.Name `xml:"person"` - Id int `xml:"id,attr"` - FirstName string `xml:"name>first"` - LastName string `xml:"name>last"` - Age int `xml:"age"` - Height float32 `xml:"height,omitempty"` - Married bool - Address - Comment string `xml:",comment"` - } - - v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42} - v.Comment = " Need more details. " - v.Address = Address{"Hanga Roa", "Easter Island"} - - enc := xml.NewEncoder(os.Stdout) - enc.Indent(" ", " ") - if err := enc.Encode(v); err != nil { - fmt.Printf("error: %v\n", err) - } - - // Output: - // <person id="13"> - // <name> - // <first>John</first> - // <last>Doe</last> - // </name> - // <age>42</age> - // <Married>false</Married> - // <City>Hanga Roa</City> - // <State>Easter Island</State> - // <!-- Need more details. --> - // </person> -} - -// This example demonstrates unmarshaling an XML excerpt into a value with -// some preset fields. Note that the Phone field isn't modified and that -// the XML <Company> element is ignored. Also, the Groups field is assigned -// considering the element path provided in its tag. -func ExampleUnmarshal() { - type Email struct { - Where string `xml:"where,attr"` - Addr string - } - type Address struct { - City, State string - } - type Result struct { - XMLName xml.Name `xml:"Person"` - Name string `xml:"FullName"` - Phone string - Email []Email - Groups []string `xml:"Group>Value"` - Address - } - v := Result{Name: "none", Phone: "none"} - - data := ` - <Person> - <FullName>Grace R. Emlin</FullName> - <Company>Example Inc.</Company> - <Email where="home"> - <Addr>gre@example.com</Addr> - </Email> - <Email where='work'> - <Addr>gre@work.com</Addr> - </Email> - <Group> - <Value>Friends</Value> - <Value>Squash</Value> - </Group> - <City>Hanga Roa</City> - <State>Easter Island</State> - </Person> - ` - err := xml.Unmarshal([]byte(data), &v) - if err != nil { - fmt.Printf("error: %v", err) - return - } - fmt.Printf("XMLName: %#v\n", v.XMLName) - fmt.Printf("Name: %q\n", v.Name) - fmt.Printf("Phone: %q\n", v.Phone) - fmt.Printf("Email: %v\n", v.Email) - fmt.Printf("Groups: %v\n", v.Groups) - fmt.Printf("Address: %v\n", v.Address) - // Output: - // XMLName: xml.Name{Space:"", Local:"Person"} - // Name: "Grace R. Emlin" - // Phone: "none" - // Email: [{home gre@example.com} {work gre@work.com}] - // Groups: [Friends Squash] - // Address: {Hanga Roa Easter Island} -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal.go deleted file mode 100644 index 3c3b6aca..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/marshal.go +++ /dev/null @@ -1,1223 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bufio" - "bytes" - "encoding" - "fmt" - "io" - "reflect" - "strconv" - "strings" -) - -const ( - // A generic XML header suitable for use with the output of Marshal. - // This is not automatically added to any output of this package, - // it is provided as a convenience. - Header = `<?xml version="1.0" encoding="UTF-8"?>` + "\n" -) - -// Marshal returns the XML encoding of v. -// -// Marshal handles an array or slice by marshalling each of the elements. -// Marshal handles a pointer by marshalling the value it points at or, if the -// pointer is nil, by writing nothing. Marshal handles an interface value by -// marshalling the value it contains or, if the interface value is nil, by -// writing nothing. Marshal handles all other data by writing one or more XML -// elements containing the data. -// -// The name for the XML elements is taken from, in order of preference: -// - the tag on the XMLName field, if the data is a struct -// - the value of the XMLName field of type xml.Name -// - the tag of the struct field used to obtain the data -// - the name of the struct field used to obtain the data -// - the name of the marshalled type -// -// The XML element for a struct contains marshalled elements for each of the -// exported fields of the struct, with these exceptions: -// - the XMLName field, described above, is omitted. -// - a field with tag "-" is omitted. -// - a field with tag "name,attr" becomes an attribute with -// the given name in the XML element. -// - a field with tag ",attr" becomes an attribute with the -// field name in the XML element. -// - a field with tag ",chardata" is written as character data, -// not as an XML element. -// - a field with tag ",innerxml" is written verbatim, not subject -// to the usual marshalling procedure. -// - a field with tag ",comment" is written as an XML comment, not -// subject to the usual marshalling procedure. It must not contain -// the "--" string within it. -// - a field with a tag including the "omitempty" option is omitted -// if the field value is empty. The empty values are false, 0, any -// nil pointer or interface value, and any array, slice, map, or -// string of length zero. -// - an anonymous struct field is handled as if the fields of its -// value were part of the outer struct. -// -// If a field uses a tag "a>b>c", then the element c will be nested inside -// parent elements a and b. Fields that appear next to each other that name -// the same parent will be enclosed in one XML element. -// -// See MarshalIndent for an example. -// -// Marshal will return an error if asked to marshal a channel, function, or map. -func Marshal(v interface{}) ([]byte, error) { - var b bytes.Buffer - if err := NewEncoder(&b).Encode(v); err != nil { - return nil, err - } - return b.Bytes(), nil -} - -// Marshaler is the interface implemented by objects that can marshal -// themselves into valid XML elements. -// -// MarshalXML encodes the receiver as zero or more XML elements. -// By convention, arrays or slices are typically encoded as a sequence -// of elements, one per entry. -// Using start as the element tag is not required, but doing so -// will enable Unmarshal to match the XML elements to the correct -// struct field. -// One common implementation strategy is to construct a separate -// value with a layout corresponding to the desired XML and then -// to encode it using e.EncodeElement. -// Another common strategy is to use repeated calls to e.EncodeToken -// to generate the XML output one token at a time. -// The sequence of encoded tokens must make up zero or more valid -// XML elements. -type Marshaler interface { - MarshalXML(e *Encoder, start StartElement) error -} - -// MarshalerAttr is the interface implemented by objects that can marshal -// themselves into valid XML attributes. -// -// MarshalXMLAttr returns an XML attribute with the encoded value of the receiver. -// Using name as the attribute name is not required, but doing so -// will enable Unmarshal to match the attribute to the correct -// struct field. -// If MarshalXMLAttr returns the zero attribute Attr{}, no attribute -// will be generated in the output. -// MarshalXMLAttr is used only for struct fields with the -// "attr" option in the field tag. -type MarshalerAttr interface { - MarshalXMLAttr(name Name) (Attr, error) -} - -// MarshalIndent works like Marshal, but each XML element begins on a new -// indented line that starts with prefix and is followed by one or more -// copies of indent according to the nesting depth. -func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - var b bytes.Buffer - enc := NewEncoder(&b) - enc.Indent(prefix, indent) - if err := enc.Encode(v); err != nil { - return nil, err - } - return b.Bytes(), nil -} - -// An Encoder writes XML data to an output stream. -type Encoder struct { - p printer -} - -// NewEncoder returns a new encoder that writes to w. -func NewEncoder(w io.Writer) *Encoder { - e := &Encoder{printer{Writer: bufio.NewWriter(w)}} - e.p.encoder = e - return e -} - -// Indent sets the encoder to generate XML in which each element -// begins on a new indented line that starts with prefix and is followed by -// one or more copies of indent according to the nesting depth. -func (enc *Encoder) Indent(prefix, indent string) { - enc.p.prefix = prefix - enc.p.indent = indent -} - -// Encode writes the XML encoding of v to the stream. -// -// See the documentation for Marshal for details about the conversion -// of Go values to XML. -// -// Encode calls Flush before returning. -func (enc *Encoder) Encode(v interface{}) error { - err := enc.p.marshalValue(reflect.ValueOf(v), nil, nil) - if err != nil { - return err - } - return enc.p.Flush() -} - -// EncodeElement writes the XML encoding of v to the stream, -// using start as the outermost tag in the encoding. -// -// See the documentation for Marshal for details about the conversion -// of Go values to XML. -// -// EncodeElement calls Flush before returning. -func (enc *Encoder) EncodeElement(v interface{}, start StartElement) error { - err := enc.p.marshalValue(reflect.ValueOf(v), nil, &start) - if err != nil { - return err - } - return enc.p.Flush() -} - -var ( - begComment = []byte("<!--") - endComment = []byte("-->") - endProcInst = []byte("?>") - endDirective = []byte(">") -) - -// EncodeToken writes the given XML token to the stream. -// It returns an error if StartElement and EndElement tokens are not -// properly matched. -// -// EncodeToken does not call Flush, because usually it is part of a -// larger operation such as Encode or EncodeElement (or a custom -// Marshaler's MarshalXML invoked during those), and those will call -// Flush when finished. Callers that create an Encoder and then invoke -// EncodeToken directly, without using Encode or EncodeElement, need to -// call Flush when finished to ensure that the XML is written to the -// underlying writer. -// -// EncodeToken allows writing a ProcInst with Target set to "xml" only -// as the first token in the stream. -// -// When encoding a StartElement holding an XML namespace prefix -// declaration for a prefix that is not already declared, contained -// elements (including the StartElement itself) will use the declared -// prefix when encoding names with matching namespace URIs. -func (enc *Encoder) EncodeToken(t Token) error { - - p := &enc.p - switch t := t.(type) { - case StartElement: - if err := p.writeStart(&t); err != nil { - return err - } - case EndElement: - if err := p.writeEnd(t.Name); err != nil { - return err - } - case CharData: - escapeText(p, t, false) - case Comment: - if bytes.Contains(t, endComment) { - return fmt.Errorf("xml: EncodeToken of Comment containing --> marker") - } - p.WriteString("<!--") - p.Write(t) - p.WriteString("-->") - return p.cachedWriteError() - case ProcInst: - // First token to be encoded which is also a ProcInst with target of xml - // is the xml declaration. The only ProcInst where target of xml is allowed. - if t.Target == "xml" && p.Buffered() != 0 { - return fmt.Errorf("xml: EncodeToken of ProcInst xml target only valid for xml declaration, first token encoded") - } - if !isNameString(t.Target) { - return fmt.Errorf("xml: EncodeToken of ProcInst with invalid Target") - } - if bytes.Contains(t.Inst, endProcInst) { - return fmt.Errorf("xml: EncodeToken of ProcInst containing ?> marker") - } - p.WriteString("<?") - p.WriteString(t.Target) - if len(t.Inst) > 0 { - p.WriteByte(' ') - p.Write(t.Inst) - } - p.WriteString("?>") - case Directive: - if !isValidDirective(t) { - return fmt.Errorf("xml: EncodeToken of Directive containing wrong < or > markers") - } - p.WriteString("<!") - p.Write(t) - p.WriteString(">") - default: - return fmt.Errorf("xml: EncodeToken of invalid token type") - - } - return p.cachedWriteError() -} - -// isValidDirective reports whether dir is a valid directive text, -// meaning angle brackets are matched, ignoring comments and strings. -func isValidDirective(dir Directive) bool { - var ( - depth int - inquote uint8 - incomment bool - ) - for i, c := range dir { - switch { - case incomment: - if c == '>' { - if n := 1 + i - len(endComment); n >= 0 && bytes.Equal(dir[n:i+1], endComment) { - incomment = false - } - } - // Just ignore anything in comment - case inquote != 0: - if c == inquote { - inquote = 0 - } - // Just ignore anything within quotes - case c == '\'' || c == '"': - inquote = c - case c == '<': - if i+len(begComment) < len(dir) && bytes.Equal(dir[i:i+len(begComment)], begComment) { - incomment = true - } else { - depth++ - } - case c == '>': - if depth == 0 { - return false - } - depth-- - } - } - return depth == 0 && inquote == 0 && !incomment -} - -// Flush flushes any buffered XML to the underlying writer. -// See the EncodeToken documentation for details about when it is necessary. -func (enc *Encoder) Flush() error { - return enc.p.Flush() -} - -type printer struct { - *bufio.Writer - encoder *Encoder - seq int - indent string - prefix string - depth int - indentedIn bool - putNewline bool - defaultNS string - attrNS map[string]string // map prefix -> name space - attrPrefix map[string]string // map name space -> prefix - prefixes []printerPrefix - tags []Name -} - -// printerPrefix holds a namespace undo record. -// When an element is popped, the prefix record -// is set back to the recorded URL. The empty -// prefix records the URL for the default name space. -// -// The start of an element is recorded with an element -// that has mark=true. -type printerPrefix struct { - prefix string - url string - mark bool -} - -func (p *printer) prefixForNS(url string, isAttr bool) string { - // The "http://www.w3.org/XML/1998/namespace" name space is predefined as "xml" - // and must be referred to that way. - // (The "http://www.w3.org/2000/xmlns/" name space is also predefined as "xmlns", - // but users should not be trying to use that one directly - that's our job.) - if url == xmlURL { - return "xml" - } - if !isAttr && url == p.defaultNS { - // We can use the default name space. - return "" - } - return p.attrPrefix[url] -} - -// defineNS pushes any namespace definition found in the given attribute. -// If ignoreNonEmptyDefault is true, an xmlns="nonempty" -// attribute will be ignored. -func (p *printer) defineNS(attr Attr, ignoreNonEmptyDefault bool) error { - var prefix string - if attr.Name.Local == "xmlns" { - if attr.Name.Space != "" && attr.Name.Space != "xml" && attr.Name.Space != xmlURL { - return fmt.Errorf("xml: cannot redefine xmlns attribute prefix") - } - } else if attr.Name.Space == "xmlns" && attr.Name.Local != "" { - prefix = attr.Name.Local - if attr.Value == "" { - // Technically, an empty XML namespace is allowed for an attribute. - // From http://www.w3.org/TR/xml-names11/#scoping-defaulting: - // - // The attribute value in a namespace declaration for a prefix may be - // empty. This has the effect, within the scope of the declaration, of removing - // any association of the prefix with a namespace name. - // - // However our namespace prefixes here are used only as hints. There's - // no need to respect the removal of a namespace prefix, so we ignore it. - return nil - } - } else { - // Ignore: it's not a namespace definition - return nil - } - if prefix == "" { - if attr.Value == p.defaultNS { - // No need for redefinition. - return nil - } - if attr.Value != "" && ignoreNonEmptyDefault { - // We have an xmlns="..." value but - // it can't define a name space in this context, - // probably because the element has an empty - // name space. In this case, we just ignore - // the name space declaration. - return nil - } - } else if _, ok := p.attrPrefix[attr.Value]; ok { - // There's already a prefix for the given name space, - // so use that. This prevents us from - // having two prefixes for the same name space - // so attrNS and attrPrefix can remain bijective. - return nil - } - p.pushPrefix(prefix, attr.Value) - return nil -} - -// createNSPrefix creates a name space prefix attribute -// to use for the given name space, defining a new prefix -// if necessary. -// If isAttr is true, the prefix is to be created for an attribute -// prefix, which means that the default name space cannot -// be used. -func (p *printer) createNSPrefix(url string, isAttr bool) { - if _, ok := p.attrPrefix[url]; ok { - // We already have a prefix for the given URL. - return - } - switch { - case !isAttr && url == p.defaultNS: - // We can use the default name space. - return - case url == "": - // The only way we can encode names in the empty - // name space is by using the default name space, - // so we must use that. - if p.defaultNS != "" { - // The default namespace is non-empty, so we - // need to set it to empty. - p.pushPrefix("", "") - } - return - case url == xmlURL: - return - } - // TODO If the URL is an existing prefix, we could - // use it as is. That would enable the - // marshaling of elements that had been unmarshaled - // and with a name space prefix that was not found. - // although technically it would be incorrect. - - // Pick a name. We try to use the final element of the path - // but fall back to _. - prefix := strings.TrimRight(url, "/") - if i := strings.LastIndex(prefix, "/"); i >= 0 { - prefix = prefix[i+1:] - } - if prefix == "" || !isName([]byte(prefix)) || strings.Contains(prefix, ":") { - prefix = "_" - } - if strings.HasPrefix(prefix, "xml") { - // xmlanything is reserved. - prefix = "_" + prefix - } - if p.attrNS[prefix] != "" { - // Name is taken. Find a better one. - for p.seq++; ; p.seq++ { - if id := prefix + "_" + strconv.Itoa(p.seq); p.attrNS[id] == "" { - prefix = id - break - } - } - } - - p.pushPrefix(prefix, url) -} - -// writeNamespaces writes xmlns attributes for all the -// namespace prefixes that have been defined in -// the current element. -func (p *printer) writeNamespaces() { - for i := len(p.prefixes) - 1; i >= 0; i-- { - prefix := p.prefixes[i] - if prefix.mark { - return - } - p.WriteString(" ") - if prefix.prefix == "" { - // Default name space. - p.WriteString(`xmlns="`) - } else { - p.WriteString("xmlns:") - p.WriteString(prefix.prefix) - p.WriteString(`="`) - } - EscapeText(p, []byte(p.nsForPrefix(prefix.prefix))) - p.WriteString(`"`) - } -} - -// pushPrefix pushes a new prefix on the prefix stack -// without checking to see if it is already defined. -func (p *printer) pushPrefix(prefix, url string) { - p.prefixes = append(p.prefixes, printerPrefix{ - prefix: prefix, - url: p.nsForPrefix(prefix), - }) - p.setAttrPrefix(prefix, url) -} - -// nsForPrefix returns the name space for the given -// prefix. Note that this is not valid for the -// empty attribute prefix, which always has an empty -// name space. -func (p *printer) nsForPrefix(prefix string) string { - if prefix == "" { - return p.defaultNS - } - return p.attrNS[prefix] -} - -// markPrefix marks the start of an element on the prefix -// stack. -func (p *printer) markPrefix() { - p.prefixes = append(p.prefixes, printerPrefix{ - mark: true, - }) -} - -// popPrefix pops all defined prefixes for the current -// element. -func (p *printer) popPrefix() { - for len(p.prefixes) > 0 { - prefix := p.prefixes[len(p.prefixes)-1] - p.prefixes = p.prefixes[:len(p.prefixes)-1] - if prefix.mark { - break - } - p.setAttrPrefix(prefix.prefix, prefix.url) - } -} - -// setAttrPrefix sets an attribute name space prefix. -// If url is empty, the attribute is removed. -// If prefix is empty, the default name space is set. -func (p *printer) setAttrPrefix(prefix, url string) { - if prefix == "" { - p.defaultNS = url - return - } - if url == "" { - delete(p.attrPrefix, p.attrNS[prefix]) - delete(p.attrNS, prefix) - return - } - if p.attrPrefix == nil { - // Need to define a new name space. - p.attrPrefix = make(map[string]string) - p.attrNS = make(map[string]string) - } - // Remove any old prefix value. This is OK because we maintain a - // strict one-to-one mapping between prefix and URL (see - // defineNS) - delete(p.attrPrefix, p.attrNS[prefix]) - p.attrPrefix[url] = prefix - p.attrNS[prefix] = url -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - marshalerAttrType = reflect.TypeOf((*MarshalerAttr)(nil)).Elem() - textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem() -) - -// marshalValue writes one or more XML elements representing val. -// If val was obtained from a struct field, finfo must have its details. -func (p *printer) marshalValue(val reflect.Value, finfo *fieldInfo, startTemplate *StartElement) error { - if startTemplate != nil && startTemplate.Name.Local == "" { - return fmt.Errorf("xml: EncodeElement of StartElement with missing name") - } - - if !val.IsValid() { - return nil - } - if finfo != nil && finfo.flags&fOmitEmpty != 0 && isEmptyValue(val) { - return nil - } - - // Drill into interfaces and pointers. - // This can turn into an infinite loop given a cyclic chain, - // but it matches the Go 1 behavior. - for val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { - if val.IsNil() { - return nil - } - val = val.Elem() - } - - kind := val.Kind() - typ := val.Type() - - // Check for marshaler. - if val.CanInterface() && typ.Implements(marshalerType) { - return p.marshalInterface(val.Interface().(Marshaler), p.defaultStart(typ, finfo, startTemplate)) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(marshalerType) { - return p.marshalInterface(pv.Interface().(Marshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) - } - } - - // Check for text marshaler. - if val.CanInterface() && typ.Implements(textMarshalerType) { - return p.marshalTextInterface(val.Interface().(encoding.TextMarshaler), p.defaultStart(typ, finfo, startTemplate)) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { - return p.marshalTextInterface(pv.Interface().(encoding.TextMarshaler), p.defaultStart(pv.Type(), finfo, startTemplate)) - } - } - - // Slices and arrays iterate over the elements. They do not have an enclosing tag. - if (kind == reflect.Slice || kind == reflect.Array) && typ.Elem().Kind() != reflect.Uint8 { - for i, n := 0, val.Len(); i < n; i++ { - if err := p.marshalValue(val.Index(i), finfo, startTemplate); err != nil { - return err - } - } - return nil - } - - tinfo, err := getTypeInfo(typ) - if err != nil { - return err - } - - // Create start element. - // Precedence for the XML element name is: - // 0. startTemplate - // 1. XMLName field in underlying struct; - // 2. field name/tag in the struct field; and - // 3. type name - var start StartElement - - // explicitNS records whether the element's name space has been - // explicitly set (for example an XMLName field). - explicitNS := false - - if startTemplate != nil { - start.Name = startTemplate.Name - explicitNS = true - start.Attr = append(start.Attr, startTemplate.Attr...) - } else if tinfo.xmlname != nil { - xmlname := tinfo.xmlname - if xmlname.name != "" { - start.Name.Space, start.Name.Local = xmlname.xmlns, xmlname.name - } else if v, ok := xmlname.value(val).Interface().(Name); ok && v.Local != "" { - start.Name = v - } - explicitNS = true - } - if start.Name.Local == "" && finfo != nil { - start.Name.Local = finfo.name - if finfo.xmlns != "" { - start.Name.Space = finfo.xmlns - explicitNS = true - } - } - if start.Name.Local == "" { - name := typ.Name() - if name == "" { - return &UnsupportedTypeError{typ} - } - start.Name.Local = name - } - - // defaultNS records the default name space as set by a xmlns="..." - // attribute. We don't set p.defaultNS because we want to let - // the attribute writing code (in p.defineNS) be solely responsible - // for maintaining that. - defaultNS := p.defaultNS - - // Attributes - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - if finfo.flags&fAttr == 0 { - continue - } - attr, err := p.fieldAttr(finfo, val) - if err != nil { - return err - } - if attr.Name.Local == "" { - continue - } - start.Attr = append(start.Attr, attr) - if attr.Name.Space == "" && attr.Name.Local == "xmlns" { - defaultNS = attr.Value - } - } - if !explicitNS { - // Historic behavior: elements use the default name space - // they are contained in by default. - start.Name.Space = defaultNS - } - // Historic behaviour: an element that's in a namespace sets - // the default namespace for all elements contained within it. - start.setDefaultNamespace() - - if err := p.writeStart(&start); err != nil { - return err - } - - if val.Kind() == reflect.Struct { - err = p.marshalStruct(tinfo, val) - } else { - s, b, err1 := p.marshalSimple(typ, val) - if err1 != nil { - err = err1 - } else if b != nil { - EscapeText(p, b) - } else { - p.EscapeString(s) - } - } - if err != nil { - return err - } - - if err := p.writeEnd(start.Name); err != nil { - return err - } - - return p.cachedWriteError() -} - -// fieldAttr returns the attribute of the given field. -// If the returned attribute has an empty Name.Local, -// it should not be used. -// The given value holds the value containing the field. -func (p *printer) fieldAttr(finfo *fieldInfo, val reflect.Value) (Attr, error) { - fv := finfo.value(val) - name := Name{Space: finfo.xmlns, Local: finfo.name} - if finfo.flags&fOmitEmpty != 0 && isEmptyValue(fv) { - return Attr{}, nil - } - if fv.Kind() == reflect.Interface && fv.IsNil() { - return Attr{}, nil - } - if fv.CanInterface() && fv.Type().Implements(marshalerAttrType) { - attr, err := fv.Interface().(MarshalerAttr).MarshalXMLAttr(name) - return attr, err - } - if fv.CanAddr() { - pv := fv.Addr() - if pv.CanInterface() && pv.Type().Implements(marshalerAttrType) { - attr, err := pv.Interface().(MarshalerAttr).MarshalXMLAttr(name) - return attr, err - } - } - if fv.CanInterface() && fv.Type().Implements(textMarshalerType) { - text, err := fv.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return Attr{}, err - } - return Attr{name, string(text)}, nil - } - if fv.CanAddr() { - pv := fv.Addr() - if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { - text, err := pv.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return Attr{}, err - } - return Attr{name, string(text)}, nil - } - } - // Dereference or skip nil pointer, interface values. - switch fv.Kind() { - case reflect.Ptr, reflect.Interface: - if fv.IsNil() { - return Attr{}, nil - } - fv = fv.Elem() - } - s, b, err := p.marshalSimple(fv.Type(), fv) - if err != nil { - return Attr{}, err - } - if b != nil { - s = string(b) - } - return Attr{name, s}, nil -} - -// defaultStart returns the default start element to use, -// given the reflect type, field info, and start template. -func (p *printer) defaultStart(typ reflect.Type, finfo *fieldInfo, startTemplate *StartElement) StartElement { - var start StartElement - // Precedence for the XML element name is as above, - // except that we do not look inside structs for the first field. - if startTemplate != nil { - start.Name = startTemplate.Name - start.Attr = append(start.Attr, startTemplate.Attr...) - } else if finfo != nil && finfo.name != "" { - start.Name.Local = finfo.name - start.Name.Space = finfo.xmlns - } else if typ.Name() != "" { - start.Name.Local = typ.Name() - } else { - // Must be a pointer to a named type, - // since it has the Marshaler methods. - start.Name.Local = typ.Elem().Name() - } - // Historic behaviour: elements use the name space of - // the element they are contained in by default. - if start.Name.Space == "" { - start.Name.Space = p.defaultNS - } - start.setDefaultNamespace() - return start -} - -// marshalInterface marshals a Marshaler interface value. -func (p *printer) marshalInterface(val Marshaler, start StartElement) error { - // Push a marker onto the tag stack so that MarshalXML - // cannot close the XML tags that it did not open. - p.tags = append(p.tags, Name{}) - n := len(p.tags) - - err := val.MarshalXML(p.encoder, start) - if err != nil { - return err - } - - // Make sure MarshalXML closed all its tags. p.tags[n-1] is the mark. - if len(p.tags) > n { - return fmt.Errorf("xml: %s.MarshalXML wrote invalid XML: <%s> not closed", receiverType(val), p.tags[len(p.tags)-1].Local) - } - p.tags = p.tags[:n-1] - return nil -} - -// marshalTextInterface marshals a TextMarshaler interface value. -func (p *printer) marshalTextInterface(val encoding.TextMarshaler, start StartElement) error { - if err := p.writeStart(&start); err != nil { - return err - } - text, err := val.MarshalText() - if err != nil { - return err - } - EscapeText(p, text) - return p.writeEnd(start.Name) -} - -// writeStart writes the given start element. -func (p *printer) writeStart(start *StartElement) error { - if start.Name.Local == "" { - return fmt.Errorf("xml: start tag with no name") - } - - p.tags = append(p.tags, start.Name) - p.markPrefix() - // Define any name spaces explicitly declared in the attributes. - // We do this as a separate pass so that explicitly declared prefixes - // will take precedence over implicitly declared prefixes - // regardless of the order of the attributes. - ignoreNonEmptyDefault := start.Name.Space == "" - for _, attr := range start.Attr { - if err := p.defineNS(attr, ignoreNonEmptyDefault); err != nil { - return err - } - } - // Define any new name spaces implied by the attributes. - for _, attr := range start.Attr { - name := attr.Name - // From http://www.w3.org/TR/xml-names11/#defaulting - // "Default namespace declarations do not apply directly - // to attribute names; the interpretation of unprefixed - // attributes is determined by the element on which they - // appear." - // This means we don't need to create a new namespace - // when an attribute name space is empty. - if name.Space != "" && !name.isNamespace() { - p.createNSPrefix(name.Space, true) - } - } - p.createNSPrefix(start.Name.Space, false) - - p.writeIndent(1) - p.WriteByte('<') - p.writeName(start.Name, false) - p.writeNamespaces() - for _, attr := range start.Attr { - name := attr.Name - if name.Local == "" || name.isNamespace() { - // Namespaces have already been written by writeNamespaces above. - continue - } - p.WriteByte(' ') - p.writeName(name, true) - p.WriteString(`="`) - p.EscapeString(attr.Value) - p.WriteByte('"') - } - p.WriteByte('>') - return nil -} - -// writeName writes the given name. It assumes -// that p.createNSPrefix(name) has already been called. -func (p *printer) writeName(name Name, isAttr bool) { - if prefix := p.prefixForNS(name.Space, isAttr); prefix != "" { - p.WriteString(prefix) - p.WriteByte(':') - } - p.WriteString(name.Local) -} - -func (p *printer) writeEnd(name Name) error { - if name.Local == "" { - return fmt.Errorf("xml: end tag with no name") - } - if len(p.tags) == 0 || p.tags[len(p.tags)-1].Local == "" { - return fmt.Errorf("xml: end tag </%s> without start tag", name.Local) - } - if top := p.tags[len(p.tags)-1]; top != name { - if top.Local != name.Local { - return fmt.Errorf("xml: end tag </%s> does not match start tag <%s>", name.Local, top.Local) - } - return fmt.Errorf("xml: end tag </%s> in namespace %s does not match start tag <%s> in namespace %s", name.Local, name.Space, top.Local, top.Space) - } - p.tags = p.tags[:len(p.tags)-1] - - p.writeIndent(-1) - p.WriteByte('<') - p.WriteByte('/') - p.writeName(name, false) - p.WriteByte('>') - p.popPrefix() - return nil -} - -func (p *printer) marshalSimple(typ reflect.Type, val reflect.Value) (string, []byte, error) { - switch val.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return strconv.FormatInt(val.Int(), 10), nil, nil - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return strconv.FormatUint(val.Uint(), 10), nil, nil - case reflect.Float32, reflect.Float64: - return strconv.FormatFloat(val.Float(), 'g', -1, val.Type().Bits()), nil, nil - case reflect.String: - return val.String(), nil, nil - case reflect.Bool: - return strconv.FormatBool(val.Bool()), nil, nil - case reflect.Array: - if typ.Elem().Kind() != reflect.Uint8 { - break - } - // [...]byte - var bytes []byte - if val.CanAddr() { - bytes = val.Slice(0, val.Len()).Bytes() - } else { - bytes = make([]byte, val.Len()) - reflect.Copy(reflect.ValueOf(bytes), val) - } - return "", bytes, nil - case reflect.Slice: - if typ.Elem().Kind() != reflect.Uint8 { - break - } - // []byte - return "", val.Bytes(), nil - } - return "", nil, &UnsupportedTypeError{typ} -} - -var ddBytes = []byte("--") - -func (p *printer) marshalStruct(tinfo *typeInfo, val reflect.Value) error { - s := parentStack{p: p} - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - if finfo.flags&fAttr != 0 { - continue - } - vf := finfo.value(val) - - // Dereference or skip nil pointer, interface values. - switch vf.Kind() { - case reflect.Ptr, reflect.Interface: - if !vf.IsNil() { - vf = vf.Elem() - } - } - - switch finfo.flags & fMode { - case fCharData: - if err := s.setParents(&noField, reflect.Value{}); err != nil { - return err - } - if vf.CanInterface() && vf.Type().Implements(textMarshalerType) { - data, err := vf.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - Escape(p, data) - continue - } - if vf.CanAddr() { - pv := vf.Addr() - if pv.CanInterface() && pv.Type().Implements(textMarshalerType) { - data, err := pv.Interface().(encoding.TextMarshaler).MarshalText() - if err != nil { - return err - } - Escape(p, data) - continue - } - } - var scratch [64]byte - switch vf.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - Escape(p, strconv.AppendInt(scratch[:0], vf.Int(), 10)) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - Escape(p, strconv.AppendUint(scratch[:0], vf.Uint(), 10)) - case reflect.Float32, reflect.Float64: - Escape(p, strconv.AppendFloat(scratch[:0], vf.Float(), 'g', -1, vf.Type().Bits())) - case reflect.Bool: - Escape(p, strconv.AppendBool(scratch[:0], vf.Bool())) - case reflect.String: - if err := EscapeText(p, []byte(vf.String())); err != nil { - return err - } - case reflect.Slice: - if elem, ok := vf.Interface().([]byte); ok { - if err := EscapeText(p, elem); err != nil { - return err - } - } - } - continue - - case fComment: - if err := s.setParents(&noField, reflect.Value{}); err != nil { - return err - } - k := vf.Kind() - if !(k == reflect.String || k == reflect.Slice && vf.Type().Elem().Kind() == reflect.Uint8) { - return fmt.Errorf("xml: bad type for comment field of %s", val.Type()) - } - if vf.Len() == 0 { - continue - } - p.writeIndent(0) - p.WriteString("<!--") - dashDash := false - dashLast := false - switch k { - case reflect.String: - s := vf.String() - dashDash = strings.Index(s, "--") >= 0 - dashLast = s[len(s)-1] == '-' - if !dashDash { - p.WriteString(s) - } - case reflect.Slice: - b := vf.Bytes() - dashDash = bytes.Index(b, ddBytes) >= 0 - dashLast = b[len(b)-1] == '-' - if !dashDash { - p.Write(b) - } - default: - panic("can't happen") - } - if dashDash { - return fmt.Errorf(`xml: comments must not contain "--"`) - } - if dashLast { - // "--->" is invalid grammar. Make it "- -->" - p.WriteByte(' ') - } - p.WriteString("-->") - continue - - case fInnerXml: - iface := vf.Interface() - switch raw := iface.(type) { - case []byte: - p.Write(raw) - continue - case string: - p.WriteString(raw) - continue - } - - case fElement, fElement | fAny: - if err := s.setParents(finfo, vf); err != nil { - return err - } - } - if err := p.marshalValue(vf, finfo, nil); err != nil { - return err - } - } - if err := s.setParents(&noField, reflect.Value{}); err != nil { - return err - } - return p.cachedWriteError() -} - -var noField fieldInfo - -// return the bufio Writer's cached write error -func (p *printer) cachedWriteError() error { - _, err := p.Write(nil) - return err -} - -func (p *printer) writeIndent(depthDelta int) { - if len(p.prefix) == 0 && len(p.indent) == 0 { - return - } - if depthDelta < 0 { - p.depth-- - if p.indentedIn { - p.indentedIn = false - return - } - p.indentedIn = false - } - if p.putNewline { - p.WriteByte('\n') - } else { - p.putNewline = true - } - if len(p.prefix) > 0 { - p.WriteString(p.prefix) - } - if len(p.indent) > 0 { - for i := 0; i < p.depth; i++ { - p.WriteString(p.indent) - } - } - if depthDelta > 0 { - p.depth++ - p.indentedIn = true - } -} - -type parentStack struct { - p *printer - xmlns string - parents []string -} - -// setParents sets the stack of current parents to those found in finfo. -// It only writes the start elements if vf holds a non-nil value. -// If finfo is &noField, it pops all elements. -func (s *parentStack) setParents(finfo *fieldInfo, vf reflect.Value) error { - xmlns := s.p.defaultNS - if finfo.xmlns != "" { - xmlns = finfo.xmlns - } - commonParents := 0 - if xmlns == s.xmlns { - for ; commonParents < len(finfo.parents) && commonParents < len(s.parents); commonParents++ { - if finfo.parents[commonParents] != s.parents[commonParents] { - break - } - } - } - // Pop off any parents that aren't in common with the previous field. - for i := len(s.parents) - 1; i >= commonParents; i-- { - if err := s.p.writeEnd(Name{ - Space: s.xmlns, - Local: s.parents[i], - }); err != nil { - return err - } - } - s.parents = finfo.parents - s.xmlns = xmlns - if commonParents >= len(s.parents) { - // No new elements to push. - return nil - } - if (vf.Kind() == reflect.Ptr || vf.Kind() == reflect.Interface) && vf.IsNil() { - // The element is nil, so no need for the start elements. - s.parents = s.parents[:commonParents] - return nil - } - // Push any new parents required. - for _, name := range s.parents[commonParents:] { - start := &StartElement{ - Name: Name{ - Space: s.xmlns, - Local: name, - }, - } - // Set the default name space for parent elements - // to match what we do with other elements. - if s.xmlns != s.p.defaultNS { - start.setDefaultNamespace() - } - if err := s.p.writeStart(start); err != nil { - return err - } - } - return nil -} - -// A MarshalXMLError is returned when Marshal encounters a type -// that cannot be converted into XML. -type UnsupportedTypeError struct { - Type reflect.Type -} - -func (e *UnsupportedTypeError) Error() string { - return "xml: unsupported type: " + e.Type.String() -} - -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - } - return false -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go b/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go deleted file mode 100644 index 5dc78e74..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/marshal_test.go +++ /dev/null @@ -1,1939 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "errors" - "fmt" - "io" - "reflect" - "strconv" - "strings" - "sync" - "testing" - "time" -) - -type DriveType int - -const ( - HyperDrive DriveType = iota - ImprobabilityDrive -) - -type Passenger struct { - Name []string `xml:"name"` - Weight float32 `xml:"weight"` -} - -type Ship struct { - XMLName struct{} `xml:"spaceship"` - - Name string `xml:"name,attr"` - Pilot string `xml:"pilot,attr"` - Drive DriveType `xml:"drive"` - Age uint `xml:"age"` - Passenger []*Passenger `xml:"passenger"` - secret string -} - -type NamedType string - -type Port struct { - XMLName struct{} `xml:"port"` - Type string `xml:"type,attr,omitempty"` - Comment string `xml:",comment"` - Number string `xml:",chardata"` -} - -type Domain struct { - XMLName struct{} `xml:"domain"` - Country string `xml:",attr,omitempty"` - Name []byte `xml:",chardata"` - Comment []byte `xml:",comment"` -} - -type Book struct { - XMLName struct{} `xml:"book"` - Title string `xml:",chardata"` -} - -type Event struct { - XMLName struct{} `xml:"event"` - Year int `xml:",chardata"` -} - -type Movie struct { - XMLName struct{} `xml:"movie"` - Length uint `xml:",chardata"` -} - -type Pi struct { - XMLName struct{} `xml:"pi"` - Approximation float32 `xml:",chardata"` -} - -type Universe struct { - XMLName struct{} `xml:"universe"` - Visible float64 `xml:",chardata"` -} - -type Particle struct { - XMLName struct{} `xml:"particle"` - HasMass bool `xml:",chardata"` -} - -type Departure struct { - XMLName struct{} `xml:"departure"` - When time.Time `xml:",chardata"` -} - -type SecretAgent struct { - XMLName struct{} `xml:"agent"` - Handle string `xml:"handle,attr"` - Identity string - Obfuscate string `xml:",innerxml"` -} - -type NestedItems struct { - XMLName struct{} `xml:"result"` - Items []string `xml:">item"` - Item1 []string `xml:"Items>item1"` -} - -type NestedOrder struct { - XMLName struct{} `xml:"result"` - Field1 string `xml:"parent>c"` - Field2 string `xml:"parent>b"` - Field3 string `xml:"parent>a"` -} - -type MixedNested struct { - XMLName struct{} `xml:"result"` - A string `xml:"parent1>a"` - B string `xml:"b"` - C string `xml:"parent1>parent2>c"` - D string `xml:"parent1>d"` -} - -type NilTest struct { - A interface{} `xml:"parent1>parent2>a"` - B interface{} `xml:"parent1>b"` - C interface{} `xml:"parent1>parent2>c"` -} - -type Service struct { - XMLName struct{} `xml:"service"` - Domain *Domain `xml:"host>domain"` - Port *Port `xml:"host>port"` - Extra1 interface{} - Extra2 interface{} `xml:"host>extra2"` -} - -var nilStruct *Ship - -type EmbedA struct { - EmbedC - EmbedB EmbedB - FieldA string -} - -type EmbedB struct { - FieldB string - *EmbedC -} - -type EmbedC struct { - FieldA1 string `xml:"FieldA>A1"` - FieldA2 string `xml:"FieldA>A2"` - FieldB string - FieldC string -} - -type NameCasing struct { - XMLName struct{} `xml:"casing"` - Xy string - XY string - XyA string `xml:"Xy,attr"` - XYA string `xml:"XY,attr"` -} - -type NamePrecedence struct { - XMLName Name `xml:"Parent"` - FromTag XMLNameWithoutTag `xml:"InTag"` - FromNameVal XMLNameWithoutTag - FromNameTag XMLNameWithTag - InFieldName string -} - -type XMLNameWithTag struct { - XMLName Name `xml:"InXMLNameTag"` - Value string `xml:",chardata"` -} - -type XMLNameWithNSTag struct { - XMLName Name `xml:"ns InXMLNameWithNSTag"` - Value string `xml:",chardata"` -} - -type XMLNameWithoutTag struct { - XMLName Name - Value string `xml:",chardata"` -} - -type NameInField struct { - Foo Name `xml:"ns foo"` -} - -type AttrTest struct { - Int int `xml:",attr"` - Named int `xml:"int,attr"` - Float float64 `xml:",attr"` - Uint8 uint8 `xml:",attr"` - Bool bool `xml:",attr"` - Str string `xml:",attr"` - Bytes []byte `xml:",attr"` -} - -type OmitAttrTest struct { - Int int `xml:",attr,omitempty"` - Named int `xml:"int,attr,omitempty"` - Float float64 `xml:",attr,omitempty"` - Uint8 uint8 `xml:",attr,omitempty"` - Bool bool `xml:",attr,omitempty"` - Str string `xml:",attr,omitempty"` - Bytes []byte `xml:",attr,omitempty"` -} - -type OmitFieldTest struct { - Int int `xml:",omitempty"` - Named int `xml:"int,omitempty"` - Float float64 `xml:",omitempty"` - Uint8 uint8 `xml:",omitempty"` - Bool bool `xml:",omitempty"` - Str string `xml:",omitempty"` - Bytes []byte `xml:",omitempty"` - Ptr *PresenceTest `xml:",omitempty"` -} - -type AnyTest struct { - XMLName struct{} `xml:"a"` - Nested string `xml:"nested>value"` - AnyField AnyHolder `xml:",any"` -} - -type AnyOmitTest struct { - XMLName struct{} `xml:"a"` - Nested string `xml:"nested>value"` - AnyField *AnyHolder `xml:",any,omitempty"` -} - -type AnySliceTest struct { - XMLName struct{} `xml:"a"` - Nested string `xml:"nested>value"` - AnyField []AnyHolder `xml:",any"` -} - -type AnyHolder struct { - XMLName Name - XML string `xml:",innerxml"` -} - -type RecurseA struct { - A string - B *RecurseB -} - -type RecurseB struct { - A *RecurseA - B string -} - -type PresenceTest struct { - Exists *struct{} -} - -type IgnoreTest struct { - PublicSecret string `xml:"-"` -} - -type MyBytes []byte - -type Data struct { - Bytes []byte - Attr []byte `xml:",attr"` - Custom MyBytes -} - -type Plain struct { - V interface{} -} - -type MyInt int - -type EmbedInt struct { - MyInt -} - -type Strings struct { - X []string `xml:"A>B,omitempty"` -} - -type PointerFieldsTest struct { - XMLName Name `xml:"dummy"` - Name *string `xml:"name,attr"` - Age *uint `xml:"age,attr"` - Empty *string `xml:"empty,attr"` - Contents *string `xml:",chardata"` -} - -type ChardataEmptyTest struct { - XMLName Name `xml:"test"` - Contents *string `xml:",chardata"` -} - -type MyMarshalerTest struct { -} - -var _ Marshaler = (*MyMarshalerTest)(nil) - -func (m *MyMarshalerTest) MarshalXML(e *Encoder, start StartElement) error { - e.EncodeToken(start) - e.EncodeToken(CharData([]byte("hello world"))) - e.EncodeToken(EndElement{start.Name}) - return nil -} - -type MyMarshalerAttrTest struct{} - -var _ MarshalerAttr = (*MyMarshalerAttrTest)(nil) - -func (m *MyMarshalerAttrTest) MarshalXMLAttr(name Name) (Attr, error) { - return Attr{name, "hello world"}, nil -} - -type MyMarshalerValueAttrTest struct{} - -var _ MarshalerAttr = MyMarshalerValueAttrTest{} - -func (m MyMarshalerValueAttrTest) MarshalXMLAttr(name Name) (Attr, error) { - return Attr{name, "hello world"}, nil -} - -type MarshalerStruct struct { - Foo MyMarshalerAttrTest `xml:",attr"` -} - -type MarshalerValueStruct struct { - Foo MyMarshalerValueAttrTest `xml:",attr"` -} - -type InnerStruct struct { - XMLName Name `xml:"testns outer"` -} - -type OuterStruct struct { - InnerStruct - IntAttr int `xml:"int,attr"` -} - -type OuterNamedStruct struct { - InnerStruct - XMLName Name `xml:"outerns test"` - IntAttr int `xml:"int,attr"` -} - -type OuterNamedOrderedStruct struct { - XMLName Name `xml:"outerns test"` - InnerStruct - IntAttr int `xml:"int,attr"` -} - -type OuterOuterStruct struct { - OuterStruct -} - -type NestedAndChardata struct { - AB []string `xml:"A>B"` - Chardata string `xml:",chardata"` -} - -type NestedAndComment struct { - AB []string `xml:"A>B"` - Comment string `xml:",comment"` -} - -type XMLNSFieldStruct struct { - Ns string `xml:"xmlns,attr"` - Body string -} - -type NamedXMLNSFieldStruct struct { - XMLName struct{} `xml:"testns test"` - Ns string `xml:"xmlns,attr"` - Body string -} - -type XMLNSFieldStructWithOmitEmpty struct { - Ns string `xml:"xmlns,attr,omitempty"` - Body string -} - -type NamedXMLNSFieldStructWithEmptyNamespace struct { - XMLName struct{} `xml:"test"` - Ns string `xml:"xmlns,attr"` - Body string -} - -type RecursiveXMLNSFieldStruct struct { - Ns string `xml:"xmlns,attr"` - Body *RecursiveXMLNSFieldStruct `xml:",omitempty"` - Text string `xml:",omitempty"` -} - -func ifaceptr(x interface{}) interface{} { - return &x -} - -var ( - nameAttr = "Sarah" - ageAttr = uint(12) - contentsAttr = "lorem ipsum" -) - -// Unless explicitly stated as such (or *Plain), all of the -// tests below are two-way tests. When introducing new tests, -// please try to make them two-way as well to ensure that -// marshalling and unmarshalling are as symmetrical as feasible. -var marshalTests = []struct { - Value interface{} - ExpectXML string - MarshalOnly bool - UnmarshalOnly bool -}{ - // Test nil marshals to nothing - {Value: nil, ExpectXML: ``, MarshalOnly: true}, - {Value: nilStruct, ExpectXML: ``, MarshalOnly: true}, - - // Test value types - {Value: &Plain{true}, ExpectXML: `<Plain><V>true</V></Plain>`}, - {Value: &Plain{false}, ExpectXML: `<Plain><V>false</V></Plain>`}, - {Value: &Plain{int(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{int8(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{int16(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{int32(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{uint(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{uint8(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{uint16(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{uint32(42)}, ExpectXML: `<Plain><V>42</V></Plain>`}, - {Value: &Plain{float32(1.25)}, ExpectXML: `<Plain><V>1.25</V></Plain>`}, - {Value: &Plain{float64(1.25)}, ExpectXML: `<Plain><V>1.25</V></Plain>`}, - {Value: &Plain{uintptr(0xFFDD)}, ExpectXML: `<Plain><V>65501</V></Plain>`}, - {Value: &Plain{"gopher"}, ExpectXML: `<Plain><V>gopher</V></Plain>`}, - {Value: &Plain{[]byte("gopher")}, ExpectXML: `<Plain><V>gopher</V></Plain>`}, - {Value: &Plain{"</>"}, ExpectXML: `<Plain><V>&lt;/&gt;</V></Plain>`}, - {Value: &Plain{[]byte("</>")}, ExpectXML: `<Plain><V>&lt;/&gt;</V></Plain>`}, - {Value: &Plain{[3]byte{'<', '/', '>'}}, ExpectXML: `<Plain><V>&lt;/&gt;</V></Plain>`}, - {Value: &Plain{NamedType("potato")}, ExpectXML: `<Plain><V>potato</V></Plain>`}, - {Value: &Plain{[]int{1, 2, 3}}, ExpectXML: `<Plain><V>1</V><V>2</V><V>3</V></Plain>`}, - {Value: &Plain{[3]int{1, 2, 3}}, ExpectXML: `<Plain><V>1</V><V>2</V><V>3</V></Plain>`}, - {Value: ifaceptr(true), MarshalOnly: true, ExpectXML: `<bool>true</bool>`}, - - // Test time. - { - Value: &Plain{time.Unix(1e9, 123456789).UTC()}, - ExpectXML: `<Plain><V>2001-09-09T01:46:40.123456789Z</V></Plain>`, - }, - - // A pointer to struct{} may be used to test for an element's presence. - { - Value: &PresenceTest{new(struct{})}, - ExpectXML: `<PresenceTest><Exists></Exists></PresenceTest>`, - }, - { - Value: &PresenceTest{}, - ExpectXML: `<PresenceTest></PresenceTest>`, - }, - - // A pointer to struct{} may be used to test for an element's presence. - { - Value: &PresenceTest{new(struct{})}, - ExpectXML: `<PresenceTest><Exists></Exists></PresenceTest>`, - }, - { - Value: &PresenceTest{}, - ExpectXML: `<PresenceTest></PresenceTest>`, - }, - - // A []byte field is only nil if the element was not found. - { - Value: &Data{}, - ExpectXML: `<Data></Data>`, - UnmarshalOnly: true, - }, - { - Value: &Data{Bytes: []byte{}, Custom: MyBytes{}, Attr: []byte{}}, - ExpectXML: `<Data Attr=""><Bytes></Bytes><Custom></Custom></Data>`, - UnmarshalOnly: true, - }, - - // Check that []byte works, including named []byte types. - { - Value: &Data{Bytes: []byte("ab"), Custom: MyBytes("cd"), Attr: []byte{'v'}}, - ExpectXML: `<Data Attr="v"><Bytes>ab</Bytes><Custom>cd</Custom></Data>`, - }, - - // Test innerxml - { - Value: &SecretAgent{ - Handle: "007", - Identity: "James Bond", - Obfuscate: "<redacted/>", - }, - ExpectXML: `<agent handle="007"><Identity>James Bond</Identity><redacted/></agent>`, - MarshalOnly: true, - }, - { - Value: &SecretAgent{ - Handle: "007", - Identity: "James Bond", - Obfuscate: "<Identity>James Bond</Identity><redacted/>", - }, - ExpectXML: `<agent handle="007"><Identity>James Bond</Identity><redacted/></agent>`, - UnmarshalOnly: true, - }, - - // Test structs - {Value: &Port{Type: "ssl", Number: "443"}, ExpectXML: `<port type="ssl">443</port>`}, - {Value: &Port{Number: "443"}, ExpectXML: `<port>443</port>`}, - {Value: &Port{Type: "<unix>"}, ExpectXML: `<port type="&lt;unix&gt;"></port>`}, - {Value: &Port{Number: "443", Comment: "https"}, ExpectXML: `<port><!--https-->443</port>`}, - {Value: &Port{Number: "443", Comment: "add space-"}, ExpectXML: `<port><!--add space- -->443</port>`, MarshalOnly: true}, - {Value: &Domain{Name: []byte("google.com&friends")}, ExpectXML: `<domain>google.com&amp;friends</domain>`}, - {Value: &Domain{Name: []byte("google.com"), Comment: []byte(" &friends ")}, ExpectXML: `<domain>google.com<!-- &friends --></domain>`}, - {Value: &Book{Title: "Pride & Prejudice"}, ExpectXML: `<book>Pride &amp; Prejudice</book>`}, - {Value: &Event{Year: -3114}, ExpectXML: `<event>-3114</event>`}, - {Value: &Movie{Length: 13440}, ExpectXML: `<movie>13440</movie>`}, - {Value: &Pi{Approximation: 3.14159265}, ExpectXML: `<pi>3.1415927</pi>`}, - {Value: &Universe{Visible: 9.3e13}, ExpectXML: `<universe>9.3e+13</universe>`}, - {Value: &Particle{HasMass: true}, ExpectXML: `<particle>true</particle>`}, - {Value: &Departure{When: ParseTime("2013-01-09T00:15:00-09:00")}, ExpectXML: `<departure>2013-01-09T00:15:00-09:00</departure>`}, - {Value: atomValue, ExpectXML: atomXml}, - { - Value: &Ship{ - Name: "Heart of Gold", - Pilot: "Computer", - Age: 1, - Drive: ImprobabilityDrive, - Passenger: []*Passenger{ - { - Name: []string{"Zaphod", "Beeblebrox"}, - Weight: 7.25, - }, - { - Name: []string{"Trisha", "McMillen"}, - Weight: 5.5, - }, - { - Name: []string{"Ford", "Prefect"}, - Weight: 7, - }, - { - Name: []string{"Arthur", "Dent"}, - Weight: 6.75, - }, - }, - }, - ExpectXML: `<spaceship name="Heart of Gold" pilot="Computer">` + - `<drive>` + strconv.Itoa(int(ImprobabilityDrive)) + `</drive>` + - `<age>1</age>` + - `<passenger>` + - `<name>Zaphod</name>` + - `<name>Beeblebrox</name>` + - `<weight>7.25</weight>` + - `</passenger>` + - `<passenger>` + - `<name>Trisha</name>` + - `<name>McMillen</name>` + - `<weight>5.5</weight>` + - `</passenger>` + - `<passenger>` + - `<name>Ford</name>` + - `<name>Prefect</name>` + - `<weight>7</weight>` + - `</passenger>` + - `<passenger>` + - `<name>Arthur</name>` + - `<name>Dent</name>` + - `<weight>6.75</weight>` + - `</passenger>` + - `</spaceship>`, - }, - - // Test a>b - { - Value: &NestedItems{Items: nil, Item1: nil}, - ExpectXML: `<result>` + - `<Items>` + - `</Items>` + - `</result>`, - }, - { - Value: &NestedItems{Items: []string{}, Item1: []string{}}, - ExpectXML: `<result>` + - `<Items>` + - `</Items>` + - `</result>`, - MarshalOnly: true, - }, - { - Value: &NestedItems{Items: nil, Item1: []string{"A"}}, - ExpectXML: `<result>` + - `<Items>` + - `<item1>A</item1>` + - `</Items>` + - `</result>`, - }, - { - Value: &NestedItems{Items: []string{"A", "B"}, Item1: nil}, - ExpectXML: `<result>` + - `<Items>` + - `<item>A</item>` + - `<item>B</item>` + - `</Items>` + - `</result>`, - }, - { - Value: &NestedItems{Items: []string{"A", "B"}, Item1: []string{"C"}}, - ExpectXML: `<result>` + - `<Items>` + - `<item>A</item>` + - `<item>B</item>` + - `<item1>C</item1>` + - `</Items>` + - `</result>`, - }, - { - Value: &NestedOrder{Field1: "C", Field2: "B", Field3: "A"}, - ExpectXML: `<result>` + - `<parent>` + - `<c>C</c>` + - `<b>B</b>` + - `<a>A</a>` + - `</parent>` + - `</result>`, - }, - { - Value: &NilTest{A: "A", B: nil, C: "C"}, - ExpectXML: `<NilTest>` + - `<parent1>` + - `<parent2><a>A</a></parent2>` + - `<parent2><c>C</c></parent2>` + - `</parent1>` + - `</NilTest>`, - MarshalOnly: true, // Uses interface{} - }, - { - Value: &MixedNested{A: "A", B: "B", C: "C", D: "D"}, - ExpectXML: `<result>` + - `<parent1><a>A</a></parent1>` + - `<b>B</b>` + - `<parent1>` + - `<parent2><c>C</c></parent2>` + - `<d>D</d>` + - `</parent1>` + - `</result>`, - }, - { - Value: &Service{Port: &Port{Number: "80"}}, - ExpectXML: `<service><host><port>80</port></host></service>`, - }, - { - Value: &Service{}, - ExpectXML: `<service></service>`, - }, - { - Value: &Service{Port: &Port{Number: "80"}, Extra1: "A", Extra2: "B"}, - ExpectXML: `<service>` + - `<host><port>80</port></host>` + - `<Extra1>A</Extra1>` + - `<host><extra2>B</extra2></host>` + - `</service>`, - MarshalOnly: true, - }, - { - Value: &Service{Port: &Port{Number: "80"}, Extra2: "example"}, - ExpectXML: `<service>` + - `<host><port>80</port></host>` + - `<host><extra2>example</extra2></host>` + - `</service>`, - MarshalOnly: true, - }, - { - Value: &struct { - XMLName struct{} `xml:"space top"` - A string `xml:"x>a"` - B string `xml:"x>b"` - C string `xml:"space x>c"` - C1 string `xml:"space1 x>c"` - D1 string `xml:"space1 x>d"` - E1 string `xml:"x>e"` - }{ - A: "a", - B: "b", - C: "c", - C1: "c1", - D1: "d1", - E1: "e1", - }, - ExpectXML: `<top xmlns="space">` + - `<x><a>a</a><b>b</b><c>c</c></x>` + - `<x xmlns="space1">` + - `<c>c1</c>` + - `<d>d1</d>` + - `</x>` + - `<x>` + - `<e>e1</e>` + - `</x>` + - `</top>`, - }, - { - Value: &struct { - XMLName Name - A string `xml:"x>a"` - B string `xml:"x>b"` - C string `xml:"space x>c"` - C1 string `xml:"space1 x>c"` - D1 string `xml:"space1 x>d"` - }{ - XMLName: Name{ - Space: "space0", - Local: "top", - }, - A: "a", - B: "b", - C: "c", - C1: "c1", - D1: "d1", - }, - ExpectXML: `<top xmlns="space0">` + - `<x><a>a</a><b>b</b></x>` + - `<x xmlns="space"><c>c</c></x>` + - `<x xmlns="space1">` + - `<c>c1</c>` + - `<d>d1</d>` + - `</x>` + - `</top>`, - }, - { - Value: &struct { - XMLName struct{} `xml:"top"` - B string `xml:"space x>b"` - B1 string `xml:"space1 x>b"` - }{ - B: "b", - B1: "b1", - }, - ExpectXML: `<top>` + - `<x xmlns="space"><b>b</b></x>` + - `<x xmlns="space1"><b>b1</b></x>` + - `</top>`, - }, - - // Test struct embedding - { - Value: &EmbedA{ - EmbedC: EmbedC{ - FieldA1: "", // Shadowed by A.A - FieldA2: "", // Shadowed by A.A - FieldB: "A.C.B", - FieldC: "A.C.C", - }, - EmbedB: EmbedB{ - FieldB: "A.B.B", - EmbedC: &EmbedC{ - FieldA1: "A.B.C.A1", - FieldA2: "A.B.C.A2", - FieldB: "", // Shadowed by A.B.B - FieldC: "A.B.C.C", - }, - }, - FieldA: "A.A", - }, - ExpectXML: `<EmbedA>` + - `<FieldB>A.C.B</FieldB>` + - `<FieldC>A.C.C</FieldC>` + - `<EmbedB>` + - `<FieldB>A.B.B</FieldB>` + - `<FieldA>` + - `<A1>A.B.C.A1</A1>` + - `<A2>A.B.C.A2</A2>` + - `</FieldA>` + - `<FieldC>A.B.C.C</FieldC>` + - `</EmbedB>` + - `<FieldA>A.A</FieldA>` + - `</EmbedA>`, - }, - - // Test that name casing matters - { - Value: &NameCasing{Xy: "mixed", XY: "upper", XyA: "mixedA", XYA: "upperA"}, - ExpectXML: `<casing Xy="mixedA" XY="upperA"><Xy>mixed</Xy><XY>upper</XY></casing>`, - }, - - // Test the order in which the XML element name is chosen - { - Value: &NamePrecedence{ - FromTag: XMLNameWithoutTag{Value: "A"}, - FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "InXMLName"}, Value: "B"}, - FromNameTag: XMLNameWithTag{Value: "C"}, - InFieldName: "D", - }, - ExpectXML: `<Parent>` + - `<InTag>A</InTag>` + - `<InXMLName>B</InXMLName>` + - `<InXMLNameTag>C</InXMLNameTag>` + - `<InFieldName>D</InFieldName>` + - `</Parent>`, - MarshalOnly: true, - }, - { - Value: &NamePrecedence{ - XMLName: Name{Local: "Parent"}, - FromTag: XMLNameWithoutTag{XMLName: Name{Local: "InTag"}, Value: "A"}, - FromNameVal: XMLNameWithoutTag{XMLName: Name{Local: "FromNameVal"}, Value: "B"}, - FromNameTag: XMLNameWithTag{XMLName: Name{Local: "InXMLNameTag"}, Value: "C"}, - InFieldName: "D", - }, - ExpectXML: `<Parent>` + - `<InTag>A</InTag>` + - `<FromNameVal>B</FromNameVal>` + - `<InXMLNameTag>C</InXMLNameTag>` + - `<InFieldName>D</InFieldName>` + - `</Parent>`, - UnmarshalOnly: true, - }, - - // xml.Name works in a plain field as well. - { - Value: &NameInField{Name{Space: "ns", Local: "foo"}}, - ExpectXML: `<NameInField><foo xmlns="ns"></foo></NameInField>`, - }, - { - Value: &NameInField{Name{Space: "ns", Local: "foo"}}, - ExpectXML: `<NameInField><foo xmlns="ns"><ignore></ignore></foo></NameInField>`, - UnmarshalOnly: true, - }, - - // Marshaling zero xml.Name uses the tag or field name. - { - Value: &NameInField{}, - ExpectXML: `<NameInField><foo xmlns="ns"></foo></NameInField>`, - MarshalOnly: true, - }, - - // Test attributes - { - Value: &AttrTest{ - Int: 8, - Named: 9, - Float: 23.5, - Uint8: 255, - Bool: true, - Str: "str", - Bytes: []byte("byt"), - }, - ExpectXML: `<AttrTest Int="8" int="9" Float="23.5" Uint8="255"` + - ` Bool="true" Str="str" Bytes="byt"></AttrTest>`, - }, - { - Value: &AttrTest{Bytes: []byte{}}, - ExpectXML: `<AttrTest Int="0" int="0" Float="0" Uint8="0"` + - ` Bool="false" Str="" Bytes=""></AttrTest>`, - }, - { - Value: &OmitAttrTest{ - Int: 8, - Named: 9, - Float: 23.5, - Uint8: 255, - Bool: true, - Str: "str", - Bytes: []byte("byt"), - }, - ExpectXML: `<OmitAttrTest Int="8" int="9" Float="23.5" Uint8="255"` + - ` Bool="true" Str="str" Bytes="byt"></OmitAttrTest>`, - }, - { - Value: &OmitAttrTest{}, - ExpectXML: `<OmitAttrTest></OmitAttrTest>`, - }, - - // pointer fields - { - Value: &PointerFieldsTest{Name: &nameAttr, Age: &ageAttr, Contents: &contentsAttr}, - ExpectXML: `<dummy name="Sarah" age="12">lorem ipsum</dummy>`, - MarshalOnly: true, - }, - - // empty chardata pointer field - { - Value: &ChardataEmptyTest{}, - ExpectXML: `<test></test>`, - MarshalOnly: true, - }, - - // omitempty on fields - { - Value: &OmitFieldTest{ - Int: 8, - Named: 9, - Float: 23.5, - Uint8: 255, - Bool: true, - Str: "str", - Bytes: []byte("byt"), - Ptr: &PresenceTest{}, - }, - ExpectXML: `<OmitFieldTest>` + - `<Int>8</Int>` + - `<int>9</int>` + - `<Float>23.5</Float>` + - `<Uint8>255</Uint8>` + - `<Bool>true</Bool>` + - `<Str>str</Str>` + - `<Bytes>byt</Bytes>` + - `<Ptr></Ptr>` + - `</OmitFieldTest>`, - }, - { - Value: &OmitFieldTest{}, - ExpectXML: `<OmitFieldTest></OmitFieldTest>`, - }, - - // Test ",any" - { - ExpectXML: `<a><nested><value>known</value></nested><other><sub>unknown</sub></other></a>`, - Value: &AnyTest{ - Nested: "known", - AnyField: AnyHolder{ - XMLName: Name{Local: "other"}, - XML: "<sub>unknown</sub>", - }, - }, - }, - { - Value: &AnyTest{Nested: "known", - AnyField: AnyHolder{ - XML: "<unknown/>", - XMLName: Name{Local: "AnyField"}, - }, - }, - ExpectXML: `<a><nested><value>known</value></nested><AnyField><unknown/></AnyField></a>`, - }, - { - ExpectXML: `<a><nested><value>b</value></nested></a>`, - Value: &AnyOmitTest{ - Nested: "b", - }, - }, - { - ExpectXML: `<a><nested><value>b</value></nested><c><d>e</d></c><g xmlns="f"><h>i</h></g></a>`, - Value: &AnySliceTest{ - Nested: "b", - AnyField: []AnyHolder{ - { - XMLName: Name{Local: "c"}, - XML: "<d>e</d>", - }, - { - XMLName: Name{Space: "f", Local: "g"}, - XML: "<h>i</h>", - }, - }, - }, - }, - { - ExpectXML: `<a><nested><value>b</value></nested></a>`, - Value: &AnySliceTest{ - Nested: "b", - }, - }, - - // Test recursive types. - { - Value: &RecurseA{ - A: "a1", - B: &RecurseB{ - A: &RecurseA{"a2", nil}, - B: "b1", - }, - }, - ExpectXML: `<RecurseA><A>a1</A><B><A><A>a2</A></A><B>b1</B></B></RecurseA>`, - }, - - // Test ignoring fields via "-" tag - { - ExpectXML: `<IgnoreTest></IgnoreTest>`, - Value: &IgnoreTest{}, - }, - { - ExpectXML: `<IgnoreTest></IgnoreTest>`, - Value: &IgnoreTest{PublicSecret: "can't tell"}, - MarshalOnly: true, - }, - { - ExpectXML: `<IgnoreTest><PublicSecret>ignore me</PublicSecret></IgnoreTest>`, - Value: &IgnoreTest{}, - UnmarshalOnly: true, - }, - - // Test escaping. - { - ExpectXML: `<a><nested><value>dquote: &#34;; squote: &#39;; ampersand: &amp;; less: &lt;; greater: &gt;;</value></nested><empty></empty></a>`, - Value: &AnyTest{ - Nested: `dquote: "; squote: '; ampersand: &; less: <; greater: >;`, - AnyField: AnyHolder{XMLName: Name{Local: "empty"}}, - }, - }, - { - ExpectXML: `<a><nested><value>newline: &#xA;; cr: &#xD;; tab: &#x9;;</value></nested><AnyField></AnyField></a>`, - Value: &AnyTest{ - Nested: "newline: \n; cr: \r; tab: \t;", - AnyField: AnyHolder{XMLName: Name{Local: "AnyField"}}, - }, - }, - { - ExpectXML: "<a><nested><value>1\r2\r\n3\n\r4\n5</value></nested></a>", - Value: &AnyTest{ - Nested: "1\n2\n3\n\n4\n5", - }, - UnmarshalOnly: true, - }, - { - ExpectXML: `<EmbedInt><MyInt>42</MyInt></EmbedInt>`, - Value: &EmbedInt{ - MyInt: 42, - }, - }, - // Test omitempty with parent chain; see golang.org/issue/4168. - { - ExpectXML: `<Strings><A></A></Strings>`, - Value: &Strings{}, - }, - // Custom marshalers. - { - ExpectXML: `<MyMarshalerTest>hello world</MyMarshalerTest>`, - Value: &MyMarshalerTest{}, - }, - { - ExpectXML: `<MarshalerStruct Foo="hello world"></MarshalerStruct>`, - Value: &MarshalerStruct{}, - }, - { - ExpectXML: `<MarshalerValueStruct Foo="hello world"></MarshalerValueStruct>`, - Value: &MarshalerValueStruct{}, - }, - { - ExpectXML: `<outer xmlns="testns" int="10"></outer>`, - Value: &OuterStruct{IntAttr: 10}, - }, - { - ExpectXML: `<test xmlns="outerns" int="10"></test>`, - Value: &OuterNamedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, - }, - { - ExpectXML: `<test xmlns="outerns" int="10"></test>`, - Value: &OuterNamedOrderedStruct{XMLName: Name{Space: "outerns", Local: "test"}, IntAttr: 10}, - }, - { - ExpectXML: `<outer xmlns="testns" int="10"></outer>`, - Value: &OuterOuterStruct{OuterStruct{IntAttr: 10}}, - }, - { - ExpectXML: `<NestedAndChardata><A><B></B><B></B></A>test</NestedAndChardata>`, - Value: &NestedAndChardata{AB: make([]string, 2), Chardata: "test"}, - }, - { - ExpectXML: `<NestedAndComment><A><B></B><B></B></A><!--test--></NestedAndComment>`, - Value: &NestedAndComment{AB: make([]string, 2), Comment: "test"}, - }, - { - ExpectXML: `<XMLNSFieldStruct xmlns="http://example.com/ns"><Body>hello world</Body></XMLNSFieldStruct>`, - Value: &XMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, - }, - { - ExpectXML: `<testns:test xmlns:testns="testns" xmlns="http://example.com/ns"><Body>hello world</Body></testns:test>`, - Value: &NamedXMLNSFieldStruct{Ns: "http://example.com/ns", Body: "hello world"}, - }, - { - ExpectXML: `<testns:test xmlns:testns="testns"><Body>hello world</Body></testns:test>`, - Value: &NamedXMLNSFieldStruct{Ns: "", Body: "hello world"}, - }, - { - ExpectXML: `<XMLNSFieldStructWithOmitEmpty><Body>hello world</Body></XMLNSFieldStructWithOmitEmpty>`, - Value: &XMLNSFieldStructWithOmitEmpty{Body: "hello world"}, - }, - { - // The xmlns attribute must be ignored because the <test> - // element is in the empty namespace, so it's not possible - // to set the default namespace to something non-empty. - ExpectXML: `<test><Body>hello world</Body></test>`, - Value: &NamedXMLNSFieldStructWithEmptyNamespace{Ns: "foo", Body: "hello world"}, - MarshalOnly: true, - }, - { - ExpectXML: `<RecursiveXMLNSFieldStruct xmlns="foo"><Body xmlns=""><Text>hello world</Text></Body></RecursiveXMLNSFieldStruct>`, - Value: &RecursiveXMLNSFieldStruct{ - Ns: "foo", - Body: &RecursiveXMLNSFieldStruct{ - Text: "hello world", - }, - }, - }, -} - -func TestMarshal(t *testing.T) { - for idx, test := range marshalTests { - if test.UnmarshalOnly { - continue - } - data, err := Marshal(test.Value) - if err != nil { - t.Errorf("#%d: marshal(%#v): %s", idx, test.Value, err) - continue - } - if got, want := string(data), test.ExpectXML; got != want { - if strings.Contains(want, "\n") { - t.Errorf("#%d: marshal(%#v):\nHAVE:\n%s\nWANT:\n%s", idx, test.Value, got, want) - } else { - t.Errorf("#%d: marshal(%#v):\nhave %#q\nwant %#q", idx, test.Value, got, want) - } - } - } -} - -type AttrParent struct { - X string `xml:"X>Y,attr"` -} - -type BadAttr struct { - Name []string `xml:"name,attr"` -} - -var marshalErrorTests = []struct { - Value interface{} - Err string - Kind reflect.Kind -}{ - { - Value: make(chan bool), - Err: "xml: unsupported type: chan bool", - Kind: reflect.Chan, - }, - { - Value: map[string]string{ - "question": "What do you get when you multiply six by nine?", - "answer": "42", - }, - Err: "xml: unsupported type: map[string]string", - Kind: reflect.Map, - }, - { - Value: map[*Ship]bool{nil: false}, - Err: "xml: unsupported type: map[*xml.Ship]bool", - Kind: reflect.Map, - }, - { - Value: &Domain{Comment: []byte("f--bar")}, - Err: `xml: comments must not contain "--"`, - }, - // Reject parent chain with attr, never worked; see golang.org/issue/5033. - { - Value: &AttrParent{}, - Err: `xml: X>Y chain not valid with attr flag`, - }, - { - Value: BadAttr{[]string{"X", "Y"}}, - Err: `xml: unsupported type: []string`, - }, -} - -var marshalIndentTests = []struct { - Value interface{} - Prefix string - Indent string - ExpectXML string -}{ - { - Value: &SecretAgent{ - Handle: "007", - Identity: "James Bond", - Obfuscate: "<redacted/>", - }, - Prefix: "", - Indent: "\t", - ExpectXML: fmt.Sprintf("<agent handle=\"007\">\n\t<Identity>James Bond</Identity><redacted/>\n</agent>"), - }, -} - -func TestMarshalErrors(t *testing.T) { - for idx, test := range marshalErrorTests { - data, err := Marshal(test.Value) - if err == nil { - t.Errorf("#%d: marshal(%#v) = [success] %q, want error %v", idx, test.Value, data, test.Err) - continue - } - if err.Error() != test.Err { - t.Errorf("#%d: marshal(%#v) = [error] %v, want %v", idx, test.Value, err, test.Err) - } - if test.Kind != reflect.Invalid { - if kind := err.(*UnsupportedTypeError).Type.Kind(); kind != test.Kind { - t.Errorf("#%d: marshal(%#v) = [error kind] %s, want %s", idx, test.Value, kind, test.Kind) - } - } - } -} - -// Do invertibility testing on the various structures that we test -func TestUnmarshal(t *testing.T) { - for i, test := range marshalTests { - if test.MarshalOnly { - continue - } - if _, ok := test.Value.(*Plain); ok { - continue - } - vt := reflect.TypeOf(test.Value) - dest := reflect.New(vt.Elem()).Interface() - err := Unmarshal([]byte(test.ExpectXML), dest) - - switch fix := dest.(type) { - case *Feed: - fix.Author.InnerXML = "" - for i := range fix.Entry { - fix.Entry[i].Author.InnerXML = "" - } - } - - if err != nil { - t.Errorf("#%d: unexpected error: %#v", i, err) - } else if got, want := dest, test.Value; !reflect.DeepEqual(got, want) { - t.Errorf("#%d: unmarshal(%q):\nhave %#v\nwant %#v", i, test.ExpectXML, got, want) - } - } -} - -func TestMarshalIndent(t *testing.T) { - for i, test := range marshalIndentTests { - data, err := MarshalIndent(test.Value, test.Prefix, test.Indent) - if err != nil { - t.Errorf("#%d: Error: %s", i, err) - continue - } - if got, want := string(data), test.ExpectXML; got != want { - t.Errorf("#%d: MarshalIndent:\nGot:%s\nWant:\n%s", i, got, want) - } - } -} - -type limitedBytesWriter struct { - w io.Writer - remain int // until writes fail -} - -func (lw *limitedBytesWriter) Write(p []byte) (n int, err error) { - if lw.remain <= 0 { - println("error") - return 0, errors.New("write limit hit") - } - if len(p) > lw.remain { - p = p[:lw.remain] - n, _ = lw.w.Write(p) - lw.remain = 0 - return n, errors.New("write limit hit") - } - n, err = lw.w.Write(p) - lw.remain -= n - return n, err -} - -func TestMarshalWriteErrors(t *testing.T) { - var buf bytes.Buffer - const writeCap = 1024 - w := &limitedBytesWriter{&buf, writeCap} - enc := NewEncoder(w) - var err error - var i int - const n = 4000 - for i = 1; i <= n; i++ { - err = enc.Encode(&Passenger{ - Name: []string{"Alice", "Bob"}, - Weight: 5, - }) - if err != nil { - break - } - } - if err == nil { - t.Error("expected an error") - } - if i == n { - t.Errorf("expected to fail before the end") - } - if buf.Len() != writeCap { - t.Errorf("buf.Len() = %d; want %d", buf.Len(), writeCap) - } -} - -func TestMarshalWriteIOErrors(t *testing.T) { - enc := NewEncoder(errWriter{}) - - expectErr := "unwritable" - err := enc.Encode(&Passenger{}) - if err == nil || err.Error() != expectErr { - t.Errorf("EscapeTest = [error] %v, want %v", err, expectErr) - } -} - -func TestMarshalFlush(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - if err := enc.EncodeToken(CharData("hello world")); err != nil { - t.Fatalf("enc.EncodeToken: %v", err) - } - if buf.Len() > 0 { - t.Fatalf("enc.EncodeToken caused actual write: %q", buf.Bytes()) - } - if err := enc.Flush(); err != nil { - t.Fatalf("enc.Flush: %v", err) - } - if buf.String() != "hello world" { - t.Fatalf("after enc.Flush, buf.String() = %q, want %q", buf.String(), "hello world") - } -} - -var encodeElementTests = []struct { - desc string - value interface{} - start StartElement - expectXML string -}{{ - desc: "simple string", - value: "hello", - start: StartElement{ - Name: Name{Local: "a"}, - }, - expectXML: `<a>hello</a>`, -}, { - desc: "string with added attributes", - value: "hello", - start: StartElement{ - Name: Name{Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "x"}, - Value: "y", - }, { - Name: Name{Local: "foo"}, - Value: "bar", - }}, - }, - expectXML: `<a x="y" foo="bar">hello</a>`, -}, { - desc: "start element with default name space", - value: struct { - Foo XMLNameWithNSTag - }{ - Foo: XMLNameWithNSTag{ - Value: "hello", - }, - }, - start: StartElement{ - Name: Name{Space: "ns", Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "xmlns"}, - // "ns" is the name space defined in XMLNameWithNSTag - Value: "ns", - }}, - }, - expectXML: `<a xmlns="ns"><InXMLNameWithNSTag>hello</InXMLNameWithNSTag></a>`, -}, { - desc: "start element in name space with different default name space", - value: struct { - Foo XMLNameWithNSTag - }{ - Foo: XMLNameWithNSTag{ - Value: "hello", - }, - }, - start: StartElement{ - Name: Name{Space: "ns2", Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "xmlns"}, - // "ns" is the name space defined in XMLNameWithNSTag - Value: "ns", - }}, - }, - expectXML: `<ns2:a xmlns:ns2="ns2" xmlns="ns"><InXMLNameWithNSTag>hello</InXMLNameWithNSTag></ns2:a>`, -}, { - desc: "XMLMarshaler with start element with default name space", - value: &MyMarshalerTest{}, - start: StartElement{ - Name: Name{Space: "ns2", Local: "a"}, - Attr: []Attr{{ - Name: Name{Local: "xmlns"}, - // "ns" is the name space defined in XMLNameWithNSTag - Value: "ns", - }}, - }, - expectXML: `<ns2:a xmlns:ns2="ns2" xmlns="ns">hello world</ns2:a>`, -}} - -func TestEncodeElement(t *testing.T) { - for idx, test := range encodeElementTests { - var buf bytes.Buffer - enc := NewEncoder(&buf) - err := enc.EncodeElement(test.value, test.start) - if err != nil { - t.Fatalf("enc.EncodeElement: %v", err) - } - err = enc.Flush() - if err != nil { - t.Fatalf("enc.Flush: %v", err) - } - if got, want := buf.String(), test.expectXML; got != want { - t.Errorf("#%d(%s): EncodeElement(%#v, %#v):\nhave %#q\nwant %#q", idx, test.desc, test.value, test.start, got, want) - } - } -} - -func BenchmarkMarshal(b *testing.B) { - b.ReportAllocs() - for i := 0; i < b.N; i++ { - Marshal(atomValue) - } -} - -func BenchmarkUnmarshal(b *testing.B) { - b.ReportAllocs() - xml := []byte(atomXml) - for i := 0; i < b.N; i++ { - Unmarshal(xml, &Feed{}) - } -} - -// golang.org/issue/6556 -func TestStructPointerMarshal(t *testing.T) { - type A struct { - XMLName string `xml:"a"` - B []interface{} - } - type C struct { - XMLName Name - Value string `xml:"value"` - } - - a := new(A) - a.B = append(a.B, &C{ - XMLName: Name{Local: "c"}, - Value: "x", - }) - - b, err := Marshal(a) - if err != nil { - t.Fatal(err) - } - if x := string(b); x != "<a><c><value>x</value></c></a>" { - t.Fatal(x) - } - var v A - err = Unmarshal(b, &v) - if err != nil { - t.Fatal(err) - } -} - -var encodeTokenTests = []struct { - desc string - toks []Token - want string - err string -}{{ - desc: "start element with name space", - toks: []Token{ - StartElement{Name{"space", "local"}, nil}, - }, - want: `<space:local xmlns:space="space">`, -}, { - desc: "start element with no name", - toks: []Token{ - StartElement{Name{"space", ""}, nil}, - }, - err: "xml: start tag with no name", -}, { - desc: "end element with no name", - toks: []Token{ - EndElement{Name{"space", ""}}, - }, - err: "xml: end tag with no name", -}, { - desc: "char data", - toks: []Token{ - CharData("foo"), - }, - want: `foo`, -}, { - desc: "char data with escaped chars", - toks: []Token{ - CharData(" \t\n"), - }, - want: " &#x9;\n", -}, { - desc: "comment", - toks: []Token{ - Comment("foo"), - }, - want: `<!--foo-->`, -}, { - desc: "comment with invalid content", - toks: []Token{ - Comment("foo-->"), - }, - err: "xml: EncodeToken of Comment containing --> marker", -}, { - desc: "proc instruction", - toks: []Token{ - ProcInst{"Target", []byte("Instruction")}, - }, - want: `<?Target Instruction?>`, -}, { - desc: "proc instruction with empty target", - toks: []Token{ - ProcInst{"", []byte("Instruction")}, - }, - err: "xml: EncodeToken of ProcInst with invalid Target", -}, { - desc: "proc instruction with bad content", - toks: []Token{ - ProcInst{"", []byte("Instruction?>")}, - }, - err: "xml: EncodeToken of ProcInst with invalid Target", -}, { - desc: "directive", - toks: []Token{ - Directive("foo"), - }, - want: `<!foo>`, -}, { - desc: "more complex directive", - toks: []Token{ - Directive("DOCTYPE doc [ <!ELEMENT doc '>'> <!-- com>ment --> ]"), - }, - want: `<!DOCTYPE doc [ <!ELEMENT doc '>'> <!-- com>ment --> ]>`, -}, { - desc: "directive instruction with bad name", - toks: []Token{ - Directive("foo>"), - }, - err: "xml: EncodeToken of Directive containing wrong < or > markers", -}, { - desc: "end tag without start tag", - toks: []Token{ - EndElement{Name{"foo", "bar"}}, - }, - err: "xml: end tag </bar> without start tag", -}, { - desc: "mismatching end tag local name", - toks: []Token{ - StartElement{Name{"", "foo"}, nil}, - EndElement{Name{"", "bar"}}, - }, - err: "xml: end tag </bar> does not match start tag <foo>", - want: `<foo>`, -}, { - desc: "mismatching end tag namespace", - toks: []Token{ - StartElement{Name{"space", "foo"}, nil}, - EndElement{Name{"another", "foo"}}, - }, - err: "xml: end tag </foo> in namespace another does not match start tag <foo> in namespace space", - want: `<space:foo xmlns:space="space">`, -}, { - desc: "start element with explicit namespace", - toks: []Token{ - StartElement{Name{"space", "local"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - {Name{"space", "foo"}, "value"}, - }}, - }, - want: `<x:local xmlns:x="space" x:foo="value">`, -}, { - desc: "start element with explicit namespace and colliding prefix", - toks: []Token{ - StartElement{Name{"space", "local"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - {Name{"space", "foo"}, "value"}, - {Name{"x", "bar"}, "other"}, - }}, - }, - want: `<x:local xmlns:x_1="x" xmlns:x="space" x:foo="value" x_1:bar="other">`, -}, { - desc: "start element using previously defined namespace", - toks: []Token{ - StartElement{Name{"", "local"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"space", "x"}, "y"}, - }}, - }, - want: `<local xmlns:x="space"><x:foo x:x="y">`, -}, { - desc: "nested name space with same prefix", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space1"}, - }}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space2"}, - }}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"space1", "a"}, "space1 value"}, - {Name{"space2", "b"}, "space2 value"}, - }}, - EndElement{Name{"", "foo"}}, - EndElement{Name{"", "foo"}}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"space1", "a"}, "space1 value"}, - {Name{"space2", "b"}, "space2 value"}, - }}, - }, - want: `<foo xmlns:x="space1"><foo xmlns:x="space2"><foo xmlns:space1="space1" space1:a="space1 value" x:b="space2 value"></foo></foo><foo xmlns:space2="space2" x:a="space1 value" space2:b="space2 value">`, -}, { - desc: "start element defining several prefixes for the same name space", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xmlns", "a"}, "space"}, - {Name{"xmlns", "b"}, "space"}, - {Name{"space", "x"}, "value"}, - }}, - }, - want: `<a:foo xmlns:a="space" a:x="value">`, -}, { - desc: "nested element redefines name space", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xmlns", "y"}, "space"}, - {Name{"space", "a"}, "value"}, - }}, - }, - want: `<foo xmlns:x="space"><x:foo x:a="value">`, -}, { - desc: "nested element creates alias for default name space", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xmlns", "y"}, "space"}, - {Name{"space", "a"}, "value"}, - }}, - }, - want: `<foo xmlns="space"><foo xmlns:y="space" y:a="value">`, -}, { - desc: "nested element defines default name space with existing prefix", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "x"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - {Name{"space", "a"}, "value"}, - }}, - }, - want: `<foo xmlns:x="space"><foo xmlns="space" x:a="value">`, -}, { - desc: "nested element uses empty attribute name space when default ns defined", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "attr"}, "value"}, - }}, - }, - want: `<foo xmlns="space"><foo attr="value">`, -}, { - desc: "redefine xmlns", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"foo", "xmlns"}, "space"}, - }}, - }, - err: `xml: cannot redefine xmlns attribute prefix`, -}, { - desc: "xmlns with explicit name space #1", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"xml", "xmlns"}, "space"}, - }}, - }, - want: `<foo xmlns="space">`, -}, { - desc: "xmlns with explicit name space #2", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{xmlURL, "xmlns"}, "space"}, - }}, - }, - want: `<foo xmlns="space">`, -}, { - desc: "empty name space declaration is ignored", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"xmlns", "foo"}, ""}, - }}, - }, - want: `<foo>`, -}, { - desc: "attribute with no name is ignored", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"", ""}, "value"}, - }}, - }, - want: `<foo>`, -}, { - desc: "namespace URL with non-valid name", - toks: []Token{ - StartElement{Name{"/34", "foo"}, []Attr{ - {Name{"/34", "x"}, "value"}, - }}, - }, - want: `<_:foo xmlns:_="/34" _:x="value">`, -}, { - desc: "nested element resets default namespace to empty", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"", "foo"}, []Attr{ - {Name{"", "xmlns"}, ""}, - {Name{"", "x"}, "value"}, - {Name{"space", "x"}, "value"}, - }}, - }, - want: `<foo xmlns="space"><foo xmlns:space="space" xmlns="" x="value" space:x="value">`, -}, { - desc: "nested element requires empty default name space", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"", "foo"}, nil}, - }, - want: `<foo xmlns="space"><foo xmlns="">`, -}, { - desc: "attribute uses name space from xmlns", - toks: []Token{ - StartElement{Name{"some/space", "foo"}, []Attr{ - {Name{"", "attr"}, "value"}, - {Name{"some/space", "other"}, "other value"}, - }}, - }, - want: `<space:foo xmlns:space="some/space" attr="value" space:other="other value">`, -}, { - desc: "default name space should not be used by attributes", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - {Name{"xmlns", "bar"}, "space"}, - {Name{"space", "baz"}, "foo"}, - }}, - StartElement{Name{"space", "baz"}, nil}, - EndElement{Name{"space", "baz"}}, - EndElement{Name{"space", "foo"}}, - }, - want: `<foo xmlns:bar="space" xmlns="space" bar:baz="foo"><baz></baz></foo>`, -}, { - desc: "default name space not used by attributes, not explicitly defined", - toks: []Token{ - StartElement{Name{"space", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - {Name{"space", "baz"}, "foo"}, - }}, - StartElement{Name{"space", "baz"}, nil}, - EndElement{Name{"space", "baz"}}, - EndElement{Name{"space", "foo"}}, - }, - want: `<foo xmlns:space="space" xmlns="space" space:baz="foo"><baz></baz></foo>`, -}, { - desc: "impossible xmlns declaration", - toks: []Token{ - StartElement{Name{"", "foo"}, []Attr{ - {Name{"", "xmlns"}, "space"}, - }}, - StartElement{Name{"space", "bar"}, []Attr{ - {Name{"space", "attr"}, "value"}, - }}, - }, - want: `<foo><space:bar xmlns:space="space" space:attr="value">`, -}} - -func TestEncodeToken(t *testing.T) { -loop: - for i, tt := range encodeTokenTests { - var buf bytes.Buffer - enc := NewEncoder(&buf) - var err error - for j, tok := range tt.toks { - err = enc.EncodeToken(tok) - if err != nil && j < len(tt.toks)-1 { - t.Errorf("#%d %s token #%d: %v", i, tt.desc, j, err) - continue loop - } - } - errorf := func(f string, a ...interface{}) { - t.Errorf("#%d %s token #%d:%s", i, tt.desc, len(tt.toks)-1, fmt.Sprintf(f, a...)) - } - switch { - case tt.err != "" && err == nil: - errorf(" expected error; got none") - continue - case tt.err == "" && err != nil: - errorf(" got error: %v", err) - continue - case tt.err != "" && err != nil && tt.err != err.Error(): - errorf(" error mismatch; got %v, want %v", err, tt.err) - continue - } - if err := enc.Flush(); err != nil { - errorf(" %v", err) - continue - } - if got := buf.String(); got != tt.want { - errorf("\ngot %v\nwant %v", got, tt.want) - continue - } - } -} - -func TestProcInstEncodeToken(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - - if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err != nil { - t.Fatalf("enc.EncodeToken: expected to be able to encode xml target ProcInst as first token, %s", err) - } - - if err := enc.EncodeToken(ProcInst{"Target", []byte("Instruction")}); err != nil { - t.Fatalf("enc.EncodeToken: expected to be able to add non-xml target ProcInst") - } - - if err := enc.EncodeToken(ProcInst{"xml", []byte("Instruction")}); err == nil { - t.Fatalf("enc.EncodeToken: expected to not be allowed to encode xml target ProcInst when not first token") - } -} - -func TestDecodeEncode(t *testing.T) { - var in, out bytes.Buffer - in.WriteString(`<?xml version="1.0" encoding="UTF-8"?> -<?Target Instruction?> -<root> -</root> -`) - dec := NewDecoder(&in) - enc := NewEncoder(&out) - for tok, err := dec.Token(); err == nil; tok, err = dec.Token() { - err = enc.EncodeToken(tok) - if err != nil { - t.Fatalf("enc.EncodeToken: Unable to encode token (%#v), %v", tok, err) - } - } -} - -// Issue 9796. Used to fail with GORACE="halt_on_error=1" -race. -func TestRace9796(t *testing.T) { - type A struct{} - type B struct { - C []A `xml:"X>Y"` - } - var wg sync.WaitGroup - for i := 0; i < 2; i++ { - wg.Add(1) - go func() { - Marshal(B{[]A{A{}}}) - wg.Done() - }() - } - wg.Wait() -} - -func TestIsValidDirective(t *testing.T) { - testOK := []string{ - "<>", - "< < > >", - "<!DOCTYPE '<' '>' '>' <!--nothing-->>", - "<!DOCTYPE doc [ <!ELEMENT doc ANY> <!ELEMENT doc ANY> ]>", - "<!DOCTYPE doc [ <!ELEMENT doc \"ANY> '<' <!E\" LEMENT '>' doc ANY> ]>", - "<!DOCTYPE doc <!-- just>>>> a < comment --> [ <!ITEM anything> ] >", - } - testKO := []string{ - "<", - ">", - "<!--", - "-->", - "< > > < < >", - "<!dummy <!-- > -->", - "<!DOCTYPE doc '>", - "<!DOCTYPE doc '>'", - "<!DOCTYPE doc <!--comment>", - } - for _, s := range testOK { - if !isValidDirective(Directive(s)) { - t.Errorf("Directive %q is expected to be valid", s) - } - } - for _, s := range testKO { - if isValidDirective(Directive(s)) { - t.Errorf("Directive %q is expected to be invalid", s) - } - } -} - -// Issue 11719. EncodeToken used to silently eat tokens with an invalid type. -func TestSimpleUseOfEncodeToken(t *testing.T) { - var buf bytes.Buffer - enc := NewEncoder(&buf) - if err := enc.EncodeToken(&StartElement{Name: Name{"", "object1"}}); err == nil { - t.Errorf("enc.EncodeToken: pointer type should be rejected") - } - if err := enc.EncodeToken(&EndElement{Name: Name{"", "object1"}}); err == nil { - t.Errorf("enc.EncodeToken: pointer type should be rejected") - } - if err := enc.EncodeToken(StartElement{Name: Name{"", "object2"}}); err != nil { - t.Errorf("enc.EncodeToken: StartElement %s", err) - } - if err := enc.EncodeToken(EndElement{Name: Name{"", "object2"}}); err != nil { - t.Errorf("enc.EncodeToken: EndElement %s", err) - } - if err := enc.EncodeToken(Universe{}); err == nil { - t.Errorf("enc.EncodeToken: invalid type not caught") - } - if err := enc.Flush(); err != nil { - t.Errorf("enc.Flush: %s", err) - } - if buf.Len() == 0 { - t.Errorf("enc.EncodeToken: empty buffer") - } - want := "<object2></object2>" - if buf.String() != want { - t.Errorf("enc.EncodeToken: expected %q; got %q", want, buf.String()) - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read.go b/vendor/golang.org/x/net/webdav/internal/xml/read.go deleted file mode 100644 index 75b9f2ba..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/read.go +++ /dev/null @@ -1,692 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" -) - -// BUG(rsc): Mapping between XML elements and data structures is inherently flawed: -// an XML element is an order-dependent collection of anonymous -// values, while a data structure is an order-independent collection -// of named values. -// See package json for a textual representation more suitable -// to data structures. - -// Unmarshal parses the XML-encoded data and stores the result in -// the value pointed to by v, which must be an arbitrary struct, -// slice, or string. Well-formed data that does not fit into v is -// discarded. -// -// Because Unmarshal uses the reflect package, it can only assign -// to exported (upper case) fields. Unmarshal uses a case-sensitive -// comparison to match XML element names to tag values and struct -// field names. -// -// Unmarshal maps an XML element to a struct using the following rules. -// In the rules, the tag of a field refers to the value associated with the -// key 'xml' in the struct field's tag (see the example above). -// -// * If the struct has a field of type []byte or string with tag -// ",innerxml", Unmarshal accumulates the raw XML nested inside the -// element in that field. The rest of the rules still apply. -// -// * If the struct has a field named XMLName of type xml.Name, -// Unmarshal records the element name in that field. -// -// * If the XMLName field has an associated tag of the form -// "name" or "namespace-URL name", the XML element must have -// the given name (and, optionally, name space) or else Unmarshal -// returns an error. -// -// * If the XML element has an attribute whose name matches a -// struct field name with an associated tag containing ",attr" or -// the explicit name in a struct field tag of the form "name,attr", -// Unmarshal records the attribute value in that field. -// -// * If the XML element contains character data, that data is -// accumulated in the first struct field that has tag ",chardata". -// The struct field may have type []byte or string. -// If there is no such field, the character data is discarded. -// -// * If the XML element contains comments, they are accumulated in -// the first struct field that has tag ",comment". The struct -// field may have type []byte or string. If there is no such -// field, the comments are discarded. -// -// * If the XML element contains a sub-element whose name matches -// the prefix of a tag formatted as "a" or "a>b>c", unmarshal -// will descend into the XML structure looking for elements with the -// given names, and will map the innermost elements to that struct -// field. A tag starting with ">" is equivalent to one starting -// with the field name followed by ">". -// -// * If the XML element contains a sub-element whose name matches -// a struct field's XMLName tag and the struct field has no -// explicit name tag as per the previous rule, unmarshal maps -// the sub-element to that struct field. -// -// * If the XML element contains a sub-element whose name matches a -// field without any mode flags (",attr", ",chardata", etc), Unmarshal -// maps the sub-element to that struct field. -// -// * If the XML element contains a sub-element that hasn't matched any -// of the above rules and the struct has a field with tag ",any", -// unmarshal maps the sub-element to that struct field. -// -// * An anonymous struct field is handled as if the fields of its -// value were part of the outer struct. -// -// * A struct field with tag "-" is never unmarshalled into. -// -// Unmarshal maps an XML element to a string or []byte by saving the -// concatenation of that element's character data in the string or -// []byte. The saved []byte is never nil. -// -// Unmarshal maps an attribute value to a string or []byte by saving -// the value in the string or slice. -// -// Unmarshal maps an XML element to a slice by extending the length of -// the slice and mapping the element to the newly created value. -// -// Unmarshal maps an XML element or attribute value to a bool by -// setting it to the boolean value represented by the string. -// -// Unmarshal maps an XML element or attribute value to an integer or -// floating-point field by setting the field to the result of -// interpreting the string value in decimal. There is no check for -// overflow. -// -// Unmarshal maps an XML element to an xml.Name by recording the -// element name. -// -// Unmarshal maps an XML element to a pointer by setting the pointer -// to a freshly allocated value and then mapping the element to that value. -// -func Unmarshal(data []byte, v interface{}) error { - return NewDecoder(bytes.NewReader(data)).Decode(v) -} - -// Decode works like xml.Unmarshal, except it reads the decoder -// stream to find the start element. -func (d *Decoder) Decode(v interface{}) error { - return d.DecodeElement(v, nil) -} - -// DecodeElement works like xml.Unmarshal except that it takes -// a pointer to the start XML element to decode into v. -// It is useful when a client reads some raw XML tokens itself -// but also wants to defer to Unmarshal for some elements. -func (d *Decoder) DecodeElement(v interface{}, start *StartElement) error { - val := reflect.ValueOf(v) - if val.Kind() != reflect.Ptr { - return errors.New("non-pointer passed to Unmarshal") - } - return d.unmarshal(val.Elem(), start) -} - -// An UnmarshalError represents an error in the unmarshalling process. -type UnmarshalError string - -func (e UnmarshalError) Error() string { return string(e) } - -// Unmarshaler is the interface implemented by objects that can unmarshal -// an XML element description of themselves. -// -// UnmarshalXML decodes a single XML element -// beginning with the given start element. -// If it returns an error, the outer call to Unmarshal stops and -// returns that error. -// UnmarshalXML must consume exactly one XML element. -// One common implementation strategy is to unmarshal into -// a separate value with a layout matching the expected XML -// using d.DecodeElement, and then to copy the data from -// that value into the receiver. -// Another common strategy is to use d.Token to process the -// XML object one token at a time. -// UnmarshalXML may not use d.RawToken. -type Unmarshaler interface { - UnmarshalXML(d *Decoder, start StartElement) error -} - -// UnmarshalerAttr is the interface implemented by objects that can unmarshal -// an XML attribute description of themselves. -// -// UnmarshalXMLAttr decodes a single XML attribute. -// If it returns an error, the outer call to Unmarshal stops and -// returns that error. -// UnmarshalXMLAttr is used only for struct fields with the -// "attr" option in the field tag. -type UnmarshalerAttr interface { - UnmarshalXMLAttr(attr Attr) error -} - -// receiverType returns the receiver type to use in an expression like "%s.MethodName". -func receiverType(val interface{}) string { - t := reflect.TypeOf(val) - if t.Name() != "" { - return t.String() - } - return "(" + t.String() + ")" -} - -// unmarshalInterface unmarshals a single XML element into val. -// start is the opening tag of the element. -func (p *Decoder) unmarshalInterface(val Unmarshaler, start *StartElement) error { - // Record that decoder must stop at end tag corresponding to start. - p.pushEOF() - - p.unmarshalDepth++ - err := val.UnmarshalXML(p, *start) - p.unmarshalDepth-- - if err != nil { - p.popEOF() - return err - } - - if !p.popEOF() { - return fmt.Errorf("xml: %s.UnmarshalXML did not consume entire <%s> element", receiverType(val), start.Name.Local) - } - - return nil -} - -// unmarshalTextInterface unmarshals a single XML element into val. -// The chardata contained in the element (but not its children) -// is passed to the text unmarshaler. -func (p *Decoder) unmarshalTextInterface(val encoding.TextUnmarshaler, start *StartElement) error { - var buf []byte - depth := 1 - for depth > 0 { - t, err := p.Token() - if err != nil { - return err - } - switch t := t.(type) { - case CharData: - if depth == 1 { - buf = append(buf, t...) - } - case StartElement: - depth++ - case EndElement: - depth-- - } - } - return val.UnmarshalText(buf) -} - -// unmarshalAttr unmarshals a single XML attribute into val. -func (p *Decoder) unmarshalAttr(val reflect.Value, attr Attr) error { - if val.Kind() == reflect.Ptr { - if val.IsNil() { - val.Set(reflect.New(val.Type().Elem())) - } - val = val.Elem() - } - - if val.CanInterface() && val.Type().Implements(unmarshalerAttrType) { - // This is an unmarshaler with a non-pointer receiver, - // so it's likely to be incorrect, but we do what we're told. - return val.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(unmarshalerAttrType) { - return pv.Interface().(UnmarshalerAttr).UnmarshalXMLAttr(attr) - } - } - - // Not an UnmarshalerAttr; try encoding.TextUnmarshaler. - if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { - // This is an unmarshaler with a non-pointer receiver, - // so it's likely to be incorrect, but we do what we're told. - return val.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) - } - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { - return pv.Interface().(encoding.TextUnmarshaler).UnmarshalText([]byte(attr.Value)) - } - } - - copyValue(val, []byte(attr.Value)) - return nil -} - -var ( - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() - unmarshalerAttrType = reflect.TypeOf((*UnmarshalerAttr)(nil)).Elem() - textUnmarshalerType = reflect.TypeOf((*encoding.TextUnmarshaler)(nil)).Elem() -) - -// Unmarshal a single XML element into val. -func (p *Decoder) unmarshal(val reflect.Value, start *StartElement) error { - // Find start element if we need it. - if start == nil { - for { - tok, err := p.Token() - if err != nil { - return err - } - if t, ok := tok.(StartElement); ok { - start = &t - break - } - } - } - - // Load value from interface, but only if the result will be - // usefully addressable. - if val.Kind() == reflect.Interface && !val.IsNil() { - e := val.Elem() - if e.Kind() == reflect.Ptr && !e.IsNil() { - val = e - } - } - - if val.Kind() == reflect.Ptr { - if val.IsNil() { - val.Set(reflect.New(val.Type().Elem())) - } - val = val.Elem() - } - - if val.CanInterface() && val.Type().Implements(unmarshalerType) { - // This is an unmarshaler with a non-pointer receiver, - // so it's likely to be incorrect, but we do what we're told. - return p.unmarshalInterface(val.Interface().(Unmarshaler), start) - } - - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(unmarshalerType) { - return p.unmarshalInterface(pv.Interface().(Unmarshaler), start) - } - } - - if val.CanInterface() && val.Type().Implements(textUnmarshalerType) { - return p.unmarshalTextInterface(val.Interface().(encoding.TextUnmarshaler), start) - } - - if val.CanAddr() { - pv := val.Addr() - if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { - return p.unmarshalTextInterface(pv.Interface().(encoding.TextUnmarshaler), start) - } - } - - var ( - data []byte - saveData reflect.Value - comment []byte - saveComment reflect.Value - saveXML reflect.Value - saveXMLIndex int - saveXMLData []byte - saveAny reflect.Value - sv reflect.Value - tinfo *typeInfo - err error - ) - - switch v := val; v.Kind() { - default: - return errors.New("unknown type " + v.Type().String()) - - case reflect.Interface: - // TODO: For now, simply ignore the field. In the near - // future we may choose to unmarshal the start - // element on it, if not nil. - return p.Skip() - - case reflect.Slice: - typ := v.Type() - if typ.Elem().Kind() == reflect.Uint8 { - // []byte - saveData = v - break - } - - // Slice of element values. - // Grow slice. - n := v.Len() - if n >= v.Cap() { - ncap := 2 * n - if ncap < 4 { - ncap = 4 - } - new := reflect.MakeSlice(typ, n, ncap) - reflect.Copy(new, v) - v.Set(new) - } - v.SetLen(n + 1) - - // Recur to read element into slice. - if err := p.unmarshal(v.Index(n), start); err != nil { - v.SetLen(n) - return err - } - return nil - - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, reflect.String: - saveData = v - - case reflect.Struct: - typ := v.Type() - if typ == nameType { - v.Set(reflect.ValueOf(start.Name)) - break - } - - sv = v - tinfo, err = getTypeInfo(typ) - if err != nil { - return err - } - - // Validate and assign element name. - if tinfo.xmlname != nil { - finfo := tinfo.xmlname - if finfo.name != "" && finfo.name != start.Name.Local { - return UnmarshalError("expected element type <" + finfo.name + "> but have <" + start.Name.Local + ">") - } - if finfo.xmlns != "" && finfo.xmlns != start.Name.Space { - e := "expected element <" + finfo.name + "> in name space " + finfo.xmlns + " but have " - if start.Name.Space == "" { - e += "no name space" - } else { - e += start.Name.Space - } - return UnmarshalError(e) - } - fv := finfo.value(sv) - if _, ok := fv.Interface().(Name); ok { - fv.Set(reflect.ValueOf(start.Name)) - } - } - - // Assign attributes. - // Also, determine whether we need to save character data or comments. - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - switch finfo.flags & fMode { - case fAttr: - strv := finfo.value(sv) - // Look for attribute. - for _, a := range start.Attr { - if a.Name.Local == finfo.name && (finfo.xmlns == "" || finfo.xmlns == a.Name.Space) { - if err := p.unmarshalAttr(strv, a); err != nil { - return err - } - break - } - } - - case fCharData: - if !saveData.IsValid() { - saveData = finfo.value(sv) - } - - case fComment: - if !saveComment.IsValid() { - saveComment = finfo.value(sv) - } - - case fAny, fAny | fElement: - if !saveAny.IsValid() { - saveAny = finfo.value(sv) - } - - case fInnerXml: - if !saveXML.IsValid() { - saveXML = finfo.value(sv) - if p.saved == nil { - saveXMLIndex = 0 - p.saved = new(bytes.Buffer) - } else { - saveXMLIndex = p.savedOffset() - } - } - } - } - } - - // Find end element. - // Process sub-elements along the way. -Loop: - for { - var savedOffset int - if saveXML.IsValid() { - savedOffset = p.savedOffset() - } - tok, err := p.Token() - if err != nil { - return err - } - switch t := tok.(type) { - case StartElement: - consumed := false - if sv.IsValid() { - consumed, err = p.unmarshalPath(tinfo, sv, nil, &t) - if err != nil { - return err - } - if !consumed && saveAny.IsValid() { - consumed = true - if err := p.unmarshal(saveAny, &t); err != nil { - return err - } - } - } - if !consumed { - if err := p.Skip(); err != nil { - return err - } - } - - case EndElement: - if saveXML.IsValid() { - saveXMLData = p.saved.Bytes()[saveXMLIndex:savedOffset] - if saveXMLIndex == 0 { - p.saved = nil - } - } - break Loop - - case CharData: - if saveData.IsValid() { - data = append(data, t...) - } - - case Comment: - if saveComment.IsValid() { - comment = append(comment, t...) - } - } - } - - if saveData.IsValid() && saveData.CanInterface() && saveData.Type().Implements(textUnmarshalerType) { - if err := saveData.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { - return err - } - saveData = reflect.Value{} - } - - if saveData.IsValid() && saveData.CanAddr() { - pv := saveData.Addr() - if pv.CanInterface() && pv.Type().Implements(textUnmarshalerType) { - if err := pv.Interface().(encoding.TextUnmarshaler).UnmarshalText(data); err != nil { - return err - } - saveData = reflect.Value{} - } - } - - if err := copyValue(saveData, data); err != nil { - return err - } - - switch t := saveComment; t.Kind() { - case reflect.String: - t.SetString(string(comment)) - case reflect.Slice: - t.Set(reflect.ValueOf(comment)) - } - - switch t := saveXML; t.Kind() { - case reflect.String: - t.SetString(string(saveXMLData)) - case reflect.Slice: - t.Set(reflect.ValueOf(saveXMLData)) - } - - return nil -} - -func copyValue(dst reflect.Value, src []byte) (err error) { - dst0 := dst - - if dst.Kind() == reflect.Ptr { - if dst.IsNil() { - dst.Set(reflect.New(dst.Type().Elem())) - } - dst = dst.Elem() - } - - // Save accumulated data. - switch dst.Kind() { - case reflect.Invalid: - // Probably a comment. - default: - return errors.New("cannot unmarshal into " + dst0.Type().String()) - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - itmp, err := strconv.ParseInt(string(src), 10, dst.Type().Bits()) - if err != nil { - return err - } - dst.SetInt(itmp) - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - utmp, err := strconv.ParseUint(string(src), 10, dst.Type().Bits()) - if err != nil { - return err - } - dst.SetUint(utmp) - case reflect.Float32, reflect.Float64: - ftmp, err := strconv.ParseFloat(string(src), dst.Type().Bits()) - if err != nil { - return err - } - dst.SetFloat(ftmp) - case reflect.Bool: - value, err := strconv.ParseBool(strings.TrimSpace(string(src))) - if err != nil { - return err - } - dst.SetBool(value) - case reflect.String: - dst.SetString(string(src)) - case reflect.Slice: - if len(src) == 0 { - // non-nil to flag presence - src = []byte{} - } - dst.SetBytes(src) - } - return nil -} - -// unmarshalPath walks down an XML structure looking for wanted -// paths, and calls unmarshal on them. -// The consumed result tells whether XML elements have been consumed -// from the Decoder until start's matching end element, or if it's -// still untouched because start is uninteresting for sv's fields. -func (p *Decoder) unmarshalPath(tinfo *typeInfo, sv reflect.Value, parents []string, start *StartElement) (consumed bool, err error) { - recurse := false -Loop: - for i := range tinfo.fields { - finfo := &tinfo.fields[i] - if finfo.flags&fElement == 0 || len(finfo.parents) < len(parents) || finfo.xmlns != "" && finfo.xmlns != start.Name.Space { - continue - } - for j := range parents { - if parents[j] != finfo.parents[j] { - continue Loop - } - } - if len(finfo.parents) == len(parents) && finfo.name == start.Name.Local { - // It's a perfect match, unmarshal the field. - return true, p.unmarshal(finfo.value(sv), start) - } - if len(finfo.parents) > len(parents) && finfo.parents[len(parents)] == start.Name.Local { - // It's a prefix for the field. Break and recurse - // since it's not ok for one field path to be itself - // the prefix for another field path. - recurse = true - - // We can reuse the same slice as long as we - // don't try to append to it. - parents = finfo.parents[:len(parents)+1] - break - } - } - if !recurse { - // We have no business with this element. - return false, nil - } - // The element is not a perfect match for any field, but one - // or more fields have the path to this element as a parent - // prefix. Recurse and attempt to match these. - for { - var tok Token - tok, err = p.Token() - if err != nil { - return true, err - } - switch t := tok.(type) { - case StartElement: - consumed2, err := p.unmarshalPath(tinfo, sv, parents, &t) - if err != nil { - return true, err - } - if !consumed2 { - if err := p.Skip(); err != nil { - return true, err - } - } - case EndElement: - return true, nil - } - } -} - -// Skip reads tokens until it has consumed the end element -// matching the most recent start element already consumed. -// It recurs if it encounters a start element, so it can be used to -// skip nested structures. -// It returns nil if it finds an end element matching the start -// element; otherwise it returns an error describing the problem. -func (d *Decoder) Skip() error { - for { - tok, err := d.Token() - if err != nil { - return err - } - switch tok.(type) { - case StartElement: - if err := d.Skip(); err != nil { - return err - } - case EndElement: - return nil - } - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/read_test.go b/vendor/golang.org/x/net/webdav/internal/xml/read_test.go deleted file mode 100644 index 02f1e10c..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/read_test.go +++ /dev/null @@ -1,744 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "fmt" - "io" - "reflect" - "strings" - "testing" - "time" -) - -// Stripped down Atom feed data structures. - -func TestUnmarshalFeed(t *testing.T) { - var f Feed - if err := Unmarshal([]byte(atomFeedString), &f); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if !reflect.DeepEqual(f, atomFeed) { - t.Fatalf("have %#v\nwant %#v", f, atomFeed) - } -} - -// hget http://codereview.appspot.com/rss/mine/rsc -const atomFeedString = ` -<?xml version="1.0" encoding="utf-8"?> -<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-us" updated="2009-10-04T01:35:58+00:00"><title>Code Review - My issues</title><link href="http://codereview.appspot.com/" rel="alternate"></link><link href="http://codereview.appspot.com/rss/mine/rsc" rel="self"></link><id>http://codereview.appspot.com/</id><author><name>rietveld&lt;&gt;</name></author><entry><title>rietveld: an attempt at pubsubhubbub -</title><link href="http://codereview.appspot.com/126085" rel="alternate"></link><updated>2009-10-04T01:35:58+00:00</updated><author><name>email-address-removed</name></author><id>urn:md5:134d9179c41f806be79b3a5f7877d19a</id><summary type="html"> - An attempt at adding pubsubhubbub support to Rietveld. -http://code.google.com/p/pubsubhubbub -http://code.google.com/p/rietveld/issues/detail?id=155 - -The server side of the protocol is trivial: - 1. add a &amp;lt;link rel=&amp;quot;hub&amp;quot; href=&amp;quot;hub-server&amp;quot;&amp;gt; tag to all - feeds that will be pubsubhubbubbed. - 2. every time one of those feeds changes, tell the hub - with a simple POST request. - -I have tested this by adding debug prints to a local hub -server and checking that the server got the right publish -requests. - -I can&amp;#39;t quite get the server to work, but I think the bug -is not in my code. I think that the server expects to be -able to grab the feed and see the feed&amp;#39;s actual URL in -the link rel=&amp;quot;self&amp;quot;, but the default value for that drops -the :port from the URL, and I cannot for the life of me -figure out how to get the Atom generator deep inside -django not to do that, or even where it is doing that, -or even what code is running to generate the Atom feed. -(I thought I knew but I added some assert False statements -and it kept running!) - -Ignoring that particular problem, I would appreciate -feedback on the right way to get the two values at -the top of feeds.py marked NOTE(rsc). - - -</summary></entry><entry><title>rietveld: correct tab handling -</title><link href="http://codereview.appspot.com/124106" rel="alternate"></link><updated>2009-10-03T23:02:17+00:00</updated><author><name>email-address-removed</name></author><id>urn:md5:0a2a4f19bb815101f0ba2904aed7c35a</id><summary type="html"> - This fixes the buggy tab rendering that can be seen at -http://codereview.appspot.com/116075/diff/1/2 - -The fundamental problem was that the tab code was -not being told what column the text began in, so it -didn&amp;#39;t know where to put the tab stops. Another problem -was that some of the code assumed that string byte -offsets were the same as column offsets, which is only -true if there are no tabs. - -In the process of fixing this, I cleaned up the arguments -to Fold and ExpandTabs and renamed them Break and -_ExpandTabs so that I could be sure that I found all the -call sites. I also wanted to verify that ExpandTabs was -not being used from outside intra_region_diff.py. - - -</summary></entry></feed> ` - -type Feed struct { - XMLName Name `xml:"http://www.w3.org/2005/Atom feed"` - Title string `xml:"title"` - Id string `xml:"id"` - Link []Link `xml:"link"` - Updated time.Time `xml:"updated,attr"` - Author Person `xml:"author"` - Entry []Entry `xml:"entry"` -} - -type Entry struct { - Title string `xml:"title"` - Id string `xml:"id"` - Link []Link `xml:"link"` - Updated time.Time `xml:"updated"` - Author Person `xml:"author"` - Summary Text `xml:"summary"` -} - -type Link struct { - Rel string `xml:"rel,attr,omitempty"` - Href string `xml:"href,attr"` -} - -type Person struct { - Name string `xml:"name"` - URI string `xml:"uri"` - Email string `xml:"email"` - InnerXML string `xml:",innerxml"` -} - -type Text struct { - Type string `xml:"type,attr,omitempty"` - Body string `xml:",chardata"` -} - -var atomFeed = Feed{ - XMLName: Name{"http://www.w3.org/2005/Atom", "feed"}, - Title: "Code Review - My issues", - Link: []Link{ - {Rel: "alternate", Href: "http://codereview.appspot.com/"}, - {Rel: "self", Href: "http://codereview.appspot.com/rss/mine/rsc"}, - }, - Id: "http://codereview.appspot.com/", - Updated: ParseTime("2009-10-04T01:35:58+00:00"), - Author: Person{ - Name: "rietveld<>", - InnerXML: "<name>rietveld&lt;&gt;</name>", - }, - Entry: []Entry{ - { - Title: "rietveld: an attempt at pubsubhubbub\n", - Link: []Link{ - {Rel: "alternate", Href: "http://codereview.appspot.com/126085"}, - }, - Updated: ParseTime("2009-10-04T01:35:58+00:00"), - Author: Person{ - Name: "email-address-removed", - InnerXML: "<name>email-address-removed</name>", - }, - Id: "urn:md5:134d9179c41f806be79b3a5f7877d19a", - Summary: Text{ - Type: "html", - Body: ` - An attempt at adding pubsubhubbub support to Rietveld. -http://code.google.com/p/pubsubhubbub -http://code.google.com/p/rietveld/issues/detail?id=155 - -The server side of the protocol is trivial: - 1. add a &lt;link rel=&quot;hub&quot; href=&quot;hub-server&quot;&gt; tag to all - feeds that will be pubsubhubbubbed. - 2. every time one of those feeds changes, tell the hub - with a simple POST request. - -I have tested this by adding debug prints to a local hub -server and checking that the server got the right publish -requests. - -I can&#39;t quite get the server to work, but I think the bug -is not in my code. I think that the server expects to be -able to grab the feed and see the feed&#39;s actual URL in -the link rel=&quot;self&quot;, but the default value for that drops -the :port from the URL, and I cannot for the life of me -figure out how to get the Atom generator deep inside -django not to do that, or even where it is doing that, -or even what code is running to generate the Atom feed. -(I thought I knew but I added some assert False statements -and it kept running!) - -Ignoring that particular problem, I would appreciate -feedback on the right way to get the two values at -the top of feeds.py marked NOTE(rsc). - - -`, - }, - }, - { - Title: "rietveld: correct tab handling\n", - Link: []Link{ - {Rel: "alternate", Href: "http://codereview.appspot.com/124106"}, - }, - Updated: ParseTime("2009-10-03T23:02:17+00:00"), - Author: Person{ - Name: "email-address-removed", - InnerXML: "<name>email-address-removed</name>", - }, - Id: "urn:md5:0a2a4f19bb815101f0ba2904aed7c35a", - Summary: Text{ - Type: "html", - Body: ` - This fixes the buggy tab rendering that can be seen at -http://codereview.appspot.com/116075/diff/1/2 - -The fundamental problem was that the tab code was -not being told what column the text began in, so it -didn&#39;t know where to put the tab stops. Another problem -was that some of the code assumed that string byte -offsets were the same as column offsets, which is only -true if there are no tabs. - -In the process of fixing this, I cleaned up the arguments -to Fold and ExpandTabs and renamed them Break and -_ExpandTabs so that I could be sure that I found all the -call sites. I also wanted to verify that ExpandTabs was -not being used from outside intra_region_diff.py. - - -`, - }, - }, - }, -} - -const pathTestString = ` -<Result> - <Before>1</Before> - <Items> - <Item1> - <Value>A</Value> - </Item1> - <Item2> - <Value>B</Value> - </Item2> - <Item1> - <Value>C</Value> - <Value>D</Value> - </Item1> - <_> - <Value>E</Value> - </_> - </Items> - <After>2</After> -</Result> -` - -type PathTestItem struct { - Value string -} - -type PathTestA struct { - Items []PathTestItem `xml:">Item1"` - Before, After string -} - -type PathTestB struct { - Other []PathTestItem `xml:"Items>Item1"` - Before, After string -} - -type PathTestC struct { - Values1 []string `xml:"Items>Item1>Value"` - Values2 []string `xml:"Items>Item2>Value"` - Before, After string -} - -type PathTestSet struct { - Item1 []PathTestItem -} - -type PathTestD struct { - Other PathTestSet `xml:"Items"` - Before, After string -} - -type PathTestE struct { - Underline string `xml:"Items>_>Value"` - Before, After string -} - -var pathTests = []interface{}{ - &PathTestA{Items: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, - &PathTestB{Other: []PathTestItem{{"A"}, {"D"}}, Before: "1", After: "2"}, - &PathTestC{Values1: []string{"A", "C", "D"}, Values2: []string{"B"}, Before: "1", After: "2"}, - &PathTestD{Other: PathTestSet{Item1: []PathTestItem{{"A"}, {"D"}}}, Before: "1", After: "2"}, - &PathTestE{Underline: "E", Before: "1", After: "2"}, -} - -func TestUnmarshalPaths(t *testing.T) { - for _, pt := range pathTests { - v := reflect.New(reflect.TypeOf(pt).Elem()).Interface() - if err := Unmarshal([]byte(pathTestString), v); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if !reflect.DeepEqual(v, pt) { - t.Fatalf("have %#v\nwant %#v", v, pt) - } - } -} - -type BadPathTestA struct { - First string `xml:"items>item1"` - Other string `xml:"items>item2"` - Second string `xml:"items"` -} - -type BadPathTestB struct { - Other string `xml:"items>item2>value"` - First string `xml:"items>item1"` - Second string `xml:"items>item1>value"` -} - -type BadPathTestC struct { - First string - Second string `xml:"First"` -} - -type BadPathTestD struct { - BadPathEmbeddedA - BadPathEmbeddedB -} - -type BadPathEmbeddedA struct { - First string -} - -type BadPathEmbeddedB struct { - Second string `xml:"First"` -} - -var badPathTests = []struct { - v, e interface{} -}{ - {&BadPathTestA{}, &TagPathError{reflect.TypeOf(BadPathTestA{}), "First", "items>item1", "Second", "items"}}, - {&BadPathTestB{}, &TagPathError{reflect.TypeOf(BadPathTestB{}), "First", "items>item1", "Second", "items>item1>value"}}, - {&BadPathTestC{}, &TagPathError{reflect.TypeOf(BadPathTestC{}), "First", "", "Second", "First"}}, - {&BadPathTestD{}, &TagPathError{reflect.TypeOf(BadPathTestD{}), "First", "", "Second", "First"}}, -} - -func TestUnmarshalBadPaths(t *testing.T) { - for _, tt := range badPathTests { - err := Unmarshal([]byte(pathTestString), tt.v) - if !reflect.DeepEqual(err, tt.e) { - t.Fatalf("Unmarshal with %#v didn't fail properly:\nhave %#v,\nwant %#v", tt.v, err, tt.e) - } - } -} - -const OK = "OK" -const withoutNameTypeData = ` -<?xml version="1.0" charset="utf-8"?> -<Test3 Attr="OK" />` - -type TestThree struct { - XMLName Name `xml:"Test3"` - Attr string `xml:",attr"` -} - -func TestUnmarshalWithoutNameType(t *testing.T) { - var x TestThree - if err := Unmarshal([]byte(withoutNameTypeData), &x); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if x.Attr != OK { - t.Fatalf("have %v\nwant %v", x.Attr, OK) - } -} - -func TestUnmarshalAttr(t *testing.T) { - type ParamVal struct { - Int int `xml:"int,attr"` - } - - type ParamPtr struct { - Int *int `xml:"int,attr"` - } - - type ParamStringPtr struct { - Int *string `xml:"int,attr"` - } - - x := []byte(`<Param int="1" />`) - - p1 := &ParamPtr{} - if err := Unmarshal(x, p1); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if p1.Int == nil { - t.Fatalf("Unmarshal failed in to *int field") - } else if *p1.Int != 1 { - t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p1.Int, 1) - } - - p2 := &ParamVal{} - if err := Unmarshal(x, p2); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if p2.Int != 1 { - t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p2.Int, 1) - } - - p3 := &ParamStringPtr{} - if err := Unmarshal(x, p3); err != nil { - t.Fatalf("Unmarshal: %s", err) - } - if p3.Int == nil { - t.Fatalf("Unmarshal failed in to *string field") - } else if *p3.Int != "1" { - t.Fatalf("Unmarshal with %s failed:\nhave %#v,\n want %#v", x, p3.Int, 1) - } -} - -type Tables struct { - HTable string `xml:"http://www.w3.org/TR/html4/ table"` - FTable string `xml:"http://www.w3schools.com/furniture table"` -} - -var tables = []struct { - xml string - tab Tables - ns string -}{ - { - xml: `<Tables>` + - `<table xmlns="http://www.w3.org/TR/html4/">hello</table>` + - `<table xmlns="http://www.w3schools.com/furniture">world</table>` + - `</Tables>`, - tab: Tables{"hello", "world"}, - }, - { - xml: `<Tables>` + - `<table xmlns="http://www.w3schools.com/furniture">world</table>` + - `<table xmlns="http://www.w3.org/TR/html4/">hello</table>` + - `</Tables>`, - tab: Tables{"hello", "world"}, - }, - { - xml: `<Tables xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/">` + - `<f:table>world</f:table>` + - `<h:table>hello</h:table>` + - `</Tables>`, - tab: Tables{"hello", "world"}, - }, - { - xml: `<Tables>` + - `<table>bogus</table>` + - `</Tables>`, - tab: Tables{}, - }, - { - xml: `<Tables>` + - `<table>only</table>` + - `</Tables>`, - tab: Tables{HTable: "only"}, - ns: "http://www.w3.org/TR/html4/", - }, - { - xml: `<Tables>` + - `<table>only</table>` + - `</Tables>`, - tab: Tables{FTable: "only"}, - ns: "http://www.w3schools.com/furniture", - }, - { - xml: `<Tables>` + - `<table>only</table>` + - `</Tables>`, - tab: Tables{}, - ns: "something else entirely", - }, -} - -func TestUnmarshalNS(t *testing.T) { - for i, tt := range tables { - var dst Tables - var err error - if tt.ns != "" { - d := NewDecoder(strings.NewReader(tt.xml)) - d.DefaultSpace = tt.ns - err = d.Decode(&dst) - } else { - err = Unmarshal([]byte(tt.xml), &dst) - } - if err != nil { - t.Errorf("#%d: Unmarshal: %v", i, err) - continue - } - want := tt.tab - if dst != want { - t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) - } - } -} - -func TestRoundTrip(t *testing.T) { - // From issue 7535 - const s = `<ex:element xmlns:ex="http://example.com/schema"></ex:element>` - in := bytes.NewBufferString(s) - for i := 0; i < 10; i++ { - out := &bytes.Buffer{} - d := NewDecoder(in) - e := NewEncoder(out) - - for { - t, err := d.Token() - if err == io.EOF { - break - } - if err != nil { - fmt.Println("failed:", err) - return - } - e.EncodeToken(t) - } - e.Flush() - in = out - } - if got := in.String(); got != s { - t.Errorf("have: %q\nwant: %q\n", got, s) - } -} - -func TestMarshalNS(t *testing.T) { - dst := Tables{"hello", "world"} - data, err := Marshal(&dst) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - want := `<Tables><table xmlns="http://www.w3.org/TR/html4/">hello</table><table xmlns="http://www.w3schools.com/furniture">world</table></Tables>` - str := string(data) - if str != want { - t.Errorf("have: %q\nwant: %q\n", str, want) - } -} - -type TableAttrs struct { - TAttr TAttr -} - -type TAttr struct { - HTable string `xml:"http://www.w3.org/TR/html4/ table,attr"` - FTable string `xml:"http://www.w3schools.com/furniture table,attr"` - Lang string `xml:"http://www.w3.org/XML/1998/namespace lang,attr,omitempty"` - Other1 string `xml:"http://golang.org/xml/ other,attr,omitempty"` - Other2 string `xml:"http://golang.org/xmlfoo/ other,attr,omitempty"` - Other3 string `xml:"http://golang.org/json/ other,attr,omitempty"` - Other4 string `xml:"http://golang.org/2/json/ other,attr,omitempty"` -} - -var tableAttrs = []struct { - xml string - tab TableAttrs - ns string -}{ - { - xml: `<TableAttrs xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/"><TAttr ` + - `h:table="hello" f:table="world" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, - }, - { - xml: `<TableAttrs><TAttr xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/" ` + - `h:table="hello" f:table="world" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, - }, - { - xml: `<TableAttrs><TAttr ` + - `h:table="hello" f:table="world" xmlns:f="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "hello", FTable: "world"}}, - }, - { - // Default space does not apply to attribute names. - xml: `<TableAttrs xmlns="http://www.w3schools.com/furniture" xmlns:h="http://www.w3.org/TR/html4/"><TAttr ` + - `h:table="hello" table="world" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, - }, - { - // Default space does not apply to attribute names. - xml: `<TableAttrs xmlns:f="http://www.w3schools.com/furniture"><TAttr xmlns="http://www.w3.org/TR/html4/" ` + - `table="hello" f:table="world" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, - }, - { - xml: `<TableAttrs><TAttr ` + - `table="bogus" ` + - `/></TableAttrs>`, - tab: TableAttrs{}, - }, - { - // Default space does not apply to attribute names. - xml: `<TableAttrs xmlns:h="http://www.w3.org/TR/html4/"><TAttr ` + - `h:table="hello" table="world" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "hello", FTable: ""}}, - ns: "http://www.w3schools.com/furniture", - }, - { - // Default space does not apply to attribute names. - xml: `<TableAttrs xmlns:f="http://www.w3schools.com/furniture"><TAttr ` + - `table="hello" f:table="world" ` + - `/></TableAttrs>`, - tab: TableAttrs{TAttr{HTable: "", FTable: "world"}}, - ns: "http://www.w3.org/TR/html4/", - }, - { - xml: `<TableAttrs><TAttr ` + - `table="bogus" ` + - `/></TableAttrs>`, - tab: TableAttrs{}, - ns: "something else entirely", - }, -} - -func TestUnmarshalNSAttr(t *testing.T) { - for i, tt := range tableAttrs { - var dst TableAttrs - var err error - if tt.ns != "" { - d := NewDecoder(strings.NewReader(tt.xml)) - d.DefaultSpace = tt.ns - err = d.Decode(&dst) - } else { - err = Unmarshal([]byte(tt.xml), &dst) - } - if err != nil { - t.Errorf("#%d: Unmarshal: %v", i, err) - continue - } - want := tt.tab - if dst != want { - t.Errorf("#%d: dst=%+v, want %+v", i, dst, want) - } - } -} - -func TestMarshalNSAttr(t *testing.T) { - src := TableAttrs{TAttr{"hello", "world", "en_US", "other1", "other2", "other3", "other4"}} - data, err := Marshal(&src) - if err != nil { - t.Fatalf("Marshal: %v", err) - } - want := `<TableAttrs><TAttr xmlns:json_1="http://golang.org/2/json/" xmlns:json="http://golang.org/json/" xmlns:_xmlfoo="http://golang.org/xmlfoo/" xmlns:_xml="http://golang.org/xml/" xmlns:furniture="http://www.w3schools.com/furniture" xmlns:html4="http://www.w3.org/TR/html4/" html4:table="hello" furniture:table="world" xml:lang="en_US" _xml:other="other1" _xmlfoo:other="other2" json:other="other3" json_1:other="other4"></TAttr></TableAttrs>` - str := string(data) - if str != want { - t.Errorf("Marshal:\nhave: %#q\nwant: %#q\n", str, want) - } - - var dst TableAttrs - if err := Unmarshal(data, &dst); err != nil { - t.Errorf("Unmarshal: %v", err) - } - - if dst != src { - t.Errorf("Unmarshal = %q, want %q", dst, src) - } -} - -type MyCharData struct { - body string -} - -func (m *MyCharData) UnmarshalXML(d *Decoder, start StartElement) error { - for { - t, err := d.Token() - if err == io.EOF { // found end of element - break - } - if err != nil { - return err - } - if char, ok := t.(CharData); ok { - m.body += string(char) - } - } - return nil -} - -var _ Unmarshaler = (*MyCharData)(nil) - -func (m *MyCharData) UnmarshalXMLAttr(attr Attr) error { - panic("must not call") -} - -type MyAttr struct { - attr string -} - -func (m *MyAttr) UnmarshalXMLAttr(attr Attr) error { - m.attr = attr.Value - return nil -} - -var _ UnmarshalerAttr = (*MyAttr)(nil) - -type MyStruct struct { - Data *MyCharData - Attr *MyAttr `xml:",attr"` - - Data2 MyCharData - Attr2 MyAttr `xml:",attr"` -} - -func TestUnmarshaler(t *testing.T) { - xml := `<?xml version="1.0" encoding="utf-8"?> - <MyStruct Attr="attr1" Attr2="attr2"> - <Data>hello <!-- comment -->world</Data> - <Data2>howdy <!-- comment -->world</Data2> - </MyStruct> - ` - - var m MyStruct - if err := Unmarshal([]byte(xml), &m); err != nil { - t.Fatal(err) - } - - if m.Data == nil || m.Attr == nil || m.Data.body != "hello world" || m.Attr.attr != "attr1" || m.Data2.body != "howdy world" || m.Attr2.attr != "attr2" { - t.Errorf("m=%#+v\n", m) - } -} - -type Pea struct { - Cotelydon string -} - -type Pod struct { - Pea interface{} `xml:"Pea"` -} - -// https://golang.org/issue/6836 -func TestUnmarshalIntoInterface(t *testing.T) { - pod := new(Pod) - pod.Pea = new(Pea) - xml := `<Pod><Pea><Cotelydon>Green stuff</Cotelydon></Pea></Pod>` - err := Unmarshal([]byte(xml), pod) - if err != nil { - t.Fatalf("failed to unmarshal %q: %v", xml, err) - } - pea, ok := pod.Pea.(*Pea) - if !ok { - t.Fatalf("unmarshalled into wrong type: have %T want *Pea", pod.Pea) - } - have, want := pea.Cotelydon, "Green stuff" - if have != want { - t.Errorf("failed to unmarshal into interface, have %q want %q", have, want) - } -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go b/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go deleted file mode 100644 index c9a6421f..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/typeinfo.go +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "fmt" - "reflect" - "strings" - "sync" -) - -// typeInfo holds details for the xml representation of a type. -type typeInfo struct { - xmlname *fieldInfo - fields []fieldInfo -} - -// fieldInfo holds details for the xml representation of a single field. -type fieldInfo struct { - idx []int - name string - xmlns string - flags fieldFlags - parents []string -} - -type fieldFlags int - -const ( - fElement fieldFlags = 1 << iota - fAttr - fCharData - fInnerXml - fComment - fAny - - fOmitEmpty - - fMode = fElement | fAttr | fCharData | fInnerXml | fComment | fAny -) - -var tinfoMap = make(map[reflect.Type]*typeInfo) -var tinfoLock sync.RWMutex - -var nameType = reflect.TypeOf(Name{}) - -// getTypeInfo returns the typeInfo structure with details necessary -// for marshalling and unmarshalling typ. -func getTypeInfo(typ reflect.Type) (*typeInfo, error) { - tinfoLock.RLock() - tinfo, ok := tinfoMap[typ] - tinfoLock.RUnlock() - if ok { - return tinfo, nil - } - tinfo = &typeInfo{} - if typ.Kind() == reflect.Struct && typ != nameType { - n := typ.NumField() - for i := 0; i < n; i++ { - f := typ.Field(i) - if f.PkgPath != "" || f.Tag.Get("xml") == "-" { - continue // Private field - } - - // For embedded structs, embed its fields. - if f.Anonymous { - t := f.Type - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - if t.Kind() == reflect.Struct { - inner, err := getTypeInfo(t) - if err != nil { - return nil, err - } - if tinfo.xmlname == nil { - tinfo.xmlname = inner.xmlname - } - for _, finfo := range inner.fields { - finfo.idx = append([]int{i}, finfo.idx...) - if err := addFieldInfo(typ, tinfo, &finfo); err != nil { - return nil, err - } - } - continue - } - } - - finfo, err := structFieldInfo(typ, &f) - if err != nil { - return nil, err - } - - if f.Name == "XMLName" { - tinfo.xmlname = finfo - continue - } - - // Add the field if it doesn't conflict with other fields. - if err := addFieldInfo(typ, tinfo, finfo); err != nil { - return nil, err - } - } - } - tinfoLock.Lock() - tinfoMap[typ] = tinfo - tinfoLock.Unlock() - return tinfo, nil -} - -// structFieldInfo builds and returns a fieldInfo for f. -func structFieldInfo(typ reflect.Type, f *reflect.StructField) (*fieldInfo, error) { - finfo := &fieldInfo{idx: f.Index} - - // Split the tag from the xml namespace if necessary. - tag := f.Tag.Get("xml") - if i := strings.Index(tag, " "); i >= 0 { - finfo.xmlns, tag = tag[:i], tag[i+1:] - } - - // Parse flags. - tokens := strings.Split(tag, ",") - if len(tokens) == 1 { - finfo.flags = fElement - } else { - tag = tokens[0] - for _, flag := range tokens[1:] { - switch flag { - case "attr": - finfo.flags |= fAttr - case "chardata": - finfo.flags |= fCharData - case "innerxml": - finfo.flags |= fInnerXml - case "comment": - finfo.flags |= fComment - case "any": - finfo.flags |= fAny - case "omitempty": - finfo.flags |= fOmitEmpty - } - } - - // Validate the flags used. - valid := true - switch mode := finfo.flags & fMode; mode { - case 0: - finfo.flags |= fElement - case fAttr, fCharData, fInnerXml, fComment, fAny: - if f.Name == "XMLName" || tag != "" && mode != fAttr { - valid = false - } - default: - // This will also catch multiple modes in a single field. - valid = false - } - if finfo.flags&fMode == fAny { - finfo.flags |= fElement - } - if finfo.flags&fOmitEmpty != 0 && finfo.flags&(fElement|fAttr) == 0 { - valid = false - } - if !valid { - return nil, fmt.Errorf("xml: invalid tag in field %s of type %s: %q", - f.Name, typ, f.Tag.Get("xml")) - } - } - - // Use of xmlns without a name is not allowed. - if finfo.xmlns != "" && tag == "" { - return nil, fmt.Errorf("xml: namespace without name in field %s of type %s: %q", - f.Name, typ, f.Tag.Get("xml")) - } - - if f.Name == "XMLName" { - // The XMLName field records the XML element name. Don't - // process it as usual because its name should default to - // empty rather than to the field name. - finfo.name = tag - return finfo, nil - } - - if tag == "" { - // If the name part of the tag is completely empty, get - // default from XMLName of underlying struct if feasible, - // or field name otherwise. - if xmlname := lookupXMLName(f.Type); xmlname != nil { - finfo.xmlns, finfo.name = xmlname.xmlns, xmlname.name - } else { - finfo.name = f.Name - } - return finfo, nil - } - - if finfo.xmlns == "" && finfo.flags&fAttr == 0 { - // If it's an element no namespace specified, get the default - // from the XMLName of enclosing struct if possible. - if xmlname := lookupXMLName(typ); xmlname != nil { - finfo.xmlns = xmlname.xmlns - } - } - - // Prepare field name and parents. - parents := strings.Split(tag, ">") - if parents[0] == "" { - parents[0] = f.Name - } - if parents[len(parents)-1] == "" { - return nil, fmt.Errorf("xml: trailing '>' in field %s of type %s", f.Name, typ) - } - finfo.name = parents[len(parents)-1] - if len(parents) > 1 { - if (finfo.flags & fElement) == 0 { - return nil, fmt.Errorf("xml: %s chain not valid with %s flag", tag, strings.Join(tokens[1:], ",")) - } - finfo.parents = parents[:len(parents)-1] - } - - // If the field type has an XMLName field, the names must match - // so that the behavior of both marshalling and unmarshalling - // is straightforward and unambiguous. - if finfo.flags&fElement != 0 { - ftyp := f.Type - xmlname := lookupXMLName(ftyp) - if xmlname != nil && xmlname.name != finfo.name { - return nil, fmt.Errorf("xml: name %q in tag of %s.%s conflicts with name %q in %s.XMLName", - finfo.name, typ, f.Name, xmlname.name, ftyp) - } - } - return finfo, nil -} - -// lookupXMLName returns the fieldInfo for typ's XMLName field -// in case it exists and has a valid xml field tag, otherwise -// it returns nil. -func lookupXMLName(typ reflect.Type) (xmlname *fieldInfo) { - for typ.Kind() == reflect.Ptr { - typ = typ.Elem() - } - if typ.Kind() != reflect.Struct { - return nil - } - for i, n := 0, typ.NumField(); i < n; i++ { - f := typ.Field(i) - if f.Name != "XMLName" { - continue - } - finfo, err := structFieldInfo(typ, &f) - if finfo.name != "" && err == nil { - return finfo - } - // Also consider errors as a non-existent field tag - // and let getTypeInfo itself report the error. - break - } - return nil -} - -func min(a, b int) int { - if a <= b { - return a - } - return b -} - -// addFieldInfo adds finfo to tinfo.fields if there are no -// conflicts, or if conflicts arise from previous fields that were -// obtained from deeper embedded structures than finfo. In the latter -// case, the conflicting entries are dropped. -// A conflict occurs when the path (parent + name) to a field is -// itself a prefix of another path, or when two paths match exactly. -// It is okay for field paths to share a common, shorter prefix. -func addFieldInfo(typ reflect.Type, tinfo *typeInfo, newf *fieldInfo) error { - var conflicts []int -Loop: - // First, figure all conflicts. Most working code will have none. - for i := range tinfo.fields { - oldf := &tinfo.fields[i] - if oldf.flags&fMode != newf.flags&fMode { - continue - } - if oldf.xmlns != "" && newf.xmlns != "" && oldf.xmlns != newf.xmlns { - continue - } - minl := min(len(newf.parents), len(oldf.parents)) - for p := 0; p < minl; p++ { - if oldf.parents[p] != newf.parents[p] { - continue Loop - } - } - if len(oldf.parents) > len(newf.parents) { - if oldf.parents[len(newf.parents)] == newf.name { - conflicts = append(conflicts, i) - } - } else if len(oldf.parents) < len(newf.parents) { - if newf.parents[len(oldf.parents)] == oldf.name { - conflicts = append(conflicts, i) - } - } else { - if newf.name == oldf.name { - conflicts = append(conflicts, i) - } - } - } - // Without conflicts, add the new field and return. - if conflicts == nil { - tinfo.fields = append(tinfo.fields, *newf) - return nil - } - - // If any conflict is shallower, ignore the new field. - // This matches the Go field resolution on embedding. - for _, i := range conflicts { - if len(tinfo.fields[i].idx) < len(newf.idx) { - return nil - } - } - - // Otherwise, if any of them is at the same depth level, it's an error. - for _, i := range conflicts { - oldf := &tinfo.fields[i] - if len(oldf.idx) == len(newf.idx) { - f1 := typ.FieldByIndex(oldf.idx) - f2 := typ.FieldByIndex(newf.idx) - return &TagPathError{typ, f1.Name, f1.Tag.Get("xml"), f2.Name, f2.Tag.Get("xml")} - } - } - - // Otherwise, the new field is shallower, and thus takes precedence, - // so drop the conflicting fields from tinfo and append the new one. - for c := len(conflicts) - 1; c >= 0; c-- { - i := conflicts[c] - copy(tinfo.fields[i:], tinfo.fields[i+1:]) - tinfo.fields = tinfo.fields[:len(tinfo.fields)-1] - } - tinfo.fields = append(tinfo.fields, *newf) - return nil -} - -// A TagPathError represents an error in the unmarshalling process -// caused by the use of field tags with conflicting paths. -type TagPathError struct { - Struct reflect.Type - Field1, Tag1 string - Field2, Tag2 string -} - -func (e *TagPathError) Error() string { - return fmt.Sprintf("%s field %q with tag %q conflicts with field %q with tag %q", e.Struct, e.Field1, e.Tag1, e.Field2, e.Tag2) -} - -// value returns v's field value corresponding to finfo. -// It's equivalent to v.FieldByIndex(finfo.idx), but initializes -// and dereferences pointers as necessary. -func (finfo *fieldInfo) value(v reflect.Value) reflect.Value { - for i, x := range finfo.idx { - if i > 0 { - t := v.Type() - if t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct { - if v.IsNil() { - v.Set(reflect.New(v.Type().Elem())) - } - v = v.Elem() - } - } - v = v.Field(x) - } - return v -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/xml.go b/vendor/golang.org/x/net/webdav/internal/xml/xml.go deleted file mode 100644 index ffab4a70..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/xml.go +++ /dev/null @@ -1,1998 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package xml implements a simple XML 1.0 parser that -// understands XML name spaces. -package xml - -// References: -// Annotated XML spec: http://www.xml.com/axml/testaxml.htm -// XML name spaces: http://www.w3.org/TR/REC-xml-names/ - -// TODO(rsc): -// Test error handling. - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "strconv" - "strings" - "unicode" - "unicode/utf8" -) - -// A SyntaxError represents a syntax error in the XML input stream. -type SyntaxError struct { - Msg string - Line int -} - -func (e *SyntaxError) Error() string { - return "XML syntax error on line " + strconv.Itoa(e.Line) + ": " + e.Msg -} - -// A Name represents an XML name (Local) annotated with a name space -// identifier (Space). In tokens returned by Decoder.Token, the Space -// identifier is given as a canonical URL, not the short prefix used in -// the document being parsed. -// -// As a special case, XML namespace declarations will use the literal -// string "xmlns" for the Space field instead of the fully resolved URL. -// See Encoder.EncodeToken for more information on namespace encoding -// behaviour. -type Name struct { - Space, Local string -} - -// isNamespace reports whether the name is a namespace-defining name. -func (name Name) isNamespace() bool { - return name.Local == "xmlns" || name.Space == "xmlns" -} - -// An Attr represents an attribute in an XML element (Name=Value). -type Attr struct { - Name Name - Value string -} - -// A Token is an interface holding one of the token types: -// StartElement, EndElement, CharData, Comment, ProcInst, or Directive. -type Token interface{} - -// A StartElement represents an XML start element. -type StartElement struct { - Name Name - Attr []Attr -} - -func (e StartElement) Copy() StartElement { - attrs := make([]Attr, len(e.Attr)) - copy(attrs, e.Attr) - e.Attr = attrs - return e -} - -// End returns the corresponding XML end element. -func (e StartElement) End() EndElement { - return EndElement{e.Name} -} - -// setDefaultNamespace sets the namespace of the element -// as the default for all elements contained within it. -func (e *StartElement) setDefaultNamespace() { - if e.Name.Space == "" { - // If there's no namespace on the element, don't - // set the default. Strictly speaking this might be wrong, as - // we can't tell if the element had no namespace set - // or was just using the default namespace. - return - } - // Don't add a default name space if there's already one set. - for _, attr := range e.Attr { - if attr.Name.Space == "" && attr.Name.Local == "xmlns" { - return - } - } - e.Attr = append(e.Attr, Attr{ - Name: Name{ - Local: "xmlns", - }, - Value: e.Name.Space, - }) -} - -// An EndElement represents an XML end element. -type EndElement struct { - Name Name -} - -// A CharData represents XML character data (raw text), -// in which XML escape sequences have been replaced by -// the characters they represent. -type CharData []byte - -func makeCopy(b []byte) []byte { - b1 := make([]byte, len(b)) - copy(b1, b) - return b1 -} - -func (c CharData) Copy() CharData { return CharData(makeCopy(c)) } - -// A Comment represents an XML comment of the form <!--comment-->. -// The bytes do not include the <!-- and --> comment markers. -type Comment []byte - -func (c Comment) Copy() Comment { return Comment(makeCopy(c)) } - -// A ProcInst represents an XML processing instruction of the form <?target inst?> -type ProcInst struct { - Target string - Inst []byte -} - -func (p ProcInst) Copy() ProcInst { - p.Inst = makeCopy(p.Inst) - return p -} - -// A Directive represents an XML directive of the form <!text>. -// The bytes do not include the <! and > markers. -type Directive []byte - -func (d Directive) Copy() Directive { return Directive(makeCopy(d)) } - -// CopyToken returns a copy of a Token. -func CopyToken(t Token) Token { - switch v := t.(type) { - case CharData: - return v.Copy() - case Comment: - return v.Copy() - case Directive: - return v.Copy() - case ProcInst: - return v.Copy() - case StartElement: - return v.Copy() - } - return t -} - -// A Decoder represents an XML parser reading a particular input stream. -// The parser assumes that its input is encoded in UTF-8. -type Decoder struct { - // Strict defaults to true, enforcing the requirements - // of the XML specification. - // If set to false, the parser allows input containing common - // mistakes: - // * If an element is missing an end tag, the parser invents - // end tags as necessary to keep the return values from Token - // properly balanced. - // * In attribute values and character data, unknown or malformed - // character entities (sequences beginning with &) are left alone. - // - // Setting: - // - // d.Strict = false; - // d.AutoClose = HTMLAutoClose; - // d.Entity = HTMLEntity - // - // creates a parser that can handle typical HTML. - // - // Strict mode does not enforce the requirements of the XML name spaces TR. - // In particular it does not reject name space tags using undefined prefixes. - // Such tags are recorded with the unknown prefix as the name space URL. - Strict bool - - // When Strict == false, AutoClose indicates a set of elements to - // consider closed immediately after they are opened, regardless - // of whether an end element is present. - AutoClose []string - - // Entity can be used to map non-standard entity names to string replacements. - // The parser behaves as if these standard mappings are present in the map, - // regardless of the actual map content: - // - // "lt": "<", - // "gt": ">", - // "amp": "&", - // "apos": "'", - // "quot": `"`, - Entity map[string]string - - // CharsetReader, if non-nil, defines a function to generate - // charset-conversion readers, converting from the provided - // non-UTF-8 charset into UTF-8. If CharsetReader is nil or - // returns an error, parsing stops with an error. One of the - // the CharsetReader's result values must be non-nil. - CharsetReader func(charset string, input io.Reader) (io.Reader, error) - - // DefaultSpace sets the default name space used for unadorned tags, - // as if the entire XML stream were wrapped in an element containing - // the attribute xmlns="DefaultSpace". - DefaultSpace string - - r io.ByteReader - buf bytes.Buffer - saved *bytes.Buffer - stk *stack - free *stack - needClose bool - toClose Name - nextToken Token - nextByte int - ns map[string]string - err error - line int - offset int64 - unmarshalDepth int -} - -// NewDecoder creates a new XML parser reading from r. -// If r does not implement io.ByteReader, NewDecoder will -// do its own buffering. -func NewDecoder(r io.Reader) *Decoder { - d := &Decoder{ - ns: make(map[string]string), - nextByte: -1, - line: 1, - Strict: true, - } - d.switchToReader(r) - return d -} - -// Token returns the next XML token in the input stream. -// At the end of the input stream, Token returns nil, io.EOF. -// -// Slices of bytes in the returned token data refer to the -// parser's internal buffer and remain valid only until the next -// call to Token. To acquire a copy of the bytes, call CopyToken -// or the token's Copy method. -// -// Token expands self-closing elements such as <br/> -// into separate start and end elements returned by successive calls. -// -// Token guarantees that the StartElement and EndElement -// tokens it returns are properly nested and matched: -// if Token encounters an unexpected end element, -// it will return an error. -// -// Token implements XML name spaces as described by -// http://www.w3.org/TR/REC-xml-names/. Each of the -// Name structures contained in the Token has the Space -// set to the URL identifying its name space when known. -// If Token encounters an unrecognized name space prefix, -// it uses the prefix as the Space rather than report an error. -func (d *Decoder) Token() (t Token, err error) { - if d.stk != nil && d.stk.kind == stkEOF { - err = io.EOF - return - } - if d.nextToken != nil { - t = d.nextToken - d.nextToken = nil - } else if t, err = d.rawToken(); err != nil { - return - } - - if !d.Strict { - if t1, ok := d.autoClose(t); ok { - d.nextToken = t - t = t1 - } - } - switch t1 := t.(type) { - case StartElement: - // In XML name spaces, the translations listed in the - // attributes apply to the element name and - // to the other attribute names, so process - // the translations first. - for _, a := range t1.Attr { - if a.Name.Space == "xmlns" { - v, ok := d.ns[a.Name.Local] - d.pushNs(a.Name.Local, v, ok) - d.ns[a.Name.Local] = a.Value - } - if a.Name.Space == "" && a.Name.Local == "xmlns" { - // Default space for untagged names - v, ok := d.ns[""] - d.pushNs("", v, ok) - d.ns[""] = a.Value - } - } - - d.translate(&t1.Name, true) - for i := range t1.Attr { - d.translate(&t1.Attr[i].Name, false) - } - d.pushElement(t1.Name) - t = t1 - - case EndElement: - d.translate(&t1.Name, true) - if !d.popElement(&t1) { - return nil, d.err - } - t = t1 - } - return -} - -const xmlURL = "http://www.w3.org/XML/1998/namespace" - -// Apply name space translation to name n. -// The default name space (for Space=="") -// applies only to element names, not to attribute names. -func (d *Decoder) translate(n *Name, isElementName bool) { - switch { - case n.Space == "xmlns": - return - case n.Space == "" && !isElementName: - return - case n.Space == "xml": - n.Space = xmlURL - case n.Space == "" && n.Local == "xmlns": - return - } - if v, ok := d.ns[n.Space]; ok { - n.Space = v - } else if n.Space == "" { - n.Space = d.DefaultSpace - } -} - -func (d *Decoder) switchToReader(r io.Reader) { - // Get efficient byte at a time reader. - // Assume that if reader has its own - // ReadByte, it's efficient enough. - // Otherwise, use bufio. - if rb, ok := r.(io.ByteReader); ok { - d.r = rb - } else { - d.r = bufio.NewReader(r) - } -} - -// Parsing state - stack holds old name space translations -// and the current set of open elements. The translations to pop when -// ending a given tag are *below* it on the stack, which is -// more work but forced on us by XML. -type stack struct { - next *stack - kind int - name Name - ok bool -} - -const ( - stkStart = iota - stkNs - stkEOF -) - -func (d *Decoder) push(kind int) *stack { - s := d.free - if s != nil { - d.free = s.next - } else { - s = new(stack) - } - s.next = d.stk - s.kind = kind - d.stk = s - return s -} - -func (d *Decoder) pop() *stack { - s := d.stk - if s != nil { - d.stk = s.next - s.next = d.free - d.free = s - } - return s -} - -// Record that after the current element is finished -// (that element is already pushed on the stack) -// Token should return EOF until popEOF is called. -func (d *Decoder) pushEOF() { - // Walk down stack to find Start. - // It might not be the top, because there might be stkNs - // entries above it. - start := d.stk - for start.kind != stkStart { - start = start.next - } - // The stkNs entries below a start are associated with that - // element too; skip over them. - for start.next != nil && start.next.kind == stkNs { - start = start.next - } - s := d.free - if s != nil { - d.free = s.next - } else { - s = new(stack) - } - s.kind = stkEOF - s.next = start.next - start.next = s -} - -// Undo a pushEOF. -// The element must have been finished, so the EOF should be at the top of the stack. -func (d *Decoder) popEOF() bool { - if d.stk == nil || d.stk.kind != stkEOF { - return false - } - d.pop() - return true -} - -// Record that we are starting an element with the given name. -func (d *Decoder) pushElement(name Name) { - s := d.push(stkStart) - s.name = name -} - -// Record that we are changing the value of ns[local]. -// The old value is url, ok. -func (d *Decoder) pushNs(local string, url string, ok bool) { - s := d.push(stkNs) - s.name.Local = local - s.name.Space = url - s.ok = ok -} - -// Creates a SyntaxError with the current line number. -func (d *Decoder) syntaxError(msg string) error { - return &SyntaxError{Msg: msg, Line: d.line} -} - -// Record that we are ending an element with the given name. -// The name must match the record at the top of the stack, -// which must be a pushElement record. -// After popping the element, apply any undo records from -// the stack to restore the name translations that existed -// before we saw this element. -func (d *Decoder) popElement(t *EndElement) bool { - s := d.pop() - name := t.Name - switch { - case s == nil || s.kind != stkStart: - d.err = d.syntaxError("unexpected end element </" + name.Local + ">") - return false - case s.name.Local != name.Local: - if !d.Strict { - d.needClose = true - d.toClose = t.Name - t.Name = s.name - return true - } - d.err = d.syntaxError("element <" + s.name.Local + "> closed by </" + name.Local + ">") - return false - case s.name.Space != name.Space: - d.err = d.syntaxError("element <" + s.name.Local + "> in space " + s.name.Space + - "closed by </" + name.Local + "> in space " + name.Space) - return false - } - - // Pop stack until a Start or EOF is on the top, undoing the - // translations that were associated with the element we just closed. - for d.stk != nil && d.stk.kind != stkStart && d.stk.kind != stkEOF { - s := d.pop() - if s.ok { - d.ns[s.name.Local] = s.name.Space - } else { - delete(d.ns, s.name.Local) - } - } - - return true -} - -// If the top element on the stack is autoclosing and -// t is not the end tag, invent the end tag. -func (d *Decoder) autoClose(t Token) (Token, bool) { - if d.stk == nil || d.stk.kind != stkStart { - return nil, false - } - name := strings.ToLower(d.stk.name.Local) - for _, s := range d.AutoClose { - if strings.ToLower(s) == name { - // This one should be auto closed if t doesn't close it. - et, ok := t.(EndElement) - if !ok || et.Name.Local != name { - return EndElement{d.stk.name}, true - } - break - } - } - return nil, false -} - -var errRawToken = errors.New("xml: cannot use RawToken from UnmarshalXML method") - -// RawToken is like Token but does not verify that -// start and end elements match and does not translate -// name space prefixes to their corresponding URLs. -func (d *Decoder) RawToken() (Token, error) { - if d.unmarshalDepth > 0 { - return nil, errRawToken - } - return d.rawToken() -} - -func (d *Decoder) rawToken() (Token, error) { - if d.err != nil { - return nil, d.err - } - if d.needClose { - // The last element we read was self-closing and - // we returned just the StartElement half. - // Return the EndElement half now. - d.needClose = false - return EndElement{d.toClose}, nil - } - - b, ok := d.getc() - if !ok { - return nil, d.err - } - - if b != '<' { - // Text section. - d.ungetc(b) - data := d.text(-1, false) - if data == nil { - return nil, d.err - } - return CharData(data), nil - } - - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - switch b { - case '/': - // </: End element - var name Name - if name, ok = d.nsname(); !ok { - if d.err == nil { - d.err = d.syntaxError("expected element name after </") - } - return nil, d.err - } - d.space() - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b != '>' { - d.err = d.syntaxError("invalid characters between </" + name.Local + " and >") - return nil, d.err - } - return EndElement{name}, nil - - case '?': - // <?: Processing instruction. - var target string - if target, ok = d.name(); !ok { - if d.err == nil { - d.err = d.syntaxError("expected target name after <?") - } - return nil, d.err - } - d.space() - d.buf.Reset() - var b0 byte - for { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - d.buf.WriteByte(b) - if b0 == '?' && b == '>' { - break - } - b0 = b - } - data := d.buf.Bytes() - data = data[0 : len(data)-2] // chop ?> - - if target == "xml" { - content := string(data) - ver := procInst("version", content) - if ver != "" && ver != "1.0" { - d.err = fmt.Errorf("xml: unsupported version %q; only version 1.0 is supported", ver) - return nil, d.err - } - enc := procInst("encoding", content) - if enc != "" && enc != "utf-8" && enc != "UTF-8" { - if d.CharsetReader == nil { - d.err = fmt.Errorf("xml: encoding %q declared but Decoder.CharsetReader is nil", enc) - return nil, d.err - } - newr, err := d.CharsetReader(enc, d.r.(io.Reader)) - if err != nil { - d.err = fmt.Errorf("xml: opening charset %q: %v", enc, err) - return nil, d.err - } - if newr == nil { - panic("CharsetReader returned a nil Reader for charset " + enc) - } - d.switchToReader(newr) - } - } - return ProcInst{target, data}, nil - - case '!': - // <!: Maybe comment, maybe CDATA. - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - switch b { - case '-': // <!- - // Probably <!-- for a comment. - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b != '-' { - d.err = d.syntaxError("invalid sequence <!- not part of <!--") - return nil, d.err - } - // Look for terminator. - d.buf.Reset() - var b0, b1 byte - for { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - d.buf.WriteByte(b) - if b0 == '-' && b1 == '-' && b == '>' { - break - } - b0, b1 = b1, b - } - data := d.buf.Bytes() - data = data[0 : len(data)-3] // chop --> - return Comment(data), nil - - case '[': // <![ - // Probably <![CDATA[. - for i := 0; i < 6; i++ { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b != "CDATA["[i] { - d.err = d.syntaxError("invalid <![ sequence") - return nil, d.err - } - } - // Have <![CDATA[. Read text until ]]>. - data := d.text(-1, true) - if data == nil { - return nil, d.err - } - return CharData(data), nil - } - - // Probably a directive: <!DOCTYPE ...>, <!ENTITY ...>, etc. - // We don't care, but accumulate for caller. Quoted angle - // brackets do not count for nesting. - d.buf.Reset() - d.buf.WriteByte(b) - inquote := uint8(0) - depth := 0 - for { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if inquote == 0 && b == '>' && depth == 0 { - break - } - HandleB: - d.buf.WriteByte(b) - switch { - case b == inquote: - inquote = 0 - - case inquote != 0: - // in quotes, no special action - - case b == '\'' || b == '"': - inquote = b - - case b == '>' && inquote == 0: - depth-- - - case b == '<' && inquote == 0: - // Look for <!-- to begin comment. - s := "!--" - for i := 0; i < len(s); i++ { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b != s[i] { - for j := 0; j < i; j++ { - d.buf.WriteByte(s[j]) - } - depth++ - goto HandleB - } - } - - // Remove < that was written above. - d.buf.Truncate(d.buf.Len() - 1) - - // Look for terminator. - var b0, b1 byte - for { - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b0 == '-' && b1 == '-' && b == '>' { - break - } - b0, b1 = b1, b - } - } - } - return Directive(d.buf.Bytes()), nil - } - - // Must be an open element like <a href="foo"> - d.ungetc(b) - - var ( - name Name - empty bool - attr []Attr - ) - if name, ok = d.nsname(); !ok { - if d.err == nil { - d.err = d.syntaxError("expected element name after <") - } - return nil, d.err - } - - attr = []Attr{} - for { - d.space() - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b == '/' { - empty = true - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b != '>' { - d.err = d.syntaxError("expected /> in element") - return nil, d.err - } - break - } - if b == '>' { - break - } - d.ungetc(b) - - n := len(attr) - if n >= cap(attr) { - nCap := 2 * cap(attr) - if nCap == 0 { - nCap = 4 - } - nattr := make([]Attr, n, nCap) - copy(nattr, attr) - attr = nattr - } - attr = attr[0 : n+1] - a := &attr[n] - if a.Name, ok = d.nsname(); !ok { - if d.err == nil { - d.err = d.syntaxError("expected attribute name in element") - } - return nil, d.err - } - d.space() - if b, ok = d.mustgetc(); !ok { - return nil, d.err - } - if b != '=' { - if d.Strict { - d.err = d.syntaxError("attribute name without = in element") - return nil, d.err - } else { - d.ungetc(b) - a.Value = a.Name.Local - } - } else { - d.space() - data := d.attrval() - if data == nil { - return nil, d.err - } - a.Value = string(data) - } - } - if empty { - d.needClose = true - d.toClose = name - } - return StartElement{name, attr}, nil -} - -func (d *Decoder) attrval() []byte { - b, ok := d.mustgetc() - if !ok { - return nil - } - // Handle quoted attribute values - if b == '"' || b == '\'' { - return d.text(int(b), false) - } - // Handle unquoted attribute values for strict parsers - if d.Strict { - d.err = d.syntaxError("unquoted or missing attribute value in element") - return nil - } - // Handle unquoted attribute values for unstrict parsers - d.ungetc(b) - d.buf.Reset() - for { - b, ok = d.mustgetc() - if !ok { - return nil - } - // http://www.w3.org/TR/REC-html40/intro/sgmltut.html#h-3.2.2 - if 'a' <= b && b <= 'z' || 'A' <= b && b <= 'Z' || - '0' <= b && b <= '9' || b == '_' || b == ':' || b == '-' { - d.buf.WriteByte(b) - } else { - d.ungetc(b) - break - } - } - return d.buf.Bytes() -} - -// Skip spaces if any -func (d *Decoder) space() { - for { - b, ok := d.getc() - if !ok { - return - } - switch b { - case ' ', '\r', '\n', '\t': - default: - d.ungetc(b) - return - } - } -} - -// Read a single byte. -// If there is no byte to read, return ok==false -// and leave the error in d.err. -// Maintain line number. -func (d *Decoder) getc() (b byte, ok bool) { - if d.err != nil { - return 0, false - } - if d.nextByte >= 0 { - b = byte(d.nextByte) - d.nextByte = -1 - } else { - b, d.err = d.r.ReadByte() - if d.err != nil { - return 0, false - } - if d.saved != nil { - d.saved.WriteByte(b) - } - } - if b == '\n' { - d.line++ - } - d.offset++ - return b, true -} - -// InputOffset returns the input stream byte offset of the current decoder position. -// The offset gives the location of the end of the most recently returned token -// and the beginning of the next token. -func (d *Decoder) InputOffset() int64 { - return d.offset -} - -// Return saved offset. -// If we did ungetc (nextByte >= 0), have to back up one. -func (d *Decoder) savedOffset() int { - n := d.saved.Len() - if d.nextByte >= 0 { - n-- - } - return n -} - -// Must read a single byte. -// If there is no byte to read, -// set d.err to SyntaxError("unexpected EOF") -// and return ok==false -func (d *Decoder) mustgetc() (b byte, ok bool) { - if b, ok = d.getc(); !ok { - if d.err == io.EOF { - d.err = d.syntaxError("unexpected EOF") - } - } - return -} - -// Unread a single byte. -func (d *Decoder) ungetc(b byte) { - if b == '\n' { - d.line-- - } - d.nextByte = int(b) - d.offset-- -} - -var entity = map[string]int{ - "lt": '<', - "gt": '>', - "amp": '&', - "apos": '\'', - "quot": '"', -} - -// Read plain text section (XML calls it character data). -// If quote >= 0, we are in a quoted string and need to find the matching quote. -// If cdata == true, we are in a <![CDATA[ section and need to find ]]>. -// On failure return nil and leave the error in d.err. -func (d *Decoder) text(quote int, cdata bool) []byte { - var b0, b1 byte - var trunc int - d.buf.Reset() -Input: - for { - b, ok := d.getc() - if !ok { - if cdata { - if d.err == io.EOF { - d.err = d.syntaxError("unexpected EOF in CDATA section") - } - return nil - } - break Input - } - - // <![CDATA[ section ends with ]]>. - // It is an error for ]]> to appear in ordinary text. - if b0 == ']' && b1 == ']' && b == '>' { - if cdata { - trunc = 2 - break Input - } - d.err = d.syntaxError("unescaped ]]> not in CDATA section") - return nil - } - - // Stop reading text if we see a <. - if b == '<' && !cdata { - if quote >= 0 { - d.err = d.syntaxError("unescaped < inside quoted string") - return nil - } - d.ungetc('<') - break Input - } - if quote >= 0 && b == byte(quote) { - break Input - } - if b == '&' && !cdata { - // Read escaped character expression up to semicolon. - // XML in all its glory allows a document to define and use - // its own character names with <!ENTITY ...> directives. - // Parsers are required to recognize lt, gt, amp, apos, and quot - // even if they have not been declared. - before := d.buf.Len() - d.buf.WriteByte('&') - var ok bool - var text string - var haveText bool - if b, ok = d.mustgetc(); !ok { - return nil - } - if b == '#' { - d.buf.WriteByte(b) - if b, ok = d.mustgetc(); !ok { - return nil - } - base := 10 - if b == 'x' { - base = 16 - d.buf.WriteByte(b) - if b, ok = d.mustgetc(); !ok { - return nil - } - } - start := d.buf.Len() - for '0' <= b && b <= '9' || - base == 16 && 'a' <= b && b <= 'f' || - base == 16 && 'A' <= b && b <= 'F' { - d.buf.WriteByte(b) - if b, ok = d.mustgetc(); !ok { - return nil - } - } - if b != ';' { - d.ungetc(b) - } else { - s := string(d.buf.Bytes()[start:]) - d.buf.WriteByte(';') - n, err := strconv.ParseUint(s, base, 64) - if err == nil && n <= unicode.MaxRune { - text = string(n) - haveText = true - } - } - } else { - d.ungetc(b) - if !d.readName() { - if d.err != nil { - return nil - } - ok = false - } - if b, ok = d.mustgetc(); !ok { - return nil - } - if b != ';' { - d.ungetc(b) - } else { - name := d.buf.Bytes()[before+1:] - d.buf.WriteByte(';') - if isName(name) { - s := string(name) - if r, ok := entity[s]; ok { - text = string(r) - haveText = true - } else if d.Entity != nil { - text, haveText = d.Entity[s] - } - } - } - } - - if haveText { - d.buf.Truncate(before) - d.buf.Write([]byte(text)) - b0, b1 = 0, 0 - continue Input - } - if !d.Strict { - b0, b1 = 0, 0 - continue Input - } - ent := string(d.buf.Bytes()[before:]) - if ent[len(ent)-1] != ';' { - ent += " (no semicolon)" - } - d.err = d.syntaxError("invalid character entity " + ent) - return nil - } - - // We must rewrite unescaped \r and \r\n into \n. - if b == '\r' { - d.buf.WriteByte('\n') - } else if b1 == '\r' && b == '\n' { - // Skip \r\n--we already wrote \n. - } else { - d.buf.WriteByte(b) - } - - b0, b1 = b1, b - } - data := d.buf.Bytes() - data = data[0 : len(data)-trunc] - - // Inspect each rune for being a disallowed character. - buf := data - for len(buf) > 0 { - r, size := utf8.DecodeRune(buf) - if r == utf8.RuneError && size == 1 { - d.err = d.syntaxError("invalid UTF-8") - return nil - } - buf = buf[size:] - if !isInCharacterRange(r) { - d.err = d.syntaxError(fmt.Sprintf("illegal character code %U", r)) - return nil - } - } - - return data -} - -// Decide whether the given rune is in the XML Character Range, per -// the Char production of http://www.xml.com/axml/testaxml.htm, -// Section 2.2 Characters. -func isInCharacterRange(r rune) (inrange bool) { - return r == 0x09 || - r == 0x0A || - r == 0x0D || - r >= 0x20 && r <= 0xDF77 || - r >= 0xE000 && r <= 0xFFFD || - r >= 0x10000 && r <= 0x10FFFF -} - -// Get name space name: name with a : stuck in the middle. -// The part before the : is the name space identifier. -func (d *Decoder) nsname() (name Name, ok bool) { - s, ok := d.name() - if !ok { - return - } - i := strings.Index(s, ":") - if i < 0 { - name.Local = s - } else { - name.Space = s[0:i] - name.Local = s[i+1:] - } - return name, true -} - -// Get name: /first(first|second)*/ -// Do not set d.err if the name is missing (unless unexpected EOF is received): -// let the caller provide better context. -func (d *Decoder) name() (s string, ok bool) { - d.buf.Reset() - if !d.readName() { - return "", false - } - - // Now we check the characters. - b := d.buf.Bytes() - if !isName(b) { - d.err = d.syntaxError("invalid XML name: " + string(b)) - return "", false - } - return string(b), true -} - -// Read a name and append its bytes to d.buf. -// The name is delimited by any single-byte character not valid in names. -// All multi-byte characters are accepted; the caller must check their validity. -func (d *Decoder) readName() (ok bool) { - var b byte - if b, ok = d.mustgetc(); !ok { - return - } - if b < utf8.RuneSelf && !isNameByte(b) { - d.ungetc(b) - return false - } - d.buf.WriteByte(b) - - for { - if b, ok = d.mustgetc(); !ok { - return - } - if b < utf8.RuneSelf && !isNameByte(b) { - d.ungetc(b) - break - } - d.buf.WriteByte(b) - } - return true -} - -func isNameByte(c byte) bool { - return 'A' <= c && c <= 'Z' || - 'a' <= c && c <= 'z' || - '0' <= c && c <= '9' || - c == '_' || c == ':' || c == '.' || c == '-' -} - -func isName(s []byte) bool { - if len(s) == 0 { - return false - } - c, n := utf8.DecodeRune(s) - if c == utf8.RuneError && n == 1 { - return false - } - if !unicode.Is(first, c) { - return false - } - for n < len(s) { - s = s[n:] - c, n = utf8.DecodeRune(s) - if c == utf8.RuneError && n == 1 { - return false - } - if !unicode.Is(first, c) && !unicode.Is(second, c) { - return false - } - } - return true -} - -func isNameString(s string) bool { - if len(s) == 0 { - return false - } - c, n := utf8.DecodeRuneInString(s) - if c == utf8.RuneError && n == 1 { - return false - } - if !unicode.Is(first, c) { - return false - } - for n < len(s) { - s = s[n:] - c, n = utf8.DecodeRuneInString(s) - if c == utf8.RuneError && n == 1 { - return false - } - if !unicode.Is(first, c) && !unicode.Is(second, c) { - return false - } - } - return true -} - -// These tables were generated by cut and paste from Appendix B of -// the XML spec at http://www.xml.com/axml/testaxml.htm -// and then reformatting. First corresponds to (Letter | '_' | ':') -// and second corresponds to NameChar. - -var first = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x003A, 0x003A, 1}, - {0x0041, 0x005A, 1}, - {0x005F, 0x005F, 1}, - {0x0061, 0x007A, 1}, - {0x00C0, 0x00D6, 1}, - {0x00D8, 0x00F6, 1}, - {0x00F8, 0x00FF, 1}, - {0x0100, 0x0131, 1}, - {0x0134, 0x013E, 1}, - {0x0141, 0x0148, 1}, - {0x014A, 0x017E, 1}, - {0x0180, 0x01C3, 1}, - {0x01CD, 0x01F0, 1}, - {0x01F4, 0x01F5, 1}, - {0x01FA, 0x0217, 1}, - {0x0250, 0x02A8, 1}, - {0x02BB, 0x02C1, 1}, - {0x0386, 0x0386, 1}, - {0x0388, 0x038A, 1}, - {0x038C, 0x038C, 1}, - {0x038E, 0x03A1, 1}, - {0x03A3, 0x03CE, 1}, - {0x03D0, 0x03D6, 1}, - {0x03DA, 0x03E0, 2}, - {0x03E2, 0x03F3, 1}, - {0x0401, 0x040C, 1}, - {0x040E, 0x044F, 1}, - {0x0451, 0x045C, 1}, - {0x045E, 0x0481, 1}, - {0x0490, 0x04C4, 1}, - {0x04C7, 0x04C8, 1}, - {0x04CB, 0x04CC, 1}, - {0x04D0, 0x04EB, 1}, - {0x04EE, 0x04F5, 1}, - {0x04F8, 0x04F9, 1}, - {0x0531, 0x0556, 1}, - {0x0559, 0x0559, 1}, - {0x0561, 0x0586, 1}, - {0x05D0, 0x05EA, 1}, - {0x05F0, 0x05F2, 1}, - {0x0621, 0x063A, 1}, - {0x0641, 0x064A, 1}, - {0x0671, 0x06B7, 1}, - {0x06BA, 0x06BE, 1}, - {0x06C0, 0x06CE, 1}, - {0x06D0, 0x06D3, 1}, - {0x06D5, 0x06D5, 1}, - {0x06E5, 0x06E6, 1}, - {0x0905, 0x0939, 1}, - {0x093D, 0x093D, 1}, - {0x0958, 0x0961, 1}, - {0x0985, 0x098C, 1}, - {0x098F, 0x0990, 1}, - {0x0993, 0x09A8, 1}, - {0x09AA, 0x09B0, 1}, - {0x09B2, 0x09B2, 1}, - {0x09B6, 0x09B9, 1}, - {0x09DC, 0x09DD, 1}, - {0x09DF, 0x09E1, 1}, - {0x09F0, 0x09F1, 1}, - {0x0A05, 0x0A0A, 1}, - {0x0A0F, 0x0A10, 1}, - {0x0A13, 0x0A28, 1}, - {0x0A2A, 0x0A30, 1}, - {0x0A32, 0x0A33, 1}, - {0x0A35, 0x0A36, 1}, - {0x0A38, 0x0A39, 1}, - {0x0A59, 0x0A5C, 1}, - {0x0A5E, 0x0A5E, 1}, - {0x0A72, 0x0A74, 1}, - {0x0A85, 0x0A8B, 1}, - {0x0A8D, 0x0A8D, 1}, - {0x0A8F, 0x0A91, 1}, - {0x0A93, 0x0AA8, 1}, - {0x0AAA, 0x0AB0, 1}, - {0x0AB2, 0x0AB3, 1}, - {0x0AB5, 0x0AB9, 1}, - {0x0ABD, 0x0AE0, 0x23}, - {0x0B05, 0x0B0C, 1}, - {0x0B0F, 0x0B10, 1}, - {0x0B13, 0x0B28, 1}, - {0x0B2A, 0x0B30, 1}, - {0x0B32, 0x0B33, 1}, - {0x0B36, 0x0B39, 1}, - {0x0B3D, 0x0B3D, 1}, - {0x0B5C, 0x0B5D, 1}, - {0x0B5F, 0x0B61, 1}, - {0x0B85, 0x0B8A, 1}, - {0x0B8E, 0x0B90, 1}, - {0x0B92, 0x0B95, 1}, - {0x0B99, 0x0B9A, 1}, - {0x0B9C, 0x0B9C, 1}, - {0x0B9E, 0x0B9F, 1}, - {0x0BA3, 0x0BA4, 1}, - {0x0BA8, 0x0BAA, 1}, - {0x0BAE, 0x0BB5, 1}, - {0x0BB7, 0x0BB9, 1}, - {0x0C05, 0x0C0C, 1}, - {0x0C0E, 0x0C10, 1}, - {0x0C12, 0x0C28, 1}, - {0x0C2A, 0x0C33, 1}, - {0x0C35, 0x0C39, 1}, - {0x0C60, 0x0C61, 1}, - {0x0C85, 0x0C8C, 1}, - {0x0C8E, 0x0C90, 1}, - {0x0C92, 0x0CA8, 1}, - {0x0CAA, 0x0CB3, 1}, - {0x0CB5, 0x0CB9, 1}, - {0x0CDE, 0x0CDE, 1}, - {0x0CE0, 0x0CE1, 1}, - {0x0D05, 0x0D0C, 1}, - {0x0D0E, 0x0D10, 1}, - {0x0D12, 0x0D28, 1}, - {0x0D2A, 0x0D39, 1}, - {0x0D60, 0x0D61, 1}, - {0x0E01, 0x0E2E, 1}, - {0x0E30, 0x0E30, 1}, - {0x0E32, 0x0E33, 1}, - {0x0E40, 0x0E45, 1}, - {0x0E81, 0x0E82, 1}, - {0x0E84, 0x0E84, 1}, - {0x0E87, 0x0E88, 1}, - {0x0E8A, 0x0E8D, 3}, - {0x0E94, 0x0E97, 1}, - {0x0E99, 0x0E9F, 1}, - {0x0EA1, 0x0EA3, 1}, - {0x0EA5, 0x0EA7, 2}, - {0x0EAA, 0x0EAB, 1}, - {0x0EAD, 0x0EAE, 1}, - {0x0EB0, 0x0EB0, 1}, - {0x0EB2, 0x0EB3, 1}, - {0x0EBD, 0x0EBD, 1}, - {0x0EC0, 0x0EC4, 1}, - {0x0F40, 0x0F47, 1}, - {0x0F49, 0x0F69, 1}, - {0x10A0, 0x10C5, 1}, - {0x10D0, 0x10F6, 1}, - {0x1100, 0x1100, 1}, - {0x1102, 0x1103, 1}, - {0x1105, 0x1107, 1}, - {0x1109, 0x1109, 1}, - {0x110B, 0x110C, 1}, - {0x110E, 0x1112, 1}, - {0x113C, 0x1140, 2}, - {0x114C, 0x1150, 2}, - {0x1154, 0x1155, 1}, - {0x1159, 0x1159, 1}, - {0x115F, 0x1161, 1}, - {0x1163, 0x1169, 2}, - {0x116D, 0x116E, 1}, - {0x1172, 0x1173, 1}, - {0x1175, 0x119E, 0x119E - 0x1175}, - {0x11A8, 0x11AB, 0x11AB - 0x11A8}, - {0x11AE, 0x11AF, 1}, - {0x11B7, 0x11B8, 1}, - {0x11BA, 0x11BA, 1}, - {0x11BC, 0x11C2, 1}, - {0x11EB, 0x11F0, 0x11F0 - 0x11EB}, - {0x11F9, 0x11F9, 1}, - {0x1E00, 0x1E9B, 1}, - {0x1EA0, 0x1EF9, 1}, - {0x1F00, 0x1F15, 1}, - {0x1F18, 0x1F1D, 1}, - {0x1F20, 0x1F45, 1}, - {0x1F48, 0x1F4D, 1}, - {0x1F50, 0x1F57, 1}, - {0x1F59, 0x1F5B, 0x1F5B - 0x1F59}, - {0x1F5D, 0x1F5D, 1}, - {0x1F5F, 0x1F7D, 1}, - {0x1F80, 0x1FB4, 1}, - {0x1FB6, 0x1FBC, 1}, - {0x1FBE, 0x1FBE, 1}, - {0x1FC2, 0x1FC4, 1}, - {0x1FC6, 0x1FCC, 1}, - {0x1FD0, 0x1FD3, 1}, - {0x1FD6, 0x1FDB, 1}, - {0x1FE0, 0x1FEC, 1}, - {0x1FF2, 0x1FF4, 1}, - {0x1FF6, 0x1FFC, 1}, - {0x2126, 0x2126, 1}, - {0x212A, 0x212B, 1}, - {0x212E, 0x212E, 1}, - {0x2180, 0x2182, 1}, - {0x3007, 0x3007, 1}, - {0x3021, 0x3029, 1}, - {0x3041, 0x3094, 1}, - {0x30A1, 0x30FA, 1}, - {0x3105, 0x312C, 1}, - {0x4E00, 0x9FA5, 1}, - {0xAC00, 0xD7A3, 1}, - }, -} - -var second = &unicode.RangeTable{ - R16: []unicode.Range16{ - {0x002D, 0x002E, 1}, - {0x0030, 0x0039, 1}, - {0x00B7, 0x00B7, 1}, - {0x02D0, 0x02D1, 1}, - {0x0300, 0x0345, 1}, - {0x0360, 0x0361, 1}, - {0x0387, 0x0387, 1}, - {0x0483, 0x0486, 1}, - {0x0591, 0x05A1, 1}, - {0x05A3, 0x05B9, 1}, - {0x05BB, 0x05BD, 1}, - {0x05BF, 0x05BF, 1}, - {0x05C1, 0x05C2, 1}, - {0x05C4, 0x0640, 0x0640 - 0x05C4}, - {0x064B, 0x0652, 1}, - {0x0660, 0x0669, 1}, - {0x0670, 0x0670, 1}, - {0x06D6, 0x06DC, 1}, - {0x06DD, 0x06DF, 1}, - {0x06E0, 0x06E4, 1}, - {0x06E7, 0x06E8, 1}, - {0x06EA, 0x06ED, 1}, - {0x06F0, 0x06F9, 1}, - {0x0901, 0x0903, 1}, - {0x093C, 0x093C, 1}, - {0x093E, 0x094C, 1}, - {0x094D, 0x094D, 1}, - {0x0951, 0x0954, 1}, - {0x0962, 0x0963, 1}, - {0x0966, 0x096F, 1}, - {0x0981, 0x0983, 1}, - {0x09BC, 0x09BC, 1}, - {0x09BE, 0x09BF, 1}, - {0x09C0, 0x09C4, 1}, - {0x09C7, 0x09C8, 1}, - {0x09CB, 0x09CD, 1}, - {0x09D7, 0x09D7, 1}, - {0x09E2, 0x09E3, 1}, - {0x09E6, 0x09EF, 1}, - {0x0A02, 0x0A3C, 0x3A}, - {0x0A3E, 0x0A3F, 1}, - {0x0A40, 0x0A42, 1}, - {0x0A47, 0x0A48, 1}, - {0x0A4B, 0x0A4D, 1}, - {0x0A66, 0x0A6F, 1}, - {0x0A70, 0x0A71, 1}, - {0x0A81, 0x0A83, 1}, - {0x0ABC, 0x0ABC, 1}, - {0x0ABE, 0x0AC5, 1}, - {0x0AC7, 0x0AC9, 1}, - {0x0ACB, 0x0ACD, 1}, - {0x0AE6, 0x0AEF, 1}, - {0x0B01, 0x0B03, 1}, - {0x0B3C, 0x0B3C, 1}, - {0x0B3E, 0x0B43, 1}, - {0x0B47, 0x0B48, 1}, - {0x0B4B, 0x0B4D, 1}, - {0x0B56, 0x0B57, 1}, - {0x0B66, 0x0B6F, 1}, - {0x0B82, 0x0B83, 1}, - {0x0BBE, 0x0BC2, 1}, - {0x0BC6, 0x0BC8, 1}, - {0x0BCA, 0x0BCD, 1}, - {0x0BD7, 0x0BD7, 1}, - {0x0BE7, 0x0BEF, 1}, - {0x0C01, 0x0C03, 1}, - {0x0C3E, 0x0C44, 1}, - {0x0C46, 0x0C48, 1}, - {0x0C4A, 0x0C4D, 1}, - {0x0C55, 0x0C56, 1}, - {0x0C66, 0x0C6F, 1}, - {0x0C82, 0x0C83, 1}, - {0x0CBE, 0x0CC4, 1}, - {0x0CC6, 0x0CC8, 1}, - {0x0CCA, 0x0CCD, 1}, - {0x0CD5, 0x0CD6, 1}, - {0x0CE6, 0x0CEF, 1}, - {0x0D02, 0x0D03, 1}, - {0x0D3E, 0x0D43, 1}, - {0x0D46, 0x0D48, 1}, - {0x0D4A, 0x0D4D, 1}, - {0x0D57, 0x0D57, 1}, - {0x0D66, 0x0D6F, 1}, - {0x0E31, 0x0E31, 1}, - {0x0E34, 0x0E3A, 1}, - {0x0E46, 0x0E46, 1}, - {0x0E47, 0x0E4E, 1}, - {0x0E50, 0x0E59, 1}, - {0x0EB1, 0x0EB1, 1}, - {0x0EB4, 0x0EB9, 1}, - {0x0EBB, 0x0EBC, 1}, - {0x0EC6, 0x0EC6, 1}, - {0x0EC8, 0x0ECD, 1}, - {0x0ED0, 0x0ED9, 1}, - {0x0F18, 0x0F19, 1}, - {0x0F20, 0x0F29, 1}, - {0x0F35, 0x0F39, 2}, - {0x0F3E, 0x0F3F, 1}, - {0x0F71, 0x0F84, 1}, - {0x0F86, 0x0F8B, 1}, - {0x0F90, 0x0F95, 1}, - {0x0F97, 0x0F97, 1}, - {0x0F99, 0x0FAD, 1}, - {0x0FB1, 0x0FB7, 1}, - {0x0FB9, 0x0FB9, 1}, - {0x20D0, 0x20DC, 1}, - {0x20E1, 0x3005, 0x3005 - 0x20E1}, - {0x302A, 0x302F, 1}, - {0x3031, 0x3035, 1}, - {0x3099, 0x309A, 1}, - {0x309D, 0x309E, 1}, - {0x30FC, 0x30FE, 1}, - }, -} - -// HTMLEntity is an entity map containing translations for the -// standard HTML entity characters. -var HTMLEntity = htmlEntity - -var htmlEntity = map[string]string{ - /* - hget http://www.w3.org/TR/html4/sgml/entities.html | - ssam ' - ,y /\&gt;/ x/\&lt;(.|\n)+/ s/\n/ /g - ,x v/^\&lt;!ENTITY/d - ,s/\&lt;!ENTITY ([^ ]+) .*U\+([0-9A-F][0-9A-F][0-9A-F][0-9A-F]) .+/ "\1": "\\u\2",/g - ' - */ - "nbsp": "\u00A0", - "iexcl": "\u00A1", - "cent": "\u00A2", - "pound": "\u00A3", - "curren": "\u00A4", - "yen": "\u00A5", - "brvbar": "\u00A6", - "sect": "\u00A7", - "uml": "\u00A8", - "copy": "\u00A9", - "ordf": "\u00AA", - "laquo": "\u00AB", - "not": "\u00AC", - "shy": "\u00AD", - "reg": "\u00AE", - "macr": "\u00AF", - "deg": "\u00B0", - "plusmn": "\u00B1", - "sup2": "\u00B2", - "sup3": "\u00B3", - "acute": "\u00B4", - "micro": "\u00B5", - "para": "\u00B6", - "middot": "\u00B7", - "cedil": "\u00B8", - "sup1": "\u00B9", - "ordm": "\u00BA", - "raquo": "\u00BB", - "frac14": "\u00BC", - "frac12": "\u00BD", - "frac34": "\u00BE", - "iquest": "\u00BF", - "Agrave": "\u00C0", - "Aacute": "\u00C1", - "Acirc": "\u00C2", - "Atilde": "\u00C3", - "Auml": "\u00C4", - "Aring": "\u00C5", - "AElig": "\u00C6", - "Ccedil": "\u00C7", - "Egrave": "\u00C8", - "Eacute": "\u00C9", - "Ecirc": "\u00CA", - "Euml": "\u00CB", - "Igrave": "\u00CC", - "Iacute": "\u00CD", - "Icirc": "\u00CE", - "Iuml": "\u00CF", - "ETH": "\u00D0", - "Ntilde": "\u00D1", - "Ograve": "\u00D2", - "Oacute": "\u00D3", - "Ocirc": "\u00D4", - "Otilde": "\u00D5", - "Ouml": "\u00D6", - "times": "\u00D7", - "Oslash": "\u00D8", - "Ugrave": "\u00D9", - "Uacute": "\u00DA", - "Ucirc": "\u00DB", - "Uuml": "\u00DC", - "Yacute": "\u00DD", - "THORN": "\u00DE", - "szlig": "\u00DF", - "agrave": "\u00E0", - "aacute": "\u00E1", - "acirc": "\u00E2", - "atilde": "\u00E3", - "auml": "\u00E4", - "aring": "\u00E5", - "aelig": "\u00E6", - "ccedil": "\u00E7", - "egrave": "\u00E8", - "eacute": "\u00E9", - "ecirc": "\u00EA", - "euml": "\u00EB", - "igrave": "\u00EC", - "iacute": "\u00ED", - "icirc": "\u00EE", - "iuml": "\u00EF", - "eth": "\u00F0", - "ntilde": "\u00F1", - "ograve": "\u00F2", - "oacute": "\u00F3", - "ocirc": "\u00F4", - "otilde": "\u00F5", - "ouml": "\u00F6", - "divide": "\u00F7", - "oslash": "\u00F8", - "ugrave": "\u00F9", - "uacute": "\u00FA", - "ucirc": "\u00FB", - "uuml": "\u00FC", - "yacute": "\u00FD", - "thorn": "\u00FE", - "yuml": "\u00FF", - "fnof": "\u0192", - "Alpha": "\u0391", - "Beta": "\u0392", - "Gamma": "\u0393", - "Delta": "\u0394", - "Epsilon": "\u0395", - "Zeta": "\u0396", - "Eta": "\u0397", - "Theta": "\u0398", - "Iota": "\u0399", - "Kappa": "\u039A", - "Lambda": "\u039B", - "Mu": "\u039C", - "Nu": "\u039D", - "Xi": "\u039E", - "Omicron": "\u039F", - "Pi": "\u03A0", - "Rho": "\u03A1", - "Sigma": "\u03A3", - "Tau": "\u03A4", - "Upsilon": "\u03A5", - "Phi": "\u03A6", - "Chi": "\u03A7", - "Psi": "\u03A8", - "Omega": "\u03A9", - "alpha": "\u03B1", - "beta": "\u03B2", - "gamma": "\u03B3", - "delta": "\u03B4", - "epsilon": "\u03B5", - "zeta": "\u03B6", - "eta": "\u03B7", - "theta": "\u03B8", - "iota": "\u03B9", - "kappa": "\u03BA", - "lambda": "\u03BB", - "mu": "\u03BC", - "nu": "\u03BD", - "xi": "\u03BE", - "omicron": "\u03BF", - "pi": "\u03C0", - "rho": "\u03C1", - "sigmaf": "\u03C2", - "sigma": "\u03C3", - "tau": "\u03C4", - "upsilon": "\u03C5", - "phi": "\u03C6", - "chi": "\u03C7", - "psi": "\u03C8", - "omega": "\u03C9", - "thetasym": "\u03D1", - "upsih": "\u03D2", - "piv": "\u03D6", - "bull": "\u2022", - "hellip": "\u2026", - "prime": "\u2032", - "Prime": "\u2033", - "oline": "\u203E", - "frasl": "\u2044", - "weierp": "\u2118", - "image": "\u2111", - "real": "\u211C", - "trade": "\u2122", - "alefsym": "\u2135", - "larr": "\u2190", - "uarr": "\u2191", - "rarr": "\u2192", - "darr": "\u2193", - "harr": "\u2194", - "crarr": "\u21B5", - "lArr": "\u21D0", - "uArr": "\u21D1", - "rArr": "\u21D2", - "dArr": "\u21D3", - "hArr": "\u21D4", - "forall": "\u2200", - "part": "\u2202", - "exist": "\u2203", - "empty": "\u2205", - "nabla": "\u2207", - "isin": "\u2208", - "notin": "\u2209", - "ni": "\u220B", - "prod": "\u220F", - "sum": "\u2211", - "minus": "\u2212", - "lowast": "\u2217", - "radic": "\u221A", - "prop": "\u221D", - "infin": "\u221E", - "ang": "\u2220", - "and": "\u2227", - "or": "\u2228", - "cap": "\u2229", - "cup": "\u222A", - "int": "\u222B", - "there4": "\u2234", - "sim": "\u223C", - "cong": "\u2245", - "asymp": "\u2248", - "ne": "\u2260", - "equiv": "\u2261", - "le": "\u2264", - "ge": "\u2265", - "sub": "\u2282", - "sup": "\u2283", - "nsub": "\u2284", - "sube": "\u2286", - "supe": "\u2287", - "oplus": "\u2295", - "otimes": "\u2297", - "perp": "\u22A5", - "sdot": "\u22C5", - "lceil": "\u2308", - "rceil": "\u2309", - "lfloor": "\u230A", - "rfloor": "\u230B", - "lang": "\u2329", - "rang": "\u232A", - "loz": "\u25CA", - "spades": "\u2660", - "clubs": "\u2663", - "hearts": "\u2665", - "diams": "\u2666", - "quot": "\u0022", - "amp": "\u0026", - "lt": "\u003C", - "gt": "\u003E", - "OElig": "\u0152", - "oelig": "\u0153", - "Scaron": "\u0160", - "scaron": "\u0161", - "Yuml": "\u0178", - "circ": "\u02C6", - "tilde": "\u02DC", - "ensp": "\u2002", - "emsp": "\u2003", - "thinsp": "\u2009", - "zwnj": "\u200C", - "zwj": "\u200D", - "lrm": "\u200E", - "rlm": "\u200F", - "ndash": "\u2013", - "mdash": "\u2014", - "lsquo": "\u2018", - "rsquo": "\u2019", - "sbquo": "\u201A", - "ldquo": "\u201C", - "rdquo": "\u201D", - "bdquo": "\u201E", - "dagger": "\u2020", - "Dagger": "\u2021", - "permil": "\u2030", - "lsaquo": "\u2039", - "rsaquo": "\u203A", - "euro": "\u20AC", -} - -// HTMLAutoClose is the set of HTML elements that -// should be considered to close automatically. -var HTMLAutoClose = htmlAutoClose - -var htmlAutoClose = []string{ - /* - hget http://www.w3.org/TR/html4/loose.dtd | - 9 sed -n 's/<!ELEMENT ([^ ]*) +- O EMPTY.+/ "\1",/p' | tr A-Z a-z - */ - "basefont", - "br", - "area", - "link", - "img", - "param", - "hr", - "input", - "col", - "frame", - "isindex", - "base", - "meta", -} - -var ( - esc_quot = []byte("&#34;") // shorter than "&quot;" - esc_apos = []byte("&#39;") // shorter than "&apos;" - esc_amp = []byte("&amp;") - esc_lt = []byte("&lt;") - esc_gt = []byte("&gt;") - esc_tab = []byte("&#x9;") - esc_nl = []byte("&#xA;") - esc_cr = []byte("&#xD;") - esc_fffd = []byte("\uFFFD") // Unicode replacement character -) - -// EscapeText writes to w the properly escaped XML equivalent -// of the plain text data s. -func EscapeText(w io.Writer, s []byte) error { - return escapeText(w, s, true) -} - -// escapeText writes to w the properly escaped XML equivalent -// of the plain text data s. If escapeNewline is true, newline -// characters will be escaped. -func escapeText(w io.Writer, s []byte, escapeNewline bool) error { - var esc []byte - last := 0 - for i := 0; i < len(s); { - r, width := utf8.DecodeRune(s[i:]) - i += width - switch r { - case '"': - esc = esc_quot - case '\'': - esc = esc_apos - case '&': - esc = esc_amp - case '<': - esc = esc_lt - case '>': - esc = esc_gt - case '\t': - esc = esc_tab - case '\n': - if !escapeNewline { - continue - } - esc = esc_nl - case '\r': - esc = esc_cr - default: - if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) { - esc = esc_fffd - break - } - continue - } - if _, err := w.Write(s[last : i-width]); err != nil { - return err - } - if _, err := w.Write(esc); err != nil { - return err - } - last = i - } - if _, err := w.Write(s[last:]); err != nil { - return err - } - return nil -} - -// EscapeString writes to p the properly escaped XML equivalent -// of the plain text data s. -func (p *printer) EscapeString(s string) { - var esc []byte - last := 0 - for i := 0; i < len(s); { - r, width := utf8.DecodeRuneInString(s[i:]) - i += width - switch r { - case '"': - esc = esc_quot - case '\'': - esc = esc_apos - case '&': - esc = esc_amp - case '<': - esc = esc_lt - case '>': - esc = esc_gt - case '\t': - esc = esc_tab - case '\n': - esc = esc_nl - case '\r': - esc = esc_cr - default: - if !isInCharacterRange(r) || (r == 0xFFFD && width == 1) { - esc = esc_fffd - break - } - continue - } - p.WriteString(s[last : i-width]) - p.Write(esc) - last = i - } - p.WriteString(s[last:]) -} - -// Escape is like EscapeText but omits the error return value. -// It is provided for backwards compatibility with Go 1.0. -// Code targeting Go 1.1 or later should use EscapeText. -func Escape(w io.Writer, s []byte) { - EscapeText(w, s) -} - -// procInst parses the `param="..."` or `param='...'` -// value out of the provided string, returning "" if not found. -func procInst(param, s string) string { - // TODO: this parsing is somewhat lame and not exact. - // It works for all actual cases, though. - param = param + "=" - idx := strings.Index(s, param) - if idx == -1 { - return "" - } - v := s[idx+len(param):] - if v == "" { - return "" - } - if v[0] != '\'' && v[0] != '"' { - return "" - } - idx = strings.IndexRune(v[1:], rune(v[0])) - if idx == -1 { - return "" - } - return v[1 : idx+1] -} diff --git a/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go b/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go deleted file mode 100644 index 312a7c98..00000000 --- a/vendor/golang.org/x/net/webdav/internal/xml/xml_test.go +++ /dev/null @@ -1,752 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package xml - -import ( - "bytes" - "fmt" - "io" - "reflect" - "strings" - "testing" - "unicode/utf8" -) - -const testInput = ` -<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> -<body xmlns:foo="ns1" xmlns="ns2" xmlns:tag="ns3" ` + - "\r\n\t" + ` > - <hello lang="en">World &lt;&gt;&apos;&quot; &#x767d;&#40300;ç¿”</hello> - <query>&何; &is-it;</query> - <goodbye /> - <outer foo:attr="value" xmlns:tag="ns4"> - <inner/> - </outer> - <tag:name> - <![CDATA[Some text here.]]> - </tag:name> -</body><!-- missing final newline -->` - -var testEntity = map[string]string{"何": "What", "is-it": "is it?"} - -var rawTokens = []Token{ - CharData("\n"), - ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, - CharData("\n"), - Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), - CharData("\n"), - StartElement{Name{"", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, - CharData("\n "), - StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, - CharData("World <>'\" 白鵬翔"), - EndElement{Name{"", "hello"}}, - CharData("\n "), - StartElement{Name{"", "query"}, []Attr{}}, - CharData("What is it?"), - EndElement{Name{"", "query"}}, - CharData("\n "), - StartElement{Name{"", "goodbye"}, []Attr{}}, - EndElement{Name{"", "goodbye"}}, - CharData("\n "), - StartElement{Name{"", "outer"}, []Attr{{Name{"foo", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, - CharData("\n "), - StartElement{Name{"", "inner"}, []Attr{}}, - EndElement{Name{"", "inner"}}, - CharData("\n "), - EndElement{Name{"", "outer"}}, - CharData("\n "), - StartElement{Name{"tag", "name"}, []Attr{}}, - CharData("\n "), - CharData("Some text here."), - CharData("\n "), - EndElement{Name{"tag", "name"}}, - CharData("\n"), - EndElement{Name{"", "body"}}, - Comment(" missing final newline "), -} - -var cookedTokens = []Token{ - CharData("\n"), - ProcInst{"xml", []byte(`version="1.0" encoding="UTF-8"`)}, - CharData("\n"), - Directive(`DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" - "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"`), - CharData("\n"), - StartElement{Name{"ns2", "body"}, []Attr{{Name{"xmlns", "foo"}, "ns1"}, {Name{"", "xmlns"}, "ns2"}, {Name{"xmlns", "tag"}, "ns3"}}}, - CharData("\n "), - StartElement{Name{"ns2", "hello"}, []Attr{{Name{"", "lang"}, "en"}}}, - CharData("World <>'\" 白鵬翔"), - EndElement{Name{"ns2", "hello"}}, - CharData("\n "), - StartElement{Name{"ns2", "query"}, []Attr{}}, - CharData("What is it?"), - EndElement{Name{"ns2", "query"}}, - CharData("\n "), - StartElement{Name{"ns2", "goodbye"}, []Attr{}}, - EndElement{Name{"ns2", "goodbye"}}, - CharData("\n "), - StartElement{Name{"ns2", "outer"}, []Attr{{Name{"ns1", "attr"}, "value"}, {Name{"xmlns", "tag"}, "ns4"}}}, - CharData("\n "), - StartElement{Name{"ns2", "inner"}, []Attr{}}, - EndElement{Name{"ns2", "inner"}}, - CharData("\n "), - EndElement{Name{"ns2", "outer"}}, - CharData("\n "), - StartElement{Name{"ns3", "name"}, []Attr{}}, - CharData("\n "), - CharData("Some text here."), - CharData("\n "), - EndElement{Name{"ns3", "name"}}, - CharData("\n"), - EndElement{Name{"ns2", "body"}}, - Comment(" missing final newline "), -} - -const testInputAltEncoding = ` -<?xml version="1.0" encoding="x-testing-uppercase"?> -<TAG>VALUE</TAG>` - -var rawTokensAltEncoding = []Token{ - CharData("\n"), - ProcInst{"xml", []byte(`version="1.0" encoding="x-testing-uppercase"`)}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("value"), - EndElement{Name{"", "tag"}}, -} - -var xmlInput = []string{ - // unexpected EOF cases - "<", - "<t", - "<t ", - "<t/", - "<!", - "<!-", - "<!--", - "<!--c-", - "<!--c--", - "<!d", - "<t></", - "<t></t", - "<?", - "<?p", - "<t a", - "<t a=", - "<t a='", - "<t a=''", - "<t/><![", - "<t/><![C", - "<t/><![CDATA[d", - "<t/><![CDATA[d]", - "<t/><![CDATA[d]]", - - // other Syntax errors - "<>", - "<t/a", - "<0 />", - "<?0 >", - // "<!0 >", // let the Token() caller handle - "</0>", - "<t 0=''>", - "<t a='&'>", - "<t a='<'>", - "<t>&nbspc;</t>", - "<t a>", - "<t a=>", - "<t a=v>", - // "<![CDATA[d]]>", // let the Token() caller handle - "<t></e>", - "<t></>", - "<t></t!", - "<t>cdata]]></t>", -} - -func TestRawToken(t *testing.T) { - d := NewDecoder(strings.NewReader(testInput)) - d.Entity = testEntity - testRawToken(t, d, testInput, rawTokens) -} - -const nonStrictInput = ` -<tag>non&entity</tag> -<tag>&unknown;entity</tag> -<tag>&#123</tag> -<tag>&#zzz;</tag> -<tag>&ãªã¾ãˆ3;</tag> -<tag>&lt-gt;</tag> -<tag>&;</tag> -<tag>&0a;</tag> -` - -var nonStringEntity = map[string]string{"": "oops!", "0a": "oops!"} - -var nonStrictTokens = []Token{ - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("non&entity"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&unknown;entity"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&#123"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&#zzz;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&ãªã¾ãˆ3;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&lt-gt;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), - StartElement{Name{"", "tag"}, []Attr{}}, - CharData("&0a;"), - EndElement{Name{"", "tag"}}, - CharData("\n"), -} - -func TestNonStrictRawToken(t *testing.T) { - d := NewDecoder(strings.NewReader(nonStrictInput)) - d.Strict = false - testRawToken(t, d, nonStrictInput, nonStrictTokens) -} - -type downCaser struct { - t *testing.T - r io.ByteReader -} - -func (d *downCaser) ReadByte() (c byte, err error) { - c, err = d.r.ReadByte() - if c >= 'A' && c <= 'Z' { - c += 'a' - 'A' - } - return -} - -func (d *downCaser) Read(p []byte) (int, error) { - d.t.Fatalf("unexpected Read call on downCaser reader") - panic("unreachable") -} - -func TestRawTokenAltEncoding(t *testing.T) { - d := NewDecoder(strings.NewReader(testInputAltEncoding)) - d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { - if charset != "x-testing-uppercase" { - t.Fatalf("unexpected charset %q", charset) - } - return &downCaser{t, input.(io.ByteReader)}, nil - } - testRawToken(t, d, testInputAltEncoding, rawTokensAltEncoding) -} - -func TestRawTokenAltEncodingNoConverter(t *testing.T) { - d := NewDecoder(strings.NewReader(testInputAltEncoding)) - token, err := d.RawToken() - if token == nil { - t.Fatalf("expected a token on first RawToken call") - } - if err != nil { - t.Fatal(err) - } - token, err = d.RawToken() - if token != nil { - t.Errorf("expected a nil token; got %#v", token) - } - if err == nil { - t.Fatalf("expected an error on second RawToken call") - } - const encoding = "x-testing-uppercase" - if !strings.Contains(err.Error(), encoding) { - t.Errorf("expected error to contain %q; got error: %v", - encoding, err) - } -} - -func testRawToken(t *testing.T, d *Decoder, raw string, rawTokens []Token) { - lastEnd := int64(0) - for i, want := range rawTokens { - start := d.InputOffset() - have, err := d.RawToken() - end := d.InputOffset() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - var shave, swant string - if _, ok := have.(CharData); ok { - shave = fmt.Sprintf("CharData(%q)", have) - } else { - shave = fmt.Sprintf("%#v", have) - } - if _, ok := want.(CharData); ok { - swant = fmt.Sprintf("CharData(%q)", want) - } else { - swant = fmt.Sprintf("%#v", want) - } - t.Errorf("token %d = %s, want %s", i, shave, swant) - } - - // Check that InputOffset returned actual token. - switch { - case start < lastEnd: - t.Errorf("token %d: position [%d,%d) for %T is before previous token", i, start, end, have) - case start >= end: - // Special case: EndElement can be synthesized. - if start == end && end == lastEnd { - break - } - t.Errorf("token %d: position [%d,%d) for %T is empty", i, start, end, have) - case end > int64(len(raw)): - t.Errorf("token %d: position [%d,%d) for %T extends beyond input", i, start, end, have) - default: - text := raw[start:end] - if strings.ContainsAny(text, "<>") && (!strings.HasPrefix(text, "<") || !strings.HasSuffix(text, ">")) { - t.Errorf("token %d: misaligned raw token %#q for %T", i, text, have) - } - } - lastEnd = end - } -} - -// Ensure that directives (specifically !DOCTYPE) include the complete -// text of any nested directives, noting that < and > do not change -// nesting depth if they are in single or double quotes. - -var nestedDirectivesInput = ` -<!DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]> -<!DOCTYPE [<!ENTITY xlt ">">]> -<!DOCTYPE [<!ENTITY xlt "<">]> -<!DOCTYPE [<!ENTITY xlt '>'>]> -<!DOCTYPE [<!ENTITY xlt '<'>]> -<!DOCTYPE [<!ENTITY xlt '">'>]> -<!DOCTYPE [<!ENTITY xlt "'<">]> -` - -var nestedDirectivesTokens = []Token{ - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY xlt ">">]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY xlt "<">]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY xlt '>'>]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY xlt '<'>]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY xlt '">'>]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY xlt "'<">]`), - CharData("\n"), -} - -func TestNestedDirectives(t *testing.T) { - d := NewDecoder(strings.NewReader(nestedDirectivesInput)) - - for i, want := range nestedDirectivesTokens { - have, err := d.Token() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - t.Errorf("token %d = %#v want %#v", i, have, want) - } - } -} - -func TestToken(t *testing.T) { - d := NewDecoder(strings.NewReader(testInput)) - d.Entity = testEntity - - for i, want := range cookedTokens { - have, err := d.Token() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - t.Errorf("token %d = %#v want %#v", i, have, want) - } - } -} - -func TestSyntax(t *testing.T) { - for i := range xmlInput { - d := NewDecoder(strings.NewReader(xmlInput[i])) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - if _, ok := err.(*SyntaxError); !ok { - t.Fatalf(`xmlInput "%s": expected SyntaxError not received`, xmlInput[i]) - } - } -} - -type allScalars struct { - True1 bool - True2 bool - False1 bool - False2 bool - Int int - Int8 int8 - Int16 int16 - Int32 int32 - Int64 int64 - Uint int - Uint8 uint8 - Uint16 uint16 - Uint32 uint32 - Uint64 uint64 - Uintptr uintptr - Float32 float32 - Float64 float64 - String string - PtrString *string -} - -var all = allScalars{ - True1: true, - True2: true, - False1: false, - False2: false, - Int: 1, - Int8: -2, - Int16: 3, - Int32: -4, - Int64: 5, - Uint: 6, - Uint8: 7, - Uint16: 8, - Uint32: 9, - Uint64: 10, - Uintptr: 11, - Float32: 13.0, - Float64: 14.0, - String: "15", - PtrString: &sixteen, -} - -var sixteen = "16" - -const testScalarsInput = `<allscalars> - <True1>true</True1> - <True2>1</True2> - <False1>false</False1> - <False2>0</False2> - <Int>1</Int> - <Int8>-2</Int8> - <Int16>3</Int16> - <Int32>-4</Int32> - <Int64>5</Int64> - <Uint>6</Uint> - <Uint8>7</Uint8> - <Uint16>8</Uint16> - <Uint32>9</Uint32> - <Uint64>10</Uint64> - <Uintptr>11</Uintptr> - <Float>12.0</Float> - <Float32>13.0</Float32> - <Float64>14.0</Float64> - <String>15</String> - <PtrString>16</PtrString> -</allscalars>` - -func TestAllScalars(t *testing.T) { - var a allScalars - err := Unmarshal([]byte(testScalarsInput), &a) - - if err != nil { - t.Fatal(err) - } - if !reflect.DeepEqual(a, all) { - t.Errorf("have %+v want %+v", a, all) - } -} - -type item struct { - Field_a string -} - -func TestIssue569(t *testing.T) { - data := `<item><Field_a>abcd</Field_a></item>` - var i item - err := Unmarshal([]byte(data), &i) - - if err != nil || i.Field_a != "abcd" { - t.Fatal("Expecting abcd") - } -} - -func TestUnquotedAttrs(t *testing.T) { - data := "<tag attr=azAZ09:-_\t>" - d := NewDecoder(strings.NewReader(data)) - d.Strict = false - token, err := d.Token() - if _, ok := err.(*SyntaxError); ok { - t.Errorf("Unexpected error: %v", err) - } - if token.(StartElement).Name.Local != "tag" { - t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) - } - attr := token.(StartElement).Attr[0] - if attr.Value != "azAZ09:-_" { - t.Errorf("Unexpected attribute value: %v", attr.Value) - } - if attr.Name.Local != "attr" { - t.Errorf("Unexpected attribute name: %v", attr.Name.Local) - } -} - -func TestValuelessAttrs(t *testing.T) { - tests := [][3]string{ - {"<p nowrap>", "p", "nowrap"}, - {"<p nowrap >", "p", "nowrap"}, - {"<input checked/>", "input", "checked"}, - {"<input checked />", "input", "checked"}, - } - for _, test := range tests { - d := NewDecoder(strings.NewReader(test[0])) - d.Strict = false - token, err := d.Token() - if _, ok := err.(*SyntaxError); ok { - t.Errorf("Unexpected error: %v", err) - } - if token.(StartElement).Name.Local != test[1] { - t.Errorf("Unexpected tag name: %v", token.(StartElement).Name.Local) - } - attr := token.(StartElement).Attr[0] - if attr.Value != test[2] { - t.Errorf("Unexpected attribute value: %v", attr.Value) - } - if attr.Name.Local != test[2] { - t.Errorf("Unexpected attribute name: %v", attr.Name.Local) - } - } -} - -func TestCopyTokenCharData(t *testing.T) { - data := []byte("same data") - var tok1 Token = CharData(data) - tok2 := CopyToken(tok1) - if !reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(CharData) != CharData") - } - data[1] = 'o' - if reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(CharData) uses same buffer.") - } -} - -func TestCopyTokenStartElement(t *testing.T) { - elt := StartElement{Name{"", "hello"}, []Attr{{Name{"", "lang"}, "en"}}} - var tok1 Token = elt - tok2 := CopyToken(tok1) - if tok1.(StartElement).Attr[0].Value != "en" { - t.Error("CopyToken overwrote Attr[0]") - } - if !reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(StartElement) != StartElement") - } - tok1.(StartElement).Attr[0] = Attr{Name{"", "lang"}, "de"} - if reflect.DeepEqual(tok1, tok2) { - t.Error("CopyToken(CharData) uses same buffer.") - } -} - -func TestSyntaxErrorLineNum(t *testing.T) { - testInput := "<P>Foo<P>\n\n<P>Bar</>\n" - d := NewDecoder(strings.NewReader(testInput)) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - synerr, ok := err.(*SyntaxError) - if !ok { - t.Error("Expected SyntaxError.") - } - if synerr.Line != 3 { - t.Error("SyntaxError didn't have correct line number.") - } -} - -func TestTrailingRawToken(t *testing.T) { - input := `<FOO></FOO> ` - d := NewDecoder(strings.NewReader(input)) - var err error - for _, err = d.RawToken(); err == nil; _, err = d.RawToken() { - } - if err != io.EOF { - t.Fatalf("d.RawToken() = _, %v, want _, io.EOF", err) - } -} - -func TestTrailingToken(t *testing.T) { - input := `<FOO></FOO> ` - d := NewDecoder(strings.NewReader(input)) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - if err != io.EOF { - t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) - } -} - -func TestEntityInsideCDATA(t *testing.T) { - input := `<test><![CDATA[ &val=foo ]]></test>` - d := NewDecoder(strings.NewReader(input)) - var err error - for _, err = d.Token(); err == nil; _, err = d.Token() { - } - if err != io.EOF { - t.Fatalf("d.Token() = _, %v, want _, io.EOF", err) - } -} - -var characterTests = []struct { - in string - err string -}{ - {"\x12<doc/>", "illegal character code U+0012"}, - {"<?xml version=\"1.0\"?>\x0b<doc/>", "illegal character code U+000B"}, - {"\xef\xbf\xbe<doc/>", "illegal character code U+FFFE"}, - {"<?xml version=\"1.0\"?><doc>\r\n<hiya/>\x07<toots/></doc>", "illegal character code U+0007"}, - {"<?xml version=\"1.0\"?><doc \x12='value'>what's up</doc>", "expected attribute name in element"}, - {"<doc>&abc\x01;</doc>", "invalid character entity &abc (no semicolon)"}, - {"<doc>&\x01;</doc>", "invalid character entity & (no semicolon)"}, - {"<doc>&\xef\xbf\xbe;</doc>", "invalid character entity &\uFFFE;"}, - {"<doc>&hello;</doc>", "invalid character entity &hello;"}, -} - -func TestDisallowedCharacters(t *testing.T) { - - for i, tt := range characterTests { - d := NewDecoder(strings.NewReader(tt.in)) - var err error - - for err == nil { - _, err = d.Token() - } - synerr, ok := err.(*SyntaxError) - if !ok { - t.Fatalf("input %d d.Token() = _, %v, want _, *SyntaxError", i, err) - } - if synerr.Msg != tt.err { - t.Fatalf("input %d synerr.Msg wrong: want %q, got %q", i, tt.err, synerr.Msg) - } - } -} - -type procInstEncodingTest struct { - expect, got string -} - -var procInstTests = []struct { - input string - expect [2]string -}{ - {`version="1.0" encoding="utf-8"`, [2]string{"1.0", "utf-8"}}, - {`version="1.0" encoding='utf-8'`, [2]string{"1.0", "utf-8"}}, - {`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}}, - {`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}}, - {`encoding="FOO" `, [2]string{"", "FOO"}}, -} - -func TestProcInstEncoding(t *testing.T) { - for _, test := range procInstTests { - if got := procInst("version", test.input); got != test.expect[0] { - t.Errorf("procInst(version, %q) = %q; want %q", test.input, got, test.expect[0]) - } - if got := procInst("encoding", test.input); got != test.expect[1] { - t.Errorf("procInst(encoding, %q) = %q; want %q", test.input, got, test.expect[1]) - } - } -} - -// Ensure that directives with comments include the complete -// text of any nested directives. - -var directivesWithCommentsInput = ` -<!DOCTYPE [<!-- a comment --><!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]> -<!DOCTYPE [<!ENTITY go "Golang"><!-- a comment-->]> -<!DOCTYPE <!-> <!> <!----> <!-->--> <!--->--> [<!ENTITY go "Golang"><!-- a comment-->]> -` - -var directivesWithCommentsTokens = []Token{ - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">]`), - CharData("\n"), - Directive(`DOCTYPE [<!ENTITY go "Golang">]`), - CharData("\n"), - Directive(`DOCTYPE <!-> <!> [<!ENTITY go "Golang">]`), - CharData("\n"), -} - -func TestDirectivesWithComments(t *testing.T) { - d := NewDecoder(strings.NewReader(directivesWithCommentsInput)) - - for i, want := range directivesWithCommentsTokens { - have, err := d.Token() - if err != nil { - t.Fatalf("token %d: unexpected error: %s", i, err) - } - if !reflect.DeepEqual(have, want) { - t.Errorf("token %d = %#v want %#v", i, have, want) - } - } -} - -// Writer whose Write method always returns an error. -type errWriter struct{} - -func (errWriter) Write(p []byte) (n int, err error) { return 0, fmt.Errorf("unwritable") } - -func TestEscapeTextIOErrors(t *testing.T) { - expectErr := "unwritable" - err := EscapeText(errWriter{}, []byte{'A'}) - - if err == nil || err.Error() != expectErr { - t.Errorf("have %v, want %v", err, expectErr) - } -} - -func TestEscapeTextInvalidChar(t *testing.T) { - input := []byte("A \x00 terminated string.") - expected := "A \uFFFD terminated string." - - buff := new(bytes.Buffer) - if err := EscapeText(buff, input); err != nil { - t.Fatalf("have %v, want nil", err) - } - text := buff.String() - - if text != expected { - t.Errorf("have %v, want %v", text, expected) - } -} - -func TestIssue5880(t *testing.T) { - type T []byte - data, err := Marshal(T{192, 168, 0, 1}) - if err != nil { - t.Errorf("Marshal error: %v", err) - } - if !utf8.Valid(data) { - t.Errorf("Marshal generated invalid UTF-8: %x", data) - } -} diff --git a/vendor/golang.org/x/net/webdav/litmus_test_server.go b/vendor/golang.org/x/net/webdav/litmus_test_server.go deleted file mode 100644 index 514db5dd..00000000 --- a/vendor/golang.org/x/net/webdav/litmus_test_server.go +++ /dev/null @@ -1,94 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build ignore - -/* -This program is a server for the WebDAV 'litmus' compliance test at -http://www.webdav.org/neon/litmus/ -To run the test: - -go run litmus_test_server.go - -and separately, from the downloaded litmus-xxx directory: - -make URL=http://localhost:9999/ check -*/ -package main - -import ( - "flag" - "fmt" - "log" - "net/http" - "net/url" - - "golang.org/x/net/webdav" -) - -var port = flag.Int("port", 9999, "server port") - -func main() { - flag.Parse() - log.SetFlags(0) - h := &webdav.Handler{ - FileSystem: webdav.NewMemFS(), - LockSystem: webdav.NewMemLS(), - Logger: func(r *http.Request, err error) { - litmus := r.Header.Get("X-Litmus") - if len(litmus) > 19 { - litmus = litmus[:16] + "..." - } - - switch r.Method { - case "COPY", "MOVE": - dst := "" - if u, err := url.Parse(r.Header.Get("Destination")); err == nil { - dst = u.Path - } - o := r.Header.Get("Overwrite") - log.Printf("%-20s%-10s%-30s%-30so=%-2s%v", litmus, r.Method, r.URL.Path, dst, o, err) - default: - log.Printf("%-20s%-10s%-30s%v", litmus, r.Method, r.URL.Path, err) - } - }, - } - - // The next line would normally be: - // http.Handle("/", h) - // but we wrap that HTTP handler h to cater for a special case. - // - // The propfind_invalid2 litmus test case expects an empty namespace prefix - // declaration to be an error. The FAQ in the webdav litmus test says: - // - // "What does the "propfind_invalid2" test check for?... - // - // If a request was sent with an XML body which included an empty namespace - // prefix declaration (xmlns:ns1=""), then the server must reject that with - // a "400 Bad Request" response, as it is invalid according to the XML - // Namespace specification." - // - // On the other hand, the Go standard library's encoding/xml package - // accepts an empty xmlns namespace, as per the discussion at - // https://github.com/golang/go/issues/8068 - // - // Empty namespaces seem disallowed in the second (2006) edition of the XML - // standard, but allowed in a later edition. The grammar differs between - // http://www.w3.org/TR/2006/REC-xml-names-20060816/#ns-decl and - // http://www.w3.org/TR/REC-xml-names/#dt-prefix - // - // Thus, we assume that the propfind_invalid2 test is obsolete, and - // hard-code the 400 Bad Request response that the test expects. - http.Handle("/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("X-Litmus") == "props: 3 (propfind_invalid2)" { - http.Error(w, "400 Bad Request", http.StatusBadRequest) - return - } - h.ServeHTTP(w, r) - })) - - addr := fmt.Sprintf(":%d", *port) - log.Printf("Serving %v", addr) - log.Fatal(http.ListenAndServe(addr, nil)) -} diff --git a/vendor/golang.org/x/net/webdav/lock.go b/vendor/golang.org/x/net/webdav/lock.go deleted file mode 100644 index 344ac5ce..00000000 --- a/vendor/golang.org/x/net/webdav/lock.go +++ /dev/null @@ -1,445 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "container/heap" - "errors" - "strconv" - "strings" - "sync" - "time" -) - -var ( - // ErrConfirmationFailed is returned by a LockSystem's Confirm method. - ErrConfirmationFailed = errors.New("webdav: confirmation failed") - // ErrForbidden is returned by a LockSystem's Unlock method. - ErrForbidden = errors.New("webdav: forbidden") - // ErrLocked is returned by a LockSystem's Create, Refresh and Unlock methods. - ErrLocked = errors.New("webdav: locked") - // ErrNoSuchLock is returned by a LockSystem's Refresh and Unlock methods. - ErrNoSuchLock = errors.New("webdav: no such lock") -) - -// Condition can match a WebDAV resource, based on a token or ETag. -// Exactly one of Token and ETag should be non-empty. -type Condition struct { - Not bool - Token string - ETag string -} - -// LockSystem manages access to a collection of named resources. The elements -// in a lock name are separated by slash ('/', U+002F) characters, regardless -// of host operating system convention. -type LockSystem interface { - // Confirm confirms that the caller can claim all of the locks specified by - // the given conditions, and that holding the union of all of those locks - // gives exclusive access to all of the named resources. Up to two resources - // can be named. Empty names are ignored. - // - // Exactly one of release and err will be non-nil. If release is non-nil, - // all of the requested locks are held until release is called. Calling - // release does not unlock the lock, in the WebDAV UNLOCK sense, but once - // Confirm has confirmed that a lock claim is valid, that lock cannot be - // Confirmed again until it has been released. - // - // If Confirm returns ErrConfirmationFailed then the Handler will continue - // to try any other set of locks presented (a WebDAV HTTP request can - // present more than one set of locks). If it returns any other non-nil - // error, the Handler will write a "500 Internal Server Error" HTTP status. - Confirm(now time.Time, name0, name1 string, conditions ...Condition) (release func(), err error) - - // Create creates a lock with the given depth, duration, owner and root - // (name). The depth will either be negative (meaning infinite) or zero. - // - // If Create returns ErrLocked then the Handler will write a "423 Locked" - // HTTP status. If it returns any other non-nil error, the Handler will - // write a "500 Internal Server Error" HTTP status. - // - // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for - // when to use each error. - // - // The token returned identifies the created lock. It should be an absolute - // URI as defined by RFC 3986, Section 4.3. In particular, it should not - // contain whitespace. - Create(now time.Time, details LockDetails) (token string, err error) - - // Refresh refreshes the lock with the given token. - // - // If Refresh returns ErrLocked then the Handler will write a "423 Locked" - // HTTP Status. If Refresh returns ErrNoSuchLock then the Handler will write - // a "412 Precondition Failed" HTTP Status. If it returns any other non-nil - // error, the Handler will write a "500 Internal Server Error" HTTP status. - // - // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.10.6 for - // when to use each error. - Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) - - // Unlock unlocks the lock with the given token. - // - // If Unlock returns ErrForbidden then the Handler will write a "403 - // Forbidden" HTTP Status. If Unlock returns ErrLocked then the Handler - // will write a "423 Locked" HTTP status. If Unlock returns ErrNoSuchLock - // then the Handler will write a "409 Conflict" HTTP Status. If it returns - // any other non-nil error, the Handler will write a "500 Internal Server - // Error" HTTP status. - // - // See http://www.webdav.org/specs/rfc4918.html#rfc.section.9.11.1 for - // when to use each error. - Unlock(now time.Time, token string) error -} - -// LockDetails are a lock's metadata. -type LockDetails struct { - // Root is the root resource name being locked. For a zero-depth lock, the - // root is the only resource being locked. - Root string - // Duration is the lock timeout. A negative duration means infinite. - Duration time.Duration - // OwnerXML is the verbatim <owner> XML given in a LOCK HTTP request. - // - // TODO: does the "verbatim" nature play well with XML namespaces? - // Does the OwnerXML field need to have more structure? See - // https://codereview.appspot.com/175140043/#msg2 - OwnerXML string - // ZeroDepth is whether the lock has zero depth. If it does not have zero - // depth, it has infinite depth. - ZeroDepth bool -} - -// NewMemLS returns a new in-memory LockSystem. -func NewMemLS() LockSystem { - return &memLS{ - byName: make(map[string]*memLSNode), - byToken: make(map[string]*memLSNode), - gen: uint64(time.Now().Unix()), - } -} - -type memLS struct { - mu sync.Mutex - byName map[string]*memLSNode - byToken map[string]*memLSNode - gen uint64 - // byExpiry only contains those nodes whose LockDetails have a finite - // Duration and are yet to expire. - byExpiry byExpiry -} - -func (m *memLS) nextToken() string { - m.gen++ - return strconv.FormatUint(m.gen, 10) -} - -func (m *memLS) collectExpiredNodes(now time.Time) { - for len(m.byExpiry) > 0 { - if now.Before(m.byExpiry[0].expiry) { - break - } - m.remove(m.byExpiry[0]) - } -} - -func (m *memLS) Confirm(now time.Time, name0, name1 string, conditions ...Condition) (func(), error) { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - - var n0, n1 *memLSNode - if name0 != "" { - if n0 = m.lookup(slashClean(name0), conditions...); n0 == nil { - return nil, ErrConfirmationFailed - } - } - if name1 != "" { - if n1 = m.lookup(slashClean(name1), conditions...); n1 == nil { - return nil, ErrConfirmationFailed - } - } - - // Don't hold the same node twice. - if n1 == n0 { - n1 = nil - } - - if n0 != nil { - m.hold(n0) - } - if n1 != nil { - m.hold(n1) - } - return func() { - m.mu.Lock() - defer m.mu.Unlock() - if n1 != nil { - m.unhold(n1) - } - if n0 != nil { - m.unhold(n0) - } - }, nil -} - -// lookup returns the node n that locks the named resource, provided that n -// matches at least one of the given conditions and that lock isn't held by -// another party. Otherwise, it returns nil. -// -// n may be a parent of the named resource, if n is an infinite depth lock. -func (m *memLS) lookup(name string, conditions ...Condition) (n *memLSNode) { - // TODO: support Condition.Not and Condition.ETag. - for _, c := range conditions { - n = m.byToken[c.Token] - if n == nil || n.held { - continue - } - if name == n.details.Root { - return n - } - if n.details.ZeroDepth { - continue - } - if n.details.Root == "/" || strings.HasPrefix(name, n.details.Root+"/") { - return n - } - } - return nil -} - -func (m *memLS) hold(n *memLSNode) { - if n.held { - panic("webdav: memLS inconsistent held state") - } - n.held = true - if n.details.Duration >= 0 && n.byExpiryIndex >= 0 { - heap.Remove(&m.byExpiry, n.byExpiryIndex) - } -} - -func (m *memLS) unhold(n *memLSNode) { - if !n.held { - panic("webdav: memLS inconsistent held state") - } - n.held = false - if n.details.Duration >= 0 { - heap.Push(&m.byExpiry, n) - } -} - -func (m *memLS) Create(now time.Time, details LockDetails) (string, error) { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - details.Root = slashClean(details.Root) - - if !m.canCreate(details.Root, details.ZeroDepth) { - return "", ErrLocked - } - n := m.create(details.Root) - n.token = m.nextToken() - m.byToken[n.token] = n - n.details = details - if n.details.Duration >= 0 { - n.expiry = now.Add(n.details.Duration) - heap.Push(&m.byExpiry, n) - } - return n.token, nil -} - -func (m *memLS) Refresh(now time.Time, token string, duration time.Duration) (LockDetails, error) { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - - n := m.byToken[token] - if n == nil { - return LockDetails{}, ErrNoSuchLock - } - if n.held { - return LockDetails{}, ErrLocked - } - if n.byExpiryIndex >= 0 { - heap.Remove(&m.byExpiry, n.byExpiryIndex) - } - n.details.Duration = duration - if n.details.Duration >= 0 { - n.expiry = now.Add(n.details.Duration) - heap.Push(&m.byExpiry, n) - } - return n.details, nil -} - -func (m *memLS) Unlock(now time.Time, token string) error { - m.mu.Lock() - defer m.mu.Unlock() - m.collectExpiredNodes(now) - - n := m.byToken[token] - if n == nil { - return ErrNoSuchLock - } - if n.held { - return ErrLocked - } - m.remove(n) - return nil -} - -func (m *memLS) canCreate(name string, zeroDepth bool) bool { - return walkToRoot(name, func(name0 string, first bool) bool { - n := m.byName[name0] - if n == nil { - return true - } - if first { - if n.token != "" { - // The target node is already locked. - return false - } - if !zeroDepth { - // The requested lock depth is infinite, and the fact that n exists - // (n != nil) means that a descendent of the target node is locked. - return false - } - } else if n.token != "" && !n.details.ZeroDepth { - // An ancestor of the target node is locked with infinite depth. - return false - } - return true - }) -} - -func (m *memLS) create(name string) (ret *memLSNode) { - walkToRoot(name, func(name0 string, first bool) bool { - n := m.byName[name0] - if n == nil { - n = &memLSNode{ - details: LockDetails{ - Root: name0, - }, - byExpiryIndex: -1, - } - m.byName[name0] = n - } - n.refCount++ - if first { - ret = n - } - return true - }) - return ret -} - -func (m *memLS) remove(n *memLSNode) { - delete(m.byToken, n.token) - n.token = "" - walkToRoot(n.details.Root, func(name0 string, first bool) bool { - x := m.byName[name0] - x.refCount-- - if x.refCount == 0 { - delete(m.byName, name0) - } - return true - }) - if n.byExpiryIndex >= 0 { - heap.Remove(&m.byExpiry, n.byExpiryIndex) - } -} - -func walkToRoot(name string, f func(name0 string, first bool) bool) bool { - for first := true; ; first = false { - if !f(name, first) { - return false - } - if name == "/" { - break - } - name = name[:strings.LastIndex(name, "/")] - if name == "" { - name = "/" - } - } - return true -} - -type memLSNode struct { - // details are the lock metadata. Even if this node's name is not explicitly locked, - // details.Root will still equal the node's name. - details LockDetails - // token is the unique identifier for this node's lock. An empty token means that - // this node is not explicitly locked. - token string - // refCount is the number of self-or-descendent nodes that are explicitly locked. - refCount int - // expiry is when this node's lock expires. - expiry time.Time - // byExpiryIndex is the index of this node in memLS.byExpiry. It is -1 - // if this node does not expire, or has expired. - byExpiryIndex int - // held is whether this node's lock is actively held by a Confirm call. - held bool -} - -type byExpiry []*memLSNode - -func (b *byExpiry) Len() int { - return len(*b) -} - -func (b *byExpiry) Less(i, j int) bool { - return (*b)[i].expiry.Before((*b)[j].expiry) -} - -func (b *byExpiry) Swap(i, j int) { - (*b)[i], (*b)[j] = (*b)[j], (*b)[i] - (*b)[i].byExpiryIndex = i - (*b)[j].byExpiryIndex = j -} - -func (b *byExpiry) Push(x interface{}) { - n := x.(*memLSNode) - n.byExpiryIndex = len(*b) - *b = append(*b, n) -} - -func (b *byExpiry) Pop() interface{} { - i := len(*b) - 1 - n := (*b)[i] - (*b)[i] = nil - n.byExpiryIndex = -1 - *b = (*b)[:i] - return n -} - -const infiniteTimeout = -1 - -// parseTimeout parses the Timeout HTTP header, as per section 10.7. If s is -// empty, an infiniteTimeout is returned. -func parseTimeout(s string) (time.Duration, error) { - if s == "" { - return infiniteTimeout, nil - } - if i := strings.IndexByte(s, ','); i >= 0 { - s = s[:i] - } - s = strings.TrimSpace(s) - if s == "Infinite" { - return infiniteTimeout, nil - } - const pre = "Second-" - if !strings.HasPrefix(s, pre) { - return 0, errInvalidTimeout - } - s = s[len(pre):] - if s == "" || s[0] < '0' || '9' < s[0] { - return 0, errInvalidTimeout - } - n, err := strconv.ParseInt(s, 10, 64) - if err != nil || 1<<32-1 < n { - return 0, errInvalidTimeout - } - return time.Duration(n) * time.Second, nil -} diff --git a/vendor/golang.org/x/net/webdav/lock_test.go b/vendor/golang.org/x/net/webdav/lock_test.go deleted file mode 100644 index 116d6c0d..00000000 --- a/vendor/golang.org/x/net/webdav/lock_test.go +++ /dev/null @@ -1,731 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "fmt" - "math/rand" - "path" - "reflect" - "sort" - "strconv" - "strings" - "testing" - "time" -) - -func TestWalkToRoot(t *testing.T) { - testCases := []struct { - name string - want []string - }{{ - "/a/b/c/d", - []string{ - "/a/b/c/d", - "/a/b/c", - "/a/b", - "/a", - "/", - }, - }, { - "/a", - []string{ - "/a", - "/", - }, - }, { - "/", - []string{ - "/", - }, - }} - - for _, tc := range testCases { - var got []string - if !walkToRoot(tc.name, func(name0 string, first bool) bool { - if first != (len(got) == 0) { - t.Errorf("name=%q: first=%t but len(got)==%d", tc.name, first, len(got)) - return false - } - got = append(got, name0) - return true - }) { - continue - } - if !reflect.DeepEqual(got, tc.want) { - t.Errorf("name=%q:\ngot %q\nwant %q", tc.name, got, tc.want) - } - } -} - -var lockTestDurations = []time.Duration{ - infiniteTimeout, // infiniteTimeout means to never expire. - 0, // A zero duration means to expire immediately. - 100 * time.Hour, // A very large duration will not expire in these tests. -} - -// lockTestNames are the names of a set of mutually compatible locks. For each -// name fragment: -// - _ means no explicit lock. -// - i means a infinite-depth lock, -// - z means a zero-depth lock, -var lockTestNames = []string{ - "/_/_/_/_/z", - "/_/_/i", - "/_/z", - "/_/z/i", - "/_/z/z", - "/_/z/_/i", - "/_/z/_/z", - "/i", - "/z", - "/z/_/i", - "/z/_/z", -} - -func lockTestZeroDepth(name string) bool { - switch name[len(name)-1] { - case 'i': - return false - case 'z': - return true - } - panic(fmt.Sprintf("lock name %q did not end with 'i' or 'z'", name)) -} - -func TestMemLSCanCreate(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - - for _, name := range lockTestNames { - _, err := m.Create(now, LockDetails{ - Root: name, - Duration: infiniteTimeout, - ZeroDepth: lockTestZeroDepth(name), - }) - if err != nil { - t.Fatalf("creating lock for %q: %v", name, err) - } - } - - wantCanCreate := func(name string, zeroDepth bool) bool { - for _, n := range lockTestNames { - switch { - case n == name: - // An existing lock has the same name as the proposed lock. - return false - case strings.HasPrefix(n, name): - // An existing lock would be a child of the proposed lock, - // which conflicts if the proposed lock has infinite depth. - if !zeroDepth { - return false - } - case strings.HasPrefix(name, n): - // An existing lock would be an ancestor of the proposed lock, - // which conflicts if the ancestor has infinite depth. - if n[len(n)-1] == 'i' { - return false - } - } - } - return true - } - - var check func(int, string) - check = func(recursion int, name string) { - for _, zeroDepth := range []bool{false, true} { - got := m.canCreate(name, zeroDepth) - want := wantCanCreate(name, zeroDepth) - if got != want { - t.Errorf("canCreate name=%q zeroDepth=%t: got %t, want %t", name, zeroDepth, got, want) - } - } - if recursion == 6 { - return - } - if name != "/" { - name += "/" - } - for _, c := range "_iz" { - check(recursion+1, name+string(c)) - } - } - check(0, "/") -} - -func TestMemLSLookup(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - - badToken := m.nextToken() - t.Logf("badToken=%q", badToken) - - for _, name := range lockTestNames { - token, err := m.Create(now, LockDetails{ - Root: name, - Duration: infiniteTimeout, - ZeroDepth: lockTestZeroDepth(name), - }) - if err != nil { - t.Fatalf("creating lock for %q: %v", name, err) - } - t.Logf("%-15q -> node=%p token=%q", name, m.byName[name], token) - } - - baseNames := append([]string{"/a", "/b/c"}, lockTestNames...) - for _, baseName := range baseNames { - for _, suffix := range []string{"", "/0", "/1/2/3"} { - name := baseName + suffix - - goodToken := "" - base := m.byName[baseName] - if base != nil && (suffix == "" || !lockTestZeroDepth(baseName)) { - goodToken = base.token - } - - for _, token := range []string{badToken, goodToken} { - if token == "" { - continue - } - - got := m.lookup(name, Condition{Token: token}) - want := base - if token == badToken { - want = nil - } - if got != want { - t.Errorf("name=%-20qtoken=%q (bad=%t): got %p, want %p", - name, token, token == badToken, got, want) - } - } - } - } -} - -func TestMemLSConfirm(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - alice, err := m.Create(now, LockDetails{ - Root: "/alice", - Duration: infiniteTimeout, - ZeroDepth: false, - }) - tweedle, err := m.Create(now, LockDetails{ - Root: "/tweedle", - Duration: infiniteTimeout, - ZeroDepth: false, - }) - if err != nil { - t.Fatalf("Create: %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Create: inconsistent state: %v", err) - } - - // Test a mismatch between name and condition. - _, err = m.Confirm(now, "/tweedle/dee", "", Condition{Token: alice}) - if err != ErrConfirmationFailed { - t.Fatalf("Confirm (mismatch): got %v, want ErrConfirmationFailed", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (mismatch): inconsistent state: %v", err) - } - - // Test two names (that fall under the same lock) in the one Confirm call. - release, err := m.Confirm(now, "/tweedle/dee", "/tweedle/dum", Condition{Token: tweedle}) - if err != nil { - t.Fatalf("Confirm (twins): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (twins): inconsistent state: %v", err) - } - release() - if err := m.consistent(); err != nil { - t.Fatalf("release (twins): inconsistent state: %v", err) - } - - // Test the same two names in overlapping Confirm / release calls. - releaseDee, err := m.Confirm(now, "/tweedle/dee", "", Condition{Token: tweedle}) - if err != nil { - t.Fatalf("Confirm (sequence #0): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (sequence #0): inconsistent state: %v", err) - } - - _, err = m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) - if err != ErrConfirmationFailed { - t.Fatalf("Confirm (sequence #1): got %v, want ErrConfirmationFailed", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (sequence #1): inconsistent state: %v", err) - } - - releaseDee() - if err := m.consistent(); err != nil { - t.Fatalf("release (sequence #2): inconsistent state: %v", err) - } - - releaseDum, err := m.Confirm(now, "/tweedle/dum", "", Condition{Token: tweedle}) - if err != nil { - t.Fatalf("Confirm (sequence #3): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Confirm (sequence #3): inconsistent state: %v", err) - } - - // Test that you can't unlock a held lock. - err = m.Unlock(now, tweedle) - if err != ErrLocked { - t.Fatalf("Unlock (sequence #4): got %v, want ErrLocked", err) - } - - releaseDum() - if err := m.consistent(); err != nil { - t.Fatalf("release (sequence #5): inconsistent state: %v", err) - } - - err = m.Unlock(now, tweedle) - if err != nil { - t.Fatalf("Unlock (sequence #6): %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Unlock (sequence #6): inconsistent state: %v", err) - } -} - -func TestMemLSNonCanonicalRoot(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - token, err := m.Create(now, LockDetails{ - Root: "/foo/./bar//", - Duration: 1 * time.Second, - }) - if err != nil { - t.Fatalf("Create: %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Create: inconsistent state: %v", err) - } - if err := m.Unlock(now, token); err != nil { - t.Fatalf("Unlock: %v", err) - } - if err := m.consistent(); err != nil { - t.Fatalf("Unlock: inconsistent state: %v", err) - } -} - -func TestMemLSExpiry(t *testing.T) { - m := NewMemLS().(*memLS) - testCases := []string{ - "setNow 0", - "create /a.5", - "want /a.5", - "create /c.6", - "want /a.5 /c.6", - "create /a/b.7", - "want /a.5 /a/b.7 /c.6", - "setNow 4", - "want /a.5 /a/b.7 /c.6", - "setNow 5", - "want /a/b.7 /c.6", - "setNow 6", - "want /a/b.7", - "setNow 7", - "want ", - "setNow 8", - "want ", - "create /a.12", - "create /b.13", - "create /c.15", - "create /a/d.16", - "want /a.12 /a/d.16 /b.13 /c.15", - "refresh /a.14", - "want /a.14 /a/d.16 /b.13 /c.15", - "setNow 12", - "want /a.14 /a/d.16 /b.13 /c.15", - "setNow 13", - "want /a.14 /a/d.16 /c.15", - "setNow 14", - "want /a/d.16 /c.15", - "refresh /a/d.20", - "refresh /c.20", - "want /a/d.20 /c.20", - "setNow 20", - "want ", - } - - tokens := map[string]string{} - zTime := time.Unix(0, 0) - now := zTime - for i, tc := range testCases { - j := strings.IndexByte(tc, ' ') - if j < 0 { - t.Fatalf("test case #%d %q: invalid command", i, tc) - } - op, arg := tc[:j], tc[j+1:] - switch op { - default: - t.Fatalf("test case #%d %q: invalid operation %q", i, tc, op) - - case "create", "refresh": - parts := strings.Split(arg, ".") - if len(parts) != 2 { - t.Fatalf("test case #%d %q: invalid create", i, tc) - } - root := parts[0] - d, err := strconv.Atoi(parts[1]) - if err != nil { - t.Fatalf("test case #%d %q: invalid duration", i, tc) - } - dur := time.Unix(0, 0).Add(time.Duration(d) * time.Second).Sub(now) - - switch op { - case "create": - token, err := m.Create(now, LockDetails{ - Root: root, - Duration: dur, - ZeroDepth: true, - }) - if err != nil { - t.Fatalf("test case #%d %q: Create: %v", i, tc, err) - } - tokens[root] = token - - case "refresh": - token := tokens[root] - if token == "" { - t.Fatalf("test case #%d %q: no token for %q", i, tc, root) - } - got, err := m.Refresh(now, token, dur) - if err != nil { - t.Fatalf("test case #%d %q: Refresh: %v", i, tc, err) - } - want := LockDetails{ - Root: root, - Duration: dur, - ZeroDepth: true, - } - if got != want { - t.Fatalf("test case #%d %q:\ngot %v\nwant %v", i, tc, got, want) - } - } - - case "setNow": - d, err := strconv.Atoi(arg) - if err != nil { - t.Fatalf("test case #%d %q: invalid duration", i, tc) - } - now = time.Unix(0, 0).Add(time.Duration(d) * time.Second) - - case "want": - m.mu.Lock() - m.collectExpiredNodes(now) - got := make([]string, 0, len(m.byToken)) - for _, n := range m.byToken { - got = append(got, fmt.Sprintf("%s.%d", - n.details.Root, n.expiry.Sub(zTime)/time.Second)) - } - m.mu.Unlock() - sort.Strings(got) - want := []string{} - if arg != "" { - want = strings.Split(arg, " ") - } - if !reflect.DeepEqual(got, want) { - t.Fatalf("test case #%d %q:\ngot %q\nwant %q", i, tc, got, want) - } - } - - if err := m.consistent(); err != nil { - t.Fatalf("test case #%d %q: inconsistent state: %v", i, tc, err) - } - } -} - -func TestMemLS(t *testing.T) { - now := time.Unix(0, 0) - m := NewMemLS().(*memLS) - rng := rand.New(rand.NewSource(0)) - tokens := map[string]string{} - nConfirm, nCreate, nRefresh, nUnlock := 0, 0, 0, 0 - const N = 2000 - - for i := 0; i < N; i++ { - name := lockTestNames[rng.Intn(len(lockTestNames))] - duration := lockTestDurations[rng.Intn(len(lockTestDurations))] - confirmed, unlocked := false, false - - // If the name was already locked, we randomly confirm/release, refresh - // or unlock it. Otherwise, we create a lock. - token := tokens[name] - if token != "" { - switch rng.Intn(3) { - case 0: - confirmed = true - nConfirm++ - release, err := m.Confirm(now, name, "", Condition{Token: token}) - if err != nil { - t.Fatalf("iteration #%d: Confirm %q: %v", i, name, err) - } - if err := m.consistent(); err != nil { - t.Fatalf("iteration #%d: inconsistent state: %v", i, err) - } - release() - - case 1: - nRefresh++ - if _, err := m.Refresh(now, token, duration); err != nil { - t.Fatalf("iteration #%d: Refresh %q: %v", i, name, err) - } - - case 2: - unlocked = true - nUnlock++ - if err := m.Unlock(now, token); err != nil { - t.Fatalf("iteration #%d: Unlock %q: %v", i, name, err) - } - } - - } else { - nCreate++ - var err error - token, err = m.Create(now, LockDetails{ - Root: name, - Duration: duration, - ZeroDepth: lockTestZeroDepth(name), - }) - if err != nil { - t.Fatalf("iteration #%d: Create %q: %v", i, name, err) - } - } - - if !confirmed { - if duration == 0 || unlocked { - // A zero-duration lock should expire immediately and is - // effectively equivalent to being unlocked. - tokens[name] = "" - } else { - tokens[name] = token - } - } - - if err := m.consistent(); err != nil { - t.Fatalf("iteration #%d: inconsistent state: %v", i, err) - } - } - - if nConfirm < N/10 { - t.Fatalf("too few Confirm calls: got %d, want >= %d", nConfirm, N/10) - } - if nCreate < N/10 { - t.Fatalf("too few Create calls: got %d, want >= %d", nCreate, N/10) - } - if nRefresh < N/10 { - t.Fatalf("too few Refresh calls: got %d, want >= %d", nRefresh, N/10) - } - if nUnlock < N/10 { - t.Fatalf("too few Unlock calls: got %d, want >= %d", nUnlock, N/10) - } -} - -func (m *memLS) consistent() error { - m.mu.Lock() - defer m.mu.Unlock() - - // If m.byName is non-empty, then it must contain an entry for the root "/", - // and its refCount should equal the number of locked nodes. - if len(m.byName) > 0 { - n := m.byName["/"] - if n == nil { - return fmt.Errorf(`non-empty m.byName does not contain the root "/"`) - } - if n.refCount != len(m.byToken) { - return fmt.Errorf("root node refCount=%d, differs from len(m.byToken)=%d", n.refCount, len(m.byToken)) - } - } - - for name, n := range m.byName { - // The map keys should be consistent with the node's copy of the key. - if n.details.Root != name { - return fmt.Errorf("node name %q != byName map key %q", n.details.Root, name) - } - - // A name must be clean, and start with a "/". - if len(name) == 0 || name[0] != '/' { - return fmt.Errorf(`node name %q does not start with "/"`, name) - } - if name != path.Clean(name) { - return fmt.Errorf(`node name %q is not clean`, name) - } - - // A node's refCount should be positive. - if n.refCount <= 0 { - return fmt.Errorf("non-positive refCount for node at name %q", name) - } - - // A node's refCount should be the number of self-or-descendents that - // are locked (i.e. have a non-empty token). - var list []string - for name0, n0 := range m.byName { - // All of lockTestNames' name fragments are one byte long: '_', 'i' or 'z', - // so strings.HasPrefix is equivalent to self-or-descendent name match. - // We don't have to worry about "/foo/bar" being a false positive match - // for "/foo/b". - if strings.HasPrefix(name0, name) && n0.token != "" { - list = append(list, name0) - } - } - if n.refCount != len(list) { - sort.Strings(list) - return fmt.Errorf("node at name %q has refCount %d but locked self-or-descendents are %q (len=%d)", - name, n.refCount, list, len(list)) - } - - // A node n is in m.byToken if it has a non-empty token. - if n.token != "" { - if _, ok := m.byToken[n.token]; !ok { - return fmt.Errorf("node at name %q has token %q but not in m.byToken", name, n.token) - } - } - - // A node n is in m.byExpiry if it has a non-negative byExpiryIndex. - if n.byExpiryIndex >= 0 { - if n.byExpiryIndex >= len(m.byExpiry) { - return fmt.Errorf("node at name %q has byExpiryIndex %d but m.byExpiry has length %d", name, n.byExpiryIndex, len(m.byExpiry)) - } - if n != m.byExpiry[n.byExpiryIndex] { - return fmt.Errorf("node at name %q has byExpiryIndex %d but that indexes a different node", name, n.byExpiryIndex) - } - } - } - - for token, n := range m.byToken { - // The map keys should be consistent with the node's copy of the key. - if n.token != token { - return fmt.Errorf("node token %q != byToken map key %q", n.token, token) - } - - // Every node in m.byToken is in m.byName. - if _, ok := m.byName[n.details.Root]; !ok { - return fmt.Errorf("node at name %q in m.byToken but not in m.byName", n.details.Root) - } - } - - for i, n := range m.byExpiry { - // The slice indices should be consistent with the node's copy of the index. - if n.byExpiryIndex != i { - return fmt.Errorf("node byExpiryIndex %d != byExpiry slice index %d", n.byExpiryIndex, i) - } - - // Every node in m.byExpiry is in m.byName. - if _, ok := m.byName[n.details.Root]; !ok { - return fmt.Errorf("node at name %q in m.byExpiry but not in m.byName", n.details.Root) - } - - // No node in m.byExpiry should be held. - if n.held { - return fmt.Errorf("node at name %q in m.byExpiry is held", n.details.Root) - } - } - return nil -} - -func TestParseTimeout(t *testing.T) { - testCases := []struct { - s string - want time.Duration - wantErr error - }{{ - "", - infiniteTimeout, - nil, - }, { - "Infinite", - infiniteTimeout, - nil, - }, { - "Infinitesimal", - 0, - errInvalidTimeout, - }, { - "infinite", - 0, - errInvalidTimeout, - }, { - "Second-0", - 0 * time.Second, - nil, - }, { - "Second-123", - 123 * time.Second, - nil, - }, { - " Second-456 ", - 456 * time.Second, - nil, - }, { - "Second-4100000000", - 4100000000 * time.Second, - nil, - }, { - "junk", - 0, - errInvalidTimeout, - }, { - "Second-", - 0, - errInvalidTimeout, - }, { - "Second--1", - 0, - errInvalidTimeout, - }, { - "Second--123", - 0, - errInvalidTimeout, - }, { - "Second-+123", - 0, - errInvalidTimeout, - }, { - "Second-0x123", - 0, - errInvalidTimeout, - }, { - "second-123", - 0, - errInvalidTimeout, - }, { - "Second-4294967295", - 4294967295 * time.Second, - nil, - }, { - // Section 10.7 says that "The timeout value for TimeType "Second" - // must not be greater than 2^32-1." - "Second-4294967296", - 0, - errInvalidTimeout, - }, { - // This test case comes from section 9.10.9 of the spec. It says, - // - // "In this request, the client has specified that it desires an - // infinite-length lock, if available, otherwise a timeout of 4.1 - // billion seconds, if available." - // - // The Go WebDAV package always supports infinite length locks, - // and ignores the fallback after the comma. - "Infinite, Second-4100000000", - infiniteTimeout, - nil, - }} - - for _, tc := range testCases { - got, gotErr := parseTimeout(tc.s) - if got != tc.want || gotErr != tc.wantErr { - t.Errorf("parsing %q:\ngot %v, %v\nwant %v, %v", tc.s, got, gotErr, tc.want, tc.wantErr) - } - } -} diff --git a/vendor/golang.org/x/net/webdav/prop.go b/vendor/golang.org/x/net/webdav/prop.go deleted file mode 100644 index a0ba16c4..00000000 --- a/vendor/golang.org/x/net/webdav/prop.go +++ /dev/null @@ -1,385 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "fmt" - "io" - "mime" - "net/http" - "os" - "path/filepath" - "strconv" - - "golang.org/x/net/webdav/internal/xml" -) - -// Proppatch describes a property update instruction as defined in RFC 4918. -// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPPATCH -type Proppatch struct { - // Remove specifies whether this patch removes properties. If it does not - // remove them, it sets them. - Remove bool - // Props contains the properties to be set or removed. - Props []Property -} - -// Propstat describes a XML propstat element as defined in RFC 4918. -// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat -type Propstat struct { - // Props contains the properties for which Status applies. - Props []Property - - // Status defines the HTTP status code of the properties in Prop. - // Allowed values include, but are not limited to the WebDAV status - // code extensions for HTTP/1.1. - // http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 - Status int - - // XMLError contains the XML representation of the optional error element. - // XML content within this field must not rely on any predefined - // namespace declarations or prefixes. If empty, the XML error element - // is omitted. - XMLError string - - // ResponseDescription contains the contents of the optional - // responsedescription field. If empty, the XML element is omitted. - ResponseDescription string -} - -// makePropstats returns a slice containing those of x and y whose Props slice -// is non-empty. If both are empty, it returns a slice containing an otherwise -// zero Propstat whose HTTP status code is 200 OK. -func makePropstats(x, y Propstat) []Propstat { - pstats := make([]Propstat, 0, 2) - if len(x.Props) != 0 { - pstats = append(pstats, x) - } - if len(y.Props) != 0 { - pstats = append(pstats, y) - } - if len(pstats) == 0 { - pstats = append(pstats, Propstat{ - Status: http.StatusOK, - }) - } - return pstats -} - -// DeadPropsHolder holds the dead properties of a resource. -// -// Dead properties are those properties that are explicitly defined. In -// comparison, live properties, such as DAV:getcontentlength, are implicitly -// defined by the underlying resource, and cannot be explicitly overridden or -// removed. See the Terminology section of -// http://www.webdav.org/specs/rfc4918.html#rfc.section.3 -// -// There is a whitelist of the names of live properties. This package handles -// all live properties, and will only pass non-whitelisted names to the Patch -// method of DeadPropsHolder implementations. -type DeadPropsHolder interface { - // DeadProps returns a copy of the dead properties held. - DeadProps() (map[xml.Name]Property, error) - - // Patch patches the dead properties held. - // - // Patching is atomic; either all or no patches succeed. It returns (nil, - // non-nil) if an internal server error occurred, otherwise the Propstats - // collectively contain one Property for each proposed patch Property. If - // all patches succeed, Patch returns a slice of length one and a Propstat - // element with a 200 OK HTTP status code. If none succeed, for reasons - // other than an internal server error, no Propstat has status 200 OK. - // - // For more details on when various HTTP status codes apply, see - // http://www.webdav.org/specs/rfc4918.html#PROPPATCH-status - Patch([]Proppatch) ([]Propstat, error) -} - -// liveProps contains all supported, protected DAV: properties. -var liveProps = map[xml.Name]struct { - // findFn implements the propfind function of this property. If nil, - // it indicates a hidden property. - findFn func(FileSystem, LockSystem, string, os.FileInfo) (string, error) - // dir is true if the property applies to directories. - dir bool -}{ - xml.Name{Space: "DAV:", Local: "resourcetype"}: { - findFn: findResourceType, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "displayname"}: { - findFn: findDisplayName, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "getcontentlength"}: { - findFn: findContentLength, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "getlastmodified"}: { - findFn: findLastModified, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "creationdate"}: { - findFn: nil, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "getcontentlanguage"}: { - findFn: nil, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "getcontenttype"}: { - findFn: findContentType, - dir: true, - }, - xml.Name{Space: "DAV:", Local: "getetag"}: { - findFn: findETag, - // findETag implements ETag as the concatenated hex values of a file's - // modification time and size. This is not a reliable synchronization - // mechanism for directories, so we do not advertise getetag for DAV - // collections. - dir: false, - }, - - // TODO: The lockdiscovery property requires LockSystem to list the - // active locks on a resource. - xml.Name{Space: "DAV:", Local: "lockdiscovery"}: {}, - xml.Name{Space: "DAV:", Local: "supportedlock"}: { - findFn: findSupportedLock, - dir: true, - }, -} - -// TODO(nigeltao) merge props and allprop? - -// Props returns the status of the properties named pnames for resource name. -// -// Each Propstat has a unique status and each property name will only be part -// of one Propstat element. -func props(fs FileSystem, ls LockSystem, name string, pnames []xml.Name) ([]Propstat, error) { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return nil, err - } - isDir := fi.IsDir() - - var deadProps map[xml.Name]Property - if dph, ok := f.(DeadPropsHolder); ok { - deadProps, err = dph.DeadProps() - if err != nil { - return nil, err - } - } - - pstatOK := Propstat{Status: http.StatusOK} - pstatNotFound := Propstat{Status: http.StatusNotFound} - for _, pn := range pnames { - // If this file has dead properties, check if they contain pn. - if dp, ok := deadProps[pn]; ok { - pstatOK.Props = append(pstatOK.Props, dp) - continue - } - // Otherwise, it must either be a live property or we don't know it. - if prop := liveProps[pn]; prop.findFn != nil && (prop.dir || !isDir) { - innerXML, err := prop.findFn(fs, ls, name, fi) - if err != nil { - return nil, err - } - pstatOK.Props = append(pstatOK.Props, Property{ - XMLName: pn, - InnerXML: []byte(innerXML), - }) - } else { - pstatNotFound.Props = append(pstatNotFound.Props, Property{ - XMLName: pn, - }) - } - } - return makePropstats(pstatOK, pstatNotFound), nil -} - -// Propnames returns the property names defined for resource name. -func propnames(fs FileSystem, ls LockSystem, name string) ([]xml.Name, error) { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) - if err != nil { - return nil, err - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return nil, err - } - isDir := fi.IsDir() - - var deadProps map[xml.Name]Property - if dph, ok := f.(DeadPropsHolder); ok { - deadProps, err = dph.DeadProps() - if err != nil { - return nil, err - } - } - - pnames := make([]xml.Name, 0, len(liveProps)+len(deadProps)) - for pn, prop := range liveProps { - if prop.findFn != nil && (prop.dir || !isDir) { - pnames = append(pnames, pn) - } - } - for pn := range deadProps { - pnames = append(pnames, pn) - } - return pnames, nil -} - -// Allprop returns the properties defined for resource name and the properties -// named in include. -// -// Note that RFC 4918 defines 'allprop' to return the DAV: properties defined -// within the RFC plus dead properties. Other live properties should only be -// returned if they are named in 'include'. -// -// See http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND -func allprop(fs FileSystem, ls LockSystem, name string, include []xml.Name) ([]Propstat, error) { - pnames, err := propnames(fs, ls, name) - if err != nil { - return nil, err - } - // Add names from include if they are not already covered in pnames. - nameset := make(map[xml.Name]bool) - for _, pn := range pnames { - nameset[pn] = true - } - for _, pn := range include { - if !nameset[pn] { - pnames = append(pnames, pn) - } - } - return props(fs, ls, name, pnames) -} - -// Patch patches the properties of resource name. The return values are -// constrained in the same manner as DeadPropsHolder.Patch. -func patch(fs FileSystem, ls LockSystem, name string, patches []Proppatch) ([]Propstat, error) { - conflict := false -loop: - for _, patch := range patches { - for _, p := range patch.Props { - if _, ok := liveProps[p.XMLName]; ok { - conflict = true - break loop - } - } - } - if conflict { - pstatForbidden := Propstat{ - Status: http.StatusForbidden, - XMLError: `<D:cannot-modify-protected-property xmlns:D="DAV:"/>`, - } - pstatFailedDep := Propstat{ - Status: StatusFailedDependency, - } - for _, patch := range patches { - for _, p := range patch.Props { - if _, ok := liveProps[p.XMLName]; ok { - pstatForbidden.Props = append(pstatForbidden.Props, Property{XMLName: p.XMLName}) - } else { - pstatFailedDep.Props = append(pstatFailedDep.Props, Property{XMLName: p.XMLName}) - } - } - } - return makePropstats(pstatForbidden, pstatFailedDep), nil - } - - f, err := fs.OpenFile(name, os.O_RDWR, 0) - if err != nil { - return nil, err - } - defer f.Close() - if dph, ok := f.(DeadPropsHolder); ok { - ret, err := dph.Patch(patches) - if err != nil { - return nil, err - } - // http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat says that - // "The contents of the prop XML element must only list the names of - // properties to which the result in the status element applies." - for _, pstat := range ret { - for i, p := range pstat.Props { - pstat.Props[i] = Property{XMLName: p.XMLName} - } - } - return ret, nil - } - // The file doesn't implement the optional DeadPropsHolder interface, so - // all patches are forbidden. - pstat := Propstat{Status: http.StatusForbidden} - for _, patch := range patches { - for _, p := range patch.Props { - pstat.Props = append(pstat.Props, Property{XMLName: p.XMLName}) - } - } - return []Propstat{pstat}, nil -} - -func findResourceType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - if fi.IsDir() { - return `<D:collection xmlns:D="DAV:"/>`, nil - } - return "", nil -} - -func findDisplayName(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - if slashClean(name) == "/" { - // Hide the real name of a possibly prefixed root directory. - return "", nil - } - return fi.Name(), nil -} - -func findContentLength(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - return strconv.FormatInt(fi.Size(), 10), nil -} - -func findLastModified(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - return fi.ModTime().Format(http.TimeFormat), nil -} - -func findContentType(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - f, err := fs.OpenFile(name, os.O_RDONLY, 0) - if err != nil { - return "", err - } - defer f.Close() - // This implementation is based on serveContent's code in the standard net/http package. - ctype := mime.TypeByExtension(filepath.Ext(name)) - if ctype == "" { - // Read a chunk to decide between utf-8 text and binary. - var buf [512]byte - n, _ := io.ReadFull(f, buf[:]) - ctype = http.DetectContentType(buf[:n]) - // Rewind file. - _, err = f.Seek(0, os.SEEK_SET) - } - return ctype, err -} - -func findETag(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - // The Apache http 2.4 web server by default concatenates the - // modification time and size of a file. We replicate the heuristic - // with nanosecond granularity. - return fmt.Sprintf(`"%x%x"`, fi.ModTime().UnixNano(), fi.Size()), nil -} - -func findSupportedLock(fs FileSystem, ls LockSystem, name string, fi os.FileInfo) (string, error) { - return `` + - `<D:lockentry xmlns:D="DAV:">` + - `<D:lockscope><D:exclusive/></D:lockscope>` + - `<D:locktype><D:write/></D:locktype>` + - `</D:lockentry>`, nil -} diff --git a/vendor/golang.org/x/net/webdav/prop_test.go b/vendor/golang.org/x/net/webdav/prop_test.go deleted file mode 100644 index 3ad19f4d..00000000 --- a/vendor/golang.org/x/net/webdav/prop_test.go +++ /dev/null @@ -1,619 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "fmt" - "net/http" - "os" - "reflect" - "sort" - "testing" - - "golang.org/x/net/webdav/internal/xml" -) - -func TestMemPS(t *testing.T) { - // calcProps calculates the getlastmodified and getetag DAV: property - // values in pstats for resource name in file-system fs. - calcProps := func(name string, fs FileSystem, ls LockSystem, pstats []Propstat) error { - fi, err := fs.Stat(name) - if err != nil { - return err - } - for _, pst := range pstats { - for i, p := range pst.Props { - switch p.XMLName { - case xml.Name{Space: "DAV:", Local: "getlastmodified"}: - p.InnerXML = []byte(fi.ModTime().Format(http.TimeFormat)) - pst.Props[i] = p - case xml.Name{Space: "DAV:", Local: "getetag"}: - if fi.IsDir() { - continue - } - etag, err := findETag(fs, ls, name, fi) - if err != nil { - return err - } - p.InnerXML = []byte(etag) - pst.Props[i] = p - } - } - } - return nil - } - - const ( - lockEntry = `` + - `<D:lockentry xmlns:D="DAV:">` + - `<D:lockscope><D:exclusive/></D:lockscope>` + - `<D:locktype><D:write/></D:locktype>` + - `</D:lockentry>` - statForbiddenError = `<D:cannot-modify-protected-property xmlns:D="DAV:"/>` - ) - - type propOp struct { - op string - name string - pnames []xml.Name - patches []Proppatch - wantPnames []xml.Name - wantPropstats []Propstat - } - - testCases := []struct { - desc string - noDeadProps bool - buildfs []string - propOp []propOp - }{{ - desc: "propname", - buildfs: []string{"mkdir /dir", "touch /file"}, - propOp: []propOp{{ - op: "propname", - name: "/dir", - wantPnames: []xml.Name{ - xml.Name{Space: "DAV:", Local: "resourcetype"}, - xml.Name{Space: "DAV:", Local: "displayname"}, - xml.Name{Space: "DAV:", Local: "getcontentlength"}, - xml.Name{Space: "DAV:", Local: "getlastmodified"}, - xml.Name{Space: "DAV:", Local: "getcontenttype"}, - xml.Name{Space: "DAV:", Local: "supportedlock"}, - }, - }, { - op: "propname", - name: "/file", - wantPnames: []xml.Name{ - xml.Name{Space: "DAV:", Local: "resourcetype"}, - xml.Name{Space: "DAV:", Local: "displayname"}, - xml.Name{Space: "DAV:", Local: "getcontentlength"}, - xml.Name{Space: "DAV:", Local: "getlastmodified"}, - xml.Name{Space: "DAV:", Local: "getcontenttype"}, - xml.Name{Space: "DAV:", Local: "getetag"}, - xml.Name{Space: "DAV:", Local: "supportedlock"}, - }, - }}, - }, { - desc: "allprop dir and file", - buildfs: []string{"mkdir /dir", "write /file foobarbaz"}, - propOp: []propOp{{ - op: "allprop", - name: "/dir", - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(`<D:collection xmlns:D="DAV:"/>`), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("dir"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, - InnerXML: []byte("0"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, - InnerXML: []byte("text/plain; charset=utf-8"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, - InnerXML: []byte(lockEntry), - }}, - }}, - }, { - op: "allprop", - name: "/file", - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(""), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("file"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, - InnerXML: []byte("9"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, - InnerXML: []byte("text/plain; charset=utf-8"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, - InnerXML: []byte(lockEntry), - }}, - }}, - }, { - op: "allprop", - name: "/file", - pnames: []xml.Name{ - {"DAV:", "resourcetype"}, - {"foo", "bar"}, - }, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(""), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("file"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlength"}, - InnerXML: []byte("9"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getlastmodified"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getcontenttype"}, - InnerXML: []byte("text/plain; charset=utf-8"), - }, { - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - InnerXML: nil, // Calculated during test. - }, { - XMLName: xml.Name{Space: "DAV:", Local: "supportedlock"}, - InnerXML: []byte(lockEntry), - }}}, { - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}}, - }, - }}, - }, { - desc: "propfind DAV:resourcetype", - buildfs: []string{"mkdir /dir", "touch /file"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "resourcetype"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(`<D:collection xmlns:D="DAV:"/>`), - }}, - }}, - }, { - op: "propfind", - name: "/file", - pnames: []xml.Name{{"DAV:", "resourcetype"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "resourcetype"}, - InnerXML: []byte(""), - }}, - }}, - }}, - }, { - desc: "propfind unsupported DAV properties", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "getcontentlanguage"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getcontentlanguage"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "creationdate"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "creationdate"}, - }}, - }}, - }}, - }, { - desc: "propfind getetag for files but not for directories", - buildfs: []string{"mkdir /dir", "touch /file"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"DAV:", "getetag"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - }}, - }}, - }, { - op: "propfind", - name: "/file", - pnames: []xml.Name{{"DAV:", "getetag"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - InnerXML: nil, // Calculated during test. - }}, - }}, - }}, - }, { - desc: "proppatch property on no-dead-properties file system", - buildfs: []string{"mkdir /dir"}, - noDeadProps: true, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusForbidden, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusForbidden, - XMLError: statForbiddenError, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "getetag"}, - }}, - }}, - }}, - }, { - desc: "proppatch dead property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{{Space: "foo", Local: "bar"}}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }}, - }}, - }, { - desc: "proppatch dead property with failed dependency", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }, { - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - InnerXML: []byte("xxx"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusForbidden, - XMLError: statForbiddenError, - Props: []Property{{ - XMLName: xml.Name{Space: "DAV:", Local: "displayname"}, - }}, - }, { - Status: StatusFailedDependency, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{{Space: "foo", Local: "bar"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }}, - }, { - desc: "proppatch remove dead property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }, { - XMLName: xml.Name{Space: "spam", Local: "ham"}, - InnerXML: []byte("eggs"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }, { - XMLName: xml.Name{Space: "spam", Local: "ham"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{ - {Space: "foo", Local: "bar"}, - {Space: "spam", Local: "ham"}, - }, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }, { - XMLName: xml.Name{Space: "spam", Local: "ham"}, - InnerXML: []byte("eggs"), - }}, - }}, - }, { - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Remove: true, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propfind", - name: "/dir", - pnames: []xml.Name{ - {Space: "foo", Local: "bar"}, - {Space: "spam", Local: "ham"}, - }, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }, { - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "spam", Local: "ham"}, - InnerXML: []byte("eggs"), - }}, - }}, - }}, - }, { - desc: "propname with dead property", - buildfs: []string{"touch /file"}, - propOp: []propOp{{ - op: "proppatch", - name: "/file", - patches: []Proppatch{{ - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - InnerXML: []byte("baz"), - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }, { - op: "propname", - name: "/file", - wantPnames: []xml.Name{ - xml.Name{Space: "DAV:", Local: "resourcetype"}, - xml.Name{Space: "DAV:", Local: "displayname"}, - xml.Name{Space: "DAV:", Local: "getcontentlength"}, - xml.Name{Space: "DAV:", Local: "getlastmodified"}, - xml.Name{Space: "DAV:", Local: "getcontenttype"}, - xml.Name{Space: "DAV:", Local: "getetag"}, - xml.Name{Space: "DAV:", Local: "supportedlock"}, - xml.Name{Space: "foo", Local: "bar"}, - }, - }}, - }, { - desc: "proppatch remove unknown dead property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "proppatch", - name: "/dir", - patches: []Proppatch{{ - Remove: true, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - wantPropstats: []Propstat{{ - Status: http.StatusOK, - Props: []Property{{ - XMLName: xml.Name{Space: "foo", Local: "bar"}, - }}, - }}, - }}, - }, { - desc: "bad: propfind unknown property", - buildfs: []string{"mkdir /dir"}, - propOp: []propOp{{ - op: "propfind", - name: "/dir", - pnames: []xml.Name{{"foo:", "bar"}}, - wantPropstats: []Propstat{{ - Status: http.StatusNotFound, - Props: []Property{{ - XMLName: xml.Name{Space: "foo:", Local: "bar"}, - }}, - }}, - }}, - }} - - for _, tc := range testCases { - fs, err := buildTestFS(tc.buildfs) - if err != nil { - t.Fatalf("%s: cannot create test filesystem: %v", tc.desc, err) - } - if tc.noDeadProps { - fs = noDeadPropsFS{fs} - } - ls := NewMemLS() - for _, op := range tc.propOp { - desc := fmt.Sprintf("%s: %s %s", tc.desc, op.op, op.name) - if err = calcProps(op.name, fs, ls, op.wantPropstats); err != nil { - t.Fatalf("%s: calcProps: %v", desc, err) - } - - // Call property system. - var propstats []Propstat - switch op.op { - case "propname": - pnames, err := propnames(fs, ls, op.name) - if err != nil { - t.Errorf("%s: got error %v, want nil", desc, err) - continue - } - sort.Sort(byXMLName(pnames)) - sort.Sort(byXMLName(op.wantPnames)) - if !reflect.DeepEqual(pnames, op.wantPnames) { - t.Errorf("%s: pnames\ngot %q\nwant %q", desc, pnames, op.wantPnames) - } - continue - case "allprop": - propstats, err = allprop(fs, ls, op.name, op.pnames) - case "propfind": - propstats, err = props(fs, ls, op.name, op.pnames) - case "proppatch": - propstats, err = patch(fs, ls, op.name, op.patches) - default: - t.Fatalf("%s: %s not implemented", desc, op.op) - } - if err != nil { - t.Errorf("%s: got error %v, want nil", desc, err) - continue - } - // Compare return values from allprop, propfind or proppatch. - for _, pst := range propstats { - sort.Sort(byPropname(pst.Props)) - } - for _, pst := range op.wantPropstats { - sort.Sort(byPropname(pst.Props)) - } - sort.Sort(byStatus(propstats)) - sort.Sort(byStatus(op.wantPropstats)) - if !reflect.DeepEqual(propstats, op.wantPropstats) { - t.Errorf("%s: propstat\ngot %q\nwant %q", desc, propstats, op.wantPropstats) - } - } - } -} - -func cmpXMLName(a, b xml.Name) bool { - if a.Space != b.Space { - return a.Space < b.Space - } - return a.Local < b.Local -} - -type byXMLName []xml.Name - -func (b byXMLName) Len() int { return len(b) } -func (b byXMLName) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byXMLName) Less(i, j int) bool { return cmpXMLName(b[i], b[j]) } - -type byPropname []Property - -func (b byPropname) Len() int { return len(b) } -func (b byPropname) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byPropname) Less(i, j int) bool { return cmpXMLName(b[i].XMLName, b[j].XMLName) } - -type byStatus []Propstat - -func (b byStatus) Len() int { return len(b) } -func (b byStatus) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b byStatus) Less(i, j int) bool { return b[i].Status < b[j].Status } - -type noDeadPropsFS struct { - FileSystem -} - -func (fs noDeadPropsFS) OpenFile(name string, flag int, perm os.FileMode) (File, error) { - f, err := fs.FileSystem.OpenFile(name, flag, perm) - if err != nil { - return nil, err - } - return noDeadPropsFile{f}, nil -} - -// noDeadPropsFile wraps a File but strips any optional DeadPropsHolder methods -// provided by the underlying File implementation. -type noDeadPropsFile struct { - f File -} - -func (f noDeadPropsFile) Close() error { return f.f.Close() } -func (f noDeadPropsFile) Read(p []byte) (int, error) { return f.f.Read(p) } -func (f noDeadPropsFile) Readdir(count int) ([]os.FileInfo, error) { return f.f.Readdir(count) } -func (f noDeadPropsFile) Seek(off int64, whence int) (int64, error) { return f.f.Seek(off, whence) } -func (f noDeadPropsFile) Stat() (os.FileInfo, error) { return f.f.Stat() } -func (f noDeadPropsFile) Write(p []byte) (int, error) { return f.f.Write(p) } diff --git a/vendor/golang.org/x/net/webdav/webdav.go b/vendor/golang.org/x/net/webdav/webdav.go deleted file mode 100644 index 82f8a905..00000000 --- a/vendor/golang.org/x/net/webdav/webdav.go +++ /dev/null @@ -1,706 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package webdav etc etc TODO. -package webdav // import "golang.org/x/net/webdav" - -import ( - "errors" - "fmt" - "io" - "log" - "net/http" - "net/url" - "os" - "path" - "runtime" - "strings" - "time" -) - -// Package webdav's XML output requires the standard library's encoding/xml -// package version 1.5 or greater. Otherwise, it will produce malformed XML. -// -// As of May 2015, the Go stable release is version 1.4, so we print a message -// to let users know that this golang.org/x/etc package won't work yet. -// -// This package also won't work with Go 1.3 and earlier, but making this -// runtime version check catch all the earlier versions too, and not just -// "1.4.x", isn't worth the complexity. -// -// TODO: delete this check at some point after Go 1.5 is released. -var go1Dot4 = strings.HasPrefix(runtime.Version(), "go1.4.") - -func init() { - if go1Dot4 { - log.Println("package webdav requires Go version 1.5 or greater") - } -} - -type Handler struct { - // Prefix is the URL path prefix to strip from WebDAV resource paths. - Prefix string - // FileSystem is the virtual file system. - FileSystem FileSystem - // LockSystem is the lock management system. - LockSystem LockSystem - // Logger is an optional error logger. If non-nil, it will be called - // for all HTTP requests. - Logger func(*http.Request, error) -} - -func (h *Handler) stripPrefix(p string) (string, int, error) { - if h.Prefix == "" { - return p, http.StatusOK, nil - } - if r := strings.TrimPrefix(p, h.Prefix); len(r) < len(p) { - return r, http.StatusOK, nil - } - return p, http.StatusNotFound, errPrefixMismatch -} - -func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - status, err := http.StatusBadRequest, errUnsupportedMethod - if h.FileSystem == nil { - status, err = http.StatusInternalServerError, errNoFileSystem - } else if h.LockSystem == nil { - status, err = http.StatusInternalServerError, errNoLockSystem - } else { - switch r.Method { - case "OPTIONS": - status, err = h.handleOptions(w, r) - case "GET", "HEAD", "POST": - status, err = h.handleGetHeadPost(w, r) - case "DELETE": - status, err = h.handleDelete(w, r) - case "PUT": - status, err = h.handlePut(w, r) - case "MKCOL": - status, err = h.handleMkcol(w, r) - case "COPY", "MOVE": - status, err = h.handleCopyMove(w, r) - case "LOCK": - status, err = h.handleLock(w, r) - case "UNLOCK": - status, err = h.handleUnlock(w, r) - case "PROPFIND": - status, err = h.handlePropfind(w, r) - case "PROPPATCH": - status, err = h.handleProppatch(w, r) - } - } - - if status != 0 { - w.WriteHeader(status) - if status != http.StatusNoContent { - w.Write([]byte(StatusText(status))) - } - } - if h.Logger != nil { - h.Logger(r, err) - } -} - -func (h *Handler) lock(now time.Time, root string) (token string, status int, err error) { - token, err = h.LockSystem.Create(now, LockDetails{ - Root: root, - Duration: infiniteTimeout, - ZeroDepth: true, - }) - if err != nil { - if err == ErrLocked { - return "", StatusLocked, err - } - return "", http.StatusInternalServerError, err - } - return token, 0, nil -} - -func (h *Handler) confirmLocks(r *http.Request, src, dst string) (release func(), status int, err error) { - hdr := r.Header.Get("If") - if hdr == "" { - // An empty If header means that the client hasn't previously created locks. - // Even if this client doesn't care about locks, we still need to check that - // the resources aren't locked by another client, so we create temporary - // locks that would conflict with another client's locks. These temporary - // locks are unlocked at the end of the HTTP request. - now, srcToken, dstToken := time.Now(), "", "" - if src != "" { - srcToken, status, err = h.lock(now, src) - if err != nil { - return nil, status, err - } - } - if dst != "" { - dstToken, status, err = h.lock(now, dst) - if err != nil { - if srcToken != "" { - h.LockSystem.Unlock(now, srcToken) - } - return nil, status, err - } - } - - return func() { - if dstToken != "" { - h.LockSystem.Unlock(now, dstToken) - } - if srcToken != "" { - h.LockSystem.Unlock(now, srcToken) - } - }, 0, nil - } - - ih, ok := parseIfHeader(hdr) - if !ok { - return nil, http.StatusBadRequest, errInvalidIfHeader - } - // ih is a disjunction (OR) of ifLists, so any ifList will do. - for _, l := range ih.lists { - lsrc := l.resourceTag - if lsrc == "" { - lsrc = src - } else { - u, err := url.Parse(lsrc) - if err != nil { - continue - } - if u.Host != r.Host { - continue - } - lsrc = u.Path - } - release, err = h.LockSystem.Confirm(time.Now(), lsrc, dst, l.conditions...) - if err == ErrConfirmationFailed { - continue - } - if err != nil { - return nil, http.StatusInternalServerError, err - } - return release, 0, nil - } - // Section 10.4.1 says that "If this header is evaluated and all state lists - // fail, then the request must fail with a 412 (Precondition Failed) status." - // We follow the spec even though the cond_put_corrupt_token test case from - // the litmus test warns on seeing a 412 instead of a 423 (Locked). - return nil, http.StatusPreconditionFailed, ErrLocked -} - -func (h *Handler) handleOptions(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - allow := "OPTIONS, LOCK, PUT, MKCOL" - if fi, err := h.FileSystem.Stat(reqPath); err == nil { - if fi.IsDir() { - allow = "OPTIONS, LOCK, GET, HEAD, POST, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND" - } else { - allow = "OPTIONS, LOCK, GET, HEAD, POST, DELETE, PROPPATCH, COPY, MOVE, UNLOCK, PROPFIND, PUT" - } - } - w.Header().Set("Allow", allow) - // http://www.webdav.org/specs/rfc4918.html#dav.compliance.classes - w.Header().Set("DAV", "1, 2") - // http://msdn.microsoft.com/en-au/library/cc250217.aspx - w.Header().Set("MS-Author-Via", "DAV") - return 0, nil -} - -func (h *Handler) handleGetHeadPost(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - // TODO: check locks for read-only access?? - f, err := h.FileSystem.OpenFile(reqPath, os.O_RDONLY, 0) - if err != nil { - return http.StatusNotFound, err - } - defer f.Close() - fi, err := f.Stat() - if err != nil { - return http.StatusNotFound, err - } - if !fi.IsDir() { - etag, err := findETag(h.FileSystem, h.LockSystem, reqPath, fi) - if err != nil { - return http.StatusInternalServerError, err - } - w.Header().Set("ETag", etag) - } - // Let ServeContent determine the Content-Type header. - http.ServeContent(w, r, reqPath, fi.ModTime(), f) - return 0, nil -} - -func (h *Handler) handleDelete(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - - // TODO: return MultiStatus where appropriate. - - // "godoc os RemoveAll" says that "If the path does not exist, RemoveAll - // returns nil (no error)." WebDAV semantics are that it should return a - // "404 Not Found". We therefore have to Stat before we RemoveAll. - if _, err := h.FileSystem.Stat(reqPath); err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusMethodNotAllowed, err - } - if err := h.FileSystem.RemoveAll(reqPath); err != nil { - return http.StatusMethodNotAllowed, err - } - return http.StatusNoContent, nil -} - -func (h *Handler) handlePut(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - // TODO(rost): Support the If-Match, If-None-Match headers? See bradfitz' - // comments in http.checkEtag. - - f, err := h.FileSystem.OpenFile(reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - return http.StatusNotFound, err - } - _, copyErr := io.Copy(f, r.Body) - fi, statErr := f.Stat() - closeErr := f.Close() - // TODO(rost): Returning 405 Method Not Allowed might not be appropriate. - if copyErr != nil { - return http.StatusMethodNotAllowed, copyErr - } - if statErr != nil { - return http.StatusMethodNotAllowed, statErr - } - if closeErr != nil { - return http.StatusMethodNotAllowed, closeErr - } - etag, err := findETag(h.FileSystem, h.LockSystem, reqPath, fi) - if err != nil { - return http.StatusInternalServerError, err - } - w.Header().Set("ETag", etag) - return http.StatusCreated, nil -} - -func (h *Handler) handleMkcol(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - - if r.ContentLength > 0 { - return http.StatusUnsupportedMediaType, nil - } - if err := h.FileSystem.Mkdir(reqPath, 0777); err != nil { - if os.IsNotExist(err) { - return http.StatusConflict, err - } - return http.StatusMethodNotAllowed, err - } - return http.StatusCreated, nil -} - -func (h *Handler) handleCopyMove(w http.ResponseWriter, r *http.Request) (status int, err error) { - hdr := r.Header.Get("Destination") - if hdr == "" { - return http.StatusBadRequest, errInvalidDestination - } - u, err := url.Parse(hdr) - if err != nil { - return http.StatusBadRequest, errInvalidDestination - } - if u.Host != r.Host { - return http.StatusBadGateway, errInvalidDestination - } - - src, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - - dst, status, err := h.stripPrefix(u.Path) - if err != nil { - return status, err - } - - if dst == "" { - return http.StatusBadGateway, errInvalidDestination - } - if dst == src { - return http.StatusForbidden, errDestinationEqualsSource - } - - if r.Method == "COPY" { - // Section 7.5.1 says that a COPY only needs to lock the destination, - // not both destination and source. Strictly speaking, this is racy, - // even though a COPY doesn't modify the source, if a concurrent - // operation modifies the source. However, the litmus test explicitly - // checks that COPYing a locked-by-another source is OK. - release, status, err := h.confirmLocks(r, "", dst) - if err != nil { - return status, err - } - defer release() - - // Section 9.8.3 says that "The COPY method on a collection without a Depth - // header must act as if a Depth header with value "infinity" was included". - depth := infiniteDepth - if hdr := r.Header.Get("Depth"); hdr != "" { - depth = parseDepth(hdr) - if depth != 0 && depth != infiniteDepth { - // Section 9.8.3 says that "A client may submit a Depth header on a - // COPY on a collection with a value of "0" or "infinity"." - return http.StatusBadRequest, errInvalidDepth - } - } - return copyFiles(h.FileSystem, src, dst, r.Header.Get("Overwrite") != "F", depth, 0) - } - - release, status, err := h.confirmLocks(r, src, dst) - if err != nil { - return status, err - } - defer release() - - // Section 9.9.2 says that "The MOVE method on a collection must act as if - // a "Depth: infinity" header was used on it. A client must not submit a - // Depth header on a MOVE on a collection with any value but "infinity"." - if hdr := r.Header.Get("Depth"); hdr != "" { - if parseDepth(hdr) != infiniteDepth { - return http.StatusBadRequest, errInvalidDepth - } - } - return moveFiles(h.FileSystem, src, dst, r.Header.Get("Overwrite") == "T") -} - -func (h *Handler) handleLock(w http.ResponseWriter, r *http.Request) (retStatus int, retErr error) { - duration, err := parseTimeout(r.Header.Get("Timeout")) - if err != nil { - return http.StatusBadRequest, err - } - li, status, err := readLockInfo(r.Body) - if err != nil { - return status, err - } - - token, ld, now, created := "", LockDetails{}, time.Now(), false - if li == (lockInfo{}) { - // An empty lockInfo means to refresh the lock. - ih, ok := parseIfHeader(r.Header.Get("If")) - if !ok { - return http.StatusBadRequest, errInvalidIfHeader - } - if len(ih.lists) == 1 && len(ih.lists[0].conditions) == 1 { - token = ih.lists[0].conditions[0].Token - } - if token == "" { - return http.StatusBadRequest, errInvalidLockToken - } - ld, err = h.LockSystem.Refresh(now, token, duration) - if err != nil { - if err == ErrNoSuchLock { - return http.StatusPreconditionFailed, err - } - return http.StatusInternalServerError, err - } - - } else { - // Section 9.10.3 says that "If no Depth header is submitted on a LOCK request, - // then the request MUST act as if a "Depth:infinity" had been submitted." - depth := infiniteDepth - if hdr := r.Header.Get("Depth"); hdr != "" { - depth = parseDepth(hdr) - if depth != 0 && depth != infiniteDepth { - // Section 9.10.3 says that "Values other than 0 or infinity must not be - // used with the Depth header on a LOCK method". - return http.StatusBadRequest, errInvalidDepth - } - } - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - ld = LockDetails{ - Root: reqPath, - Duration: duration, - OwnerXML: li.Owner.InnerXML, - ZeroDepth: depth == 0, - } - token, err = h.LockSystem.Create(now, ld) - if err != nil { - if err == ErrLocked { - return StatusLocked, err - } - return http.StatusInternalServerError, err - } - defer func() { - if retErr != nil { - h.LockSystem.Unlock(now, token) - } - }() - - // Create the resource if it didn't previously exist. - if _, err := h.FileSystem.Stat(reqPath); err != nil { - f, err := h.FileSystem.OpenFile(reqPath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0666) - if err != nil { - // TODO: detect missing intermediate dirs and return http.StatusConflict? - return http.StatusInternalServerError, err - } - f.Close() - created = true - } - - // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the - // Lock-Token value is a Coded-URL. We add angle brackets. - w.Header().Set("Lock-Token", "<"+token+">") - } - - w.Header().Set("Content-Type", "application/xml; charset=utf-8") - if created { - // This is "w.WriteHeader(http.StatusCreated)" and not "return - // http.StatusCreated, nil" because we write our own (XML) response to w - // and Handler.ServeHTTP would otherwise write "Created". - w.WriteHeader(http.StatusCreated) - } - writeLockInfo(w, token, ld) - return 0, nil -} - -func (h *Handler) handleUnlock(w http.ResponseWriter, r *http.Request) (status int, err error) { - // http://www.webdav.org/specs/rfc4918.html#HEADER_Lock-Token says that the - // Lock-Token value is a Coded-URL. We strip its angle brackets. - t := r.Header.Get("Lock-Token") - if len(t) < 2 || t[0] != '<' || t[len(t)-1] != '>' { - return http.StatusBadRequest, errInvalidLockToken - } - t = t[1 : len(t)-1] - - switch err = h.LockSystem.Unlock(time.Now(), t); err { - case nil: - return http.StatusNoContent, err - case ErrForbidden: - return http.StatusForbidden, err - case ErrLocked: - return StatusLocked, err - case ErrNoSuchLock: - return http.StatusConflict, err - default: - return http.StatusInternalServerError, err - } -} - -func (h *Handler) handlePropfind(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - fi, err := h.FileSystem.Stat(reqPath) - if err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusMethodNotAllowed, err - } - depth := infiniteDepth - if hdr := r.Header.Get("Depth"); hdr != "" { - depth = parseDepth(hdr) - if depth == invalidDepth { - return http.StatusBadRequest, errInvalidDepth - } - } - pf, status, err := readPropfind(r.Body) - if err != nil { - return status, err - } - - mw := multistatusWriter{w: w} - - walkFn := func(reqPath string, info os.FileInfo, err error) error { - if err != nil { - return err - } - var pstats []Propstat - if pf.Propname != nil { - pnames, err := propnames(h.FileSystem, h.LockSystem, reqPath) - if err != nil { - return err - } - pstat := Propstat{Status: http.StatusOK} - for _, xmlname := range pnames { - pstat.Props = append(pstat.Props, Property{XMLName: xmlname}) - } - pstats = append(pstats, pstat) - } else if pf.Allprop != nil { - pstats, err = allprop(h.FileSystem, h.LockSystem, reqPath, pf.Prop) - } else { - pstats, err = props(h.FileSystem, h.LockSystem, reqPath, pf.Prop) - } - if err != nil { - return err - } - return mw.write(makePropstatResponse(path.Join(h.Prefix, reqPath), pstats)) - } - - walkErr := walkFS(h.FileSystem, depth, reqPath, fi, walkFn) - closeErr := mw.close() - if walkErr != nil { - return http.StatusInternalServerError, walkErr - } - if closeErr != nil { - return http.StatusInternalServerError, closeErr - } - return 0, nil -} - -func (h *Handler) handleProppatch(w http.ResponseWriter, r *http.Request) (status int, err error) { - reqPath, status, err := h.stripPrefix(r.URL.Path) - if err != nil { - return status, err - } - release, status, err := h.confirmLocks(r, reqPath, "") - if err != nil { - return status, err - } - defer release() - - if _, err := h.FileSystem.Stat(reqPath); err != nil { - if os.IsNotExist(err) { - return http.StatusNotFound, err - } - return http.StatusMethodNotAllowed, err - } - patches, status, err := readProppatch(r.Body) - if err != nil { - return status, err - } - pstats, err := patch(h.FileSystem, h.LockSystem, reqPath, patches) - if err != nil { - return http.StatusInternalServerError, err - } - mw := multistatusWriter{w: w} - writeErr := mw.write(makePropstatResponse(r.URL.Path, pstats)) - closeErr := mw.close() - if writeErr != nil { - return http.StatusInternalServerError, writeErr - } - if closeErr != nil { - return http.StatusInternalServerError, closeErr - } - return 0, nil -} - -func makePropstatResponse(href string, pstats []Propstat) *response { - resp := response{ - Href: []string{href}, - Propstat: make([]propstat, 0, len(pstats)), - } - for _, p := range pstats { - var xmlErr *xmlError - if p.XMLError != "" { - xmlErr = &xmlError{InnerXML: []byte(p.XMLError)} - } - resp.Propstat = append(resp.Propstat, propstat{ - Status: fmt.Sprintf("HTTP/1.1 %d %s", p.Status, StatusText(p.Status)), - Prop: p.Props, - ResponseDescription: p.ResponseDescription, - Error: xmlErr, - }) - } - return &resp -} - -const ( - infiniteDepth = -1 - invalidDepth = -2 -) - -// parseDepth maps the strings "0", "1" and "infinity" to 0, 1 and -// infiniteDepth. Parsing any other string returns invalidDepth. -// -// Different WebDAV methods have further constraints on valid depths: -// - PROPFIND has no further restrictions, as per section 9.1. -// - COPY accepts only "0" or "infinity", as per section 9.8.3. -// - MOVE accepts only "infinity", as per section 9.9.2. -// - LOCK accepts only "0" or "infinity", as per section 9.10.3. -// These constraints are enforced by the handleXxx methods. -func parseDepth(s string) int { - switch s { - case "0": - return 0 - case "1": - return 1 - case "infinity": - return infiniteDepth - } - return invalidDepth -} - -// http://www.webdav.org/specs/rfc4918.html#status.code.extensions.to.http11 -const ( - StatusMulti = 207 - StatusUnprocessableEntity = 422 - StatusLocked = 423 - StatusFailedDependency = 424 - StatusInsufficientStorage = 507 -) - -func StatusText(code int) string { - switch code { - case StatusMulti: - return "Multi-Status" - case StatusUnprocessableEntity: - return "Unprocessable Entity" - case StatusLocked: - return "Locked" - case StatusFailedDependency: - return "Failed Dependency" - case StatusInsufficientStorage: - return "Insufficient Storage" - } - return http.StatusText(code) -} - -var ( - errDestinationEqualsSource = errors.New("webdav: destination equals source") - errDirectoryNotEmpty = errors.New("webdav: directory not empty") - errInvalidDepth = errors.New("webdav: invalid depth") - errInvalidDestination = errors.New("webdav: invalid destination") - errInvalidIfHeader = errors.New("webdav: invalid If header") - errInvalidLockInfo = errors.New("webdav: invalid lock info") - errInvalidLockToken = errors.New("webdav: invalid lock token") - errInvalidPropfind = errors.New("webdav: invalid propfind") - errInvalidProppatch = errors.New("webdav: invalid proppatch") - errInvalidResponse = errors.New("webdav: invalid response") - errInvalidTimeout = errors.New("webdav: invalid timeout") - errNoFileSystem = errors.New("webdav: no file system") - errNoLockSystem = errors.New("webdav: no lock system") - errNotADirectory = errors.New("webdav: not a directory") - errPrefixMismatch = errors.New("webdav: prefix mismatch") - errRecursionTooDeep = errors.New("webdav: recursion too deep") - errUnsupportedLockInfo = errors.New("webdav: unsupported lock info") - errUnsupportedMethod = errors.New("webdav: unsupported method") -) diff --git a/vendor/golang.org/x/net/webdav/webdav_test.go b/vendor/golang.org/x/net/webdav/webdav_test.go deleted file mode 100644 index 45b4055b..00000000 --- a/vendor/golang.org/x/net/webdav/webdav_test.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "fmt" - "io" - "net/http" - "net/http/httptest" - "reflect" - "sort" - "strings" - "testing" -) - -// TODO: add tests to check XML responses with the expected prefix path -func TestPrefix(t *testing.T) { - const dst, blah = "Destination", "blah blah blah" - - do := func(method, urlStr string, body io.Reader, wantStatusCode int, headers ...string) error { - req, err := http.NewRequest(method, urlStr, body) - if err != nil { - return err - } - for len(headers) >= 2 { - req.Header.Add(headers[0], headers[1]) - headers = headers[2:] - } - res, err := http.DefaultClient.Do(req) - if err != nil { - return err - } - defer res.Body.Close() - if res.StatusCode != wantStatusCode { - return fmt.Errorf("got status code %d, want %d", res.StatusCode, wantStatusCode) - } - return nil - } - - prefixes := []string{ - "/", - "/a/", - "/a/b/", - "/a/b/c/", - } - for _, prefix := range prefixes { - fs := NewMemFS() - h := &Handler{ - FileSystem: fs, - LockSystem: NewMemLS(), - } - mux := http.NewServeMux() - if prefix != "/" { - h.Prefix = prefix - } - mux.Handle(prefix, h) - srv := httptest.NewServer(mux) - defer srv.Close() - - // The script is: - // MKCOL /a - // MKCOL /a/b - // PUT /a/b/c - // COPY /a/b/c /a/b/d - // MKCOL /a/b/e - // MOVE /a/b/d /a/b/e/f - // which should yield the (possibly stripped) filenames /a/b/c and - // /a/b/e/f, plus their parent directories. - - wantA := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusMovedPermanently, - "/a/b/": http.StatusNotFound, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if err := do("MKCOL", srv.URL+"/a", nil, wantA); err != nil { - t.Errorf("prefix=%-9q MKCOL /a: %v", prefix, err) - continue - } - - wantB := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusMovedPermanently, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if err := do("MKCOL", srv.URL+"/a/b", nil, wantB); err != nil { - t.Errorf("prefix=%-9q MKCOL /a/b: %v", prefix, err) - continue - } - - wantC := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusMovedPermanently, - }[prefix] - if err := do("PUT", srv.URL+"/a/b/c", strings.NewReader(blah), wantC); err != nil { - t.Errorf("prefix=%-9q PUT /a/b/c: %v", prefix, err) - continue - } - - wantD := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusMovedPermanently, - }[prefix] - if err := do("COPY", srv.URL+"/a/b/c", nil, wantD, dst, srv.URL+"/a/b/d"); err != nil { - t.Errorf("prefix=%-9q COPY /a/b/c /a/b/d: %v", prefix, err) - continue - } - - wantE := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if err := do("MKCOL", srv.URL+"/a/b/e", nil, wantE); err != nil { - t.Errorf("prefix=%-9q MKCOL /a/b/e: %v", prefix, err) - continue - } - - wantF := map[string]int{ - "/": http.StatusCreated, - "/a/": http.StatusCreated, - "/a/b/": http.StatusCreated, - "/a/b/c/": http.StatusNotFound, - }[prefix] - if err := do("MOVE", srv.URL+"/a/b/d", nil, wantF, dst, srv.URL+"/a/b/e/f"); err != nil { - t.Errorf("prefix=%-9q MOVE /a/b/d /a/b/e/f: %v", prefix, err) - continue - } - - got, err := find(nil, fs, "/") - if err != nil { - t.Errorf("prefix=%-9q find: %v", prefix, err) - continue - } - sort.Strings(got) - want := map[string][]string{ - "/": []string{"/", "/a", "/a/b", "/a/b/c", "/a/b/e", "/a/b/e/f"}, - "/a/": []string{"/", "/b", "/b/c", "/b/e", "/b/e/f"}, - "/a/b/": []string{"/", "/c", "/e", "/e/f"}, - "/a/b/c/": []string{"/"}, - }[prefix] - if !reflect.DeepEqual(got, want) { - t.Errorf("prefix=%-9q find:\ngot %v\nwant %v", prefix, got, want) - continue - } - } -} diff --git a/vendor/golang.org/x/net/webdav/xml.go b/vendor/golang.org/x/net/webdav/xml.go deleted file mode 100644 index 8705cda2..00000000 --- a/vendor/golang.org/x/net/webdav/xml.go +++ /dev/null @@ -1,469 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -// The XML encoding is covered by Section 14. -// http://www.webdav.org/specs/rfc4918.html#xml.element.definitions - -import ( - "bytes" - "fmt" - "io" - "net/http" - "time" - - "golang.org/x/net/webdav/internal/xml" -) - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_lockinfo -type lockInfo struct { - XMLName xml.Name `xml:"lockinfo"` - Exclusive *struct{} `xml:"lockscope>exclusive"` - Shared *struct{} `xml:"lockscope>shared"` - Write *struct{} `xml:"locktype>write"` - Owner owner `xml:"owner"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_owner -type owner struct { - InnerXML string `xml:",innerxml"` -} - -func readLockInfo(r io.Reader) (li lockInfo, status int, err error) { - c := &countingReader{r: r} - if err = xml.NewDecoder(c).Decode(&li); err != nil { - if err == io.EOF { - if c.n == 0 { - // An empty body means to refresh the lock. - // http://www.webdav.org/specs/rfc4918.html#refreshing-locks - return lockInfo{}, 0, nil - } - err = errInvalidLockInfo - } - return lockInfo{}, http.StatusBadRequest, err - } - // We only support exclusive (non-shared) write locks. In practice, these are - // the only types of locks that seem to matter. - if li.Exclusive == nil || li.Shared != nil || li.Write == nil { - return lockInfo{}, http.StatusNotImplemented, errUnsupportedLockInfo - } - return li, 0, nil -} - -type countingReader struct { - n int - r io.Reader -} - -func (c *countingReader) Read(p []byte) (int, error) { - n, err := c.r.Read(p) - c.n += n - return n, err -} - -func writeLockInfo(w io.Writer, token string, ld LockDetails) (int, error) { - depth := "infinity" - if ld.ZeroDepth { - depth = "0" - } - timeout := ld.Duration / time.Second - return fmt.Fprintf(w, "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"+ - "<D:prop xmlns:D=\"DAV:\"><D:lockdiscovery><D:activelock>\n"+ - " <D:locktype><D:write/></D:locktype>\n"+ - " <D:lockscope><D:exclusive/></D:lockscope>\n"+ - " <D:depth>%s</D:depth>\n"+ - " <D:owner>%s</D:owner>\n"+ - " <D:timeout>Second-%d</D:timeout>\n"+ - " <D:locktoken><D:href>%s</D:href></D:locktoken>\n"+ - " <D:lockroot><D:href>%s</D:href></D:lockroot>\n"+ - "</D:activelock></D:lockdiscovery></D:prop>", - depth, ld.OwnerXML, timeout, escape(token), escape(ld.Root), - ) -} - -func escape(s string) string { - for i := 0; i < len(s); i++ { - switch s[i] { - case '"', '&', '\'', '<', '>': - b := bytes.NewBuffer(nil) - xml.EscapeText(b, []byte(s)) - return b.String() - } - } - return s -} - -// Next returns the next token, if any, in the XML stream of d. -// RFC 4918 requires to ignore comments, processing instructions -// and directives. -// http://www.webdav.org/specs/rfc4918.html#property_values -// http://www.webdav.org/specs/rfc4918.html#xml-extensibility -func next(d *xml.Decoder) (xml.Token, error) { - for { - t, err := d.Token() - if err != nil { - return t, err - } - switch t.(type) { - case xml.Comment, xml.Directive, xml.ProcInst: - continue - default: - return t, nil - } - } -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for propfind) -type propfindProps []xml.Name - -// UnmarshalXML appends the property names enclosed within start to pn. -// -// It returns an error if start does not contain any properties or if -// properties contain values. Character data between properties is ignored. -func (pn *propfindProps) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - for { - t, err := next(d) - if err != nil { - return err - } - switch t.(type) { - case xml.EndElement: - if len(*pn) == 0 { - return fmt.Errorf("%s must not be empty", start.Name.Local) - } - return nil - case xml.StartElement: - name := t.(xml.StartElement).Name - t, err = next(d) - if err != nil { - return err - } - if _, ok := t.(xml.EndElement); !ok { - return fmt.Errorf("unexpected token %T", t) - } - *pn = append(*pn, name) - } - } -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propfind -type propfind struct { - XMLName xml.Name `xml:"DAV: propfind"` - Allprop *struct{} `xml:"DAV: allprop"` - Propname *struct{} `xml:"DAV: propname"` - Prop propfindProps `xml:"DAV: prop"` - Include propfindProps `xml:"DAV: include"` -} - -func readPropfind(r io.Reader) (pf propfind, status int, err error) { - c := countingReader{r: r} - if err = xml.NewDecoder(&c).Decode(&pf); err != nil { - if err == io.EOF { - if c.n == 0 { - // An empty body means to propfind allprop. - // http://www.webdav.org/specs/rfc4918.html#METHOD_PROPFIND - return propfind{Allprop: new(struct{})}, 0, nil - } - err = errInvalidPropfind - } - return propfind{}, http.StatusBadRequest, err - } - - if pf.Allprop == nil && pf.Include != nil { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - if pf.Allprop != nil && (pf.Prop != nil || pf.Propname != nil) { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - if pf.Prop != nil && pf.Propname != nil { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - if pf.Propname == nil && pf.Allprop == nil && pf.Prop == nil { - return propfind{}, http.StatusBadRequest, errInvalidPropfind - } - return pf, 0, nil -} - -// Property represents a single DAV resource property as defined in RFC 4918. -// See http://www.webdav.org/specs/rfc4918.html#data.model.for.resource.properties -type Property struct { - // XMLName is the fully qualified name that identifies this property. - XMLName xml.Name - - // Lang is an optional xml:lang attribute. - Lang string `xml:"xml:lang,attr,omitempty"` - - // InnerXML contains the XML representation of the property value. - // See http://www.webdav.org/specs/rfc4918.html#property_values - // - // Property values of complex type or mixed-content must have fully - // expanded XML namespaces or be self-contained with according - // XML namespace declarations. They must not rely on any XML - // namespace declarations within the scope of the XML document, - // even including the DAV: namespace. - InnerXML []byte `xml:",innerxml"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_error -// See multistatusWriter for the "D:" namespace prefix. -type xmlError struct { - XMLName xml.Name `xml:"D:error"` - InnerXML []byte `xml:",innerxml"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propstat -// See multistatusWriter for the "D:" namespace prefix. -type propstat struct { - Prop []Property `xml:"D:prop>_ignored_"` - Status string `xml:"D:status"` - Error *xmlError `xml:"D:error"` - ResponseDescription string `xml:"D:responsedescription,omitempty"` -} - -// MarshalXML prepends the "D:" namespace prefix on properties in the DAV: namespace -// before encoding. See multistatusWriter. -func (ps propstat) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - for k, prop := range ps.Prop { - if prop.XMLName.Space == "DAV:" { - prop.XMLName = xml.Name{Space: "", Local: "D:" + prop.XMLName.Local} - ps.Prop[k] = prop - } - } - // Distinct type to avoid infinite recursion of MarshalXML. - type newpropstat propstat - return e.EncodeElement(newpropstat(ps), start) -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_response -// See multistatusWriter for the "D:" namespace prefix. -type response struct { - XMLName xml.Name `xml:"D:response"` - Href []string `xml:"D:href"` - Propstat []propstat `xml:"D:propstat"` - Status string `xml:"D:status,omitempty"` - Error *xmlError `xml:"D:error"` - ResponseDescription string `xml:"D:responsedescription,omitempty"` -} - -// MultistatusWriter marshals one or more Responses into a XML -// multistatus response. -// See http://www.webdav.org/specs/rfc4918.html#ELEMENT_multistatus -// TODO(rsto, mpl): As a workaround, the "D:" namespace prefix, defined as -// "DAV:" on this element, is prepended on the nested response, as well as on all -// its nested elements. All property names in the DAV: namespace are prefixed as -// well. This is because some versions of Mini-Redirector (on windows 7) ignore -// elements with a default namespace (no prefixed namespace). A less intrusive fix -// should be possible after golang.org/cl/11074. See https://golang.org/issue/11177 -type multistatusWriter struct { - // ResponseDescription contains the optional responsedescription - // of the multistatus XML element. Only the latest content before - // close will be emitted. Empty response descriptions are not - // written. - responseDescription string - - w http.ResponseWriter - enc *xml.Encoder -} - -// Write validates and emits a DAV response as part of a multistatus response -// element. -// -// It sets the HTTP status code of its underlying http.ResponseWriter to 207 -// (Multi-Status) and populates the Content-Type header. If r is the -// first, valid response to be written, Write prepends the XML representation -// of r with a multistatus tag. Callers must call close after the last response -// has been written. -func (w *multistatusWriter) write(r *response) error { - switch len(r.Href) { - case 0: - return errInvalidResponse - case 1: - if len(r.Propstat) > 0 != (r.Status == "") { - return errInvalidResponse - } - default: - if len(r.Propstat) > 0 || r.Status == "" { - return errInvalidResponse - } - } - err := w.writeHeader() - if err != nil { - return err - } - return w.enc.Encode(r) -} - -// writeHeader writes a XML multistatus start element on w's underlying -// http.ResponseWriter and returns the result of the write operation. -// After the first write attempt, writeHeader becomes a no-op. -func (w *multistatusWriter) writeHeader() error { - if w.enc != nil { - return nil - } - w.w.Header().Add("Content-Type", "text/xml; charset=utf-8") - w.w.WriteHeader(StatusMulti) - _, err := fmt.Fprintf(w.w, `<?xml version="1.0" encoding="UTF-8"?>`) - if err != nil { - return err - } - w.enc = xml.NewEncoder(w.w) - return w.enc.EncodeToken(xml.StartElement{ - Name: xml.Name{ - Space: "DAV:", - Local: "multistatus", - }, - Attr: []xml.Attr{{ - Name: xml.Name{Space: "xmlns", Local: "D"}, - Value: "DAV:", - }}, - }) -} - -// Close completes the marshalling of the multistatus response. It returns -// an error if the multistatus response could not be completed. If both the -// return value and field enc of w are nil, then no multistatus response has -// been written. -func (w *multistatusWriter) close() error { - if w.enc == nil { - return nil - } - var end []xml.Token - if w.responseDescription != "" { - name := xml.Name{Space: "DAV:", Local: "responsedescription"} - end = append(end, - xml.StartElement{Name: name}, - xml.CharData(w.responseDescription), - xml.EndElement{Name: name}, - ) - } - end = append(end, xml.EndElement{ - Name: xml.Name{Space: "DAV:", Local: "multistatus"}, - }) - for _, t := range end { - err := w.enc.EncodeToken(t) - if err != nil { - return err - } - } - return w.enc.Flush() -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_prop (for proppatch) -type proppatchProps []Property - -var xmlLangName = xml.Name{Space: "http://www.w3.org/XML/1998/namespace", Local: "lang"} - -func xmlLang(s xml.StartElement, d string) string { - for _, attr := range s.Attr { - if attr.Name == xmlLangName { - return attr.Value - } - } - return d -} - -type xmlValue []byte - -func (v *xmlValue) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - // The XML value of a property can be arbitrary, mixed-content XML. - // To make sure that the unmarshalled value contains all required - // namespaces, we encode all the property value XML tokens into a - // buffer. This forces the encoder to redeclare any used namespaces. - var b bytes.Buffer - e := xml.NewEncoder(&b) - for { - t, err := next(d) - if err != nil { - return err - } - if e, ok := t.(xml.EndElement); ok && e.Name == start.Name { - break - } - if err = e.EncodeToken(t); err != nil { - return err - } - } - err := e.Flush() - if err != nil { - return err - } - *v = b.Bytes() - return nil -} - -// UnmarshalXML appends the property names and values enclosed within start -// to ps. -// -// An xml:lang attribute that is defined either on the DAV:prop or property -// name XML element is propagated to the property's Lang field. -// -// UnmarshalXML returns an error if start does not contain any properties or if -// property values contain syntactically incorrect XML. -func (ps *proppatchProps) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { - lang := xmlLang(start, "") - for { - t, err := next(d) - if err != nil { - return err - } - switch elem := t.(type) { - case xml.EndElement: - if len(*ps) == 0 { - return fmt.Errorf("%s must not be empty", start.Name.Local) - } - return nil - case xml.StartElement: - p := Property{ - XMLName: t.(xml.StartElement).Name, - Lang: xmlLang(t.(xml.StartElement), lang), - } - err = d.DecodeElement(((*xmlValue)(&p.InnerXML)), &elem) - if err != nil { - return err - } - *ps = append(*ps, p) - } - } -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_set -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_remove -type setRemove struct { - XMLName xml.Name - Lang string `xml:"xml:lang,attr,omitempty"` - Prop proppatchProps `xml:"DAV: prop"` -} - -// http://www.webdav.org/specs/rfc4918.html#ELEMENT_propertyupdate -type propertyupdate struct { - XMLName xml.Name `xml:"DAV: propertyupdate"` - Lang string `xml:"xml:lang,attr,omitempty"` - SetRemove []setRemove `xml:",any"` -} - -func readProppatch(r io.Reader) (patches []Proppatch, status int, err error) { - var pu propertyupdate - if err = xml.NewDecoder(r).Decode(&pu); err != nil { - return nil, http.StatusBadRequest, err - } - for _, op := range pu.SetRemove { - remove := false - switch op.XMLName { - case xml.Name{Space: "DAV:", Local: "set"}: - // No-op. - case xml.Name{Space: "DAV:", Local: "remove"}: - for _, p := range op.Prop { - if len(p.InnerXML) > 0 { - return nil, http.StatusBadRequest, errInvalidProppatch - } - } - remove = true - default: - return nil, http.StatusBadRequest, errInvalidProppatch - } - patches = append(patches, Proppatch{Remove: remove, Props: op.Prop}) - } - return patches, 0, nil -} diff --git a/vendor/golang.org/x/net/webdav/xml_test.go b/vendor/golang.org/x/net/webdav/xml_test.go deleted file mode 100644 index bc5641f4..00000000 --- a/vendor/golang.org/x/net/webdav/xml_test.go +++ /dev/null @@ -1,909 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package webdav - -import ( - "bytes" - "fmt" - "io" - "net/http" - "net/http/httptest" - "reflect" - "sort" - "strings" - "testing" - - "golang.org/x/net/webdav/internal/xml" -) - -func TestReadLockInfo(t *testing.T) { - // The "section x.y.z" test cases come from section x.y.z of the spec at - // http://www.webdav.org/specs/rfc4918.html - testCases := []struct { - desc string - input string - wantLI lockInfo - wantStatus int - }{{ - "bad: junk", - "xxx", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: invalid owner XML", - "" + - "<D:lockinfo xmlns:D='DAV:'>\n" + - " <D:lockscope><D:exclusive/></D:lockscope>\n" + - " <D:locktype><D:write/></D:locktype>\n" + - " <D:owner>\n" + - " <D:href> no end tag \n" + - " </D:owner>\n" + - "</D:lockinfo>", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: invalid UTF-8", - "" + - "<D:lockinfo xmlns:D='DAV:'>\n" + - " <D:lockscope><D:exclusive/></D:lockscope>\n" + - " <D:locktype><D:write/></D:locktype>\n" + - " <D:owner>\n" + - " <D:href> \xff </D:href>\n" + - " </D:owner>\n" + - "</D:lockinfo>", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: unfinished XML #1", - "" + - "<D:lockinfo xmlns:D='DAV:'>\n" + - " <D:lockscope><D:exclusive/></D:lockscope>\n" + - " <D:locktype><D:write/></D:locktype>\n", - lockInfo{}, - http.StatusBadRequest, - }, { - "bad: unfinished XML #2", - "" + - "<D:lockinfo xmlns:D='DAV:'>\n" + - " <D:lockscope><D:exclusive/></D:lockscope>\n" + - " <D:locktype><D:write/></D:locktype>\n" + - " <D:owner>\n", - lockInfo{}, - http.StatusBadRequest, - }, { - "good: empty", - "", - lockInfo{}, - 0, - }, { - "good: plain-text owner", - "" + - "<D:lockinfo xmlns:D='DAV:'>\n" + - " <D:lockscope><D:exclusive/></D:lockscope>\n" + - " <D:locktype><D:write/></D:locktype>\n" + - " <D:owner>gopher</D:owner>\n" + - "</D:lockinfo>", - lockInfo{ - XMLName: xml.Name{Space: "DAV:", Local: "lockinfo"}, - Exclusive: new(struct{}), - Write: new(struct{}), - Owner: owner{ - InnerXML: "gopher", - }, - }, - 0, - }, { - "section 9.10.7", - "" + - "<D:lockinfo xmlns:D='DAV:'>\n" + - " <D:lockscope><D:exclusive/></D:lockscope>\n" + - " <D:locktype><D:write/></D:locktype>\n" + - " <D:owner>\n" + - " <D:href>http://example.org/~ejw/contact.html</D:href>\n" + - " </D:owner>\n" + - "</D:lockinfo>", - lockInfo{ - XMLName: xml.Name{Space: "DAV:", Local: "lockinfo"}, - Exclusive: new(struct{}), - Write: new(struct{}), - Owner: owner{ - InnerXML: "\n <D:href>http://example.org/~ejw/contact.html</D:href>\n ", - }, - }, - 0, - }} - - for _, tc := range testCases { - li, status, err := readLockInfo(strings.NewReader(tc.input)) - if tc.wantStatus != 0 { - if err == nil { - t.Errorf("%s: got nil error, want non-nil", tc.desc) - continue - } - } else if err != nil { - t.Errorf("%s: %v", tc.desc, err) - continue - } - if !reflect.DeepEqual(li, tc.wantLI) || status != tc.wantStatus { - t.Errorf("%s:\ngot lockInfo=%v, status=%v\nwant lockInfo=%v, status=%v", - tc.desc, li, status, tc.wantLI, tc.wantStatus) - continue - } - } -} - -func TestReadPropfind(t *testing.T) { - testCases := []struct { - desc string - input string - wantPF propfind - wantStatus int - }{{ - desc: "propfind: propname", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:propname/>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Propname: new(struct{}), - }, - }, { - desc: "propfind: empty body means allprop", - input: "", - wantPF: propfind{ - Allprop: new(struct{}), - }, - }, { - desc: "propfind: allprop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:allprop/>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Allprop: new(struct{}), - }, - }, { - desc: "propfind: allprop followed by include", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:allprop/>\n" + - " <A:include><A:displayname/></A:include>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Allprop: new(struct{}), - Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: include followed by allprop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:include><A:displayname/></A:include>\n" + - " <A:allprop/>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Allprop: new(struct{}), - Include: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propfind", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop><A:displayname/></A:prop>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: prop with ignored comments", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop>\n" + - " <!-- ignore -->\n" + - " <A:displayname><!-- ignore --></A:displayname>\n" + - " </A:prop>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propfind with ignored whitespace", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop> <A:displayname/></A:prop>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propfind with ignored mixed-content", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop>foo<A:displayname/>bar</A:prop>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Prop: propfindProps{xml.Name{Space: "DAV:", Local: "displayname"}}, - }, - }, { - desc: "propfind: propname with ignored element (section A.4)", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:propname/>\n" + - " <E:leave-out xmlns:E='E:'>*boss*</E:leave-out>\n" + - "</A:propfind>", - wantPF: propfind{ - XMLName: xml.Name{Space: "DAV:", Local: "propfind"}, - Propname: new(struct{}), - }, - }, { - desc: "propfind: bad: junk", - input: "xxx", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: propname and allprop (section A.3)", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:propname/>" + - " <A:allprop/>" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: propname and prop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop><A:displayname/></A:prop>\n" + - " <A:propname/>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: allprop and prop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:allprop/>\n" + - " <A:prop><A:foo/><A:/prop>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: empty propfind with ignored element (section A.4)", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <E:expired-props/>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: empty prop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop/>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: prop with just chardata", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop>foo</A:prop>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: interrupted prop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop><A:foo></A:prop>\n", - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: malformed end element prop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop><A:foo/></A:bar></A:prop>\n", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: property with chardata value", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop><A:foo>bar</A:foo></A:prop>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: property with whitespace value", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:prop><A:foo> </A:foo></A:prop>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }, { - desc: "propfind: bad: include without allprop", - input: "" + - "<A:propfind xmlns:A='DAV:'>\n" + - " <A:include><A:foo/></A:include>\n" + - "</A:propfind>", - wantStatus: http.StatusBadRequest, - }} - - for _, tc := range testCases { - pf, status, err := readPropfind(strings.NewReader(tc.input)) - if tc.wantStatus != 0 { - if err == nil { - t.Errorf("%s: got nil error, want non-nil", tc.desc) - continue - } - } else if err != nil { - t.Errorf("%s: %v", tc.desc, err) - continue - } - if !reflect.DeepEqual(pf, tc.wantPF) || status != tc.wantStatus { - t.Errorf("%s:\ngot propfind=%v, status=%v\nwant propfind=%v, status=%v", - tc.desc, pf, status, tc.wantPF, tc.wantStatus) - continue - } - } -} - -func TestMultistatusWriter(t *testing.T) { - if go1Dot4 { - t.Skip("TestMultistatusWriter requires Go version 1.5 or greater") - } - - ///The "section x.y.z" test cases come from section x.y.z of the spec at - // http://www.webdav.org/specs/rfc4918.html - testCases := []struct { - desc string - responses []response - respdesc string - writeHeader bool - wantXML string - wantCode int - wantErr error - }{{ - desc: "section 9.2.2 (failed dependency)", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://ns.example.com/", - Local: "Authors", - }, - }}, - Status: "HTTP/1.1 424 Failed Dependency", - }, { - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://ns.example.com/", - Local: "Copyright-Owner", - }, - }}, - Status: "HTTP/1.1 409 Conflict", - }}, - ResponseDescription: "Copyright Owner cannot be deleted or altered.", - }}, - wantXML: `` + - `<?xml version="1.0" encoding="UTF-8"?>` + - `<multistatus xmlns="DAV:">` + - ` <response>` + - ` <href>http://example.com/foo</href>` + - ` <propstat>` + - ` <prop>` + - ` <Authors xmlns="http://ns.example.com/"></Authors>` + - ` </prop>` + - ` <status>HTTP/1.1 424 Failed Dependency</status>` + - ` </propstat>` + - ` <propstat xmlns="DAV:">` + - ` <prop>` + - ` <Copyright-Owner xmlns="http://ns.example.com/"></Copyright-Owner>` + - ` </prop>` + - ` <status>HTTP/1.1 409 Conflict</status>` + - ` </propstat>` + - ` <responsedescription>Copyright Owner cannot be deleted or altered.</responsedescription>` + - `</response>` + - `</multistatus>`, - wantCode: StatusMulti, - }, { - desc: "section 9.6.2 (lock-token-submitted)", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Status: "HTTP/1.1 423 Locked", - Error: &xmlError{ - InnerXML: []byte(`<lock-token-submitted xmlns="DAV:"/>`), - }, - }}, - wantXML: `` + - `<?xml version="1.0" encoding="UTF-8"?>` + - `<multistatus xmlns="DAV:">` + - ` <response>` + - ` <href>http://example.com/foo</href>` + - ` <status>HTTP/1.1 423 Locked</status>` + - ` <error><lock-token-submitted xmlns="DAV:"/></error>` + - ` </response>` + - `</multistatus>`, - wantCode: StatusMulti, - }, { - desc: "section 9.1.3", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "bigbox"}, - InnerXML: []byte(`` + - `<BoxType xmlns="http://ns.example.com/boxschema/">` + - `Box type A` + - `</BoxType>`), - }, { - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "author"}, - InnerXML: []byte(`` + - `<Name xmlns="http://ns.example.com/boxschema/">` + - `J.J. Johnson` + - `</Name>`), - }}, - Status: "HTTP/1.1 200 OK", - }, { - Prop: []Property{{ - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "DingALing"}, - }, { - XMLName: xml.Name{Space: "http://ns.example.com/boxschema/", Local: "Random"}, - }}, - Status: "HTTP/1.1 403 Forbidden", - ResponseDescription: "The user does not have access to the DingALing property.", - }}, - }}, - respdesc: "There has been an access violation error.", - wantXML: `` + - `<?xml version="1.0" encoding="UTF-8"?>` + - `<multistatus xmlns="DAV:" xmlns:B="http://ns.example.com/boxschema/">` + - ` <response>` + - ` <href>http://example.com/foo</href>` + - ` <propstat>` + - ` <prop>` + - ` <B:bigbox><B:BoxType>Box type A</B:BoxType></B:bigbox>` + - ` <B:author><B:Name>J.J. Johnson</B:Name></B:author>` + - ` </prop>` + - ` <status>HTTP/1.1 200 OK</status>` + - ` </propstat>` + - ` <propstat>` + - ` <prop>` + - ` <B:DingALing/>` + - ` <B:Random/>` + - ` </prop>` + - ` <status>HTTP/1.1 403 Forbidden</status>` + - ` <responsedescription>The user does not have access to the DingALing property.</responsedescription>` + - ` </propstat>` + - ` </response>` + - ` <responsedescription>There has been an access violation error.</responsedescription>` + - `</multistatus>`, - wantCode: StatusMulti, - }, { - desc: "no response written", - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "no response written (with description)", - respdesc: "too bad", - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "empty multistatus with header", - writeHeader: true, - wantXML: `<multistatus xmlns="DAV:"></multistatus>`, - wantCode: StatusMulti, - }, { - desc: "bad: no href", - responses: []response{{ - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://example.com/", - Local: "foo", - }, - }}, - Status: "HTTP/1.1 200 OK", - }}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: multiple hrefs and no status", - responses: []response{{ - Href: []string{"http://example.com/foo", "http://example.com/bar"}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: one href and no propstat", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: status with one href and propstat", - responses: []response{{ - Href: []string{"http://example.com/foo"}, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://example.com/", - Local: "foo", - }, - }}, - Status: "HTTP/1.1 200 OK", - }}, - Status: "HTTP/1.1 200 OK", - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }, { - desc: "bad: multiple hrefs and propstat", - responses: []response{{ - Href: []string{ - "http://example.com/foo", - "http://example.com/bar", - }, - Propstat: []propstat{{ - Prop: []Property{{ - XMLName: xml.Name{ - Space: "http://example.com/", - Local: "foo", - }, - }}, - Status: "HTTP/1.1 200 OK", - }}, - }}, - wantErr: errInvalidResponse, - // default of http.responseWriter - wantCode: http.StatusOK, - }} - - n := xmlNormalizer{omitWhitespace: true} -loop: - for _, tc := range testCases { - rec := httptest.NewRecorder() - w := multistatusWriter{w: rec, responseDescription: tc.respdesc} - if tc.writeHeader { - if err := w.writeHeader(); err != nil { - t.Errorf("%s: got writeHeader error %v, want nil", tc.desc, err) - continue - } - } - for _, r := range tc.responses { - if err := w.write(&r); err != nil { - if err != tc.wantErr { - t.Errorf("%s: got write error %v, want %v", - tc.desc, err, tc.wantErr) - } - continue loop - } - } - if err := w.close(); err != tc.wantErr { - t.Errorf("%s: got close error %v, want %v", - tc.desc, err, tc.wantErr) - continue - } - if rec.Code != tc.wantCode { - t.Errorf("%s: got HTTP status code %d, want %d\n", - tc.desc, rec.Code, tc.wantCode) - continue - } - gotXML := rec.Body.String() - eq, err := n.equalXML(strings.NewReader(gotXML), strings.NewReader(tc.wantXML)) - if err != nil { - t.Errorf("%s: equalXML: %v", tc.desc, err) - continue - } - if !eq { - t.Errorf("%s: XML body\ngot %s\nwant %s", tc.desc, gotXML, tc.wantXML) - } - } -} - -func TestReadProppatch(t *testing.T) { - ppStr := func(pps []Proppatch) string { - var outer []string - for _, pp := range pps { - var inner []string - for _, p := range pp.Props { - inner = append(inner, fmt.Sprintf("{XMLName: %q, Lang: %q, InnerXML: %q}", - p.XMLName, p.Lang, p.InnerXML)) - } - outer = append(outer, fmt.Sprintf("{Remove: %t, Props: [%s]}", - pp.Remove, strings.Join(inner, ", "))) - } - return "[" + strings.Join(outer, ", ") + "]" - } - - testCases := []struct { - desc string - input string - wantPP []Proppatch - wantStatus int - }{{ - desc: "proppatch: section 9.2 (with simple property value)", - input: `` + - `<?xml version="1.0" encoding="utf-8" ?>` + - `<D:propertyupdate xmlns:D="DAV:"` + - ` xmlns:Z="http://ns.example.com/z/">` + - ` <D:set>` + - ` <D:prop><Z:Authors>somevalue</Z:Authors></D:prop>` + - ` </D:set>` + - ` <D:remove>` + - ` <D:prop><Z:Copyright-Owner/></D:prop>` + - ` </D:remove>` + - `</D:propertyupdate>`, - wantPP: []Proppatch{{ - Props: []Property{{ - xml.Name{Space: "http://ns.example.com/z/", Local: "Authors"}, - "", - []byte(`somevalue`), - }}, - }, { - Remove: true, - Props: []Property{{ - xml.Name{Space: "http://ns.example.com/z/", Local: "Copyright-Owner"}, - "", - nil, - }}, - }}, - }, { - desc: "proppatch: lang attribute on prop", - input: `` + - `<?xml version="1.0" encoding="utf-8" ?>` + - `<D:propertyupdate xmlns:D="DAV:">` + - ` <D:set>` + - ` <D:prop xml:lang="en">` + - ` <foo xmlns="http://example.com/ns"/>` + - ` </D:prop>` + - ` </D:set>` + - `</D:propertyupdate>`, - wantPP: []Proppatch{{ - Props: []Property{{ - xml.Name{Space: "http://example.com/ns", Local: "foo"}, - "en", - nil, - }}, - }}, - }, { - desc: "bad: remove with value", - input: `` + - `<?xml version="1.0" encoding="utf-8" ?>` + - `<D:propertyupdate xmlns:D="DAV:"` + - ` xmlns:Z="http://ns.example.com/z/">` + - ` <D:remove>` + - ` <D:prop>` + - ` <Z:Authors>` + - ` <Z:Author>Jim Whitehead</Z:Author>` + - ` </Z:Authors>` + - ` </D:prop>` + - ` </D:remove>` + - `</D:propertyupdate>`, - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: empty propertyupdate", - input: `` + - `<?xml version="1.0" encoding="utf-8" ?>` + - `<D:propertyupdate xmlns:D="DAV:"` + - `</D:propertyupdate>`, - wantStatus: http.StatusBadRequest, - }, { - desc: "bad: empty prop", - input: `` + - `<?xml version="1.0" encoding="utf-8" ?>` + - `<D:propertyupdate xmlns:D="DAV:"` + - ` xmlns:Z="http://ns.example.com/z/">` + - ` <D:remove>` + - ` <D:prop/>` + - ` </D:remove>` + - `</D:propertyupdate>`, - wantStatus: http.StatusBadRequest, - }} - - for _, tc := range testCases { - pp, status, err := readProppatch(strings.NewReader(tc.input)) - if tc.wantStatus != 0 { - if err == nil { - t.Errorf("%s: got nil error, want non-nil", tc.desc) - continue - } - } else if err != nil { - t.Errorf("%s: %v", tc.desc, err) - continue - } - if status != tc.wantStatus { - t.Errorf("%s: got status %d, want %d", tc.desc, status, tc.wantStatus) - continue - } - if !reflect.DeepEqual(pp, tc.wantPP) || status != tc.wantStatus { - t.Errorf("%s: proppatch\ngot %v\nwant %v", tc.desc, ppStr(pp), ppStr(tc.wantPP)) - } - } -} - -func TestUnmarshalXMLValue(t *testing.T) { - testCases := []struct { - desc string - input string - wantVal string - }{{ - desc: "simple char data", - input: "<root>foo</root>", - wantVal: "foo", - }, { - desc: "empty element", - input: "<root><foo/></root>", - wantVal: "<foo/>", - }, { - desc: "preserve namespace", - input: `<root><foo xmlns="bar"/></root>`, - wantVal: `<foo xmlns="bar"/>`, - }, { - desc: "preserve root element namespace", - input: `<root xmlns:bar="bar"><bar:foo/></root>`, - wantVal: `<foo xmlns="bar"/>`, - }, { - desc: "preserve whitespace", - input: "<root> \t </root>", - wantVal: " \t ", - }, { - desc: "preserve mixed content", - input: `<root xmlns="bar"> <foo>a<bam xmlns="baz"/> </foo> </root>`, - wantVal: ` <foo xmlns="bar">a<bam xmlns="baz"/> </foo> `, - }, { - desc: "section 9.2", - input: `` + - `<Z:Authors xmlns:Z="http://ns.example.com/z/">` + - ` <Z:Author>Jim Whitehead</Z:Author>` + - ` <Z:Author>Roy Fielding</Z:Author>` + - `</Z:Authors>`, - wantVal: `` + - ` <Author xmlns="http://ns.example.com/z/">Jim Whitehead</Author>` + - ` <Author xmlns="http://ns.example.com/z/">Roy Fielding</Author>`, - }, { - desc: "section 4.3.1 (mixed content)", - input: `` + - `<x:author ` + - ` xmlns:x='http://example.com/ns' ` + - ` xmlns:D="DAV:">` + - ` <x:name>Jane Doe</x:name>` + - ` <!-- Jane's contact info -->` + - ` <x:uri type='email'` + - ` added='2005-11-26'>mailto:jane.doe@example.com</x:uri>` + - ` <x:uri type='web'` + - ` added='2005-11-27'>http://www.example.com</x:uri>` + - ` <x:notes xmlns:h='http://www.w3.org/1999/xhtml'>` + - ` Jane has been working way <h:em>too</h:em> long on the` + - ` long-awaited revision of <![CDATA[<RFC2518>]]>.` + - ` </x:notes>` + - `</x:author>`, - wantVal: `` + - ` <name xmlns="http://example.com/ns">Jane Doe</name>` + - ` ` + - ` <uri type='email'` + - ` xmlns="http://example.com/ns" ` + - ` added='2005-11-26'>mailto:jane.doe@example.com</uri>` + - ` <uri added='2005-11-27'` + - ` type='web'` + - ` xmlns="http://example.com/ns">http://www.example.com</uri>` + - ` <notes xmlns="http://example.com/ns" ` + - ` xmlns:h="http://www.w3.org/1999/xhtml">` + - ` Jane has been working way <h:em>too</h:em> long on the` + - ` long-awaited revision of &lt;RFC2518&gt;.` + - ` </notes>`, - }} - - var n xmlNormalizer - for _, tc := range testCases { - d := xml.NewDecoder(strings.NewReader(tc.input)) - var v xmlValue - if err := d.Decode(&v); err != nil { - t.Errorf("%s: got error %v, want nil", tc.desc, err) - continue - } - eq, err := n.equalXML(bytes.NewReader(v), strings.NewReader(tc.wantVal)) - if err != nil { - t.Errorf("%s: equalXML: %v", tc.desc, err) - continue - } - if !eq { - t.Errorf("%s:\ngot %s\nwant %s", tc.desc, string(v), tc.wantVal) - } - } -} - -// xmlNormalizer normalizes XML. -type xmlNormalizer struct { - // omitWhitespace instructs to ignore whitespace between element tags. - omitWhitespace bool - // omitComments instructs to ignore XML comments. - omitComments bool -} - -// normalize writes the normalized XML content of r to w. It applies the -// following rules -// -// * Rename namespace prefixes according to an internal heuristic. -// * Remove unnecessary namespace declarations. -// * Sort attributes in XML start elements in lexical order of their -// fully qualified name. -// * Remove XML directives and processing instructions. -// * Remove CDATA between XML tags that only contains whitespace, if -// instructed to do so. -// * Remove comments, if instructed to do so. -// -func (n *xmlNormalizer) normalize(w io.Writer, r io.Reader) error { - d := xml.NewDecoder(r) - e := xml.NewEncoder(w) - for { - t, err := d.Token() - if err != nil { - if t == nil && err == io.EOF { - break - } - return err - } - switch val := t.(type) { - case xml.Directive, xml.ProcInst: - continue - case xml.Comment: - if n.omitComments { - continue - } - case xml.CharData: - if n.omitWhitespace && len(bytes.TrimSpace(val)) == 0 { - continue - } - case xml.StartElement: - start, _ := xml.CopyToken(val).(xml.StartElement) - attr := start.Attr[:0] - for _, a := range start.Attr { - if a.Name.Space == "xmlns" || a.Name.Local == "xmlns" { - continue - } - attr = append(attr, a) - } - sort.Sort(byName(attr)) - start.Attr = attr - t = start - } - err = e.EncodeToken(t) - if err != nil { - return err - } - } - return e.Flush() -} - -// equalXML tests for equality of the normalized XML contents of a and b. -func (n *xmlNormalizer) equalXML(a, b io.Reader) (bool, error) { - var buf bytes.Buffer - if err := n.normalize(&buf, a); err != nil { - return false, err - } - normA := buf.String() - buf.Reset() - if err := n.normalize(&buf, b); err != nil { - return false, err - } - normB := buf.String() - return normA == normB, nil -} - -type byName []xml.Attr - -func (a byName) Len() int { return len(a) } -func (a byName) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byName) Less(i, j int) bool { - if a[i].Name.Space != a[j].Name.Space { - return a[i].Name.Space < a[j].Name.Space - } - return a[i].Name.Local < a[j].Name.Local -} diff --git a/vendor/golang.org/x/net/websocket/client.go b/vendor/golang.org/x/net/websocket/client.go deleted file mode 100644 index 20d1e1e3..00000000 --- a/vendor/golang.org/x/net/websocket/client.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "crypto/tls" - "io" - "net" - "net/http" - "net/url" -) - -// DialError is an error that occurs while dialling a websocket server. -type DialError struct { - *Config - Err error -} - -func (e *DialError) Error() string { - return "websocket.Dial " + e.Config.Location.String() + ": " + e.Err.Error() -} - -// NewConfig creates a new WebSocket config for client connection. -func NewConfig(server, origin string) (config *Config, err error) { - config = new(Config) - config.Version = ProtocolVersionHybi13 - config.Location, err = url.ParseRequestURI(server) - if err != nil { - return - } - config.Origin, err = url.ParseRequestURI(origin) - if err != nil { - return - } - config.Header = http.Header(make(map[string][]string)) - return -} - -// NewClient creates a new WebSocket client connection over rwc. -func NewClient(config *Config, rwc io.ReadWriteCloser) (ws *Conn, err error) { - br := bufio.NewReader(rwc) - bw := bufio.NewWriter(rwc) - err = hybiClientHandshake(config, br, bw) - if err != nil { - return - } - buf := bufio.NewReadWriter(br, bw) - ws = newHybiClientConn(config, buf, rwc) - return -} - -// Dial opens a new client connection to a WebSocket. -func Dial(url_, protocol, origin string) (ws *Conn, err error) { - config, err := NewConfig(url_, origin) - if err != nil { - return nil, err - } - if protocol != "" { - config.Protocol = []string{protocol} - } - return DialConfig(config) -} - -var portMap = map[string]string{ - "ws": "80", - "wss": "443", -} - -func parseAuthority(location *url.URL) string { - if _, ok := portMap[location.Scheme]; ok { - if _, _, err := net.SplitHostPort(location.Host); err != nil { - return net.JoinHostPort(location.Host, portMap[location.Scheme]) - } - } - return location.Host -} - -// DialConfig opens a new client connection to a WebSocket with a config. -func DialConfig(config *Config) (ws *Conn, err error) { - var client net.Conn - if config.Location == nil { - return nil, &DialError{config, ErrBadWebSocketLocation} - } - if config.Origin == nil { - return nil, &DialError{config, ErrBadWebSocketOrigin} - } - switch config.Location.Scheme { - case "ws": - client, err = net.Dial("tcp", parseAuthority(config.Location)) - - case "wss": - client, err = tls.Dial("tcp", parseAuthority(config.Location), config.TlsConfig) - - default: - err = ErrBadScheme - } - if err != nil { - goto Error - } - - ws, err = NewClient(config, client) - if err != nil { - client.Close() - goto Error - } - return - -Error: - return nil, &DialError{config, err} -} diff --git a/vendor/golang.org/x/net/websocket/exampledial_test.go b/vendor/golang.org/x/net/websocket/exampledial_test.go deleted file mode 100644 index 72bb9d48..00000000 --- a/vendor/golang.org/x/net/websocket/exampledial_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket_test - -import ( - "fmt" - "log" - - "golang.org/x/net/websocket" -) - -// This example demonstrates a trivial client. -func ExampleDial() { - origin := "http://localhost/" - url := "ws://localhost:12345/ws" - ws, err := websocket.Dial(url, "", origin) - if err != nil { - log.Fatal(err) - } - if _, err := ws.Write([]byte("hello, world!\n")); err != nil { - log.Fatal(err) - } - var msg = make([]byte, 512) - var n int - if n, err = ws.Read(msg); err != nil { - log.Fatal(err) - } - fmt.Printf("Received: %s.\n", msg[:n]) -} diff --git a/vendor/golang.org/x/net/websocket/examplehandler_test.go b/vendor/golang.org/x/net/websocket/examplehandler_test.go deleted file mode 100644 index f22a98fc..00000000 --- a/vendor/golang.org/x/net/websocket/examplehandler_test.go +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket_test - -import ( - "io" - "net/http" - - "golang.org/x/net/websocket" -) - -// Echo the data received on the WebSocket. -func EchoServer(ws *websocket.Conn) { - io.Copy(ws, ws) -} - -// This example demonstrates a trivial echo server. -func ExampleHandler() { - http.Handle("/echo", websocket.Handler(EchoServer)) - err := http.ListenAndServe(":12345", nil) - if err != nil { - panic("ListenAndServe: " + err.Error()) - } -} diff --git a/vendor/golang.org/x/net/websocket/hybi.go b/vendor/golang.org/x/net/websocket/hybi.go deleted file mode 100644 index 60bbc841..00000000 --- a/vendor/golang.org/x/net/websocket/hybi.go +++ /dev/null @@ -1,586 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -// This file implements a protocol of hybi draft. -// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 - -import ( - "bufio" - "bytes" - "crypto/rand" - "crypto/sha1" - "encoding/base64" - "encoding/binary" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strings" -) - -const ( - websocketGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" - - closeStatusNormal = 1000 - closeStatusGoingAway = 1001 - closeStatusProtocolError = 1002 - closeStatusUnsupportedData = 1003 - closeStatusFrameTooLarge = 1004 - closeStatusNoStatusRcvd = 1005 - closeStatusAbnormalClosure = 1006 - closeStatusBadMessageData = 1007 - closeStatusPolicyViolation = 1008 - closeStatusTooBigData = 1009 - closeStatusExtensionMismatch = 1010 - - maxControlFramePayloadLength = 125 -) - -var ( - ErrBadMaskingKey = &ProtocolError{"bad masking key"} - ErrBadPongMessage = &ProtocolError{"bad pong message"} - ErrBadClosingStatus = &ProtocolError{"bad closing status"} - ErrUnsupportedExtensions = &ProtocolError{"unsupported extensions"} - ErrNotImplemented = &ProtocolError{"not implemented"} - - handshakeHeader = map[string]bool{ - "Host": true, - "Upgrade": true, - "Connection": true, - "Sec-Websocket-Key": true, - "Sec-Websocket-Origin": true, - "Sec-Websocket-Version": true, - "Sec-Websocket-Protocol": true, - "Sec-Websocket-Accept": true, - } -) - -// A hybiFrameHeader is a frame header as defined in hybi draft. -type hybiFrameHeader struct { - Fin bool - Rsv [3]bool - OpCode byte - Length int64 - MaskingKey []byte - - data *bytes.Buffer -} - -// A hybiFrameReader is a reader for hybi frame. -type hybiFrameReader struct { - reader io.Reader - - header hybiFrameHeader - pos int64 - length int -} - -func (frame *hybiFrameReader) Read(msg []byte) (n int, err error) { - n, err = frame.reader.Read(msg) - if err != nil { - return 0, err - } - if frame.header.MaskingKey != nil { - for i := 0; i < n; i++ { - msg[i] = msg[i] ^ frame.header.MaskingKey[frame.pos%4] - frame.pos++ - } - } - return n, err -} - -func (frame *hybiFrameReader) PayloadType() byte { return frame.header.OpCode } - -func (frame *hybiFrameReader) HeaderReader() io.Reader { - if frame.header.data == nil { - return nil - } - if frame.header.data.Len() == 0 { - return nil - } - return frame.header.data -} - -func (frame *hybiFrameReader) TrailerReader() io.Reader { return nil } - -func (frame *hybiFrameReader) Len() (n int) { return frame.length } - -// A hybiFrameReaderFactory creates new frame reader based on its frame type. -type hybiFrameReaderFactory struct { - *bufio.Reader -} - -// NewFrameReader reads a frame header from the connection, and creates new reader for the frame. -// See Section 5.2 Base Framing protocol for detail. -// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17#section-5.2 -func (buf hybiFrameReaderFactory) NewFrameReader() (frame frameReader, err error) { - hybiFrame := new(hybiFrameReader) - frame = hybiFrame - var header []byte - var b byte - // First byte. FIN/RSV1/RSV2/RSV3/OpCode(4bits) - b, err = buf.ReadByte() - if err != nil { - return - } - header = append(header, b) - hybiFrame.header.Fin = ((header[0] >> 7) & 1) != 0 - for i := 0; i < 3; i++ { - j := uint(6 - i) - hybiFrame.header.Rsv[i] = ((header[0] >> j) & 1) != 0 - } - hybiFrame.header.OpCode = header[0] & 0x0f - - // Second byte. Mask/Payload len(7bits) - b, err = buf.ReadByte() - if err != nil { - return - } - header = append(header, b) - mask := (b & 0x80) != 0 - b &= 0x7f - lengthFields := 0 - switch { - case b <= 125: // Payload length 7bits. - hybiFrame.header.Length = int64(b) - case b == 126: // Payload length 7+16bits - lengthFields = 2 - case b == 127: // Payload length 7+64bits - lengthFields = 8 - } - for i := 0; i < lengthFields; i++ { - b, err = buf.ReadByte() - if err != nil { - return - } - if lengthFields == 8 && i == 0 { // MSB must be zero when 7+64 bits - b &= 0x7f - } - header = append(header, b) - hybiFrame.header.Length = hybiFrame.header.Length*256 + int64(b) - } - if mask { - // Masking key. 4 bytes. - for i := 0; i < 4; i++ { - b, err = buf.ReadByte() - if err != nil { - return - } - header = append(header, b) - hybiFrame.header.MaskingKey = append(hybiFrame.header.MaskingKey, b) - } - } - hybiFrame.reader = io.LimitReader(buf.Reader, hybiFrame.header.Length) - hybiFrame.header.data = bytes.NewBuffer(header) - hybiFrame.length = len(header) + int(hybiFrame.header.Length) - return -} - -// A HybiFrameWriter is a writer for hybi frame. -type hybiFrameWriter struct { - writer *bufio.Writer - - header *hybiFrameHeader -} - -func (frame *hybiFrameWriter) Write(msg []byte) (n int, err error) { - var header []byte - var b byte - if frame.header.Fin { - b |= 0x80 - } - for i := 0; i < 3; i++ { - if frame.header.Rsv[i] { - j := uint(6 - i) - b |= 1 << j - } - } - b |= frame.header.OpCode - header = append(header, b) - if frame.header.MaskingKey != nil { - b = 0x80 - } else { - b = 0 - } - lengthFields := 0 - length := len(msg) - switch { - case length <= 125: - b |= byte(length) - case length < 65536: - b |= 126 - lengthFields = 2 - default: - b |= 127 - lengthFields = 8 - } - header = append(header, b) - for i := 0; i < lengthFields; i++ { - j := uint((lengthFields - i - 1) * 8) - b = byte((length >> j) & 0xff) - header = append(header, b) - } - if frame.header.MaskingKey != nil { - if len(frame.header.MaskingKey) != 4 { - return 0, ErrBadMaskingKey - } - header = append(header, frame.header.MaskingKey...) - frame.writer.Write(header) - data := make([]byte, length) - for i := range data { - data[i] = msg[i] ^ frame.header.MaskingKey[i%4] - } - frame.writer.Write(data) - err = frame.writer.Flush() - return length, err - } - frame.writer.Write(header) - frame.writer.Write(msg) - err = frame.writer.Flush() - return length, err -} - -func (frame *hybiFrameWriter) Close() error { return nil } - -type hybiFrameWriterFactory struct { - *bufio.Writer - needMaskingKey bool -} - -func (buf hybiFrameWriterFactory) NewFrameWriter(payloadType byte) (frame frameWriter, err error) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: payloadType} - if buf.needMaskingKey { - frameHeader.MaskingKey, err = generateMaskingKey() - if err != nil { - return nil, err - } - } - return &hybiFrameWriter{writer: buf.Writer, header: frameHeader}, nil -} - -type hybiFrameHandler struct { - conn *Conn - payloadType byte -} - -func (handler *hybiFrameHandler) HandleFrame(frame frameReader) (frameReader, error) { - if handler.conn.IsServerConn() { - // The client MUST mask all frames sent to the server. - if frame.(*hybiFrameReader).header.MaskingKey == nil { - handler.WriteClose(closeStatusProtocolError) - return nil, io.EOF - } - } else { - // The server MUST NOT mask all frames. - if frame.(*hybiFrameReader).header.MaskingKey != nil { - handler.WriteClose(closeStatusProtocolError) - return nil, io.EOF - } - } - if header := frame.HeaderReader(); header != nil { - io.Copy(ioutil.Discard, header) - } - switch frame.PayloadType() { - case ContinuationFrame: - frame.(*hybiFrameReader).header.OpCode = handler.payloadType - case TextFrame, BinaryFrame: - handler.payloadType = frame.PayloadType() - case CloseFrame: - return nil, io.EOF - case PingFrame, PongFrame: - b := make([]byte, maxControlFramePayloadLength) - n, err := io.ReadFull(frame, b) - if err != nil && err != io.EOF && err != io.ErrUnexpectedEOF { - return nil, err - } - io.Copy(ioutil.Discard, frame) - if frame.PayloadType() == PingFrame { - if _, err := handler.WritePong(b[:n]); err != nil { - return nil, err - } - } - return nil, nil - } - return frame, nil -} - -func (handler *hybiFrameHandler) WriteClose(status int) (err error) { - handler.conn.wio.Lock() - defer handler.conn.wio.Unlock() - w, err := handler.conn.frameWriterFactory.NewFrameWriter(CloseFrame) - if err != nil { - return err - } - msg := make([]byte, 2) - binary.BigEndian.PutUint16(msg, uint16(status)) - _, err = w.Write(msg) - w.Close() - return err -} - -func (handler *hybiFrameHandler) WritePong(msg []byte) (n int, err error) { - handler.conn.wio.Lock() - defer handler.conn.wio.Unlock() - w, err := handler.conn.frameWriterFactory.NewFrameWriter(PongFrame) - if err != nil { - return 0, err - } - n, err = w.Write(msg) - w.Close() - return n, err -} - -// newHybiConn creates a new WebSocket connection speaking hybi draft protocol. -func newHybiConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { - if buf == nil { - br := bufio.NewReader(rwc) - bw := bufio.NewWriter(rwc) - buf = bufio.NewReadWriter(br, bw) - } - ws := &Conn{config: config, request: request, buf: buf, rwc: rwc, - frameReaderFactory: hybiFrameReaderFactory{buf.Reader}, - frameWriterFactory: hybiFrameWriterFactory{ - buf.Writer, request == nil}, - PayloadType: TextFrame, - defaultCloseStatus: closeStatusNormal} - ws.frameHandler = &hybiFrameHandler{conn: ws} - return ws -} - -// generateMaskingKey generates a masking key for a frame. -func generateMaskingKey() (maskingKey []byte, err error) { - maskingKey = make([]byte, 4) - if _, err = io.ReadFull(rand.Reader, maskingKey); err != nil { - return - } - return -} - -// generateNonce generates a nonce consisting of a randomly selected 16-byte -// value that has been base64-encoded. -func generateNonce() (nonce []byte) { - key := make([]byte, 16) - if _, err := io.ReadFull(rand.Reader, key); err != nil { - panic(err) - } - nonce = make([]byte, 24) - base64.StdEncoding.Encode(nonce, key) - return -} - -// removeZone removes IPv6 zone identifer from host. -// E.g., "[fe80::1%en0]:8080" to "[fe80::1]:8080" -func removeZone(host string) string { - if !strings.HasPrefix(host, "[") { - return host - } - i := strings.LastIndex(host, "]") - if i < 0 { - return host - } - j := strings.LastIndex(host[:i], "%") - if j < 0 { - return host - } - return host[:j] + host[i:] -} - -// getNonceAccept computes the base64-encoded SHA-1 of the concatenation of -// the nonce ("Sec-WebSocket-Key" value) with the websocket GUID string. -func getNonceAccept(nonce []byte) (expected []byte, err error) { - h := sha1.New() - if _, err = h.Write(nonce); err != nil { - return - } - if _, err = h.Write([]byte(websocketGUID)); err != nil { - return - } - expected = make([]byte, 28) - base64.StdEncoding.Encode(expected, h.Sum(nil)) - return -} - -// Client handshake described in draft-ietf-hybi-thewebsocket-protocol-17 -func hybiClientHandshake(config *Config, br *bufio.Reader, bw *bufio.Writer) (err error) { - bw.WriteString("GET " + config.Location.RequestURI() + " HTTP/1.1\r\n") - - // According to RFC 6874, an HTTP client, proxy, or other - // intermediary must remove any IPv6 zone identifier attached - // to an outgoing URI. - bw.WriteString("Host: " + removeZone(config.Location.Host) + "\r\n") - bw.WriteString("Upgrade: websocket\r\n") - bw.WriteString("Connection: Upgrade\r\n") - nonce := generateNonce() - if config.handshakeData != nil { - nonce = []byte(config.handshakeData["key"]) - } - bw.WriteString("Sec-WebSocket-Key: " + string(nonce) + "\r\n") - bw.WriteString("Origin: " + strings.ToLower(config.Origin.String()) + "\r\n") - - if config.Version != ProtocolVersionHybi13 { - return ErrBadProtocolVersion - } - - bw.WriteString("Sec-WebSocket-Version: " + fmt.Sprintf("%d", config.Version) + "\r\n") - if len(config.Protocol) > 0 { - bw.WriteString("Sec-WebSocket-Protocol: " + strings.Join(config.Protocol, ", ") + "\r\n") - } - // TODO(ukai): send Sec-WebSocket-Extensions. - err = config.Header.WriteSubset(bw, handshakeHeader) - if err != nil { - return err - } - - bw.WriteString("\r\n") - if err = bw.Flush(); err != nil { - return err - } - - resp, err := http.ReadResponse(br, &http.Request{Method: "GET"}) - if err != nil { - return err - } - if resp.StatusCode != 101 { - return ErrBadStatus - } - if strings.ToLower(resp.Header.Get("Upgrade")) != "websocket" || - strings.ToLower(resp.Header.Get("Connection")) != "upgrade" { - return ErrBadUpgrade - } - expectedAccept, err := getNonceAccept(nonce) - if err != nil { - return err - } - if resp.Header.Get("Sec-WebSocket-Accept") != string(expectedAccept) { - return ErrChallengeResponse - } - if resp.Header.Get("Sec-WebSocket-Extensions") != "" { - return ErrUnsupportedExtensions - } - offeredProtocol := resp.Header.Get("Sec-WebSocket-Protocol") - if offeredProtocol != "" { - protocolMatched := false - for i := 0; i < len(config.Protocol); i++ { - if config.Protocol[i] == offeredProtocol { - protocolMatched = true - break - } - } - if !protocolMatched { - return ErrBadWebSocketProtocol - } - config.Protocol = []string{offeredProtocol} - } - - return nil -} - -// newHybiClientConn creates a client WebSocket connection after handshake. -func newHybiClientConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser) *Conn { - return newHybiConn(config, buf, rwc, nil) -} - -// A HybiServerHandshaker performs a server handshake using hybi draft protocol. -type hybiServerHandshaker struct { - *Config - accept []byte -} - -func (c *hybiServerHandshaker) ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) { - c.Version = ProtocolVersionHybi13 - if req.Method != "GET" { - return http.StatusMethodNotAllowed, ErrBadRequestMethod - } - // HTTP version can be safely ignored. - - if strings.ToLower(req.Header.Get("Upgrade")) != "websocket" || - !strings.Contains(strings.ToLower(req.Header.Get("Connection")), "upgrade") { - return http.StatusBadRequest, ErrNotWebSocket - } - - key := req.Header.Get("Sec-Websocket-Key") - if key == "" { - return http.StatusBadRequest, ErrChallengeResponse - } - version := req.Header.Get("Sec-Websocket-Version") - switch version { - case "13": - c.Version = ProtocolVersionHybi13 - default: - return http.StatusBadRequest, ErrBadWebSocketVersion - } - var scheme string - if req.TLS != nil { - scheme = "wss" - } else { - scheme = "ws" - } - c.Location, err = url.ParseRequestURI(scheme + "://" + req.Host + req.URL.RequestURI()) - if err != nil { - return http.StatusBadRequest, err - } - protocol := strings.TrimSpace(req.Header.Get("Sec-Websocket-Protocol")) - if protocol != "" { - protocols := strings.Split(protocol, ",") - for i := 0; i < len(protocols); i++ { - c.Protocol = append(c.Protocol, strings.TrimSpace(protocols[i])) - } - } - c.accept, err = getNonceAccept([]byte(key)) - if err != nil { - return http.StatusInternalServerError, err - } - return http.StatusSwitchingProtocols, nil -} - -// Origin parses the Origin header in req. -// If the Origin header is not set, it returns nil and nil. -func Origin(config *Config, req *http.Request) (*url.URL, error) { - var origin string - switch config.Version { - case ProtocolVersionHybi13: - origin = req.Header.Get("Origin") - } - if origin == "" { - return nil, nil - } - return url.ParseRequestURI(origin) -} - -func (c *hybiServerHandshaker) AcceptHandshake(buf *bufio.Writer) (err error) { - if len(c.Protocol) > 0 { - if len(c.Protocol) != 1 { - // You need choose a Protocol in Handshake func in Server. - return ErrBadWebSocketProtocol - } - } - buf.WriteString("HTTP/1.1 101 Switching Protocols\r\n") - buf.WriteString("Upgrade: websocket\r\n") - buf.WriteString("Connection: Upgrade\r\n") - buf.WriteString("Sec-WebSocket-Accept: " + string(c.accept) + "\r\n") - if len(c.Protocol) > 0 { - buf.WriteString("Sec-WebSocket-Protocol: " + c.Protocol[0] + "\r\n") - } - // TODO(ukai): send Sec-WebSocket-Extensions. - if c.Header != nil { - err := c.Header.WriteSubset(buf, handshakeHeader) - if err != nil { - return err - } - } - buf.WriteString("\r\n") - return buf.Flush() -} - -func (c *hybiServerHandshaker) NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { - return newHybiServerConn(c.Config, buf, rwc, request) -} - -// newHybiServerConn returns a new WebSocket connection speaking hybi draft protocol. -func newHybiServerConn(config *Config, buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) *Conn { - return newHybiConn(config, buf, rwc, request) -} diff --git a/vendor/golang.org/x/net/websocket/hybi_test.go b/vendor/golang.org/x/net/websocket/hybi_test.go deleted file mode 100644 index 9504aa2d..00000000 --- a/vendor/golang.org/x/net/websocket/hybi_test.go +++ /dev/null @@ -1,608 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "bytes" - "fmt" - "io" - "net/http" - "net/url" - "strings" - "testing" -) - -// Test the getNonceAccept function with values in -// http://tools.ietf.org/html/draft-ietf-hybi-thewebsocketprotocol-17 -func TestSecWebSocketAccept(t *testing.T) { - nonce := []byte("dGhlIHNhbXBsZSBub25jZQ==") - expected := []byte("s3pPLMBiTxaQ9kYGzzhZRbK+xOo=") - accept, err := getNonceAccept(nonce) - if err != nil { - t.Errorf("getNonceAccept: returned error %v", err) - return - } - if !bytes.Equal(expected, accept) { - t.Errorf("getNonceAccept: expected %q got %q", expected, accept) - } -} - -func TestHybiClientHandshake(t *testing.T) { - type test struct { - url, host string - } - tests := []test{ - {"ws://server.example.com/chat", "server.example.com"}, - {"ws://127.0.0.1/chat", "127.0.0.1"}, - } - if _, err := url.ParseRequestURI("http://[fe80::1%25lo0]"); err == nil { - tests = append(tests, test{"ws://[fe80::1%25lo0]/chat", "[fe80::1]"}) - } - - for _, tt := range tests { - var b bytes.Buffer - bw := bufio.NewWriter(&b) - br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= -Sec-WebSocket-Protocol: chat - -`)) - var err error - var config Config - config.Location, err = url.ParseRequestURI(tt.url) - if err != nil { - t.Fatal("location url", err) - } - config.Origin, err = url.ParseRequestURI("http://example.com") - if err != nil { - t.Fatal("origin url", err) - } - config.Protocol = append(config.Protocol, "chat") - config.Protocol = append(config.Protocol, "superchat") - config.Version = ProtocolVersionHybi13 - config.handshakeData = map[string]string{ - "key": "dGhlIHNhbXBsZSBub25jZQ==", - } - if err := hybiClientHandshake(&config, br, bw); err != nil { - t.Fatal("handshake", err) - } - req, err := http.ReadRequest(bufio.NewReader(&b)) - if err != nil { - t.Fatal("read request", err) - } - if req.Method != "GET" { - t.Errorf("request method expected GET, but got %s", req.Method) - } - if req.URL.Path != "/chat" { - t.Errorf("request path expected /chat, but got %s", req.URL.Path) - } - if req.Proto != "HTTP/1.1" { - t.Errorf("request proto expected HTTP/1.1, but got %s", req.Proto) - } - if req.Host != tt.host { - t.Errorf("request host expected %s, but got %s", tt.host, req.Host) - } - var expectedHeader = map[string]string{ - "Connection": "Upgrade", - "Upgrade": "websocket", - "Sec-Websocket-Key": config.handshakeData["key"], - "Origin": config.Origin.String(), - "Sec-Websocket-Protocol": "chat, superchat", - "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), - } - for k, v := range expectedHeader { - if req.Header.Get(k) != v { - t.Errorf("%s expected %s, but got %v", k, v, req.Header.Get(k)) - } - } - } -} - -func TestHybiClientHandshakeWithHeader(t *testing.T) { - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - br := bufio.NewReader(strings.NewReader(`HTTP/1.1 101 Switching Protocols -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= -Sec-WebSocket-Protocol: chat - -`)) - var err error - config := new(Config) - config.Location, err = url.ParseRequestURI("ws://server.example.com/chat") - if err != nil { - t.Fatal("location url", err) - } - config.Origin, err = url.ParseRequestURI("http://example.com") - if err != nil { - t.Fatal("origin url", err) - } - config.Protocol = append(config.Protocol, "chat") - config.Protocol = append(config.Protocol, "superchat") - config.Version = ProtocolVersionHybi13 - config.Header = http.Header(make(map[string][]string)) - config.Header.Add("User-Agent", "test") - - config.handshakeData = map[string]string{ - "key": "dGhlIHNhbXBsZSBub25jZQ==", - } - err = hybiClientHandshake(config, br, bw) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - req, err := http.ReadRequest(bufio.NewReader(b)) - if err != nil { - t.Fatalf("read request: %v", err) - } - if req.Method != "GET" { - t.Errorf("request method expected GET, but got %q", req.Method) - } - if req.URL.Path != "/chat" { - t.Errorf("request path expected /chat, but got %q", req.URL.Path) - } - if req.Proto != "HTTP/1.1" { - t.Errorf("request proto expected HTTP/1.1, but got %q", req.Proto) - } - if req.Host != "server.example.com" { - t.Errorf("request Host expected server.example.com, but got %v", req.Host) - } - var expectedHeader = map[string]string{ - "Connection": "Upgrade", - "Upgrade": "websocket", - "Sec-Websocket-Key": config.handshakeData["key"], - "Origin": config.Origin.String(), - "Sec-Websocket-Protocol": "chat, superchat", - "Sec-Websocket-Version": fmt.Sprintf("%d", ProtocolVersionHybi13), - "User-Agent": "test", - } - for k, v := range expectedHeader { - if req.Header.Get(k) != v { - t.Errorf(fmt.Sprintf("%s expected %q but got %q", k, v, req.Header.Get(k))) - } - } -} - -func TestHybiServerHandshake(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Origin: http://example.com -Sec-WebSocket-Protocol: chat, superchat -Sec-WebSocket-Version: 13 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - if code != http.StatusSwitchingProtocols { - t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) - } - expectedProtocols := []string{"chat", "superchat"} - if fmt.Sprintf("%v", config.Protocol) != fmt.Sprintf("%v", expectedProtocols) { - t.Errorf("protocol expected %q but got %q", expectedProtocols, config.Protocol) - } - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - - config.Protocol = config.Protocol[:1] - - err = handshaker.AcceptHandshake(bw) - if err != nil { - t.Errorf("handshake response failed: %v", err) - } - expectedResponse := strings.Join([]string{ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", - "Sec-WebSocket-Protocol: chat", - "", ""}, "\r\n") - - if b.String() != expectedResponse { - t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) - } -} - -func TestHybiServerHandshakeNoSubProtocol(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Origin: http://example.com -Sec-WebSocket-Version: 13 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - if code != http.StatusSwitchingProtocols { - t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) - } - if len(config.Protocol) != 0 { - t.Errorf("len(config.Protocol) expected 0, but got %q", len(config.Protocol)) - } - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - - err = handshaker.AcceptHandshake(bw) - if err != nil { - t.Errorf("handshake response failed: %v", err) - } - expectedResponse := strings.Join([]string{ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", - "", ""}, "\r\n") - - if b.String() != expectedResponse { - t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) - } -} - -func TestHybiServerHandshakeHybiBadVersion(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: Upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Sec-WebSocket-Origin: http://example.com -Sec-WebSocket-Protocol: chat, superchat -Sec-WebSocket-Version: 9 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != ErrBadWebSocketVersion { - t.Errorf("handshake expected err %q but got %q", ErrBadWebSocketVersion, err) - } - if code != http.StatusBadRequest { - t.Errorf("status expected %q but got %q", http.StatusBadRequest, code) - } -} - -func testHybiFrame(t *testing.T, testHeader, testPayload, testMaskedPayload []byte, frameHeader *hybiFrameHeader) { - b := bytes.NewBuffer([]byte{}) - frameWriterFactory := &hybiFrameWriterFactory{bufio.NewWriter(b), false} - w, _ := frameWriterFactory.NewFrameWriter(TextFrame) - w.(*hybiFrameWriter).header = frameHeader - _, err := w.Write(testPayload) - w.Close() - if err != nil { - t.Errorf("Write error %q", err) - } - var expectedFrame []byte - expectedFrame = append(expectedFrame, testHeader...) - expectedFrame = append(expectedFrame, testMaskedPayload...) - if !bytes.Equal(expectedFrame, b.Bytes()) { - t.Errorf("frame expected %q got %q", expectedFrame, b.Bytes()) - } - frameReaderFactory := &hybiFrameReaderFactory{bufio.NewReader(b)} - r, err := frameReaderFactory.NewFrameReader() - if err != nil { - t.Errorf("Read error %q", err) - } - if header := r.HeaderReader(); header == nil { - t.Errorf("no header") - } else { - actualHeader := make([]byte, r.Len()) - n, err := header.Read(actualHeader) - if err != nil { - t.Errorf("Read header error %q", err) - } else { - if n < len(testHeader) { - t.Errorf("header too short %q got %q", testHeader, actualHeader[:n]) - } - if !bytes.Equal(testHeader, actualHeader[:n]) { - t.Errorf("header expected %q got %q", testHeader, actualHeader[:n]) - } - } - } - if trailer := r.TrailerReader(); trailer != nil { - t.Errorf("unexpected trailer %q", trailer) - } - frame := r.(*hybiFrameReader) - if frameHeader.Fin != frame.header.Fin || - frameHeader.OpCode != frame.header.OpCode || - len(testPayload) != int(frame.header.Length) { - t.Errorf("mismatch %v (%d) vs %v", frameHeader, len(testPayload), frame) - } - payload := make([]byte, len(testPayload)) - _, err = r.Read(payload) - if err != nil && err != io.EOF { - t.Errorf("read %v", err) - } - if !bytes.Equal(testPayload, payload) { - t.Errorf("payload %q vs %q", testPayload, payload) - } -} - -func TestHybiShortTextFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} - payload := []byte("hello") - testHybiFrame(t, []byte{0x81, 0x05}, payload, payload, frameHeader) - - payload = make([]byte, 125) - testHybiFrame(t, []byte{0x81, 125}, payload, payload, frameHeader) -} - -func TestHybiShortMaskedTextFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame, - MaskingKey: []byte{0xcc, 0x55, 0x80, 0x20}} - payload := []byte("hello") - maskedPayload := []byte{0xa4, 0x30, 0xec, 0x4c, 0xa3} - header := []byte{0x81, 0x85} - header = append(header, frameHeader.MaskingKey...) - testHybiFrame(t, header, payload, maskedPayload, frameHeader) -} - -func TestHybiShortBinaryFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: BinaryFrame} - payload := []byte("hello") - testHybiFrame(t, []byte{0x82, 0x05}, payload, payload, frameHeader) - - payload = make([]byte, 125) - testHybiFrame(t, []byte{0x82, 125}, payload, payload, frameHeader) -} - -func TestHybiControlFrame(t *testing.T) { - payload := []byte("hello") - - frameHeader := &hybiFrameHeader{Fin: true, OpCode: PingFrame} - testHybiFrame(t, []byte{0x89, 0x05}, payload, payload, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: PingFrame} - testHybiFrame(t, []byte{0x89, 0x00}, nil, nil, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} - testHybiFrame(t, []byte{0x8A, 0x05}, payload, payload, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: PongFrame} - testHybiFrame(t, []byte{0x8A, 0x00}, nil, nil, frameHeader) - - frameHeader = &hybiFrameHeader{Fin: true, OpCode: CloseFrame} - payload = []byte{0x03, 0xe8} // 1000 - testHybiFrame(t, []byte{0x88, 0x02}, payload, payload, frameHeader) -} - -func TestHybiLongFrame(t *testing.T) { - frameHeader := &hybiFrameHeader{Fin: true, OpCode: TextFrame} - payload := make([]byte, 126) - testHybiFrame(t, []byte{0x81, 126, 0x00, 126}, payload, payload, frameHeader) - - payload = make([]byte, 65535) - testHybiFrame(t, []byte{0x81, 126, 0xff, 0xff}, payload, payload, frameHeader) - - payload = make([]byte, 65536) - testHybiFrame(t, []byte{0x81, 127, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00}, payload, payload, frameHeader) -} - -func TestHybiClientRead(t *testing.T) { - wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', - 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping - 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) - - msg := make([]byte, 512) - n, err := conn.Read(msg) - if err != nil { - t.Errorf("read 1st frame, error %q", err) - } - if n != 5 { - t.Errorf("read 1st frame, expect 5, got %d", n) - } - if !bytes.Equal(wireData[2:7], msg[:n]) { - t.Errorf("read 1st frame %v, got %v", wireData[2:7], msg[:n]) - } - n, err = conn.Read(msg) - if err != nil { - t.Errorf("read 2nd frame, error %q", err) - } - if n != 5 { - t.Errorf("read 2nd frame, expect 5, got %d", n) - } - if !bytes.Equal(wireData[16:21], msg[:n]) { - t.Errorf("read 2nd frame %v, got %v", wireData[16:21], msg[:n]) - } - n, err = conn.Read(msg) - if err == nil { - t.Errorf("read not EOF") - } - if n != 0 { - t.Errorf("expect read 0, got %d", n) - } -} - -func TestHybiShortRead(t *testing.T) { - wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o', - 0x89, 0x05, 'h', 'e', 'l', 'l', 'o', // ping - 0x81, 0x05, 'w', 'o', 'r', 'l', 'd'} - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) - - step := 0 - pos := 0 - expectedPos := []int{2, 5, 16, 19} - expectedLen := []int{3, 2, 3, 2} - for { - msg := make([]byte, 3) - n, err := conn.Read(msg) - if step >= len(expectedPos) { - if err == nil { - t.Errorf("read not EOF") - } - if n != 0 { - t.Errorf("expect read 0, got %d", n) - } - return - } - pos = expectedPos[step] - endPos := pos + expectedLen[step] - if err != nil { - t.Errorf("read from %d, got error %q", pos, err) - return - } - if n != endPos-pos { - t.Errorf("read from %d, expect %d, got %d", pos, endPos-pos, n) - } - if !bytes.Equal(wireData[pos:endPos], msg[:n]) { - t.Errorf("read from %d, frame %v, got %v", pos, wireData[pos:endPos], msg[:n]) - } - step++ - } -} - -func TestHybiServerRead(t *testing.T) { - wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, - 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello - 0x89, 0x85, 0xcc, 0x55, 0x80, 0x20, - 0xa4, 0x30, 0xec, 0x4c, 0xa3, // ping: hello - 0x81, 0x85, 0xed, 0x83, 0xb4, 0x24, - 0x9a, 0xec, 0xc6, 0x48, 0x89, // world - } - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) - - expected := [][]byte{[]byte("hello"), []byte("world")} - - msg := make([]byte, 512) - n, err := conn.Read(msg) - if err != nil { - t.Errorf("read 1st frame, error %q", err) - } - if n != 5 { - t.Errorf("read 1st frame, expect 5, got %d", n) - } - if !bytes.Equal(expected[0], msg[:n]) { - t.Errorf("read 1st frame %q, got %q", expected[0], msg[:n]) - } - - n, err = conn.Read(msg) - if err != nil { - t.Errorf("read 2nd frame, error %q", err) - } - if n != 5 { - t.Errorf("read 2nd frame, expect 5, got %d", n) - } - if !bytes.Equal(expected[1], msg[:n]) { - t.Errorf("read 2nd frame %q, got %q", expected[1], msg[:n]) - } - - n, err = conn.Read(msg) - if err == nil { - t.Errorf("read not EOF") - } - if n != 0 { - t.Errorf("expect read 0, got %d", n) - } -} - -func TestHybiServerReadWithoutMasking(t *testing.T) { - wireData := []byte{0x81, 0x05, 'h', 'e', 'l', 'l', 'o'} - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, new(http.Request)) - // server MUST close the connection upon receiving a non-masked frame. - msg := make([]byte, 512) - _, err := conn.Read(msg) - if err != io.EOF { - t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) - } -} - -func TestHybiClientReadWithMasking(t *testing.T) { - wireData := []byte{0x81, 0x85, 0xcc, 0x55, 0x80, 0x20, - 0xa4, 0x30, 0xec, 0x4c, 0xa3, // hello - } - br := bufio.NewReader(bytes.NewBuffer(wireData)) - bw := bufio.NewWriter(bytes.NewBuffer([]byte{})) - conn := newHybiConn(newConfig(t, "/"), bufio.NewReadWriter(br, bw), nil, nil) - - // client MUST close the connection upon receiving a masked frame. - msg := make([]byte, 512) - _, err := conn.Read(msg) - if err != io.EOF { - t.Errorf("read 1st frame, expect %q, but got %q", io.EOF, err) - } -} - -// Test the hybiServerHandshaker supports firefox implementation and -// checks Connection request header include (but it's not necessary -// equal to) "upgrade" -func TestHybiServerFirefoxHandshake(t *testing.T) { - config := new(Config) - handshaker := &hybiServerHandshaker{Config: config} - br := bufio.NewReader(strings.NewReader(`GET /chat HTTP/1.1 -Host: server.example.com -Upgrade: websocket -Connection: keep-alive, upgrade -Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== -Origin: http://example.com -Sec-WebSocket-Protocol: chat, superchat -Sec-WebSocket-Version: 13 - -`)) - req, err := http.ReadRequest(br) - if err != nil { - t.Fatal("request", err) - } - code, err := handshaker.ReadHandshake(br, req) - if err != nil { - t.Errorf("handshake failed: %v", err) - } - if code != http.StatusSwitchingProtocols { - t.Errorf("status expected %q but got %q", http.StatusSwitchingProtocols, code) - } - b := bytes.NewBuffer([]byte{}) - bw := bufio.NewWriter(b) - - config.Protocol = []string{"chat"} - - err = handshaker.AcceptHandshake(bw) - if err != nil { - t.Errorf("handshake response failed: %v", err) - } - expectedResponse := strings.Join([]string{ - "HTTP/1.1 101 Switching Protocols", - "Upgrade: websocket", - "Connection: Upgrade", - "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=", - "Sec-WebSocket-Protocol: chat", - "", ""}, "\r\n") - - if b.String() != expectedResponse { - t.Errorf("handshake expected %q but got %q", expectedResponse, b.String()) - } -} diff --git a/vendor/golang.org/x/net/websocket/server.go b/vendor/golang.org/x/net/websocket/server.go deleted file mode 100644 index 0895dea1..00000000 --- a/vendor/golang.org/x/net/websocket/server.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "fmt" - "io" - "net/http" -) - -func newServerConn(rwc io.ReadWriteCloser, buf *bufio.ReadWriter, req *http.Request, config *Config, handshake func(*Config, *http.Request) error) (conn *Conn, err error) { - var hs serverHandshaker = &hybiServerHandshaker{Config: config} - code, err := hs.ReadHandshake(buf.Reader, req) - if err == ErrBadWebSocketVersion { - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - fmt.Fprintf(buf, "Sec-WebSocket-Version: %s\r\n", SupportedProtocolVersion) - buf.WriteString("\r\n") - buf.WriteString(err.Error()) - buf.Flush() - return - } - if err != nil { - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - buf.WriteString("\r\n") - buf.WriteString(err.Error()) - buf.Flush() - return - } - if handshake != nil { - err = handshake(config, req) - if err != nil { - code = http.StatusForbidden - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - buf.WriteString("\r\n") - buf.Flush() - return - } - } - err = hs.AcceptHandshake(buf.Writer) - if err != nil { - code = http.StatusBadRequest - fmt.Fprintf(buf, "HTTP/1.1 %03d %s\r\n", code, http.StatusText(code)) - buf.WriteString("\r\n") - buf.Flush() - return - } - conn = hs.NewServerConn(buf, rwc, req) - return -} - -// Server represents a server of a WebSocket. -type Server struct { - // Config is a WebSocket configuration for new WebSocket connection. - Config - - // Handshake is an optional function in WebSocket handshake. - // For example, you can check, or don't check Origin header. - // Another example, you can select config.Protocol. - Handshake func(*Config, *http.Request) error - - // Handler handles a WebSocket connection. - Handler -} - -// ServeHTTP implements the http.Handler interface for a WebSocket -func (s Server) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s.serveWebSocket(w, req) -} - -func (s Server) serveWebSocket(w http.ResponseWriter, req *http.Request) { - rwc, buf, err := w.(http.Hijacker).Hijack() - if err != nil { - panic("Hijack failed: " + err.Error()) - } - // The server should abort the WebSocket connection if it finds - // the client did not send a handshake that matches with protocol - // specification. - defer rwc.Close() - conn, err := newServerConn(rwc, buf, req, &s.Config, s.Handshake) - if err != nil { - return - } - if conn == nil { - panic("unexpected nil conn") - } - s.Handler(conn) -} - -// Handler is a simple interface to a WebSocket browser client. -// It checks if Origin header is valid URL by default. -// You might want to verify websocket.Conn.Config().Origin in the func. -// If you use Server instead of Handler, you could call websocket.Origin and -// check the origin in your Handshake func. So, if you want to accept -// non-browser clients, which do not send an Origin header, set a -// Server.Handshake that does not check the origin. -type Handler func(*Conn) - -func checkOrigin(config *Config, req *http.Request) (err error) { - config.Origin, err = Origin(config, req) - if err == nil && config.Origin == nil { - return fmt.Errorf("null origin") - } - return err -} - -// ServeHTTP implements the http.Handler interface for a WebSocket -func (h Handler) ServeHTTP(w http.ResponseWriter, req *http.Request) { - s := Server{Handler: h, Handshake: checkOrigin} - s.serveWebSocket(w, req) -} diff --git a/vendor/golang.org/x/net/websocket/websocket.go b/vendor/golang.org/x/net/websocket/websocket.go deleted file mode 100644 index 60684009..00000000 --- a/vendor/golang.org/x/net/websocket/websocket.go +++ /dev/null @@ -1,412 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package websocket implements a client and server for the WebSocket protocol -// as specified in RFC 6455. -package websocket // import "golang.org/x/net/websocket" - -import ( - "bufio" - "crypto/tls" - "encoding/json" - "errors" - "io" - "io/ioutil" - "net" - "net/http" - "net/url" - "sync" - "time" -) - -const ( - ProtocolVersionHybi13 = 13 - ProtocolVersionHybi = ProtocolVersionHybi13 - SupportedProtocolVersion = "13" - - ContinuationFrame = 0 - TextFrame = 1 - BinaryFrame = 2 - CloseFrame = 8 - PingFrame = 9 - PongFrame = 10 - UnknownFrame = 255 -) - -// ProtocolError represents WebSocket protocol errors. -type ProtocolError struct { - ErrorString string -} - -func (err *ProtocolError) Error() string { return err.ErrorString } - -var ( - ErrBadProtocolVersion = &ProtocolError{"bad protocol version"} - ErrBadScheme = &ProtocolError{"bad scheme"} - ErrBadStatus = &ProtocolError{"bad status"} - ErrBadUpgrade = &ProtocolError{"missing or bad upgrade"} - ErrBadWebSocketOrigin = &ProtocolError{"missing or bad WebSocket-Origin"} - ErrBadWebSocketLocation = &ProtocolError{"missing or bad WebSocket-Location"} - ErrBadWebSocketProtocol = &ProtocolError{"missing or bad WebSocket-Protocol"} - ErrBadWebSocketVersion = &ProtocolError{"missing or bad WebSocket Version"} - ErrChallengeResponse = &ProtocolError{"mismatch challenge/response"} - ErrBadFrame = &ProtocolError{"bad frame"} - ErrBadFrameBoundary = &ProtocolError{"not on frame boundary"} - ErrNotWebSocket = &ProtocolError{"not websocket protocol"} - ErrBadRequestMethod = &ProtocolError{"bad method"} - ErrNotSupported = &ProtocolError{"not supported"} -) - -// Addr is an implementation of net.Addr for WebSocket. -type Addr struct { - *url.URL -} - -// Network returns the network type for a WebSocket, "websocket". -func (addr *Addr) Network() string { return "websocket" } - -// Config is a WebSocket configuration -type Config struct { - // A WebSocket server address. - Location *url.URL - - // A Websocket client origin. - Origin *url.URL - - // WebSocket subprotocols. - Protocol []string - - // WebSocket protocol version. - Version int - - // TLS config for secure WebSocket (wss). - TlsConfig *tls.Config - - // Additional header fields to be sent in WebSocket opening handshake. - Header http.Header - - handshakeData map[string]string -} - -// serverHandshaker is an interface to handle WebSocket server side handshake. -type serverHandshaker interface { - // ReadHandshake reads handshake request message from client. - // Returns http response code and error if any. - ReadHandshake(buf *bufio.Reader, req *http.Request) (code int, err error) - - // AcceptHandshake accepts the client handshake request and sends - // handshake response back to client. - AcceptHandshake(buf *bufio.Writer) (err error) - - // NewServerConn creates a new WebSocket connection. - NewServerConn(buf *bufio.ReadWriter, rwc io.ReadWriteCloser, request *http.Request) (conn *Conn) -} - -// frameReader is an interface to read a WebSocket frame. -type frameReader interface { - // Reader is to read payload of the frame. - io.Reader - - // PayloadType returns payload type. - PayloadType() byte - - // HeaderReader returns a reader to read header of the frame. - HeaderReader() io.Reader - - // TrailerReader returns a reader to read trailer of the frame. - // If it returns nil, there is no trailer in the frame. - TrailerReader() io.Reader - - // Len returns total length of the frame, including header and trailer. - Len() int -} - -// frameReaderFactory is an interface to creates new frame reader. -type frameReaderFactory interface { - NewFrameReader() (r frameReader, err error) -} - -// frameWriter is an interface to write a WebSocket frame. -type frameWriter interface { - // Writer is to write payload of the frame. - io.WriteCloser -} - -// frameWriterFactory is an interface to create new frame writer. -type frameWriterFactory interface { - NewFrameWriter(payloadType byte) (w frameWriter, err error) -} - -type frameHandler interface { - HandleFrame(frame frameReader) (r frameReader, err error) - WriteClose(status int) (err error) -} - -// Conn represents a WebSocket connection. -type Conn struct { - config *Config - request *http.Request - - buf *bufio.ReadWriter - rwc io.ReadWriteCloser - - rio sync.Mutex - frameReaderFactory - frameReader - - wio sync.Mutex - frameWriterFactory - - frameHandler - PayloadType byte - defaultCloseStatus int -} - -// Read implements the io.Reader interface: -// it reads data of a frame from the WebSocket connection. -// if msg is not large enough for the frame data, it fills the msg and next Read -// will read the rest of the frame data. -// it reads Text frame or Binary frame. -func (ws *Conn) Read(msg []byte) (n int, err error) { - ws.rio.Lock() - defer ws.rio.Unlock() -again: - if ws.frameReader == nil { - frame, err := ws.frameReaderFactory.NewFrameReader() - if err != nil { - return 0, err - } - ws.frameReader, err = ws.frameHandler.HandleFrame(frame) - if err != nil { - return 0, err - } - if ws.frameReader == nil { - goto again - } - } - n, err = ws.frameReader.Read(msg) - if err == io.EOF { - if trailer := ws.frameReader.TrailerReader(); trailer != nil { - io.Copy(ioutil.Discard, trailer) - } - ws.frameReader = nil - goto again - } - return n, err -} - -// Write implements the io.Writer interface: -// it writes data as a frame to the WebSocket connection. -func (ws *Conn) Write(msg []byte) (n int, err error) { - ws.wio.Lock() - defer ws.wio.Unlock() - w, err := ws.frameWriterFactory.NewFrameWriter(ws.PayloadType) - if err != nil { - return 0, err - } - n, err = w.Write(msg) - w.Close() - if err != nil { - return n, err - } - return n, err -} - -// Close implements the io.Closer interface. -func (ws *Conn) Close() error { - err := ws.frameHandler.WriteClose(ws.defaultCloseStatus) - err1 := ws.rwc.Close() - if err != nil { - return err - } - return err1 -} - -func (ws *Conn) IsClientConn() bool { return ws.request == nil } -func (ws *Conn) IsServerConn() bool { return ws.request != nil } - -// LocalAddr returns the WebSocket Origin for the connection for client, or -// the WebSocket location for server. -func (ws *Conn) LocalAddr() net.Addr { - if ws.IsClientConn() { - return &Addr{ws.config.Origin} - } - return &Addr{ws.config.Location} -} - -// RemoteAddr returns the WebSocket location for the connection for client, or -// the Websocket Origin for server. -func (ws *Conn) RemoteAddr() net.Addr { - if ws.IsClientConn() { - return &Addr{ws.config.Location} - } - return &Addr{ws.config.Origin} -} - -var errSetDeadline = errors.New("websocket: cannot set deadline: not using a net.Conn") - -// SetDeadline sets the connection's network read & write deadlines. -func (ws *Conn) SetDeadline(t time.Time) error { - if conn, ok := ws.rwc.(net.Conn); ok { - return conn.SetDeadline(t) - } - return errSetDeadline -} - -// SetReadDeadline sets the connection's network read deadline. -func (ws *Conn) SetReadDeadline(t time.Time) error { - if conn, ok := ws.rwc.(net.Conn); ok { - return conn.SetReadDeadline(t) - } - return errSetDeadline -} - -// SetWriteDeadline sets the connection's network write deadline. -func (ws *Conn) SetWriteDeadline(t time.Time) error { - if conn, ok := ws.rwc.(net.Conn); ok { - return conn.SetWriteDeadline(t) - } - return errSetDeadline -} - -// Config returns the WebSocket config. -func (ws *Conn) Config() *Config { return ws.config } - -// Request returns the http request upgraded to the WebSocket. -// It is nil for client side. -func (ws *Conn) Request() *http.Request { return ws.request } - -// Codec represents a symmetric pair of functions that implement a codec. -type Codec struct { - Marshal func(v interface{}) (data []byte, payloadType byte, err error) - Unmarshal func(data []byte, payloadType byte, v interface{}) (err error) -} - -// Send sends v marshaled by cd.Marshal as single frame to ws. -func (cd Codec) Send(ws *Conn, v interface{}) (err error) { - data, payloadType, err := cd.Marshal(v) - if err != nil { - return err - } - ws.wio.Lock() - defer ws.wio.Unlock() - w, err := ws.frameWriterFactory.NewFrameWriter(payloadType) - if err != nil { - return err - } - _, err = w.Write(data) - w.Close() - return err -} - -// Receive receives single frame from ws, unmarshaled by cd.Unmarshal and stores in v. -func (cd Codec) Receive(ws *Conn, v interface{}) (err error) { - ws.rio.Lock() - defer ws.rio.Unlock() - if ws.frameReader != nil { - _, err = io.Copy(ioutil.Discard, ws.frameReader) - if err != nil { - return err - } - ws.frameReader = nil - } -again: - frame, err := ws.frameReaderFactory.NewFrameReader() - if err != nil { - return err - } - frame, err = ws.frameHandler.HandleFrame(frame) - if err != nil { - return err - } - if frame == nil { - goto again - } - payloadType := frame.PayloadType() - data, err := ioutil.ReadAll(frame) - if err != nil { - return err - } - return cd.Unmarshal(data, payloadType, v) -} - -func marshal(v interface{}) (msg []byte, payloadType byte, err error) { - switch data := v.(type) { - case string: - return []byte(data), TextFrame, nil - case []byte: - return data, BinaryFrame, nil - } - return nil, UnknownFrame, ErrNotSupported -} - -func unmarshal(msg []byte, payloadType byte, v interface{}) (err error) { - switch data := v.(type) { - case *string: - *data = string(msg) - return nil - case *[]byte: - *data = msg - return nil - } - return ErrNotSupported -} - -/* -Message is a codec to send/receive text/binary data in a frame on WebSocket connection. -To send/receive text frame, use string type. -To send/receive binary frame, use []byte type. - -Trivial usage: - - import "websocket" - - // receive text frame - var message string - websocket.Message.Receive(ws, &message) - - // send text frame - message = "hello" - websocket.Message.Send(ws, message) - - // receive binary frame - var data []byte - websocket.Message.Receive(ws, &data) - - // send binary frame - data = []byte{0, 1, 2} - websocket.Message.Send(ws, data) - -*/ -var Message = Codec{marshal, unmarshal} - -func jsonMarshal(v interface{}) (msg []byte, payloadType byte, err error) { - msg, err = json.Marshal(v) - return msg, TextFrame, err -} - -func jsonUnmarshal(msg []byte, payloadType byte, v interface{}) (err error) { - return json.Unmarshal(msg, v) -} - -/* -JSON is a codec to send/receive JSON data in a frame from a WebSocket connection. - -Trivial usage: - - import "websocket" - - type T struct { - Msg string - Count int - } - - // receive JSON type T - var data T - websocket.JSON.Receive(ws, &data) - - // send JSON type T - websocket.JSON.Send(ws, data) -*/ -var JSON = Codec{jsonMarshal, jsonUnmarshal} diff --git a/vendor/golang.org/x/net/websocket/websocket_test.go b/vendor/golang.org/x/net/websocket/websocket_test.go deleted file mode 100644 index 05b7e535..00000000 --- a/vendor/golang.org/x/net/websocket/websocket_test.go +++ /dev/null @@ -1,587 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bytes" - "fmt" - "io" - "log" - "net" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "runtime" - "strings" - "sync" - "testing" - "time" -) - -var serverAddr string -var once sync.Once - -func echoServer(ws *Conn) { - defer ws.Close() - io.Copy(ws, ws) -} - -type Count struct { - S string - N int -} - -func countServer(ws *Conn) { - defer ws.Close() - for { - var count Count - err := JSON.Receive(ws, &count) - if err != nil { - return - } - count.N++ - count.S = strings.Repeat(count.S, count.N) - err = JSON.Send(ws, count) - if err != nil { - return - } - } -} - -type testCtrlAndDataHandler struct { - hybiFrameHandler -} - -func (h *testCtrlAndDataHandler) WritePing(b []byte) (int, error) { - h.hybiFrameHandler.conn.wio.Lock() - defer h.hybiFrameHandler.conn.wio.Unlock() - w, err := h.hybiFrameHandler.conn.frameWriterFactory.NewFrameWriter(PingFrame) - if err != nil { - return 0, err - } - n, err := w.Write(b) - w.Close() - return n, err -} - -func ctrlAndDataServer(ws *Conn) { - defer ws.Close() - h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} - ws.frameHandler = h - - go func() { - for i := 0; ; i++ { - var b []byte - if i%2 != 0 { // with or without payload - b = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-SERVER", i)) - } - if _, err := h.WritePing(b); err != nil { - break - } - if _, err := h.WritePong(b); err != nil { // unsolicited pong - break - } - time.Sleep(10 * time.Millisecond) - } - }() - - b := make([]byte, 128) - for { - n, err := ws.Read(b) - if err != nil { - break - } - if _, err := ws.Write(b[:n]); err != nil { - break - } - } -} - -func subProtocolHandshake(config *Config, req *http.Request) error { - for _, proto := range config.Protocol { - if proto == "chat" { - config.Protocol = []string{proto} - return nil - } - } - return ErrBadWebSocketProtocol -} - -func subProtoServer(ws *Conn) { - for _, proto := range ws.Config().Protocol { - io.WriteString(ws, proto) - } -} - -func startServer() { - http.Handle("/echo", Handler(echoServer)) - http.Handle("/count", Handler(countServer)) - http.Handle("/ctrldata", Handler(ctrlAndDataServer)) - subproto := Server{ - Handshake: subProtocolHandshake, - Handler: Handler(subProtoServer), - } - http.Handle("/subproto", subproto) - server := httptest.NewServer(nil) - serverAddr = server.Listener.Addr().String() - log.Print("Test WebSocket server listening on ", serverAddr) -} - -func newConfig(t *testing.T, path string) *Config { - config, _ := NewConfig(fmt.Sprintf("ws://%s%s", serverAddr, path), "http://localhost") - return config -} - -func TestEcho(t *testing.T) { - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/echo"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - msg := []byte("hello, world\n") - if _, err := conn.Write(msg); err != nil { - t.Errorf("Write: %v", err) - } - var actual_msg = make([]byte, 512) - n, err := conn.Read(actual_msg) - if err != nil { - t.Errorf("Read: %v", err) - } - actual_msg = actual_msg[0:n] - if !bytes.Equal(msg, actual_msg) { - t.Errorf("Echo: expected %q got %q", msg, actual_msg) - } - conn.Close() -} - -func TestAddr(t *testing.T) { - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/echo"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - ra := conn.RemoteAddr().String() - if !strings.HasPrefix(ra, "ws://") || !strings.HasSuffix(ra, "/echo") { - t.Errorf("Bad remote addr: %v", ra) - } - la := conn.LocalAddr().String() - if !strings.HasPrefix(la, "http://") { - t.Errorf("Bad local addr: %v", la) - } - conn.Close() -} - -func TestCount(t *testing.T) { - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/count"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - var count Count - count.S = "hello" - if err := JSON.Send(conn, count); err != nil { - t.Errorf("Write: %v", err) - } - if err := JSON.Receive(conn, &count); err != nil { - t.Errorf("Read: %v", err) - } - if count.N != 1 { - t.Errorf("count: expected %d got %d", 1, count.N) - } - if count.S != "hello" { - t.Errorf("count: expected %q got %q", "hello", count.S) - } - if err := JSON.Send(conn, count); err != nil { - t.Errorf("Write: %v", err) - } - if err := JSON.Receive(conn, &count); err != nil { - t.Errorf("Read: %v", err) - } - if count.N != 2 { - t.Errorf("count: expected %d got %d", 2, count.N) - } - if count.S != "hellohello" { - t.Errorf("count: expected %q got %q", "hellohello", count.S) - } - conn.Close() -} - -func TestWithQuery(t *testing.T) { - once.Do(startServer) - - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - - config := newConfig(t, "/echo") - config.Location, err = url.ParseRequestURI(fmt.Sprintf("ws://%s/echo?q=v", serverAddr)) - if err != nil { - t.Fatal("location url", err) - } - - ws, err := NewClient(config, client) - if err != nil { - t.Errorf("WebSocket handshake: %v", err) - return - } - ws.Close() -} - -func testWithProtocol(t *testing.T, subproto []string) (string, error) { - once.Do(startServer) - - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - - config := newConfig(t, "/subproto") - config.Protocol = subproto - - ws, err := NewClient(config, client) - if err != nil { - return "", err - } - msg := make([]byte, 16) - n, err := ws.Read(msg) - if err != nil { - return "", err - } - ws.Close() - return string(msg[:n]), nil -} - -func TestWithProtocol(t *testing.T) { - proto, err := testWithProtocol(t, []string{"chat"}) - if err != nil { - t.Errorf("SubProto: unexpected error: %v", err) - } - if proto != "chat" { - t.Errorf("SubProto: expected %q, got %q", "chat", proto) - } -} - -func TestWithTwoProtocol(t *testing.T) { - proto, err := testWithProtocol(t, []string{"test", "chat"}) - if err != nil { - t.Errorf("SubProto: unexpected error: %v", err) - } - if proto != "chat" { - t.Errorf("SubProto: expected %q, got %q", "chat", proto) - } -} - -func TestWithBadProtocol(t *testing.T) { - _, err := testWithProtocol(t, []string{"test"}) - if err != ErrBadStatus { - t.Errorf("SubProto: expected %v, got %v", ErrBadStatus, err) - } -} - -func TestHTTP(t *testing.T) { - once.Do(startServer) - - // If the client did not send a handshake that matches the protocol - // specification, the server MUST return an HTTP response with an - // appropriate error code (such as 400 Bad Request) - resp, err := http.Get(fmt.Sprintf("http://%s/echo", serverAddr)) - if err != nil { - t.Errorf("Get: error %#v", err) - return - } - if resp == nil { - t.Error("Get: resp is null") - return - } - if resp.StatusCode != http.StatusBadRequest { - t.Errorf("Get: expected %q got %q", http.StatusBadRequest, resp.StatusCode) - } -} - -func TestTrailingSpaces(t *testing.T) { - // http://code.google.com/p/go/issues/detail?id=955 - // The last runs of this create keys with trailing spaces that should not be - // generated by the client. - once.Do(startServer) - config := newConfig(t, "/echo") - for i := 0; i < 30; i++ { - // body - ws, err := DialConfig(config) - if err != nil { - t.Errorf("Dial #%d failed: %v", i, err) - break - } - ws.Close() - } -} - -func TestDialConfigBadVersion(t *testing.T) { - once.Do(startServer) - config := newConfig(t, "/echo") - config.Version = 1234 - - _, err := DialConfig(config) - - if dialerr, ok := err.(*DialError); ok { - if dialerr.Err != ErrBadProtocolVersion { - t.Errorf("dial expected err %q but got %q", ErrBadProtocolVersion, dialerr.Err) - } - } -} - -func TestSmallBuffer(t *testing.T) { - // http://code.google.com/p/go/issues/detail?id=1145 - // Read should be able to handle reading a fragment of a frame. - once.Do(startServer) - - // websocket.Dial() - client, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - conn, err := NewClient(newConfig(t, "/echo"), client) - if err != nil { - t.Errorf("WebSocket handshake error: %v", err) - return - } - - msg := []byte("hello, world\n") - if _, err := conn.Write(msg); err != nil { - t.Errorf("Write: %v", err) - } - var small_msg = make([]byte, 8) - n, err := conn.Read(small_msg) - if err != nil { - t.Errorf("Read: %v", err) - } - if !bytes.Equal(msg[:len(small_msg)], small_msg) { - t.Errorf("Echo: expected %q got %q", msg[:len(small_msg)], small_msg) - } - var second_msg = make([]byte, len(msg)) - n, err = conn.Read(second_msg) - if err != nil { - t.Errorf("Read: %v", err) - } - second_msg = second_msg[0:n] - if !bytes.Equal(msg[len(small_msg):], second_msg) { - t.Errorf("Echo: expected %q got %q", msg[len(small_msg):], second_msg) - } - conn.Close() -} - -var parseAuthorityTests = []struct { - in *url.URL - out string -}{ - { - &url.URL{ - Scheme: "ws", - Host: "www.google.com", - }, - "www.google.com:80", - }, - { - &url.URL{ - Scheme: "wss", - Host: "www.google.com", - }, - "www.google.com:443", - }, - { - &url.URL{ - Scheme: "ws", - Host: "www.google.com:80", - }, - "www.google.com:80", - }, - { - &url.URL{ - Scheme: "wss", - Host: "www.google.com:443", - }, - "www.google.com:443", - }, - // some invalid ones for parseAuthority. parseAuthority doesn't - // concern itself with the scheme unless it actually knows about it - { - &url.URL{ - Scheme: "http", - Host: "www.google.com", - }, - "www.google.com", - }, - { - &url.URL{ - Scheme: "http", - Host: "www.google.com:80", - }, - "www.google.com:80", - }, - { - &url.URL{ - Scheme: "asdf", - Host: "127.0.0.1", - }, - "127.0.0.1", - }, - { - &url.URL{ - Scheme: "asdf", - Host: "www.google.com", - }, - "www.google.com", - }, -} - -func TestParseAuthority(t *testing.T) { - for _, tt := range parseAuthorityTests { - out := parseAuthority(tt.in) - if out != tt.out { - t.Errorf("got %v; want %v", out, tt.out) - } - } -} - -type closerConn struct { - net.Conn - closed int // count of the number of times Close was called -} - -func (c *closerConn) Close() error { - c.closed++ - return c.Conn.Close() -} - -func TestClose(t *testing.T) { - if runtime.GOOS == "plan9" { - t.Skip("see golang.org/issue/11454") - } - - once.Do(startServer) - - conn, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal("dialing", err) - } - - cc := closerConn{Conn: conn} - - client, err := NewClient(newConfig(t, "/echo"), &cc) - if err != nil { - t.Fatalf("WebSocket handshake: %v", err) - } - - // set the deadline to ten minutes ago, which will have expired by the time - // client.Close sends the close status frame. - conn.SetDeadline(time.Now().Add(-10 * time.Minute)) - - if err := client.Close(); err == nil { - t.Errorf("ws.Close(): expected error, got %v", err) - } - if cc.closed < 1 { - t.Fatalf("ws.Close(): expected underlying ws.rwc.Close to be called > 0 times, got: %v", cc.closed) - } -} - -var originTests = []struct { - req *http.Request - origin *url.URL -}{ - { - req: &http.Request{ - Header: http.Header{ - "Origin": []string{"http://www.example.com"}, - }, - }, - origin: &url.URL{ - Scheme: "http", - Host: "www.example.com", - }, - }, - { - req: &http.Request{}, - }, -} - -func TestOrigin(t *testing.T) { - conf := newConfig(t, "/echo") - conf.Version = ProtocolVersionHybi13 - for i, tt := range originTests { - origin, err := Origin(conf, tt.req) - if err != nil { - t.Error(err) - continue - } - if !reflect.DeepEqual(origin, tt.origin) { - t.Errorf("#%d: got origin %v; want %v", i, origin, tt.origin) - continue - } - } -} - -func TestCtrlAndData(t *testing.T) { - once.Do(startServer) - - c, err := net.Dial("tcp", serverAddr) - if err != nil { - t.Fatal(err) - } - ws, err := NewClient(newConfig(t, "/ctrldata"), c) - if err != nil { - t.Fatal(err) - } - defer ws.Close() - - h := &testCtrlAndDataHandler{hybiFrameHandler: hybiFrameHandler{conn: ws}} - ws.frameHandler = h - - b := make([]byte, 128) - for i := 0; i < 2; i++ { - data := []byte(fmt.Sprintf("#%d-DATA-FRAME-FROM-CLIENT", i)) - if _, err := ws.Write(data); err != nil { - t.Fatalf("#%d: %v", i, err) - } - var ctrl []byte - if i%2 != 0 { // with or without payload - ctrl = []byte(fmt.Sprintf("#%d-CONTROL-FRAME-FROM-CLIENT", i)) - } - if _, err := h.WritePing(ctrl); err != nil { - t.Fatalf("#%d: %v", i, err) - } - n, err := ws.Read(b) - if err != nil { - t.Fatalf("#%d: %v", i, err) - } - if !bytes.Equal(b[:n], data) { - t.Fatalf("#%d: got %v; want %v", i, b[:n], data) - } - } -} diff --git a/vendor/golang.org/x/oauth2/LICENSE b/vendor/golang.org/x/oauth2/LICENSE index d02f24fd..6a66aea5 100644 --- a/vendor/golang.org/x/oauth2/LICENSE +++ b/vendor/golang.org/x/oauth2/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The oauth2 Authors. All rights reserved. +Copyright (c) 2009 The Go Authors. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are diff --git a/vendor/golang.org/x/oauth2/README.md b/vendor/golang.org/x/oauth2/README.md index 0d514173..eb8dcee1 100644 --- a/vendor/golang.org/x/oauth2/README.md +++ b/vendor/golang.org/x/oauth2/README.md @@ -1,6 +1,7 @@ # OAuth2 for Go [![Build Status](https://travis-ci.org/golang/oauth2.svg?branch=master)](https://travis-ci.org/golang/oauth2) +[![GoDoc](https://godoc.org/golang.org/x/oauth2?status.svg)](https://godoc.org/golang.org/x/oauth2) oauth2 package contains a client implementation for OAuth 2.0 spec. @@ -10,6 +11,9 @@ oauth2 package contains a client implementation for OAuth 2.0 spec. go get golang.org/x/oauth2 ~~~~ +Or you can manually git clone the repository to +`$(go env GOPATH)/src/golang.org/x/oauth2`. + See godoc for further documentation and examples. * [godoc.org/golang.org/x/oauth2](http://godoc.org/golang.org/x/oauth2) @@ -18,11 +22,11 @@ See godoc for further documentation and examples. ## App Engine -In change 96e89be (March 2015) we removed the `oauth2.Context2` type in favor +In change 96e89be (March 2015), we removed the `oauth2.Context2` type in favor of the [`context.Context`](https://golang.org/x/net/context#Context) type from the `golang.org/x/net/context` package -This means its no longer possible to use the "Classic App Engine" +This means it's no longer possible to use the "Classic App Engine" `appengine.Context` type with the `oauth2` package. (You're using Classic App Engine if you import the package `"appengine"`.) @@ -38,27 +42,36 @@ If you don't want to update your entire app to use the new App Engine packages, you may use both sets of packages in parallel, using only the new packages with the `oauth2` package. - import ( - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - newappengine "google.golang.org/appengine" - newurlfetch "google.golang.org/appengine/urlfetch" +```go +import ( + "golang.org/x/net/context" + "golang.org/x/oauth2" + "golang.org/x/oauth2/google" + newappengine "google.golang.org/appengine" + newurlfetch "google.golang.org/appengine/urlfetch" - "appengine" - ) + "appengine" +) - func handler(w http.ResponseWriter, r *http.Request) { - var c appengine.Context = appengine.NewContext(r) - c.Infof("Logging a message with the old package") +func handler(w http.ResponseWriter, r *http.Request) { + var c appengine.Context = appengine.NewContext(r) + c.Infof("Logging a message with the old package") - var ctx context.Context = newappengine.NewContext(r) - client := &http.Client{ - Transport: &oauth2.Transport{ - Source: google.AppEngineTokenSource(ctx, "scope"), - Base: &newurlfetch.Transport{Context: ctx}, - }, - } - client.Get("...") + var ctx context.Context = newappengine.NewContext(r) + client := &http.Client{ + Transport: &oauth2.Transport{ + Source: google.AppEngineTokenSource(ctx, "scope"), + Base: &newurlfetch.Transport{Context: ctx}, + }, } + client.Get("...") +} +``` +## Report Issues / Send Patches + +This repository uses Gerrit for code changes. To learn how to submit changes to +this repository, see https://golang.org/doc/contribute.html. + +The main issue tracker for the oauth2 repository is located at +https://github.com/golang/oauth2/issues. diff --git a/vendor/golang.org/x/oauth2/bitbucket/bitbucket.go b/vendor/golang.org/x/oauth2/bitbucket/bitbucket.go deleted file mode 100644 index 44af1f1a..00000000 --- a/vendor/golang.org/x/oauth2/bitbucket/bitbucket.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The oauth2 Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package bitbucket provides constants for using OAuth2 to access Bitbucket. -package bitbucket - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Bitbucket's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://bitbucket.org/site/oauth2/authorize", - TokenURL: "https://bitbucket.org/site/oauth2/access_token", -} diff --git a/vendor/golang.org/x/oauth2/client_appengine.go b/vendor/golang.org/x/oauth2/client_appengine.go deleted file mode 100644 index 8962c49d..00000000 --- a/vendor/golang.org/x/oauth2/client_appengine.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine - -// App Engine hooks. - -package oauth2 - -import ( - "net/http" - - "golang.org/x/net/context" - "golang.org/x/oauth2/internal" - "google.golang.org/appengine/urlfetch" -) - -func init() { - internal.RegisterContextClientFunc(contextClientAppEngine) -} - -func contextClientAppEngine(ctx context.Context) (*http.Client, error) { - return urlfetch.Client(ctx), nil -} diff --git a/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go b/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go deleted file mode 100644 index 38be1126..00000000 --- a/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials.go +++ /dev/null @@ -1,112 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package clientcredentials implements the OAuth2.0 "client credentials" token flow, -// also known as the "two-legged OAuth 2.0". -// -// This should be used when the client is acting on its own behalf or when the client -// is the resource owner. It may also be used when requesting access to protected -// resources based on an authorization previously arranged with the authorization -// server. -// -// See http://tools.ietf.org/html/draft-ietf-oauth-v2-31#section-4.4 -package clientcredentials // import "golang.org/x/oauth2/clientcredentials" - -import ( - "net/http" - "net/url" - "strings" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" -) - -// tokenFromInternal maps an *internal.Token struct into -// an *oauth2.Token struct. -func tokenFromInternal(t *internal.Token) *oauth2.Token { - if t == nil { - return nil - } - tk := &oauth2.Token{ - AccessToken: t.AccessToken, - TokenType: t.TokenType, - RefreshToken: t.RefreshToken, - Expiry: t.Expiry, - } - return tk.WithExtra(t.Raw) -} - -// retrieveToken takes a *Config and uses that to retrieve an *internal.Token. -// This token is then mapped from *internal.Token into an *oauth2.Token which is -// returned along with an error. -func retrieveToken(ctx context.Context, c *Config, v url.Values) (*oauth2.Token, error) { - tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.TokenURL, v) - if err != nil { - return nil, err - } - return tokenFromInternal(tk), nil -} - -// Client Credentials Config describes a 2-legged OAuth2 flow, with both the -// client application information and the server's endpoint URLs. -type Config struct { - // ClientID is the application's ID. - ClientID string - - // ClientSecret is the application's secret. - ClientSecret string - - // TokenURL is the resource server's token endpoint - // URL. This is a constant specific to each server. - TokenURL string - - // Scope specifies optional requested permissions. - Scopes []string -} - -// Token uses client credentials to retrieve a token. -// The HTTP client to use is derived from the context. -// If nil, http.DefaultClient is used. -func (c *Config) Token(ctx context.Context) (*oauth2.Token, error) { - return retrieveToken(ctx, c, url.Values{ - "grant_type": {"client_credentials"}, - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - }) -} - -// Client returns an HTTP client using the provided token. -// The token will auto-refresh as necessary. The underlying -// HTTP transport will be obtained using the provided context. -// The returned client and its Transport should not be modified. -func (c *Config) Client(ctx context.Context) *http.Client { - return oauth2.NewClient(ctx, c.TokenSource(ctx)) -} - -// TokenSource returns a TokenSource that returns t until t expires, -// automatically refreshing it as necessary using the provided context and the -// client ID and client secret. -// -// Most users will use Config.Client instead. -func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource { - source := &tokenSource{ - ctx: ctx, - conf: c, - } - return oauth2.ReuseTokenSource(nil, source) -} - -type tokenSource struct { - ctx context.Context - conf *Config -} - -// Token refreshes the token by using a new client credentials request. -// tokens received this way do not include a refresh token -func (c *tokenSource) Token() (*oauth2.Token, error) { - return retrieveToken(c.ctx, c.conf, url.Values{ - "grant_type": {"client_credentials"}, - "scope": internal.CondVal(strings.Join(c.conf.Scopes, " ")), - }) -} diff --git a/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go b/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go deleted file mode 100644 index 5a0170a9..00000000 --- a/vendor/golang.org/x/oauth2/clientcredentials/clientcredentials_test.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package clientcredentials - -import ( - "io/ioutil" - "net/http" - "net/http/httptest" - "testing" - - "golang.org/x/oauth2" -) - -func newConf(url string) *Config { - return &Config{ - ClientID: "CLIENT_ID", - ClientSecret: "CLIENT_SECRET", - Scopes: []string{"scope1", "scope2"}, - TokenURL: url + "/token", - } -} - -type mockTransport struct { - rt func(req *http.Request) (resp *http.Response, err error) -} - -func (t *mockTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - return t.rt(req) -} - -func TestTokenRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() != "/token" { - t.Errorf("authenticate client request URL = %q; want %q", r.URL, "/token") - } - headerAuth := r.Header.Get("Authorization") - if headerAuth != "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - if got, want := r.Header.Get("Content-Type"), "application/x-www-form-urlencoded"; got != want { - t.Errorf("Content-Type header = %q; want %q", got, want) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - r.Body.Close() - } - if err != nil { - t.Errorf("failed reading request body: %s.", err) - } - if string(body) != "client_id=CLIENT_ID&grant_type=client_credentials&scope=scope1+scope2" { - t.Errorf("payload = %q; want %q", string(body), "client_id=CLIENT_ID&grant_type=client_credentials&scope=scope1+scope2") - } - w.Header().Set("Content-Type", "application/x-www-form-urlencoded") - w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&token_type=bearer")) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Token(oauth2.NoContext) - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("token invalid. got: %#v", tok) - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Access token = %q; want %q", tok.AccessToken, "90d64460d14870c08c81352a05dedd3465940a7c") - } - if tok.TokenType != "bearer" { - t.Errorf("token type = %q; want %q", tok.TokenType, "bearer") - } -} - -func TestTokenRefreshRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() == "/somethingelse" { - return - } - if r.URL.String() != "/token" { - t.Errorf("Unexpected token refresh request URL, %v is found.", r.URL) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, _ := ioutil.ReadAll(r.Body) - if string(body) != "client_id=CLIENT_ID&grant_type=client_credentials&scope=scope1+scope2" { - t.Errorf("Unexpected refresh token payload, %v is found.", string(body)) - } - })) - defer ts.Close() - conf := newConf(ts.URL) - c := conf.Client(oauth2.NoContext) - c.Get(ts.URL + "/somethingelse") -} diff --git a/vendor/golang.org/x/oauth2/example_test.go b/vendor/golang.org/x/oauth2/example_test.go deleted file mode 100644 index 33b305c6..00000000 --- a/vendor/golang.org/x/oauth2/example_test.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package oauth2_test - -import ( - "fmt" - "log" - - "golang.org/x/oauth2" -) - -func ExampleConfig() { - conf := &oauth2.Config{ - ClientID: "YOUR_CLIENT_ID", - ClientSecret: "YOUR_CLIENT_SECRET", - Scopes: []string{"SCOPE1", "SCOPE2"}, - Endpoint: oauth2.Endpoint{ - AuthURL: "https://provider.com/o/oauth2/auth", - TokenURL: "https://provider.com/o/oauth2/token", - }, - } - - // Redirect user to consent page to ask for permission - // for the scopes specified above. - url := conf.AuthCodeURL("state", oauth2.AccessTypeOffline) - fmt.Printf("Visit the URL for the auth dialog: %v", url) - - // Use the authorization code that is pushed to the redirect URL. - // NewTransportWithCode will do the handshake to retrieve - // an access token and initiate a Transport that is - // authorized and authenticated by the retrieved token. - var code string - if _, err := fmt.Scan(&code); err != nil { - log.Fatal(err) - } - tok, err := conf.Exchange(oauth2.NoContext, code) - if err != nil { - log.Fatal(err) - } - - client := conf.Client(oauth2.NoContext, tok) - client.Get("...") -} diff --git a/vendor/golang.org/x/oauth2/facebook/facebook.go b/vendor/golang.org/x/oauth2/facebook/facebook.go deleted file mode 100644 index 14c801a2..00000000 --- a/vendor/golang.org/x/oauth2/facebook/facebook.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package facebook provides constants for using OAuth2 to access Facebook. -package facebook // import "golang.org/x/oauth2/facebook" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Facebook's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.facebook.com/dialog/oauth", - TokenURL: "https://graph.facebook.com/oauth/access_token", -} diff --git a/vendor/golang.org/x/oauth2/fitbit/fitbit.go b/vendor/golang.org/x/oauth2/fitbit/fitbit.go deleted file mode 100644 index b31b82ac..00000000 --- a/vendor/golang.org/x/oauth2/fitbit/fitbit.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package fitbit provides constants for using OAuth2 to access the Fitbit API. -package fitbit // import "golang.org/x/oauth2/fitbit" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is the Fitbit API's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.fitbit.com/oauth2/authorize", - TokenURL: "https://api.fitbit.com/oauth2/token", -} diff --git a/vendor/golang.org/x/oauth2/github/github.go b/vendor/golang.org/x/oauth2/github/github.go deleted file mode 100644 index f2978015..00000000 --- a/vendor/golang.org/x/oauth2/github/github.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package github provides constants for using OAuth2 to access Github. -package github // import "golang.org/x/oauth2/github" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Github's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://github.com/login/oauth/authorize", - TokenURL: "https://github.com/login/oauth/access_token", -} diff --git a/vendor/golang.org/x/oauth2/google/appengine.go b/vendor/golang.org/x/oauth2/google/appengine.go deleted file mode 100644 index dc993efb..00000000 --- a/vendor/golang.org/x/oauth2/google/appengine.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "sort" - "strings" - "sync" - "time" - - "golang.org/x/net/context" - "golang.org/x/oauth2" -) - -// Set at init time by appenginevm_hook.go. If true, we are on App Engine Managed VMs. -var appengineVM bool - -// Set at init time by appengine_hook.go. If nil, we're not on App Engine. -var appengineTokenFunc func(c context.Context, scopes ...string) (token string, expiry time.Time, err error) - -// AppEngineTokenSource returns a token source that fetches tokens -// issued to the current App Engine application's service account. -// If you are implementing a 3-legged OAuth 2.0 flow on App Engine -// that involves user accounts, see oauth2.Config instead. -// -// The provided context must have come from appengine.NewContext. -func AppEngineTokenSource(ctx context.Context, scope ...string) oauth2.TokenSource { - if appengineTokenFunc == nil { - panic("google: AppEngineTokenSource can only be used on App Engine.") - } - scopes := append([]string{}, scope...) - sort.Strings(scopes) - return &appEngineTokenSource{ - ctx: ctx, - scopes: scopes, - key: strings.Join(scopes, " "), - } -} - -// aeTokens helps the fetched tokens to be reused until their expiration. -var ( - aeTokensMu sync.Mutex - aeTokens = make(map[string]*tokenLock) // key is space-separated scopes -) - -type tokenLock struct { - mu sync.Mutex // guards t; held while fetching or updating t - t *oauth2.Token -} - -type appEngineTokenSource struct { - ctx context.Context - scopes []string - key string // to aeTokens map; space-separated scopes -} - -func (ts *appEngineTokenSource) Token() (*oauth2.Token, error) { - if appengineTokenFunc == nil { - panic("google: AppEngineTokenSource can only be used on App Engine.") - } - - aeTokensMu.Lock() - tok, ok := aeTokens[ts.key] - if !ok { - tok = &tokenLock{} - aeTokens[ts.key] = tok - } - aeTokensMu.Unlock() - - tok.mu.Lock() - defer tok.mu.Unlock() - if tok.t.Valid() { - return tok.t, nil - } - access, exp, err := appengineTokenFunc(ts.ctx, ts.scopes...) - if err != nil { - return nil, err - } - tok.t = &oauth2.Token{ - AccessToken: access, - Expiry: exp, - } - return tok.t, nil -} diff --git a/vendor/golang.org/x/oauth2/google/appengine_hook.go b/vendor/golang.org/x/oauth2/google/appengine_hook.go deleted file mode 100644 index 4f42c8b3..00000000 --- a/vendor/golang.org/x/oauth2/google/appengine_hook.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appengine - -package google - -import "google.golang.org/appengine" - -func init() { - appengineTokenFunc = appengine.AccessToken -} diff --git a/vendor/golang.org/x/oauth2/google/appenginevm_hook.go b/vendor/golang.org/x/oauth2/google/appenginevm_hook.go deleted file mode 100644 index 633611cc..00000000 --- a/vendor/golang.org/x/oauth2/google/appenginevm_hook.go +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2015 The oauth2 Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appenginevm - -package google - -import "google.golang.org/appengine" - -func init() { - appengineVM = true - appengineTokenFunc = appengine.AccessToken -} diff --git a/vendor/golang.org/x/oauth2/google/default.go b/vendor/golang.org/x/oauth2/google/default.go deleted file mode 100644 index b9523629..00000000 --- a/vendor/golang.org/x/oauth2/google/default.go +++ /dev/null @@ -1,155 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "net/http" - "os" - "path/filepath" - "runtime" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/jwt" - "google.golang.org/cloud/compute/metadata" -) - -// DefaultClient returns an HTTP Client that uses the -// DefaultTokenSource to obtain authentication credentials. -// -// This client should be used when developing services -// that run on Google App Engine or Google Compute Engine -// and use "Application Default Credentials." -// -// For more details, see: -// https://developers.google.com/accounts/docs/application-default-credentials -// -func DefaultClient(ctx context.Context, scope ...string) (*http.Client, error) { - ts, err := DefaultTokenSource(ctx, scope...) - if err != nil { - return nil, err - } - return oauth2.NewClient(ctx, ts), nil -} - -// DefaultTokenSource is a token source that uses -// "Application Default Credentials". -// -// It looks for credentials in the following places, -// preferring the first location found: -// -// 1. A JSON file whose path is specified by the -// GOOGLE_APPLICATION_CREDENTIALS environment variable. -// 2. A JSON file in a location known to the gcloud command-line tool. -// On Windows, this is %APPDATA%/gcloud/application_default_credentials.json. -// On other systems, $HOME/.config/gcloud/application_default_credentials.json. -// 3. On Google App Engine it uses the appengine.AccessToken function. -// 4. On Google Compute Engine and Google App Engine Managed VMs, it fetches -// credentials from the metadata server. -// (In this final case any provided scopes are ignored.) -// -// For more details, see: -// https://developers.google.com/accounts/docs/application-default-credentials -// -func DefaultTokenSource(ctx context.Context, scope ...string) (oauth2.TokenSource, error) { - // First, try the environment variable. - const envVar = "GOOGLE_APPLICATION_CREDENTIALS" - if filename := os.Getenv(envVar); filename != "" { - ts, err := tokenSourceFromFile(ctx, filename, scope) - if err != nil { - return nil, fmt.Errorf("google: error getting credentials using %v environment variable: %v", envVar, err) - } - return ts, nil - } - - // Second, try a well-known file. - filename := wellKnownFile() - _, err := os.Stat(filename) - if err == nil { - ts, err2 := tokenSourceFromFile(ctx, filename, scope) - if err2 == nil { - return ts, nil - } - err = err2 - } else if os.IsNotExist(err) { - err = nil // ignore this error - } - if err != nil { - return nil, fmt.Errorf("google: error getting credentials using well-known file (%v): %v", filename, err) - } - - // Third, if we're on Google App Engine use those credentials. - if appengineTokenFunc != nil && !appengineVM { - return AppEngineTokenSource(ctx, scope...), nil - } - - // Fourth, if we're on Google Compute Engine use the metadata server. - if metadata.OnGCE() { - return ComputeTokenSource(""), nil - } - - // None are found; return helpful error. - const url = "https://developers.google.com/accounts/docs/application-default-credentials" - return nil, fmt.Errorf("google: could not find default credentials. See %v for more information.", url) -} - -func wellKnownFile() string { - const f = "application_default_credentials.json" - if runtime.GOOS == "windows" { - return filepath.Join(os.Getenv("APPDATA"), "gcloud", f) - } - return filepath.Join(guessUnixHomeDir(), ".config", "gcloud", f) -} - -func tokenSourceFromFile(ctx context.Context, filename string, scopes []string) (oauth2.TokenSource, error) { - b, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - var d struct { - // Common fields - Type string - ClientID string `json:"client_id"` - - // User Credential fields - ClientSecret string `json:"client_secret"` - RefreshToken string `json:"refresh_token"` - - // Service Account fields - ClientEmail string `json:"client_email"` - PrivateKeyID string `json:"private_key_id"` - PrivateKey string `json:"private_key"` - } - if err := json.Unmarshal(b, &d); err != nil { - return nil, err - } - switch d.Type { - case "authorized_user": - cfg := &oauth2.Config{ - ClientID: d.ClientID, - ClientSecret: d.ClientSecret, - Scopes: append([]string{}, scopes...), // copy - Endpoint: Endpoint, - } - tok := &oauth2.Token{RefreshToken: d.RefreshToken} - return cfg.TokenSource(ctx, tok), nil - case "service_account": - cfg := &jwt.Config{ - Email: d.ClientEmail, - PrivateKey: []byte(d.PrivateKey), - Scopes: append([]string{}, scopes...), // copy - TokenURL: JWTTokenURL, - } - return cfg.TokenSource(ctx), nil - case "": - return nil, errors.New("missing 'type' field in credentials") - default: - return nil, fmt.Errorf("unknown credential type: %q", d.Type) - } -} diff --git a/vendor/golang.org/x/oauth2/google/example_test.go b/vendor/golang.org/x/oauth2/google/example_test.go deleted file mode 100644 index 9745be19..00000000 --- a/vendor/golang.org/x/oauth2/google/example_test.go +++ /dev/null @@ -1,150 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build appenginevm !appengine - -package google_test - -import ( - "fmt" - "io/ioutil" - "log" - "net/http" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/google" - "golang.org/x/oauth2/jwt" - "google.golang.org/appengine" - "google.golang.org/appengine/urlfetch" -) - -func ExampleDefaultClient() { - client, err := google.DefaultClient(oauth2.NoContext, - "https://www.googleapis.com/auth/devstorage.full_control") - if err != nil { - log.Fatal(err) - } - client.Get("...") -} - -func Example_webServer() { - // Your credentials should be obtained from the Google - // Developer Console (https://console.developers.google.com). - conf := &oauth2.Config{ - ClientID: "YOUR_CLIENT_ID", - ClientSecret: "YOUR_CLIENT_SECRET", - RedirectURL: "YOUR_REDIRECT_URL", - Scopes: []string{ - "https://www.googleapis.com/auth/bigquery", - "https://www.googleapis.com/auth/blogger", - }, - Endpoint: google.Endpoint, - } - // Redirect user to Google's consent page to ask for permission - // for the scopes specified above. - url := conf.AuthCodeURL("state") - fmt.Printf("Visit the URL for the auth dialog: %v", url) - - // Handle the exchange code to initiate a transport. - tok, err := conf.Exchange(oauth2.NoContext, "authorization-code") - if err != nil { - log.Fatal(err) - } - client := conf.Client(oauth2.NoContext, tok) - client.Get("...") -} - -func ExampleJWTConfigFromJSON() { - // Your credentials should be obtained from the Google - // Developer Console (https://console.developers.google.com). - // Navigate to your project, then see the "Credentials" page - // under "APIs & Auth". - // To create a service account client, click "Create new Client ID", - // select "Service Account", and click "Create Client ID". A JSON - // key file will then be downloaded to your computer. - data, err := ioutil.ReadFile("/path/to/your-project-key.json") - if err != nil { - log.Fatal(err) - } - conf, err := google.JWTConfigFromJSON(data, "https://www.googleapis.com/auth/bigquery") - if err != nil { - log.Fatal(err) - } - // Initiate an http.Client. The following GET request will be - // authorized and authenticated on the behalf of - // your service account. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} - -func ExampleSDKConfig() { - // The credentials will be obtained from the first account that - // has been authorized with `gcloud auth login`. - conf, err := google.NewSDKConfig("") - if err != nil { - log.Fatal(err) - } - // Initiate an http.Client. The following GET request will be - // authorized and authenticated on the behalf of the SDK user. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} - -func Example_serviceAccount() { - // Your credentials should be obtained from the Google - // Developer Console (https://console.developers.google.com). - conf := &jwt.Config{ - Email: "xxx@developer.gserviceaccount.com", - // The contents of your RSA private key or your PEM file - // that contains a private key. - // If you have a p12 file instead, you - // can use `openssl` to export the private key into a pem file. - // - // $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes - // - // The field only supports PEM containers with no passphrase. - // The openssl command will convert p12 keys to passphrase-less PEM containers. - PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----..."), - Scopes: []string{ - "https://www.googleapis.com/auth/bigquery", - "https://www.googleapis.com/auth/blogger", - }, - TokenURL: google.JWTTokenURL, - // If you would like to impersonate a user, you can - // create a transport with a subject. The following GET - // request will be made on the behalf of user@example.com. - // Optional. - Subject: "user@example.com", - } - // Initiate an http.Client, the following GET request will be - // authorized and authenticated on the behalf of user@example.com. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} - -func ExampleAppEngineTokenSource() { - var req *http.Request // from the ServeHTTP handler - ctx := appengine.NewContext(req) - client := &http.Client{ - Transport: &oauth2.Transport{ - Source: google.AppEngineTokenSource(ctx, "https://www.googleapis.com/auth/bigquery"), - Base: &urlfetch.Transport{ - Context: ctx, - }, - }, - } - client.Get("...") -} - -func ExampleComputeTokenSource() { - client := &http.Client{ - Transport: &oauth2.Transport{ - // Fetch from Google Compute Engine's metadata server to retrieve - // an access token for the provided account. - // If no account is specified, "default" is used. - Source: google.ComputeTokenSource(""), - }, - } - client.Get("...") -} diff --git a/vendor/golang.org/x/oauth2/google/google.go b/vendor/golang.org/x/oauth2/google/google.go deleted file mode 100644 index 464c75aa..00000000 --- a/vendor/golang.org/x/oauth2/google/google.go +++ /dev/null @@ -1,146 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package google provides support for making OAuth2 authorized and -// authenticated HTTP requests to Google APIs. -// It supports the Web server flow, client-side credentials, service accounts, -// Google Compute Engine service accounts, and Google App Engine service -// accounts. -// -// For more information, please read -// https://developers.google.com/accounts/docs/OAuth2 -// and -// https://developers.google.com/accounts/docs/application-default-credentials. -package google // import "golang.org/x/oauth2/google" - -import ( - "encoding/json" - "errors" - "fmt" - "strings" - "time" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/jwt" - "google.golang.org/cloud/compute/metadata" -) - -// Endpoint is Google's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://accounts.google.com/o/oauth2/auth", - TokenURL: "https://accounts.google.com/o/oauth2/token", -} - -// JWTTokenURL is Google's OAuth 2.0 token URL to use with the JWT flow. -const JWTTokenURL = "https://accounts.google.com/o/oauth2/token" - -// ConfigFromJSON uses a Google Developers Console client_credentials.json -// file to construct a config. -// client_credentials.json can be downloaded from -// https://console.developers.google.com, under "Credentials". Download the Web -// application credentials in the JSON format and provide the contents of the -// file as jsonKey. -func ConfigFromJSON(jsonKey []byte, scope ...string) (*oauth2.Config, error) { - type cred struct { - ClientID string `json:"client_id"` - ClientSecret string `json:"client_secret"` - RedirectURIs []string `json:"redirect_uris"` - AuthURI string `json:"auth_uri"` - TokenURI string `json:"token_uri"` - } - var j struct { - Web *cred `json:"web"` - Installed *cred `json:"installed"` - } - if err := json.Unmarshal(jsonKey, &j); err != nil { - return nil, err - } - var c *cred - switch { - case j.Web != nil: - c = j.Web - case j.Installed != nil: - c = j.Installed - default: - return nil, fmt.Errorf("oauth2/google: no credentials found") - } - if len(c.RedirectURIs) < 1 { - return nil, errors.New("oauth2/google: missing redirect URL in the client_credentials.json") - } - return &oauth2.Config{ - ClientID: c.ClientID, - ClientSecret: c.ClientSecret, - RedirectURL: c.RedirectURIs[0], - Scopes: scope, - Endpoint: oauth2.Endpoint{ - AuthURL: c.AuthURI, - TokenURL: c.TokenURI, - }, - }, nil -} - -// JWTConfigFromJSON uses a Google Developers service account JSON key file to read -// the credentials that authorize and authenticate the requests. -// Create a service account on "Credentials" for your project at -// https://console.developers.google.com to download a JSON key file. -func JWTConfigFromJSON(jsonKey []byte, scope ...string) (*jwt.Config, error) { - var key struct { - Email string `json:"client_email"` - PrivateKey string `json:"private_key"` - } - if err := json.Unmarshal(jsonKey, &key); err != nil { - return nil, err - } - return &jwt.Config{ - Email: key.Email, - PrivateKey: []byte(key.PrivateKey), - Scopes: scope, - TokenURL: JWTTokenURL, - }, nil -} - -// ComputeTokenSource returns a token source that fetches access tokens -// from Google Compute Engine (GCE)'s metadata server. It's only valid to use -// this token source if your program is running on a GCE instance. -// If no account is specified, "default" is used. -// Further information about retrieving access tokens from the GCE metadata -// server can be found at https://cloud.google.com/compute/docs/authentication. -func ComputeTokenSource(account string) oauth2.TokenSource { - return oauth2.ReuseTokenSource(nil, computeSource{account: account}) -} - -type computeSource struct { - account string -} - -func (cs computeSource) Token() (*oauth2.Token, error) { - if !metadata.OnGCE() { - return nil, errors.New("oauth2/google: can't get a token from the metadata service; not running on GCE") - } - acct := cs.account - if acct == "" { - acct = "default" - } - tokenJSON, err := metadata.Get("instance/service-accounts/" + acct + "/token") - if err != nil { - return nil, err - } - var res struct { - AccessToken string `json:"access_token"` - ExpiresInSec int `json:"expires_in"` - TokenType string `json:"token_type"` - } - err = json.NewDecoder(strings.NewReader(tokenJSON)).Decode(&res) - if err != nil { - return nil, fmt.Errorf("oauth2/google: invalid token JSON from metadata: %v", err) - } - if res.ExpiresInSec == 0 || res.AccessToken == "" { - return nil, fmt.Errorf("oauth2/google: incomplete token received from metadata") - } - return &oauth2.Token{ - AccessToken: res.AccessToken, - TokenType: res.TokenType, - Expiry: time.Now().Add(time.Duration(res.ExpiresInSec) * time.Second), - }, nil -} diff --git a/vendor/golang.org/x/oauth2/google/google_test.go b/vendor/golang.org/x/oauth2/google/google_test.go deleted file mode 100644 index 74080ede..00000000 --- a/vendor/golang.org/x/oauth2/google/google_test.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "strings" - "testing" -) - -var webJSONKey = []byte(` -{ - "web": { - "auth_uri": "https://google.com/o/oauth2/auth", - "client_secret": "3Oknc4jS_wA2r9i", - "token_uri": "https://google.com/o/oauth2/token", - "client_email": "222-nprqovg5k43uum874cs9osjt2koe97g8@developer.gserviceaccount.com", - "redirect_uris": ["https://www.example.com/oauth2callback"], - "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/222-nprqovg5k43uum874cs9osjt2koe97g8@developer.gserviceaccount.com", - "client_id": "222-nprqovg5k43uum874cs9osjt2koe97g8.apps.googleusercontent.com", - "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", - "javascript_origins": ["https://www.example.com"] - } -}`) - -var installedJSONKey = []byte(`{ - "installed": { - "client_id": "222-installed.apps.googleusercontent.com", - "redirect_uris": ["https://www.example.com/oauth2callback"] - } -}`) - -func TestConfigFromJSON(t *testing.T) { - conf, err := ConfigFromJSON(webJSONKey, "scope1", "scope2") - if err != nil { - t.Error(err) - } - if got, want := conf.ClientID, "222-nprqovg5k43uum874cs9osjt2koe97g8.apps.googleusercontent.com"; got != want { - t.Errorf("ClientID = %q; want %q", got, want) - } - if got, want := conf.ClientSecret, "3Oknc4jS_wA2r9i"; got != want { - t.Errorf("ClientSecret = %q; want %q", got, want) - } - if got, want := conf.RedirectURL, "https://www.example.com/oauth2callback"; got != want { - t.Errorf("RedictURL = %q; want %q", got, want) - } - if got, want := strings.Join(conf.Scopes, ","), "scope1,scope2"; got != want { - t.Errorf("Scopes = %q; want %q", got, want) - } - if got, want := conf.Endpoint.AuthURL, "https://google.com/o/oauth2/auth"; got != want { - t.Errorf("AuthURL = %q; want %q", got, want) - } - if got, want := conf.Endpoint.TokenURL, "https://google.com/o/oauth2/token"; got != want { - t.Errorf("TokenURL = %q; want %q", got, want) - } -} - -func TestConfigFromJSON_Installed(t *testing.T) { - conf, err := ConfigFromJSON(installedJSONKey) - if err != nil { - t.Error(err) - } - if got, want := conf.ClientID, "222-installed.apps.googleusercontent.com"; got != want { - t.Errorf("ClientID = %q; want %q", got, want) - } -} diff --git a/vendor/golang.org/x/oauth2/google/jwt.go b/vendor/golang.org/x/oauth2/google/jwt.go deleted file mode 100644 index b9199178..00000000 --- a/vendor/golang.org/x/oauth2/google/jwt.go +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "crypto/rsa" - "fmt" - "time" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" - "golang.org/x/oauth2/jws" -) - -// JWTAccessTokenSourceFromJSON uses a Google Developers service account JSON -// key file to read the credentials that authorize and authenticate the -// requests, and returns a TokenSource that does not use any OAuth2 flow but -// instead creates a JWT and sends that as the access token. -// The audience is typically a URL that specifies the scope of the credentials. -// -// Note that this is not a standard OAuth flow, but rather an -// optimization supported by a few Google services. -// Unless you know otherwise, you should use JWTConfigFromJSON instead. -func JWTAccessTokenSourceFromJSON(jsonKey []byte, audience string) (oauth2.TokenSource, error) { - cfg, err := JWTConfigFromJSON(jsonKey) - if err != nil { - return nil, fmt.Errorf("google: could not parse JSON key: %v", err) - } - pk, err := internal.ParseKey(cfg.PrivateKey) - if err != nil { - return nil, fmt.Errorf("google: could not parse key: %v", err) - } - ts := &jwtAccessTokenSource{ - email: cfg.Email, - audience: audience, - pk: pk, - } - tok, err := ts.Token() - if err != nil { - return nil, err - } - return oauth2.ReuseTokenSource(tok, ts), nil -} - -type jwtAccessTokenSource struct { - email, audience string - pk *rsa.PrivateKey -} - -func (ts *jwtAccessTokenSource) Token() (*oauth2.Token, error) { - iat := time.Now() - exp := iat.Add(time.Hour) - cs := &jws.ClaimSet{ - Iss: ts.email, - Sub: ts.email, - Aud: ts.audience, - Iat: iat.Unix(), - Exp: exp.Unix(), - } - hdr := &jws.Header{ - Algorithm: "RS256", - Typ: "JWT", - } - msg, err := jws.Encode(hdr, cs, ts.pk) - if err != nil { - return nil, fmt.Errorf("google: could not encode JWT: %v", err) - } - return &oauth2.Token{AccessToken: msg, TokenType: "Bearer", Expiry: exp}, nil -} diff --git a/vendor/golang.org/x/oauth2/google/sdk.go b/vendor/golang.org/x/oauth2/google/sdk.go deleted file mode 100644 index d29a3bb9..00000000 --- a/vendor/golang.org/x/oauth2/google/sdk.go +++ /dev/null @@ -1,168 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import ( - "encoding/json" - "errors" - "fmt" - "net/http" - "os" - "os/user" - "path/filepath" - "runtime" - "strings" - "time" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" -) - -type sdkCredentials struct { - Data []struct { - Credential struct { - ClientID string `json:"client_id"` - ClientSecret string `json:"client_secret"` - AccessToken string `json:"access_token"` - RefreshToken string `json:"refresh_token"` - TokenExpiry *time.Time `json:"token_expiry"` - } `json:"credential"` - Key struct { - Account string `json:"account"` - Scope string `json:"scope"` - } `json:"key"` - } -} - -// An SDKConfig provides access to tokens from an account already -// authorized via the Google Cloud SDK. -type SDKConfig struct { - conf oauth2.Config - initialToken *oauth2.Token -} - -// NewSDKConfig creates an SDKConfig for the given Google Cloud SDK -// account. If account is empty, the account currently active in -// Google Cloud SDK properties is used. -// Google Cloud SDK credentials must be created by running `gcloud auth` -// before using this function. -// The Google Cloud SDK is available at https://cloud.google.com/sdk/. -func NewSDKConfig(account string) (*SDKConfig, error) { - configPath, err := sdkConfigPath() - if err != nil { - return nil, fmt.Errorf("oauth2/google: error getting SDK config path: %v", err) - } - credentialsPath := filepath.Join(configPath, "credentials") - f, err := os.Open(credentialsPath) - if err != nil { - return nil, fmt.Errorf("oauth2/google: failed to load SDK credentials: %v", err) - } - defer f.Close() - - var c sdkCredentials - if err := json.NewDecoder(f).Decode(&c); err != nil { - return nil, fmt.Errorf("oauth2/google: failed to decode SDK credentials from %q: %v", credentialsPath, err) - } - if len(c.Data) == 0 { - return nil, fmt.Errorf("oauth2/google: no credentials found in %q, run `gcloud auth login` to create one", credentialsPath) - } - if account == "" { - propertiesPath := filepath.Join(configPath, "properties") - f, err := os.Open(propertiesPath) - if err != nil { - return nil, fmt.Errorf("oauth2/google: failed to load SDK properties: %v", err) - } - defer f.Close() - ini, err := internal.ParseINI(f) - if err != nil { - return nil, fmt.Errorf("oauth2/google: failed to parse SDK properties %q: %v", propertiesPath, err) - } - core, ok := ini["core"] - if !ok { - return nil, fmt.Errorf("oauth2/google: failed to find [core] section in %v", ini) - } - active, ok := core["account"] - if !ok { - return nil, fmt.Errorf("oauth2/google: failed to find %q attribute in %v", "account", core) - } - account = active - } - - for _, d := range c.Data { - if account == "" || d.Key.Account == account { - if d.Credential.AccessToken == "" && d.Credential.RefreshToken == "" { - return nil, fmt.Errorf("oauth2/google: no token available for account %q", account) - } - var expiry time.Time - if d.Credential.TokenExpiry != nil { - expiry = *d.Credential.TokenExpiry - } - return &SDKConfig{ - conf: oauth2.Config{ - ClientID: d.Credential.ClientID, - ClientSecret: d.Credential.ClientSecret, - Scopes: strings.Split(d.Key.Scope, " "), - Endpoint: Endpoint, - RedirectURL: "oob", - }, - initialToken: &oauth2.Token{ - AccessToken: d.Credential.AccessToken, - RefreshToken: d.Credential.RefreshToken, - Expiry: expiry, - }, - }, nil - } - } - return nil, fmt.Errorf("oauth2/google: no such credentials for account %q", account) -} - -// Client returns an HTTP client using Google Cloud SDK credentials to -// authorize requests. The token will auto-refresh as necessary. The -// underlying http.RoundTripper will be obtained using the provided -// context. The returned client and its Transport should not be -// modified. -func (c *SDKConfig) Client(ctx context.Context) *http.Client { - return &http.Client{ - Transport: &oauth2.Transport{ - Source: c.TokenSource(ctx), - }, - } -} - -// TokenSource returns an oauth2.TokenSource that retrieve tokens from -// Google Cloud SDK credentials using the provided context. -// It will returns the current access token stored in the credentials, -// and refresh it when it expires, but it won't update the credentials -// with the new access token. -func (c *SDKConfig) TokenSource(ctx context.Context) oauth2.TokenSource { - return c.conf.TokenSource(ctx, c.initialToken) -} - -// Scopes are the OAuth 2.0 scopes the current account is authorized for. -func (c *SDKConfig) Scopes() []string { - return c.conf.Scopes -} - -// sdkConfigPath tries to guess where the gcloud config is located. -// It can be overridden during tests. -var sdkConfigPath = func() (string, error) { - if runtime.GOOS == "windows" { - return filepath.Join(os.Getenv("APPDATA"), "gcloud"), nil - } - homeDir := guessUnixHomeDir() - if homeDir == "" { - return "", errors.New("unable to get current user home directory: os/user lookup failed; $HOME is empty") - } - return filepath.Join(homeDir, ".config", "gcloud"), nil -} - -func guessUnixHomeDir() string { - usr, err := user.Current() - if err == nil { - return usr.HomeDir - } - return os.Getenv("HOME") -} diff --git a/vendor/golang.org/x/oauth2/google/sdk_test.go b/vendor/golang.org/x/oauth2/google/sdk_test.go deleted file mode 100644 index a5aa2a64..00000000 --- a/vendor/golang.org/x/oauth2/google/sdk_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package google - -import "testing" - -func TestSDKConfig(t *testing.T) { - sdkConfigPath = func() (string, error) { - return "testdata/gcloud", nil - } - - tests := []struct { - account string - accessToken string - err bool - }{ - {"", "bar_access_token", false}, - {"foo@example.com", "foo_access_token", false}, - {"bar@example.com", "bar_access_token", false}, - {"baz@serviceaccount.example.com", "", true}, - } - for _, tt := range tests { - c, err := NewSDKConfig(tt.account) - if got, want := err != nil, tt.err; got != want { - if !tt.err { - t.Errorf("expected no error, got error: %v", tt.err, err) - } else { - t.Errorf("expected error, got none") - } - continue - } - if err != nil { - continue - } - tok := c.initialToken - if tok == nil { - t.Errorf("expected token %q, got: nil", tt.accessToken) - continue - } - if tok.AccessToken != tt.accessToken { - t.Errorf("expected token %q, got: %q", tt.accessToken, tok.AccessToken) - } - } -} diff --git a/vendor/golang.org/x/oauth2/google/testdata/gcloud/credentials b/vendor/golang.org/x/oauth2/google/testdata/gcloud/credentials deleted file mode 100644 index ff5eefbd..00000000 --- a/vendor/golang.org/x/oauth2/google/testdata/gcloud/credentials +++ /dev/null @@ -1,122 +0,0 @@ -{ - "data": [ - { - "credential": { - "_class": "OAuth2Credentials", - "_module": "oauth2client.client", - "access_token": "foo_access_token", - "client_id": "foo_client_id", - "client_secret": "foo_client_secret", - "id_token": { - "at_hash": "foo_at_hash", - "aud": "foo_aud", - "azp": "foo_azp", - "cid": "foo_cid", - "email": "foo@example.com", - "email_verified": true, - "exp": 1420573614, - "iat": 1420569714, - "id": "1337", - "iss": "accounts.google.com", - "sub": "1337", - "token_hash": "foo_token_hash", - "verified_email": true - }, - "invalid": false, - "refresh_token": "foo_refresh_token", - "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "token_expiry": "2015-01-09T00:51:51Z", - "token_response": { - "access_token": "foo_access_token", - "expires_in": 3600, - "id_token": "foo_id_token", - "token_type": "Bearer" - }, - "token_uri": "https://accounts.google.com/o/oauth2/token", - "user_agent": "Cloud SDK Command Line Tool" - }, - "key": { - "account": "foo@example.com", - "clientId": "foo_client_id", - "scope": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "type": "google-cloud-sdk" - } - }, - { - "credential": { - "_class": "OAuth2Credentials", - "_module": "oauth2client.client", - "access_token": "bar_access_token", - "client_id": "bar_client_id", - "client_secret": "bar_client_secret", - "id_token": { - "at_hash": "bar_at_hash", - "aud": "bar_aud", - "azp": "bar_azp", - "cid": "bar_cid", - "email": "bar@example.com", - "email_verified": true, - "exp": 1420573614, - "iat": 1420569714, - "id": "1337", - "iss": "accounts.google.com", - "sub": "1337", - "token_hash": "bar_token_hash", - "verified_email": true - }, - "invalid": false, - "refresh_token": "bar_refresh_token", - "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "token_expiry": "2015-01-09T00:51:51Z", - "token_response": { - "access_token": "bar_access_token", - "expires_in": 3600, - "id_token": "bar_id_token", - "token_type": "Bearer" - }, - "token_uri": "https://accounts.google.com/o/oauth2/token", - "user_agent": "Cloud SDK Command Line Tool" - }, - "key": { - "account": "bar@example.com", - "clientId": "bar_client_id", - "scope": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "type": "google-cloud-sdk" - } - }, - { - "credential": { - "_class": "ServiceAccountCredentials", - "_kwargs": {}, - "_module": "oauth2client.client", - "_private_key_id": "00000000000000000000000000000000", - "_private_key_pkcs8_text": "-----BEGIN RSA PRIVATE KEY-----\nMIICWwIBAAKBgQCt3fpiynPSaUhWSIKMGV331zudwJ6GkGmvQtwsoK2S2LbvnSwU\nNxgj4fp08kIDR5p26wF4+t/HrKydMwzftXBfZ9UmLVJgRdSswmS5SmChCrfDS5OE\nvFFcN5+6w1w8/Nu657PF/dse8T0bV95YrqyoR0Osy8WHrUOMSIIbC3hRuwIDAQAB\nAoGAJrGE/KFjn0sQ7yrZ6sXmdLawrM3mObo/2uI9T60+k7SpGbBX0/Pi6nFrJMWZ\nTVONG7P3Mu5aCPzzuVRYJB0j8aldSfzABTY3HKoWCczqw1OztJiEseXGiYz4QOyr\nYU3qDyEpdhS6q6wcoLKGH+hqRmz6pcSEsc8XzOOu7s4xW8kCQQDkc75HjhbarCnd\nJJGMe3U76+6UGmdK67ltZj6k6xoB5WbTNChY9TAyI2JC+ppYV89zv3ssj4L+02u3\nHIHFGxsHAkEAwtU1qYb1tScpchPobnYUFiVKJ7KA8EZaHVaJJODW/cghTCV7BxcJ\nbgVvlmk4lFKn3lPKAgWw7PdQsBTVBUcCrQJATPwoIirizrv3u5soJUQxZIkENAqV\nxmybZx9uetrzP7JTrVbFRf0SScMcyN90hdLJiQL8+i4+gaszgFht7sNMnwJAAbfj\nq0UXcauQwALQ7/h2oONfTg5S+MuGC/AxcXPSMZbMRGGoPh3D5YaCv27aIuS/ukQ+\n6dmm/9AGlCb64fsIWQJAPaokbjIifo+LwC5gyK73Mc4t8nAOSZDenzd/2f6TCq76\nS1dcnKiPxaED7W/y6LJiuBT2rbZiQ2L93NJpFZD/UA==\n-----END RSA PRIVATE KEY-----\n", - "_revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "_scopes": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "_service_account_email": "baz@serviceaccount.example.com", - "_service_account_id": "baz.serviceaccount.example.com", - "_token_uri": "https://accounts.google.com/o/oauth2/token", - "_user_agent": "Cloud SDK Command Line Tool", - "access_token": null, - "assertion_type": null, - "client_id": null, - "client_secret": null, - "id_token": null, - "invalid": false, - "refresh_token": null, - "revoke_uri": "https://accounts.google.com/o/oauth2/revoke", - "service_account_name": "baz@serviceaccount.example.com", - "token_expiry": null, - "token_response": null, - "user_agent": "Cloud SDK Command Line Tool" - }, - "key": { - "account": "baz@serviceaccount.example.com", - "clientId": "baz_client_id", - "scope": "https://www.googleapis.com/auth/appengine.admin https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/compute https://www.googleapis.com/auth/devstorage.full_control https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/ndev.cloudman https://www.googleapis.com/auth/cloud-platform https://www.googleapis.com/auth/sqlservice.admin https://www.googleapis.com/auth/prediction https://www.googleapis.com/auth/projecthosting", - "type": "google-cloud-sdk" - } - } - ], - "file_version": 1 -} diff --git a/vendor/golang.org/x/oauth2/google/testdata/gcloud/properties b/vendor/golang.org/x/oauth2/google/testdata/gcloud/properties deleted file mode 100644 index 025de886..00000000 --- a/vendor/golang.org/x/oauth2/google/testdata/gcloud/properties +++ /dev/null @@ -1,2 +0,0 @@ -[core] -account = bar@example.com \ No newline at end of file diff --git a/vendor/golang.org/x/oauth2/hipchat/hipchat.go b/vendor/golang.org/x/oauth2/hipchat/hipchat.go deleted file mode 100644 index 594fe072..00000000 --- a/vendor/golang.org/x/oauth2/hipchat/hipchat.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package hipchat provides constants for using OAuth2 to access HipChat. -package hipchat // import "golang.org/x/oauth2/hipchat" - -import ( - "encoding/json" - "errors" - - "golang.org/x/oauth2" - "golang.org/x/oauth2/clientcredentials" -) - -// Endpoint is HipChat's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.hipchat.com/users/authorize", - TokenURL: "https://api.hipchat.com/v2/oauth/token", -} - -// ServerEndpoint returns a new oauth2.Endpoint for a HipChat Server instance -// running on the given domain or host. -func ServerEndpoint(host string) oauth2.Endpoint { - return oauth2.Endpoint{ - AuthURL: "https://" + host + "/users/authorize", - TokenURL: "https://" + host + "/v2/oauth/token", - } -} - -// ClientCredentialsConfigFromCaps generates a Config from a HipChat API -// capabilities descriptor. It does not verify the scopes against the -// capabilities document at this time. -// -// For more information see: https://www.hipchat.com/docs/apiv2/method/get_capabilities -func ClientCredentialsConfigFromCaps(capsJSON []byte, clientID, clientSecret string, scopes ...string) (*clientcredentials.Config, error) { - var caps struct { - Caps struct { - Endpoint struct { - TokenURL string `json:"tokenUrl"` - } `json:"oauth2Provider"` - } `json:"capabilities"` - } - - if err := json.Unmarshal(capsJSON, &caps); err != nil { - return nil, err - } - - // Verify required fields. - if caps.Caps.Endpoint.TokenURL == "" { - return nil, errors.New("oauth2/hipchat: missing OAuth2 token URL in the capabilities descriptor JSON") - } - - return &clientcredentials.Config{ - ClientID: clientID, - ClientSecret: clientSecret, - Scopes: scopes, - TokenURL: caps.Caps.Endpoint.TokenURL, - }, nil -} diff --git a/vendor/golang.org/x/oauth2/internal/client_appengine.go b/vendor/golang.org/x/oauth2/internal/client_appengine.go new file mode 100644 index 00000000..74348718 --- /dev/null +++ b/vendor/golang.org/x/oauth2/internal/client_appengine.go @@ -0,0 +1,13 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import "google.golang.org/appengine/urlfetch" + +func init() { + appengineClientHook = urlfetch.Client +} diff --git a/vendor/golang.org/x/oauth2/internal/doc.go b/vendor/golang.org/x/oauth2/internal/doc.go new file mode 100644 index 00000000..03265e88 --- /dev/null +++ b/vendor/golang.org/x/oauth2/internal/doc.go @@ -0,0 +1,6 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package internal contains support packages for oauth2 package. +package internal diff --git a/vendor/golang.org/x/oauth2/internal/oauth2.go b/vendor/golang.org/x/oauth2/internal/oauth2.go index fbe1028d..fc63fcab 100644 --- a/vendor/golang.org/x/oauth2/internal/oauth2.go +++ b/vendor/golang.org/x/oauth2/internal/oauth2.go @@ -2,18 +2,14 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package internal contains support packages for oauth2 package. package internal import ( - "bufio" "crypto/rsa" "crypto/x509" "encoding/pem" "errors" "fmt" - "io" - "strings" ) // ParseKey converts the binary contents of a private key file @@ -39,38 +35,3 @@ func ParseKey(key []byte) (*rsa.PrivateKey, error) { } return parsed, nil } - -func ParseINI(ini io.Reader) (map[string]map[string]string, error) { - result := map[string]map[string]string{ - "": map[string]string{}, // root section - } - scanner := bufio.NewScanner(ini) - currentSection := "" - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if strings.HasPrefix(line, ";") { - // comment. - continue - } - if strings.HasPrefix(line, "[") && strings.HasSuffix(line, "]") { - currentSection = strings.TrimSpace(line[1 : len(line)-1]) - result[currentSection] = map[string]string{} - continue - } - parts := strings.SplitN(line, "=", 2) - if len(parts) == 2 && parts[0] != "" { - result[currentSection][strings.TrimSpace(parts[0])] = strings.TrimSpace(parts[1]) - } - } - if err := scanner.Err(); err != nil { - return nil, fmt.Errorf("error scanning ini: %v", err) - } - return result, nil -} - -func CondVal(v string) []string { - if v == "" { - return nil - } - return []string{v} -} diff --git a/vendor/golang.org/x/oauth2/internal/oauth2_test.go b/vendor/golang.org/x/oauth2/internal/oauth2_test.go deleted file mode 100644 index c6158554..00000000 --- a/vendor/golang.org/x/oauth2/internal/oauth2_test.go +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package internal contains support packages for oauth2 package. -package internal - -import ( - "reflect" - "strings" - "testing" -) - -func TestParseINI(t *testing.T) { - tests := []struct { - ini string - want map[string]map[string]string - }{ - { - `root = toor -[foo] -bar = hop -ini = nin -`, - map[string]map[string]string{ - "": map[string]string{"root": "toor"}, - "foo": map[string]string{"bar": "hop", "ini": "nin"}, - }, - }, - { - `[empty] -[section] -empty= -`, - map[string]map[string]string{ - "": map[string]string{}, - "empty": map[string]string{}, - "section": map[string]string{"empty": ""}, - }, - }, - { - `ignore -[invalid -=stuff -;comment=true -`, - map[string]map[string]string{ - "": map[string]string{}, - }, - }, - } - for _, tt := range tests { - result, err := ParseINI(strings.NewReader(tt.ini)) - if err != nil { - t.Errorf("ParseINI(%q) error %v, want: no error", tt.ini, err) - continue - } - if !reflect.DeepEqual(result, tt.want) { - t.Errorf("ParseINI(%q) = %#v, want: %#v", tt.ini, result, tt.want) - } - } -} diff --git a/vendor/golang.org/x/oauth2/internal/token.go b/vendor/golang.org/x/oauth2/internal/token.go index a6ed3cc7..7d61117a 100644 --- a/vendor/golang.org/x/oauth2/internal/token.go +++ b/vendor/golang.org/x/oauth2/internal/token.go @@ -2,11 +2,11 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package internal contains support packages for oauth2 package. package internal import ( "encoding/json" + "errors" "fmt" "io" "io/ioutil" @@ -18,9 +18,10 @@ import ( "time" "golang.org/x/net/context" + "golang.org/x/net/context/ctxhttp" ) -// Token represents the crendentials used to authorize +// Token represents the credentials used to authorize // the requests to access protected resources on the OAuth 2.0 // provider's backend. // @@ -91,6 +92,7 @@ func (e *expirationTime) UnmarshalJSON(b []byte) error { var brokenAuthHeaderProviders = []string{ "https://accounts.google.com/", + "https://api.codeswholesale.com/oauth/token", "https://api.dropbox.com/", "https://api.dropboxapi.com/", "https://api.instagram.com/", @@ -101,8 +103,11 @@ var brokenAuthHeaderProviders = []string{ "https://api.twitch.tv/", "https://app.box.com/", "https://connect.stripe.com/", + "https://graph.facebook.com", // see https://github.com/golang/oauth2/issues/214 "https://login.microsoftonline.com/", "https://login.salesforce.com/", + "https://login.windows.net", + "https://login.live.com/", "https://oauth.sandbox.trainingpeaks.com/", "https://oauth.trainingpeaks.com/", "https://oauth.vk.com/", @@ -117,6 +122,19 @@ var brokenAuthHeaderProviders = []string{ "https://www.strava.com/oauth/", "https://www.wunderlist.com/oauth/", "https://api.patreon.com/", + "https://sandbox.codeswholesale.com/oauth/token", + "https://api.sipgate.com/v1/authorization/oauth", + "https://api.medium.com/v1/tokens", + "https://log.finalsurge.com/oauth/token", +} + +// brokenAuthHeaderDomains lists broken providers that issue dynamic endpoints. +var brokenAuthHeaderDomains = []string{ + ".auth0.com", + ".force.com", + ".myshopify.com", + ".okta.com", + ".oktapreview.com", } func RegisterBrokenAuthHeaderProvider(tokenURL string) { @@ -139,6 +157,14 @@ func providerAuthHeaderWorks(tokenURL string) bool { } } + if u, err := url.Parse(tokenURL); err == nil { + for _, s := range brokenAuthHeaderDomains { + if strings.HasSuffix(u.Host, s) { + return false + } + } + } + // Assume the provider implements the spec properly // otherwise. We can add more exceptions as they're // discovered. We will _not_ be adding configurable hooks @@ -146,25 +172,25 @@ func providerAuthHeaderWorks(tokenURL string) bool { return true } -func RetrieveToken(ctx context.Context, ClientID, ClientSecret, TokenURL string, v url.Values) (*Token, error) { - hc, err := ContextClient(ctx) - if err != nil { - return nil, err +func RetrieveToken(ctx context.Context, clientID, clientSecret, tokenURL string, v url.Values) (*Token, error) { + bustedAuth := !providerAuthHeaderWorks(tokenURL) + if bustedAuth { + if clientID != "" { + v.Set("client_id", clientID) + } + if clientSecret != "" { + v.Set("client_secret", clientSecret) + } } - v.Set("client_id", ClientID) - bustedAuth := !providerAuthHeaderWorks(TokenURL) - if bustedAuth && ClientSecret != "" { - v.Set("client_secret", ClientSecret) - } - req, err := http.NewRequest("POST", TokenURL, strings.NewReader(v.Encode())) + req, err := http.NewRequest("POST", tokenURL, strings.NewReader(v.Encode())) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") if !bustedAuth { - req.SetBasicAuth(ClientID, ClientSecret) + req.SetBasicAuth(url.QueryEscape(clientID), url.QueryEscape(clientSecret)) } - r, err := hc.Do(req) + r, err := ctxhttp.Do(ctx, ContextClient(ctx), req) if err != nil { return nil, err } @@ -174,7 +200,10 @@ func RetrieveToken(ctx context.Context, ClientID, ClientSecret, TokenURL string, return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) } if code := r.StatusCode; code < 200 || code > 299 { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v\nResponse: %s", r.Status, body) + return nil, &RetrieveError{ + Response: r, + Body: body, + } } var token *Token @@ -221,5 +250,17 @@ func RetrieveToken(ctx context.Context, ClientID, ClientSecret, TokenURL string, if token.RefreshToken == "" { token.RefreshToken = v.Get("refresh_token") } + if token.AccessToken == "" { + return token, errors.New("oauth2: server response missing access_token") + } return token, nil } + +type RetrieveError struct { + Response *http.Response + Body []byte +} + +func (r *RetrieveError) Error() string { + return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) +} diff --git a/vendor/golang.org/x/oauth2/internal/token_test.go b/vendor/golang.org/x/oauth2/internal/token_test.go deleted file mode 100644 index d8d1e989..00000000 --- a/vendor/golang.org/x/oauth2/internal/token_test.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package internal contains support packages for oauth2 package. -package internal - -import ( - "fmt" - "testing" -) - -func TestRegisterBrokenAuthHeaderProvider(t *testing.T) { - RegisterBrokenAuthHeaderProvider("https://aaa.com/") - tokenURL := "https://aaa.com/token" - if providerAuthHeaderWorks(tokenURL) { - t.Errorf("URL: %s is a broken provider", tokenURL) - } -} - -func Test_providerAuthHeaderWorks(t *testing.T) { - for _, p := range brokenAuthHeaderProviders { - if providerAuthHeaderWorks(p) { - t.Errorf("URL: %s not found in list", p) - } - p := fmt.Sprintf("%ssomesuffix", p) - if providerAuthHeaderWorks(p) { - t.Errorf("URL: %s not found in list", p) - } - } - p := "https://api.not-in-the-list-example.com/" - if !providerAuthHeaderWorks(p) { - t.Errorf("URL: %s found in list", p) - } - -} diff --git a/vendor/golang.org/x/oauth2/internal/transport.go b/vendor/golang.org/x/oauth2/internal/transport.go index f1f173e3..d16f9ae1 100644 --- a/vendor/golang.org/x/oauth2/internal/transport.go +++ b/vendor/golang.org/x/oauth2/internal/transport.go @@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -// Package internal contains support packages for oauth2 package. package internal import ( @@ -20,50 +19,16 @@ var HTTPClient ContextKey // because nobody else can create a ContextKey, being unexported. type ContextKey struct{} -// ContextClientFunc is a func which tries to return an *http.Client -// given a Context value. If it returns an error, the search stops -// with that error. If it returns (nil, nil), the search continues -// down the list of registered funcs. -type ContextClientFunc func(context.Context) (*http.Client, error) +var appengineClientHook func(context.Context) *http.Client -var contextClientFuncs []ContextClientFunc - -func RegisterContextClientFunc(fn ContextClientFunc) { - contextClientFuncs = append(contextClientFuncs, fn) -} - -func ContextClient(ctx context.Context) (*http.Client, error) { +func ContextClient(ctx context.Context) *http.Client { if ctx != nil { if hc, ok := ctx.Value(HTTPClient).(*http.Client); ok { - return hc, nil + return hc } } - for _, fn := range contextClientFuncs { - c, err := fn(ctx) - if err != nil { - return nil, err - } - if c != nil { - return c, nil - } + if appengineClientHook != nil { + return appengineClientHook(ctx) } - return http.DefaultClient, nil -} - -func ContextTransport(ctx context.Context) http.RoundTripper { - hc, err := ContextClient(ctx) - // This is a rare error case (somebody using nil on App Engine). - if err != nil { - return ErrorTransport{err} - } - return hc.Transport -} - -// ErrorTransport returns the specified error on RoundTrip. -// This RoundTripper should be used in rare error cases where -// error handling can be postponed to response handling time. -type ErrorTransport struct{ Err error } - -func (t ErrorTransport) RoundTrip(*http.Request) (*http.Response, error) { - return nil, t.Err + return http.DefaultClient } diff --git a/vendor/golang.org/x/oauth2/internal/transport_test.go b/vendor/golang.org/x/oauth2/internal/transport_test.go deleted file mode 100644 index 8772ec5c..00000000 --- a/vendor/golang.org/x/oauth2/internal/transport_test.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package internal - -import ( - "net/http" - "testing" - - "golang.org/x/net/context" -) - -func TestContextClient(t *testing.T) { - rc := &http.Client{} - RegisterContextClientFunc(func(context.Context) (*http.Client, error) { - return rc, nil - }) - - c := &http.Client{} - ctx := context.WithValue(context.Background(), HTTPClient, c) - - hc, err := ContextClient(ctx) - if err != nil { - t.Fatalf("want valid client; got err = %v", err) - } - if hc != c { - t.Fatalf("want context client = %p; got = %p", c, hc) - } - - hc, err = ContextClient(context.TODO()) - if err != nil { - t.Fatalf("want valid client; got err = %v", err) - } - if hc != rc { - t.Fatalf("want registered client = %p; got = %p", c, hc) - } -} diff --git a/vendor/golang.org/x/oauth2/jws/jws.go b/vendor/golang.org/x/oauth2/jws/jws.go deleted file mode 100644 index 29887ea9..00000000 --- a/vendor/golang.org/x/oauth2/jws/jws.go +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package jws provides encoding and decoding utilities for -// signed JWS messages. -package jws // import "golang.org/x/oauth2/jws" - -import ( - "bytes" - "crypto" - "crypto/rand" - "crypto/rsa" - "crypto/sha256" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - "strings" - "time" -) - -// ClaimSet contains information about the JWT signature including the -// permissions being requested (scopes), the target of the token, the issuer, -// the time the token was issued, and the lifetime of the token. -type ClaimSet struct { - Iss string `json:"iss"` // email address of the client_id of the application making the access token request - Scope string `json:"scope,omitempty"` // space-delimited list of the permissions the application requests - Aud string `json:"aud"` // descriptor of the intended target of the assertion (Optional). - Exp int64 `json:"exp"` // the expiration time of the assertion (seconds since Unix epoch) - Iat int64 `json:"iat"` // the time the assertion was issued (seconds since Unix epoch) - Typ string `json:"typ,omitempty"` // token type (Optional). - - // Email for which the application is requesting delegated access (Optional). - Sub string `json:"sub,omitempty"` - - // The old name of Sub. Client keeps setting Prn to be - // complaint with legacy OAuth 2.0 providers. (Optional) - Prn string `json:"prn,omitempty"` - - // See http://tools.ietf.org/html/draft-jones-json-web-token-10#section-4.3 - // This array is marshalled using custom code (see (c *ClaimSet) encode()). - PrivateClaims map[string]interface{} `json:"-"` -} - -func (c *ClaimSet) encode() (string, error) { - // Reverting time back for machines whose time is not perfectly in sync. - // If client machine's time is in the future according - // to Google servers, an access token will not be issued. - now := time.Now().Add(-10 * time.Second) - if c.Iat == 0 { - c.Iat = now.Unix() - } - if c.Exp == 0 { - c.Exp = now.Add(time.Hour).Unix() - } - if c.Exp < c.Iat { - return "", fmt.Errorf("jws: invalid Exp = %v; must be later than Iat = %v", c.Exp, c.Iat) - } - - b, err := json.Marshal(c) - if err != nil { - return "", err - } - - if len(c.PrivateClaims) == 0 { - return base64Encode(b), nil - } - - // Marshal private claim set and then append it to b. - prv, err := json.Marshal(c.PrivateClaims) - if err != nil { - return "", fmt.Errorf("jws: invalid map of private claims %v", c.PrivateClaims) - } - - // Concatenate public and private claim JSON objects. - if !bytes.HasSuffix(b, []byte{'}'}) { - return "", fmt.Errorf("jws: invalid JSON %s", b) - } - if !bytes.HasPrefix(prv, []byte{'{'}) { - return "", fmt.Errorf("jws: invalid JSON %s", prv) - } - b[len(b)-1] = ',' // Replace closing curly brace with a comma. - b = append(b, prv[1:]...) // Append private claims. - return base64Encode(b), nil -} - -// Header represents the header for the signed JWS payloads. -type Header struct { - // The algorithm used for signature. - Algorithm string `json:"alg"` - - // Represents the token type. - Typ string `json:"typ"` -} - -func (h *Header) encode() (string, error) { - b, err := json.Marshal(h) - if err != nil { - return "", err - } - return base64Encode(b), nil -} - -// Decode decodes a claim set from a JWS payload. -func Decode(payload string) (*ClaimSet, error) { - // decode returned id token to get expiry - s := strings.Split(payload, ".") - if len(s) < 2 { - // TODO(jbd): Provide more context about the error. - return nil, errors.New("jws: invalid token received") - } - decoded, err := base64Decode(s[1]) - if err != nil { - return nil, err - } - c := &ClaimSet{} - err = json.NewDecoder(bytes.NewBuffer(decoded)).Decode(c) - return c, err -} - -// Signer returns a signature for the given data. -type Signer func(data []byte) (sig []byte, err error) - -// EncodeWithSigner encodes a header and claim set with the provided signer. -func EncodeWithSigner(header *Header, c *ClaimSet, sg Signer) (string, error) { - head, err := header.encode() - if err != nil { - return "", err - } - cs, err := c.encode() - if err != nil { - return "", err - } - ss := fmt.Sprintf("%s.%s", head, cs) - sig, err := sg([]byte(ss)) - if err != nil { - return "", err - } - return fmt.Sprintf("%s.%s", ss, base64Encode(sig)), nil -} - -// Encode encodes a signed JWS with provided header and claim set. -// This invokes EncodeWithSigner using crypto/rsa.SignPKCS1v15 with the given RSA private key. -func Encode(header *Header, c *ClaimSet, key *rsa.PrivateKey) (string, error) { - sg := func(data []byte) (sig []byte, err error) { - h := sha256.New() - h.Write(data) - return rsa.SignPKCS1v15(rand.Reader, key, crypto.SHA256, h.Sum(nil)) - } - return EncodeWithSigner(header, c, sg) -} - -// Verify tests whether the provided JWT token's signature was produced by the private key -// associated with the supplied public key. -func Verify(token string, key *rsa.PublicKey) error { - parts := strings.Split(token, ".") - if len(parts) != 3 { - return errors.New("jws: invalid token received, token must have 3 parts") - } - - signedContent := parts[0] + "." + parts[1] - signatureString, err := base64Decode(parts[2]) - if err != nil { - return err - } - - h := sha256.New() - h.Write([]byte(signedContent)) - return rsa.VerifyPKCS1v15(key, crypto.SHA256, h.Sum(nil), []byte(signatureString)) -} - -// base64Encode returns and Base64url encoded version of the input string with any -// trailing "=" stripped. -func base64Encode(b []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(b), "=") -} - -// base64Decode decodes the Base64url encoded string -func base64Decode(s string) ([]byte, error) { - // add back missing padding - switch len(s) % 4 { - case 1: - s += "===" - case 2: - s += "==" - case 3: - s += "=" - } - return base64.URLEncoding.DecodeString(s) -} diff --git a/vendor/golang.org/x/oauth2/jws/jws_test.go b/vendor/golang.org/x/oauth2/jws/jws_test.go deleted file mode 100644 index 9b5efdd3..00000000 --- a/vendor/golang.org/x/oauth2/jws/jws_test.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jws - -import ( - "crypto/rand" - "crypto/rsa" - "testing" -) - -func TestSignAndVerify(t *testing.T) { - header := &Header{ - Algorithm: "RS256", - Typ: "JWT", - } - payload := &ClaimSet{ - Iss: "http://google.com/", - Aud: "", - Exp: 3610, - Iat: 10, - } - - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) - if err != nil { - t.Fatal(err) - } - - token, err := Encode(header, payload, privateKey) - if err != nil { - t.Fatal(err) - } - - err = Verify(token, &privateKey.PublicKey) - if err != nil { - t.Fatal(err) - } -} - -func TestVerifyFailsOnMalformedClaim(t *testing.T) { - err := Verify("abc.def", nil) - if err == nil { - t.Error("Improperly formed JWT should fail.") - } -} diff --git a/vendor/golang.org/x/oauth2/jwt/example_test.go b/vendor/golang.org/x/oauth2/jwt/example_test.go deleted file mode 100644 index a9533e85..00000000 --- a/vendor/golang.org/x/oauth2/jwt/example_test.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jwt_test - -import ( - "golang.org/x/oauth2" - "golang.org/x/oauth2/jwt" -) - -func ExampleJWTConfig() { - conf := &jwt.Config{ - Email: "xxx@developer.com", - // The contents of your RSA private key or your PEM file - // that contains a private key. - // If you have a p12 file instead, you - // can use `openssl` to export the private key into a pem file. - // - // $ openssl pkcs12 -in key.p12 -out key.pem -nodes - // - // It only supports PEM containers with no passphrase. - PrivateKey: []byte("-----BEGIN RSA PRIVATE KEY-----..."), - Subject: "user@example.com", - TokenURL: "https://provider.com/o/oauth2/token", - } - // Initiate an http.Client, the following GET request will be - // authorized and authenticated on the behalf of user@example.com. - client := conf.Client(oauth2.NoContext) - client.Get("...") -} diff --git a/vendor/golang.org/x/oauth2/jwt/jwt.go b/vendor/golang.org/x/oauth2/jwt/jwt.go deleted file mode 100644 index 2ffad21a..00000000 --- a/vendor/golang.org/x/oauth2/jwt/jwt.go +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package jwt implements the OAuth 2.0 JSON Web Token flow, commonly -// known as "two-legged OAuth 2.0". -// -// See: https://tools.ietf.org/html/draft-ietf-oauth-jwt-bearer-12 -package jwt - -import ( - "encoding/json" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/url" - "strings" - "time" - - "golang.org/x/net/context" - "golang.org/x/oauth2" - "golang.org/x/oauth2/internal" - "golang.org/x/oauth2/jws" -) - -var ( - defaultGrantType = "urn:ietf:params:oauth:grant-type:jwt-bearer" - defaultHeader = &jws.Header{Algorithm: "RS256", Typ: "JWT"} -) - -// Config is the configuration for using JWT to fetch tokens, -// commonly known as "two-legged OAuth 2.0". -type Config struct { - // Email is the OAuth client identifier used when communicating with - // the configured OAuth provider. - Email string - - // PrivateKey contains the contents of an RSA private key or the - // contents of a PEM file that contains a private key. The provided - // private key is used to sign JWT payloads. - // PEM containers with a passphrase are not supported. - // Use the following command to convert a PKCS 12 file into a PEM. - // - // $ openssl pkcs12 -in key.p12 -out key.pem -nodes - // - PrivateKey []byte - - // Subject is the optional user to impersonate. - Subject string - - // Scopes optionally specifies a list of requested permission scopes. - Scopes []string - - // TokenURL is the endpoint required to complete the 2-legged JWT flow. - TokenURL string - - // Expires optionally specifies how long the token is valid for. - Expires time.Duration -} - -// TokenSource returns a JWT TokenSource using the configuration -// in c and the HTTP client from the provided context. -func (c *Config) TokenSource(ctx context.Context) oauth2.TokenSource { - return oauth2.ReuseTokenSource(nil, jwtSource{ctx, c}) -} - -// Client returns an HTTP client wrapping the context's -// HTTP transport and adding Authorization headers with tokens -// obtained from c. -// -// The returned client and its Transport should not be modified. -func (c *Config) Client(ctx context.Context) *http.Client { - return oauth2.NewClient(ctx, c.TokenSource(ctx)) -} - -// jwtSource is a source that always does a signed JWT request for a token. -// It should typically be wrapped with a reuseTokenSource. -type jwtSource struct { - ctx context.Context - conf *Config -} - -func (js jwtSource) Token() (*oauth2.Token, error) { - pk, err := internal.ParseKey(js.conf.PrivateKey) - if err != nil { - return nil, err - } - hc := oauth2.NewClient(js.ctx, nil) - claimSet := &jws.ClaimSet{ - Iss: js.conf.Email, - Scope: strings.Join(js.conf.Scopes, " "), - Aud: js.conf.TokenURL, - } - if subject := js.conf.Subject; subject != "" { - claimSet.Sub = subject - // prn is the old name of sub. Keep setting it - // to be compatible with legacy OAuth 2.0 providers. - claimSet.Prn = subject - } - if t := js.conf.Expires; t > 0 { - claimSet.Exp = time.Now().Add(t).Unix() - } - payload, err := jws.Encode(defaultHeader, claimSet, pk) - if err != nil { - return nil, err - } - v := url.Values{} - v.Set("grant_type", defaultGrantType) - v.Set("assertion", payload) - resp, err := hc.PostForm(js.conf.TokenURL, v) - if err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - defer resp.Body.Close() - body, err := ioutil.ReadAll(io.LimitReader(resp.Body, 1<<20)) - if err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - if c := resp.StatusCode; c < 200 || c > 299 { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v\nResponse: %s", resp.Status, body) - } - // tokenRes is the JSON response body. - var tokenRes struct { - AccessToken string `json:"access_token"` - TokenType string `json:"token_type"` - IDToken string `json:"id_token"` - ExpiresIn int64 `json:"expires_in"` // relative seconds from now - } - if err := json.Unmarshal(body, &tokenRes); err != nil { - return nil, fmt.Errorf("oauth2: cannot fetch token: %v", err) - } - token := &oauth2.Token{ - AccessToken: tokenRes.AccessToken, - TokenType: tokenRes.TokenType, - } - raw := make(map[string]interface{}) - json.Unmarshal(body, &raw) // no error checks for optional fields - token = token.WithExtra(raw) - - if secs := tokenRes.ExpiresIn; secs > 0 { - token.Expiry = time.Now().Add(time.Duration(secs) * time.Second) - } - if v := tokenRes.IDToken; v != "" { - // decode returned id token to get expiry - claimSet, err := jws.Decode(v) - if err != nil { - return nil, fmt.Errorf("oauth2: error decoding JWT token: %v", err) - } - token.Expiry = time.Unix(claimSet.Exp, 0) - } - return token, nil -} diff --git a/vendor/golang.org/x/oauth2/jwt/jwt_test.go b/vendor/golang.org/x/oauth2/jwt/jwt_test.go deleted file mode 100644 index a9c126b4..00000000 --- a/vendor/golang.org/x/oauth2/jwt/jwt_test.go +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package jwt - -import ( - "net/http" - "net/http/httptest" - "testing" - - "golang.org/x/oauth2" -) - -var dummyPrivateKey = []byte(`-----BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEAx4fm7dngEmOULNmAs1IGZ9Apfzh+BkaQ1dzkmbUgpcoghucE -DZRnAGd2aPyB6skGMXUytWQvNYav0WTR00wFtX1ohWTfv68HGXJ8QXCpyoSKSSFY -fuP9X36wBSkSX9J5DVgiuzD5VBdzUISSmapjKm+DcbRALjz6OUIPEWi1Tjl6p5RK -1w41qdbmt7E5/kGhKLDuT7+M83g4VWhgIvaAXtnhklDAggilPPa8ZJ1IFe31lNlr -k4DRk38nc6sEutdf3RL7QoH7FBusI7uXV03DC6dwN1kP4GE7bjJhcRb/7jYt7CQ9 -/E9Exz3c0yAp0yrTg0Fwh+qxfH9dKwN52S7SBwIDAQABAoIBAQCaCs26K07WY5Jt -3a2Cw3y2gPrIgTCqX6hJs7O5ByEhXZ8nBwsWANBUe4vrGaajQHdLj5OKfsIDrOvn -2NI1MqflqeAbu/kR32q3tq8/Rl+PPiwUsW3E6Pcf1orGMSNCXxeducF2iySySzh3 -nSIhCG5uwJDWI7a4+9KiieFgK1pt/Iv30q1SQS8IEntTfXYwANQrfKUVMmVF9aIK -6/WZE2yd5+q3wVVIJ6jsmTzoDCX6QQkkJICIYwCkglmVy5AeTckOVwcXL0jqw5Kf -5/soZJQwLEyBoQq7Kbpa26QHq+CJONetPP8Ssy8MJJXBT+u/bSseMb3Zsr5cr43e -DJOhwsThAoGBAPY6rPKl2NT/K7XfRCGm1sbWjUQyDShscwuWJ5+kD0yudnT/ZEJ1 -M3+KS/iOOAoHDdEDi9crRvMl0UfNa8MAcDKHflzxg2jg/QI+fTBjPP5GOX0lkZ9g -z6VePoVoQw2gpPFVNPPTxKfk27tEzbaffvOLGBEih0Kb7HTINkW8rIlzAoGBAM9y -1yr+jvfS1cGFtNU+Gotoihw2eMKtIqR03Yn3n0PK1nVCDKqwdUqCypz4+ml6cxRK -J8+Pfdh7D+ZJd4LEG6Y4QRDLuv5OA700tUoSHxMSNn3q9As4+T3MUyYxWKvTeu3U -f2NWP9ePU0lV8ttk7YlpVRaPQmc1qwooBA/z/8AdAoGAW9x0HWqmRICWTBnpjyxx -QGlW9rQ9mHEtUotIaRSJ6K/F3cxSGUEkX1a3FRnp6kPLcckC6NlqdNgNBd6rb2rA -cPl/uSkZP42Als+9YMoFPU/xrrDPbUhu72EDrj3Bllnyb168jKLa4VBOccUvggxr -Dm08I1hgYgdN5huzs7y6GeUCgYEAj+AZJSOJ6o1aXS6rfV3mMRve9bQ9yt8jcKXw -5HhOCEmMtaSKfnOF1Ziih34Sxsb7O2428DiX0mV/YHtBnPsAJidL0SdLWIapBzeg -KHArByIRkwE6IvJvwpGMdaex1PIGhx5i/3VZL9qiq/ElT05PhIb+UXgoWMabCp84 -OgxDK20CgYAeaFo8BdQ7FmVX2+EEejF+8xSge6WVLtkaon8bqcn6P0O8lLypoOhd -mJAYH8WU+UAy9pecUnDZj14LAGNVmYcse8HFX71MoshnvCTFEPVo4rZxIAGwMpeJ -5jgQ3slYLpqrGlcbLgUXBUgzEO684Wk/UV9DFPlHALVqCfXQ9dpJPg== ------END RSA PRIVATE KEY-----`) - -func TestJWTFetch_JSONResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{ - "access_token": "90d64460d14870c08c81352a05dedd3465940a7c", - "scope": "user", - "token_type": "bearer", - "expires_in": 3600 - }`)) - })) - defer ts.Close() - - conf := &Config{ - Email: "aaa@xxx.com", - PrivateKey: dummyPrivateKey, - TokenURL: ts.URL, - } - tok, err := conf.TokenSource(oauth2.NoContext).Token() - if err != nil { - t.Fatal(err) - } - if !tok.Valid() { - t.Errorf("Token invalid") - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Unexpected access token, %#v", tok.AccessToken) - } - if tok.TokenType != "bearer" { - t.Errorf("Unexpected token type, %#v", tok.TokenType) - } - if tok.Expiry.IsZero() { - t.Errorf("Unexpected token expiry, %#v", tok.Expiry) - } - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected value for scope: %v", scope) - } -} - -func TestJWTFetch_BadResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - - conf := &Config{ - Email: "aaa@xxx.com", - PrivateKey: dummyPrivateKey, - TokenURL: ts.URL, - } - tok, err := conf.TokenSource(oauth2.NoContext).Token() - if err != nil { - t.Fatal(err) - } - if tok == nil { - t.Fatalf("token is nil") - } - if tok.Valid() { - t.Errorf("token is valid. want invalid.") - } - if tok.AccessToken != "" { - t.Errorf("Unexpected non-empty access token %q.", tok.AccessToken) - } - if want := "bearer"; tok.TokenType != want { - t.Errorf("TokenType = %q; want %q", tok.TokenType, want) - } - scope := tok.Extra("scope") - if want := "user"; scope != want { - t.Errorf("token scope = %q; want %q", scope, want) - } -} - -func TestJWTFetch_BadResponseType(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token":123, "scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - conf := &Config{ - Email: "aaa@xxx.com", - PrivateKey: dummyPrivateKey, - TokenURL: ts.URL, - } - tok, err := conf.TokenSource(oauth2.NoContext).Token() - if err == nil { - t.Error("got a token; expected error") - if tok.AccessToken != "" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } - } -} diff --git a/vendor/golang.org/x/oauth2/linkedin/linkedin.go b/vendor/golang.org/x/oauth2/linkedin/linkedin.go deleted file mode 100644 index b619f93d..00000000 --- a/vendor/golang.org/x/oauth2/linkedin/linkedin.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package linkedin provides constants for using OAuth2 to access LinkedIn. -package linkedin // import "golang.org/x/oauth2/linkedin" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is LinkedIn's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.linkedin.com/uas/oauth2/authorization", - TokenURL: "https://www.linkedin.com/uas/oauth2/accessToken", -} diff --git a/vendor/golang.org/x/oauth2/microsoft/microsoft.go b/vendor/golang.org/x/oauth2/microsoft/microsoft.go deleted file mode 100644 index f21b3985..00000000 --- a/vendor/golang.org/x/oauth2/microsoft/microsoft.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package microsoft provides constants for using OAuth2 to access Windows Live ID. -package microsoft // import "golang.org/x/oauth2/microsoft" - -import ( - "golang.org/x/oauth2" -) - -// LiveConnectEndpoint is Windows's Live ID OAuth 2.0 endpoint. -var LiveConnectEndpoint = oauth2.Endpoint{ - AuthURL: "https://login.live.com/oauth20_authorize.srf", - TokenURL: "https://login.live.com/oauth20_token.srf", -} diff --git a/vendor/golang.org/x/oauth2/oauth2.go b/vendor/golang.org/x/oauth2/oauth2.go index a6828960..a047a5f9 100644 --- a/vendor/golang.org/x/oauth2/oauth2.go +++ b/vendor/golang.org/x/oauth2/oauth2.go @@ -21,6 +21,8 @@ import ( // NoContext is the default context you should supply if not using // your own context.Context (see https://golang.org/x/net/context). +// +// Deprecated: Use context.Background() or context.TODO() instead. var NoContext = context.TODO() // RegisterBrokenAuthHeaderProvider registers an OAuth2 server @@ -37,6 +39,8 @@ func RegisterBrokenAuthHeaderProvider(tokenURL string) { // Config describes a typical 3-legged OAuth2 flow, with both the // client application information and the server's endpoint URLs. +// For the client credentials 2-legged OAuth2 flow, see the clientcredentials +// package (https://golang.org/x/oauth2/clientcredentials). type Config struct { // ClientID is the application's ID. ClientID string @@ -113,7 +117,7 @@ func SetAuthURLParam(key, value string) AuthCodeOption { // that asks for permissions for the required scopes explicitly. // // State is a token to protect the user from CSRF attacks. You must -// always provide a non-zero string and validate that it matches the +// always provide a non-empty string and validate that it matches the // the state query parameter on your redirect callback. // See http://tools.ietf.org/html/rfc6749#section-10.12 for more info. // @@ -125,9 +129,16 @@ func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string { v := url.Values{ "response_type": {"code"}, "client_id": {c.ClientID}, - "redirect_uri": internal.CondVal(c.RedirectURL), - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - "state": internal.CondVal(state), + } + if c.RedirectURL != "" { + v.Set("redirect_uri", c.RedirectURL) + } + if len(c.Scopes) > 0 { + v.Set("scope", strings.Join(c.Scopes, " ")) + } + if state != "" { + // TODO(light): Docs say never to omit state; don't allow empty. + v.Set("state", state) } for _, opt := range opts { opt.setValue(v) @@ -153,12 +164,15 @@ func (c *Config) AuthCodeURL(state string, opts ...AuthCodeOption) string { // The HTTP client to use is derived from the context. // If nil, http.DefaultClient is used. func (c *Config) PasswordCredentialsToken(ctx context.Context, username, password string) (*Token, error) { - return retrieveToken(ctx, c, url.Values{ + v := url.Values{ "grant_type": {"password"}, "username": {username}, "password": {password}, - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - }) + } + if len(c.Scopes) > 0 { + v.Set("scope", strings.Join(c.Scopes, " ")) + } + return retrieveToken(ctx, c, v) } // Exchange converts an authorization code into a token. @@ -172,12 +186,14 @@ func (c *Config) PasswordCredentialsToken(ctx context.Context, username, passwor // The code will be in the *http.Request.FormValue("code"). Before // calling Exchange, be sure to validate FormValue("state"). func (c *Config) Exchange(ctx context.Context, code string) (*Token, error) { - return retrieveToken(ctx, c, url.Values{ - "grant_type": {"authorization_code"}, - "code": {code}, - "redirect_uri": internal.CondVal(c.RedirectURL), - "scope": internal.CondVal(strings.Join(c.Scopes, " ")), - }) + v := url.Values{ + "grant_type": {"authorization_code"}, + "code": {code}, + } + if c.RedirectURL != "" { + v.Set("redirect_uri", c.RedirectURL) + } + return retrieveToken(ctx, c, v) } // Client returns an HTTP client using the provided token. @@ -288,20 +304,20 @@ var HTTPClient internal.ContextKey // NewClient creates an *http.Client from a Context and TokenSource. // The returned client is not valid beyond the lifetime of the context. // +// Note that if a custom *http.Client is provided via the Context it +// is used only for token acquisition and is not used to configure the +// *http.Client returned from NewClient. +// // As a special case, if src is nil, a non-OAuth2 client is returned // using the provided context. This exists to support related OAuth2 // packages. func NewClient(ctx context.Context, src TokenSource) *http.Client { if src == nil { - c, err := internal.ContextClient(ctx) - if err != nil { - return &http.Client{Transport: internal.ErrorTransport{err}} - } - return c + return internal.ContextClient(ctx) } return &http.Client{ Transport: &Transport{ - Base: internal.ContextTransport(ctx), + Base: internal.ContextClient(ctx).Transport, Source: ReuseTokenSource(nil, src), }, } diff --git a/vendor/golang.org/x/oauth2/oauth2_test.go b/vendor/golang.org/x/oauth2/oauth2_test.go deleted file mode 100644 index a9aecd6a..00000000 --- a/vendor/golang.org/x/oauth2/oauth2_test.go +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package oauth2 - -import ( - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "net/http" - "net/http/httptest" - "net/url" - "reflect" - "strconv" - "testing" - "time" - - "golang.org/x/net/context" -) - -type mockTransport struct { - rt func(req *http.Request) (resp *http.Response, err error) -} - -func (t *mockTransport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - return t.rt(req) -} - -func newConf(url string) *Config { - return &Config{ - ClientID: "CLIENT_ID", - ClientSecret: "CLIENT_SECRET", - RedirectURL: "REDIRECT_URL", - Scopes: []string{"scope1", "scope2"}, - Endpoint: Endpoint{ - AuthURL: url + "/auth", - TokenURL: url + "/token", - }, - } -} - -func TestAuthCodeURL(t *testing.T) { - conf := newConf("server") - url := conf.AuthCodeURL("foo", AccessTypeOffline, ApprovalForce) - if url != "server/auth?access_type=offline&approval_prompt=force&client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&response_type=code&scope=scope1+scope2&state=foo" { - t.Errorf("Auth code URL doesn't match the expected, found: %v", url) - } -} - -func TestAuthCodeURL_CustomParam(t *testing.T) { - conf := newConf("server") - param := SetAuthURLParam("foo", "bar") - url := conf.AuthCodeURL("baz", param) - if url != "server/auth?client_id=CLIENT_ID&foo=bar&redirect_uri=REDIRECT_URL&response_type=code&scope=scope1+scope2&state=baz" { - t.Errorf("Auth code URL doesn't match the expected, found: %v", url) - } -} - -func TestAuthCodeURL_Optional(t *testing.T) { - conf := &Config{ - ClientID: "CLIENT_ID", - Endpoint: Endpoint{ - AuthURL: "/auth-url", - TokenURL: "/token-url", - }, - } - url := conf.AuthCodeURL("") - if url != "/auth-url?client_id=CLIENT_ID&response_type=code" { - t.Fatalf("Auth code URL doesn't match the expected, found: %v", url) - } -} - -func TestExchangeRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() != "/token" { - t.Errorf("Unexpected exchange request URL, %v is found.", r.URL) - } - headerAuth := r.Header.Get("Authorization") - if headerAuth != "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Errorf("Failed reading request body: %s.", err) - } - if string(body) != "client_id=CLIENT_ID&code=exchange-code&grant_type=authorization_code&redirect_uri=REDIRECT_URL&scope=scope1+scope2" { - t.Errorf("Unexpected exchange payload, %v is found.", string(body)) - } - w.Header().Set("Content-Type", "application/x-www-form-urlencoded") - w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&scope=user&token_type=bearer")) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Exchange(NoContext, "exchange-code") - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } - if tok.TokenType != "bearer" { - t.Errorf("Unexpected token type, %#v.", tok.TokenType) - } - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected value for scope: %v", scope) - } -} - -func TestExchangeRequest_JSONResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() != "/token" { - t.Errorf("Unexpected exchange request URL, %v is found.", r.URL) - } - headerAuth := r.Header.Get("Authorization") - if headerAuth != "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Errorf("Failed reading request body: %s.", err) - } - if string(body) != "client_id=CLIENT_ID&code=exchange-code&grant_type=authorization_code&redirect_uri=REDIRECT_URL&scope=scope1+scope2" { - t.Errorf("Unexpected exchange payload, %v is found.", string(body)) - } - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token": "90d64460d14870c08c81352a05dedd3465940a7c", "scope": "user", "token_type": "bearer", "expires_in": 86400}`)) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Exchange(NoContext, "exchange-code") - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - if tok.AccessToken != "90d64460d14870c08c81352a05dedd3465940a7c" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } - if tok.TokenType != "bearer" { - t.Errorf("Unexpected token type, %#v.", tok.TokenType) - } - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected value for scope: %v", scope) - } - expiresIn := tok.Extra("expires_in") - if expiresIn != float64(86400) { - t.Errorf("Unexpected non-numeric value for expires_in: %v", expiresIn) - } -} - -func TestExtraValueRetrieval(t *testing.T) { - values := url.Values{} - - kvmap := map[string]string{ - "scope": "user", "token_type": "bearer", "expires_in": "86400.92", - "server_time": "1443571905.5606415", "referer_ip": "10.0.0.1", - "etag": "\"afZYj912P4alikMz_P11982\"", "request_id": "86400", - "untrimmed": " untrimmed ", - } - - for key, value := range kvmap { - values.Set(key, value) - } - - tok := Token{ - raw: values, - } - - scope := tok.Extra("scope") - if scope != "user" { - t.Errorf("Unexpected scope %v wanted \"user\"", scope) - } - serverTime := tok.Extra("server_time") - if serverTime != 1443571905.5606415 { - t.Errorf("Unexpected non-float64 value for server_time: %v", serverTime) - } - refererIp := tok.Extra("referer_ip") - if refererIp != "10.0.0.1" { - t.Errorf("Unexpected non-string value for referer_ip: %v", refererIp) - } - expires_in := tok.Extra("expires_in") - if expires_in != 86400.92 { - t.Errorf("Unexpected value for expires_in, wanted 86400 got %v", expires_in) - } - requestId := tok.Extra("request_id") - if requestId != int64(86400) { - t.Errorf("Unexpected non-int64 value for request_id: %v", requestId) - } - untrimmed := tok.Extra("untrimmed") - if untrimmed != " untrimmed " { - t.Errorf("Unexpected value for untrimmed, got %q expected \" untrimmed \"", untrimmed) - } -} - -const day = 24 * time.Hour - -func TestExchangeRequest_JSONResponse_Expiry(t *testing.T) { - seconds := int32(day.Seconds()) - jsonNumberType := reflect.TypeOf(json.Number("0")) - for _, c := range []struct { - expires string - expect error - }{ - {fmt.Sprintf(`"expires_in": %d`, seconds), nil}, - {fmt.Sprintf(`"expires_in": "%d"`, seconds), nil}, // PayPal case - {fmt.Sprintf(`"expires": %d`, seconds), nil}, // Facebook case - {`"expires": false`, &json.UnmarshalTypeError{Value: "bool", Type: jsonNumberType}}, // wrong type - {`"expires": {}`, &json.UnmarshalTypeError{Value: "object", Type: jsonNumberType}}, // wrong type - {`"expires": "zzz"`, &strconv.NumError{Func: "ParseInt", Num: "zzz", Err: strconv.ErrSyntax}}, // wrong value - } { - testExchangeRequest_JSONResponse_expiry(t, c.expires, c.expect) - } -} - -func testExchangeRequest_JSONResponse_expiry(t *testing.T, exp string, expect error) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(fmt.Sprintf(`{"access_token": "90d", "scope": "user", "token_type": "bearer", %s}`, exp))) - })) - defer ts.Close() - conf := newConf(ts.URL) - t1 := time.Now().Add(day) - tok, err := conf.Exchange(NoContext, "exchange-code") - t2 := time.Now().Add(day) - // Do a fmt.Sprint comparison so either side can be - // nil. fmt.Sprint just stringifies them to "<nil>", and no - // non-nil expected error ever stringifies as "<nil>", so this - // isn't terribly disgusting. We do this because Go 1.4 and - // Go 1.5 return a different deep value for - // json.UnmarshalTypeError. In Go 1.5, the - // json.UnmarshalTypeError contains a new field with a new - // non-zero value. Rather than ignore it here with reflect or - // add new files and +build tags, just look at the strings. - if fmt.Sprint(err) != fmt.Sprint(expect) { - t.Errorf("Error = %v; want %v", err, expect) - } - if err != nil { - return - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - expiry := tok.Expiry - if expiry.Before(t1) || expiry.After(t2) { - t.Errorf("Unexpected value for Expiry: %v (shold be between %v and %v)", expiry, t1, t2) - } -} - -func TestExchangeRequest_BadResponse(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.Exchange(NoContext, "code") - if err != nil { - t.Fatal(err) - } - if tok.AccessToken != "" { - t.Errorf("Unexpected access token, %#v.", tok.AccessToken) - } -} - -func TestExchangeRequest_BadResponseType(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token":123, "scope": "user", "token_type": "bearer"}`)) - })) - defer ts.Close() - conf := newConf(ts.URL) - _, err := conf.Exchange(NoContext, "exchange-code") - if err == nil { - t.Error("expected error from invalid access_token type") - } -} - -func TestExchangeRequest_NonBasicAuth(t *testing.T) { - tr := &mockTransport{ - rt: func(r *http.Request) (w *http.Response, err error) { - headerAuth := r.Header.Get("Authorization") - if headerAuth != "" { - t.Errorf("Unexpected authorization header, %v is found.", headerAuth) - } - return nil, errors.New("no response") - }, - } - c := &http.Client{Transport: tr} - conf := &Config{ - ClientID: "CLIENT_ID", - Endpoint: Endpoint{ - AuthURL: "https://accounts.google.com/auth", - TokenURL: "https://accounts.google.com/token", - }, - } - - ctx := context.WithValue(context.Background(), HTTPClient, c) - conf.Exchange(ctx, "code") -} - -func TestPasswordCredentialsTokenRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - defer r.Body.Close() - expected := "/token" - if r.URL.String() != expected { - t.Errorf("URL = %q; want %q", r.URL, expected) - } - headerAuth := r.Header.Get("Authorization") - expected = "Basic Q0xJRU5UX0lEOkNMSUVOVF9TRUNSRVQ=" - if headerAuth != expected { - t.Errorf("Authorization header = %q; want %q", headerAuth, expected) - } - headerContentType := r.Header.Get("Content-Type") - expected = "application/x-www-form-urlencoded" - if headerContentType != expected { - t.Errorf("Content-Type header = %q; want %q", headerContentType, expected) - } - body, err := ioutil.ReadAll(r.Body) - if err != nil { - t.Errorf("Failed reading request body: %s.", err) - } - expected = "client_id=CLIENT_ID&grant_type=password&password=password1&scope=scope1+scope2&username=user1" - if string(body) != expected { - t.Errorf("res.Body = %q; want %q", string(body), expected) - } - w.Header().Set("Content-Type", "application/x-www-form-urlencoded") - w.Write([]byte("access_token=90d64460d14870c08c81352a05dedd3465940a7c&scope=user&token_type=bearer")) - })) - defer ts.Close() - conf := newConf(ts.URL) - tok, err := conf.PasswordCredentialsToken(NoContext, "user1", "password1") - if err != nil { - t.Error(err) - } - if !tok.Valid() { - t.Fatalf("Token invalid. Got: %#v", tok) - } - expected := "90d64460d14870c08c81352a05dedd3465940a7c" - if tok.AccessToken != expected { - t.Errorf("AccessToken = %q; want %q", tok.AccessToken, expected) - } - expected = "bearer" - if tok.TokenType != expected { - t.Errorf("TokenType = %q; want %q", tok.TokenType, expected) - } -} - -func TestTokenRefreshRequest(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() == "/somethingelse" { - return - } - if r.URL.String() != "/token" { - t.Errorf("Unexpected token refresh request URL, %v is found.", r.URL) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, _ := ioutil.ReadAll(r.Body) - if string(body) != "client_id=CLIENT_ID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN" { - t.Errorf("Unexpected refresh token payload, %v is found.", string(body)) - } - })) - defer ts.Close() - conf := newConf(ts.URL) - c := conf.Client(NoContext, &Token{RefreshToken: "REFRESH_TOKEN"}) - c.Get(ts.URL + "/somethingelse") -} - -func TestFetchWithNoRefreshToken(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if r.URL.String() == "/somethingelse" { - return - } - if r.URL.String() != "/token" { - t.Errorf("Unexpected token refresh request URL, %v is found.", r.URL) - } - headerContentType := r.Header.Get("Content-Type") - if headerContentType != "application/x-www-form-urlencoded" { - t.Errorf("Unexpected Content-Type header, %v is found.", headerContentType) - } - body, _ := ioutil.ReadAll(r.Body) - if string(body) != "client_id=CLIENT_ID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN" { - t.Errorf("Unexpected refresh token payload, %v is found.", string(body)) - } - })) - defer ts.Close() - conf := newConf(ts.URL) - c := conf.Client(NoContext, nil) - _, err := c.Get(ts.URL + "/somethingelse") - if err == nil { - t.Errorf("Fetch should return an error if no refresh token is set") - } -} - -func TestRefreshToken_RefreshTokenReplacement(t *testing.T) { - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") - w.Write([]byte(`{"access_token":"ACCESS TOKEN", "scope": "user", "token_type": "bearer", "refresh_token": "NEW REFRESH TOKEN"}`)) - return - })) - defer ts.Close() - conf := newConf(ts.URL) - tkr := tokenRefresher{ - conf: conf, - ctx: NoContext, - refreshToken: "OLD REFRESH TOKEN", - } - tk, err := tkr.Token() - if err != nil { - t.Errorf("Unexpected refreshToken error returned: %v", err) - return - } - if tk.RefreshToken != tkr.refreshToken { - t.Errorf("tokenRefresher.refresh_token = %s; want %s", tkr.refreshToken, tk.RefreshToken) - } -} - -func TestConfigClientWithToken(t *testing.T) { - tok := &Token{ - AccessToken: "abc123", - } - ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - if got, want := r.Header.Get("Authorization"), fmt.Sprintf("Bearer %s", tok.AccessToken); got != want { - t.Errorf("Authorization header = %q; want %q", got, want) - } - return - })) - defer ts.Close() - conf := newConf(ts.URL) - - c := conf.Client(NoContext, tok) - req, err := http.NewRequest("GET", ts.URL, nil) - if err != nil { - t.Error(err) - } - _, err = c.Do(req) - if err != nil { - t.Error(err) - } -} diff --git a/vendor/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go b/vendor/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go deleted file mode 100644 index c0d093cc..00000000 --- a/vendor/golang.org/x/oauth2/odnoklassniki/odnoklassniki.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package odnoklassniki provides constants for using OAuth2 to access Odnoklassniki. -package odnoklassniki // import "golang.org/x/oauth2/odnoklassniki" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Odnoklassniki's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.odnoklassniki.ru/oauth/authorize", - TokenURL: "https://api.odnoklassniki.ru/oauth/token.do", -} diff --git a/vendor/golang.org/x/oauth2/paypal/paypal.go b/vendor/golang.org/x/oauth2/paypal/paypal.go deleted file mode 100644 index 2e713c53..00000000 --- a/vendor/golang.org/x/oauth2/paypal/paypal.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package paypal provides constants for using OAuth2 to access PayPal. -package paypal // import "golang.org/x/oauth2/paypal" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is PayPal's OAuth 2.0 endpoint in live (production) environment. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize", - TokenURL: "https://api.paypal.com/v1/identity/openidconnect/tokenservice", -} - -// SandboxEndpoint is PayPal's OAuth 2.0 endpoint in sandbox (testing) environment. -var SandboxEndpoint = oauth2.Endpoint{ - AuthURL: "https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize", - TokenURL: "https://api.sandbox.paypal.com/v1/identity/openidconnect/tokenservice", -} diff --git a/vendor/golang.org/x/oauth2/slack/slack.go b/vendor/golang.org/x/oauth2/slack/slack.go deleted file mode 100644 index 593d2f60..00000000 --- a/vendor/golang.org/x/oauth2/slack/slack.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package slack provides constants for using OAuth2 to access Slack. -package slack // import "golang.org/x/oauth2/slack" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is Slack's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://slack.com/oauth/authorize", - TokenURL: "https://slack.com/api/oauth.access", -} diff --git a/vendor/golang.org/x/oauth2/token.go b/vendor/golang.org/x/oauth2/token.go index 7a3167f1..34db8cdc 100644 --- a/vendor/golang.org/x/oauth2/token.go +++ b/vendor/golang.org/x/oauth2/token.go @@ -5,6 +5,7 @@ package oauth2 import ( + "fmt" "net/http" "net/url" "strconv" @@ -20,7 +21,7 @@ import ( // expirations due to client-server time mismatches. const expiryDelta = 10 * time.Second -// Token represents the crendentials used to authorize +// Token represents the credentials used to authorize // the requests to access protected resources on the OAuth 2.0 // provider's backend. // @@ -123,7 +124,7 @@ func (t *Token) expired() bool { if t.Expiry.IsZero() { return false } - return t.Expiry.Add(-expiryDelta).Before(time.Now()) + return t.Expiry.Round(0).Add(-expiryDelta).Before(time.Now()) } // Valid reports whether t is non-nil, has an AccessToken, and is not expired. @@ -152,7 +153,23 @@ func tokenFromInternal(t *internal.Token) *Token { func retrieveToken(ctx context.Context, c *Config, v url.Values) (*Token, error) { tk, err := internal.RetrieveToken(ctx, c.ClientID, c.ClientSecret, c.Endpoint.TokenURL, v) if err != nil { + if rErr, ok := err.(*internal.RetrieveError); ok { + return nil, (*RetrieveError)(rErr) + } return nil, err } return tokenFromInternal(tk), nil } + +// RetrieveError is the error returned when the token endpoint returns a +// non-2XX HTTP status code. +type RetrieveError struct { + Response *http.Response + // Body is the body that was consumed by reading Response.Body. + // It may be truncated. + Body []byte +} + +func (r *RetrieveError) Error() string { + return fmt.Sprintf("oauth2: cannot fetch token: %v\nResponse: %s", r.Response.Status, r.Body) +} diff --git a/vendor/golang.org/x/oauth2/token_test.go b/vendor/golang.org/x/oauth2/token_test.go deleted file mode 100644 index 80db83c2..00000000 --- a/vendor/golang.org/x/oauth2/token_test.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package oauth2 - -import ( - "testing" - "time" -) - -func TestTokenExtra(t *testing.T) { - type testCase struct { - key string - val interface{} - want interface{} - } - const key = "extra-key" - cases := []testCase{ - {key: key, val: "abc", want: "abc"}, - {key: key, val: 123, want: 123}, - {key: key, val: "", want: ""}, - {key: "other-key", val: "def", want: nil}, - } - for _, tc := range cases { - extra := make(map[string]interface{}) - extra[tc.key] = tc.val - tok := &Token{raw: extra} - if got, want := tok.Extra(key), tc.want; got != want { - t.Errorf("Extra(%q) = %q; want %q", key, got, want) - } - } -} - -func TestTokenExpiry(t *testing.T) { - now := time.Now() - cases := []struct { - name string - tok *Token - want bool - }{ - {name: "12 seconds", tok: &Token{Expiry: now.Add(12 * time.Second)}, want: false}, - {name: "10 seconds", tok: &Token{Expiry: now.Add(expiryDelta)}, want: true}, - {name: "-1 hour", tok: &Token{Expiry: now.Add(-1 * time.Hour)}, want: true}, - } - for _, tc := range cases { - if got, want := tc.tok.expired(), tc.want; got != want { - t.Errorf("expired (%q) = %v; want %v", tc.name, got, want) - } - } -} - -func TestTokenTypeMethod(t *testing.T) { - cases := []struct { - name string - tok *Token - want string - }{ - {name: "bearer-mixed_case", tok: &Token{TokenType: "beAREr"}, want: "Bearer"}, - {name: "default-bearer", tok: &Token{}, want: "Bearer"}, - {name: "basic", tok: &Token{TokenType: "basic"}, want: "Basic"}, - {name: "basic-capitalized", tok: &Token{TokenType: "Basic"}, want: "Basic"}, - {name: "mac", tok: &Token{TokenType: "mac"}, want: "MAC"}, - {name: "mac-caps", tok: &Token{TokenType: "MAC"}, want: "MAC"}, - {name: "mac-mixed_case", tok: &Token{TokenType: "mAc"}, want: "MAC"}, - } - for _, tc := range cases { - if got, want := tc.tok.Type(), tc.want; got != want { - t.Errorf("TokenType(%q) = %v; want %v", tc.name, got, want) - } - } -} diff --git a/vendor/golang.org/x/oauth2/transport_test.go b/vendor/golang.org/x/oauth2/transport_test.go deleted file mode 100644 index 9bb1383f..00000000 --- a/vendor/golang.org/x/oauth2/transport_test.go +++ /dev/null @@ -1,108 +0,0 @@ -package oauth2 - -import ( - "net/http" - "net/http/httptest" - "testing" - "time" -) - -type tokenSource struct{ token *Token } - -func (t *tokenSource) Token() (*Token, error) { - return t.token, nil -} - -func TestTransportNilTokenSource(t *testing.T) { - tr := &Transport{} - server := newMockServer(func(w http.ResponseWriter, r *http.Request) {}) - defer server.Close() - client := &http.Client{Transport: tr} - res, err := client.Get(server.URL) - if err == nil { - t.Errorf("a nil Source was passed into the transport expected an error") - } - if res != nil { - t.Errorf("expected a nil response, got %v", res) - } -} - -func TestTransportTokenSource(t *testing.T) { - ts := &tokenSource{ - token: &Token{ - AccessToken: "abc", - }, - } - tr := &Transport{ - Source: ts, - } - server := newMockServer(func(w http.ResponseWriter, r *http.Request) { - if r.Header.Get("Authorization") != "Bearer abc" { - t.Errorf("Transport doesn't set the Authorization header from the fetched token") - } - }) - defer server.Close() - client := &http.Client{Transport: tr} - res, err := client.Get(server.URL) - if err != nil { - t.Fatal(err) - } - res.Body.Close() -} - -// Test for case-sensitive token types, per https://github.com/golang/oauth2/issues/113 -func TestTransportTokenSourceTypes(t *testing.T) { - const val = "abc" - tests := []struct { - key string - val string - want string - }{ - {key: "bearer", val: val, want: "Bearer abc"}, - {key: "mac", val: val, want: "MAC abc"}, - {key: "basic", val: val, want: "Basic abc"}, - } - for _, tc := range tests { - ts := &tokenSource{ - token: &Token{ - AccessToken: tc.val, - TokenType: tc.key, - }, - } - tr := &Transport{ - Source: ts, - } - server := newMockServer(func(w http.ResponseWriter, r *http.Request) { - if got, want := r.Header.Get("Authorization"), tc.want; got != want { - t.Errorf("Authorization header (%q) = %q; want %q", val, got, want) - } - }) - defer server.Close() - client := &http.Client{Transport: tr} - res, err := client.Get(server.URL) - if err != nil { - t.Fatal(err) - } - res.Body.Close() - } -} - -func TestTokenValidNoAccessToken(t *testing.T) { - token := &Token{} - if token.Valid() { - t.Errorf("Token should not be valid with no access token") - } -} - -func TestExpiredWithExpiry(t *testing.T) { - token := &Token{ - Expiry: time.Now().Add(-5 * time.Hour), - } - if token.Valid() { - t.Errorf("Token should not be valid if it expired in the past") - } -} - -func newMockServer(handler func(w http.ResponseWriter, r *http.Request)) *httptest.Server { - return httptest.NewServer(http.HandlerFunc(handler)) -} diff --git a/vendor/golang.org/x/oauth2/vk/vk.go b/vendor/golang.org/x/oauth2/vk/vk.go deleted file mode 100644 index bd8e1594..00000000 --- a/vendor/golang.org/x/oauth2/vk/vk.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package vk provides constants for using OAuth2 to access VK.com. -package vk // import "golang.org/x/oauth2/vk" - -import ( - "golang.org/x/oauth2" -) - -// Endpoint is VK's OAuth 2.0 endpoint. -var Endpoint = oauth2.Endpoint{ - AuthURL: "https://oauth.vk.com/authorize", - TokenURL: "https://oauth.vk.com/access_token", -} diff --git a/vendor/google.golang.org/appengine/LICENSE b/vendor/google.golang.org/appengine/LICENSE new file mode 100644 index 00000000..d6456956 --- /dev/null +++ b/vendor/google.golang.org/appengine/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/google.golang.org/appengine/internal/api.go b/vendor/google.golang.org/appengine/internal/api.go new file mode 100644 index 00000000..ec5aa59b --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/api.go @@ -0,0 +1,646 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package internal + +import ( + "bytes" + "errors" + "fmt" + "io/ioutil" + "log" + "net" + "net/http" + "net/url" + "os" + "runtime" + "strconv" + "strings" + "sync" + "sync/atomic" + "time" + + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" + + basepb "google.golang.org/appengine/internal/base" + logpb "google.golang.org/appengine/internal/log" + remotepb "google.golang.org/appengine/internal/remote_api" +) + +const ( + apiPath = "/rpc_http" +) + +var ( + // Incoming headers. + ticketHeader = http.CanonicalHeaderKey("X-AppEngine-API-Ticket") + dapperHeader = http.CanonicalHeaderKey("X-Google-DapperTraceInfo") + traceHeader = http.CanonicalHeaderKey("X-Cloud-Trace-Context") + curNamespaceHeader = http.CanonicalHeaderKey("X-AppEngine-Current-Namespace") + userIPHeader = http.CanonicalHeaderKey("X-AppEngine-User-IP") + remoteAddrHeader = http.CanonicalHeaderKey("X-AppEngine-Remote-Addr") + + // Outgoing headers. + apiEndpointHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Endpoint") + apiEndpointHeaderValue = []string{"app-engine-apis"} + apiMethodHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Method") + apiMethodHeaderValue = []string{"/VMRemoteAPI.CallRemoteAPI"} + apiDeadlineHeader = http.CanonicalHeaderKey("X-Google-RPC-Service-Deadline") + apiContentType = http.CanonicalHeaderKey("Content-Type") + apiContentTypeValue = []string{"application/octet-stream"} + logFlushHeader = http.CanonicalHeaderKey("X-AppEngine-Log-Flush-Count") + + apiHTTPClient = &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyFromEnvironment, + Dial: limitDial, + }, + } +) + +func apiURL() *url.URL { + host, port := "appengine.googleapis.internal", "10001" + if h := os.Getenv("API_HOST"); h != "" { + host = h + } + if p := os.Getenv("API_PORT"); p != "" { + port = p + } + return &url.URL{ + Scheme: "http", + Host: host + ":" + port, + Path: apiPath, + } +} + +func handleHTTP(w http.ResponseWriter, r *http.Request) { + c := &context{ + req: r, + outHeader: w.Header(), + apiURL: apiURL(), + } + stopFlushing := make(chan int) + + ctxs.Lock() + ctxs.m[r] = c + ctxs.Unlock() + defer func() { + ctxs.Lock() + delete(ctxs.m, r) + ctxs.Unlock() + }() + + // Patch up RemoteAddr so it looks reasonable. + if addr := r.Header.Get(userIPHeader); addr != "" { + r.RemoteAddr = addr + } else if addr = r.Header.Get(remoteAddrHeader); addr != "" { + r.RemoteAddr = addr + } else { + // Should not normally reach here, but pick a sensible default anyway. + r.RemoteAddr = "127.0.0.1" + } + // The address in the headers will most likely be of these forms: + // 123.123.123.123 + // 2001:db8::1 + // net/http.Request.RemoteAddr is specified to be in "IP:port" form. + if _, _, err := net.SplitHostPort(r.RemoteAddr); err != nil { + // Assume the remote address is only a host; add a default port. + r.RemoteAddr = net.JoinHostPort(r.RemoteAddr, "80") + } + + // Start goroutine responsible for flushing app logs. + // This is done after adding c to ctx.m (and stopped before removing it) + // because flushing logs requires making an API call. + go c.logFlusher(stopFlushing) + + executeRequestSafely(c, r) + c.outHeader = nil // make sure header changes aren't respected any more + + stopFlushing <- 1 // any logging beyond this point will be dropped + + // Flush any pending logs asynchronously. + c.pendingLogs.Lock() + flushes := c.pendingLogs.flushes + if len(c.pendingLogs.lines) > 0 { + flushes++ + } + c.pendingLogs.Unlock() + go c.flushLog(false) + w.Header().Set(logFlushHeader, strconv.Itoa(flushes)) + + // Avoid nil Write call if c.Write is never called. + if c.outCode != 0 { + w.WriteHeader(c.outCode) + } + if c.outBody != nil { + w.Write(c.outBody) + } +} + +func executeRequestSafely(c *context, r *http.Request) { + defer func() { + if x := recover(); x != nil { + logf(c, 4, "%s", renderPanic(x)) // 4 == critical + c.outCode = 500 + } + }() + + http.DefaultServeMux.ServeHTTP(c, r) +} + +func renderPanic(x interface{}) string { + buf := make([]byte, 16<<10) // 16 KB should be plenty + buf = buf[:runtime.Stack(buf, false)] + + // Remove the first few stack frames: + // this func + // the recover closure in the caller + // That will root the stack trace at the site of the panic. + const ( + skipStart = "internal.renderPanic" + skipFrames = 2 + ) + start := bytes.Index(buf, []byte(skipStart)) + p := start + for i := 0; i < skipFrames*2 && p+1 < len(buf); i++ { + p = bytes.IndexByte(buf[p+1:], '\n') + p + 1 + if p < 0 { + break + } + } + if p >= 0 { + // buf[start:p+1] is the block to remove. + // Copy buf[p+1:] over buf[start:] and shrink buf. + copy(buf[start:], buf[p+1:]) + buf = buf[:len(buf)-(p+1-start)] + } + + // Add panic heading. + head := fmt.Sprintf("panic: %v\n\n", x) + if len(head) > len(buf) { + // Extremely unlikely to happen. + return head + } + copy(buf[len(head):], buf) + copy(buf, head) + + return string(buf) +} + +var ctxs = struct { + sync.Mutex + m map[*http.Request]*context + bg *context // background context, lazily initialized + // dec is used by tests to decorate the netcontext.Context returned + // for a given request. This allows tests to add overrides (such as + // WithAppIDOverride) to the context. The map is nil outside tests. + dec map[*http.Request]func(netcontext.Context) netcontext.Context +}{ + m: make(map[*http.Request]*context), +} + +// context represents the context of an in-flight HTTP request. +// It implements the appengine.Context and http.ResponseWriter interfaces. +type context struct { + req *http.Request + + outCode int + outHeader http.Header + outBody []byte + + pendingLogs struct { + sync.Mutex + lines []*logpb.UserAppLogLine + flushes int + } + + apiURL *url.URL +} + +var contextKey = "holds a *context" + +func fromContext(ctx netcontext.Context) *context { + c, _ := ctx.Value(&contextKey).(*context) + return c +} + +func withContext(parent netcontext.Context, c *context) netcontext.Context { + ctx := netcontext.WithValue(parent, &contextKey, c) + if ns := c.req.Header.Get(curNamespaceHeader); ns != "" { + ctx = withNamespace(ctx, ns) + } + return ctx +} + +func toContext(c *context) netcontext.Context { + return withContext(netcontext.Background(), c) +} + +func IncomingHeaders(ctx netcontext.Context) http.Header { + if c := fromContext(ctx); c != nil { + return c.req.Header + } + return nil +} + +func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context { + ctxs.Lock() + c := ctxs.m[req] + d := ctxs.dec[req] + ctxs.Unlock() + + if d != nil { + parent = d(parent) + } + + if c == nil { + // Someone passed in an http.Request that is not in-flight. + // We panic here rather than panicking at a later point + // so that stack traces will be more sensible. + log.Panic("appengine: NewContext passed an unknown http.Request") + } + return withContext(parent, c) +} + +func BackgroundContext() netcontext.Context { + ctxs.Lock() + defer ctxs.Unlock() + + if ctxs.bg != nil { + return toContext(ctxs.bg) + } + + // Compute background security ticket. + appID := partitionlessAppID() + escAppID := strings.Replace(strings.Replace(appID, ":", "_", -1), ".", "_", -1) + majVersion := VersionID(nil) + if i := strings.Index(majVersion, "."); i > 0 { + majVersion = majVersion[:i] + } + ticket := fmt.Sprintf("%s/%s.%s.%s", escAppID, ModuleName(nil), majVersion, InstanceID()) + + ctxs.bg = &context{ + req: &http.Request{ + Header: http.Header{ + ticketHeader: []string{ticket}, + }, + }, + apiURL: apiURL(), + } + + // TODO(dsymonds): Wire up the shutdown handler to do a final flush. + go ctxs.bg.logFlusher(make(chan int)) + + return toContext(ctxs.bg) +} + +// RegisterTestRequest registers the HTTP request req for testing, such that +// any API calls are sent to the provided URL. It returns a closure to delete +// the registration. +// It should only be used by aetest package. +func RegisterTestRequest(req *http.Request, apiURL *url.URL, decorate func(netcontext.Context) netcontext.Context) func() { + c := &context{ + req: req, + apiURL: apiURL, + } + ctxs.Lock() + defer ctxs.Unlock() + if _, ok := ctxs.m[req]; ok { + log.Panic("req already associated with context") + } + if _, ok := ctxs.dec[req]; ok { + log.Panic("req already associated with context") + } + if ctxs.dec == nil { + ctxs.dec = make(map[*http.Request]func(netcontext.Context) netcontext.Context) + } + ctxs.m[req] = c + ctxs.dec[req] = decorate + + return func() { + ctxs.Lock() + delete(ctxs.m, req) + delete(ctxs.dec, req) + ctxs.Unlock() + } +} + +var errTimeout = &CallError{ + Detail: "Deadline exceeded", + Code: int32(remotepb.RpcError_CANCELLED), + Timeout: true, +} + +func (c *context) Header() http.Header { return c.outHeader } + +// Copied from $GOROOT/src/pkg/net/http/transfer.go. Some response status +// codes do not permit a response body (nor response entity headers such as +// Content-Length, Content-Type, etc). +func bodyAllowedForStatus(status int) bool { + switch { + case status >= 100 && status <= 199: + return false + case status == 204: + return false + case status == 304: + return false + } + return true +} + +func (c *context) Write(b []byte) (int, error) { + if c.outCode == 0 { + c.WriteHeader(http.StatusOK) + } + if len(b) > 0 && !bodyAllowedForStatus(c.outCode) { + return 0, http.ErrBodyNotAllowed + } + c.outBody = append(c.outBody, b...) + return len(b), nil +} + +func (c *context) WriteHeader(code int) { + if c.outCode != 0 { + logf(c, 3, "WriteHeader called multiple times on request.") // error level + return + } + c.outCode = code +} + +func (c *context) post(body []byte, timeout time.Duration) (b []byte, err error) { + hreq := &http.Request{ + Method: "POST", + URL: c.apiURL, + Header: http.Header{ + apiEndpointHeader: apiEndpointHeaderValue, + apiMethodHeader: apiMethodHeaderValue, + apiContentType: apiContentTypeValue, + apiDeadlineHeader: []string{strconv.FormatFloat(timeout.Seconds(), 'f', -1, 64)}, + }, + Body: ioutil.NopCloser(bytes.NewReader(body)), + ContentLength: int64(len(body)), + Host: c.apiURL.Host, + } + if info := c.req.Header.Get(dapperHeader); info != "" { + hreq.Header.Set(dapperHeader, info) + } + if info := c.req.Header.Get(traceHeader); info != "" { + hreq.Header.Set(traceHeader, info) + } + + tr := apiHTTPClient.Transport.(*http.Transport) + + var timedOut int32 // atomic; set to 1 if timed out + t := time.AfterFunc(timeout, func() { + atomic.StoreInt32(&timedOut, 1) + tr.CancelRequest(hreq) + }) + defer t.Stop() + defer func() { + // Check if timeout was exceeded. + if atomic.LoadInt32(&timedOut) != 0 { + err = errTimeout + } + }() + + hresp, err := apiHTTPClient.Do(hreq) + if err != nil { + return nil, &CallError{ + Detail: fmt.Sprintf("service bridge HTTP failed: %v", err), + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + defer hresp.Body.Close() + hrespBody, err := ioutil.ReadAll(hresp.Body) + if hresp.StatusCode != 200 { + return nil, &CallError{ + Detail: fmt.Sprintf("service bridge returned HTTP %d (%q)", hresp.StatusCode, hrespBody), + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + if err != nil { + return nil, &CallError{ + Detail: fmt.Sprintf("service bridge response bad: %v", err), + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + return hrespBody, nil +} + +func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error { + if ns := NamespaceFromContext(ctx); ns != "" { + if fn, ok := NamespaceMods[service]; ok { + fn(in, ns) + } + } + + if f, ctx, ok := callOverrideFromContext(ctx); ok { + return f(ctx, service, method, in, out) + } + + // Handle already-done contexts quickly. + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + c := fromContext(ctx) + if c == nil { + // Give a good error message rather than a panic lower down. + return errors.New("not an App Engine context") + } + + // Apply transaction modifications if we're in a transaction. + if t := transactionFromContext(ctx); t != nil { + if t.finished { + return errors.New("transaction context has expired") + } + applyTransaction(in, &t.transaction) + } + + // Default RPC timeout is 60s. + timeout := 60 * time.Second + if deadline, ok := ctx.Deadline(); ok { + timeout = deadline.Sub(time.Now()) + } + + data, err := proto.Marshal(in) + if err != nil { + return err + } + + ticket := c.req.Header.Get(ticketHeader) + req := &remotepb.Request{ + ServiceName: &service, + Method: &method, + Request: data, + RequestId: &ticket, + } + hreqBody, err := proto.Marshal(req) + if err != nil { + return err + } + + hrespBody, err := c.post(hreqBody, timeout) + if err != nil { + return err + } + + res := &remotepb.Response{} + if err := proto.Unmarshal(hrespBody, res); err != nil { + return err + } + if res.RpcError != nil { + ce := &CallError{ + Detail: res.RpcError.GetDetail(), + Code: *res.RpcError.Code, + } + switch remotepb.RpcError_ErrorCode(ce.Code) { + case remotepb.RpcError_CANCELLED, remotepb.RpcError_DEADLINE_EXCEEDED: + ce.Timeout = true + } + return ce + } + if res.ApplicationError != nil { + return &APIError{ + Service: *req.ServiceName, + Detail: res.ApplicationError.GetDetail(), + Code: *res.ApplicationError.Code, + } + } + if res.Exception != nil || res.JavaException != nil { + // This shouldn't happen, but let's be defensive. + return &CallError{ + Detail: "service bridge returned exception", + Code: int32(remotepb.RpcError_UNKNOWN), + } + } + return proto.Unmarshal(res.Response, out) +} + +func (c *context) Request() *http.Request { + return c.req +} + +func (c *context) addLogLine(ll *logpb.UserAppLogLine) { + // Truncate long log lines. + // TODO(dsymonds): Check if this is still necessary. + const lim = 8 << 10 + if len(*ll.Message) > lim { + suffix := fmt.Sprintf("...(length %d)", len(*ll.Message)) + ll.Message = proto.String((*ll.Message)[:lim-len(suffix)] + suffix) + } + + c.pendingLogs.Lock() + c.pendingLogs.lines = append(c.pendingLogs.lines, ll) + c.pendingLogs.Unlock() +} + +var logLevelName = map[int64]string{ + 0: "DEBUG", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + 4: "CRITICAL", +} + +func logf(c *context, level int64, format string, args ...interface{}) { + s := fmt.Sprintf(format, args...) + s = strings.TrimRight(s, "\n") // Remove any trailing newline characters. + c.addLogLine(&logpb.UserAppLogLine{ + TimestampUsec: proto.Int64(time.Now().UnixNano() / 1e3), + Level: &level, + Message: &s, + }) + log.Print(logLevelName[level] + ": " + s) +} + +// flushLog attempts to flush any pending logs to the appserver. +// It should not be called concurrently. +func (c *context) flushLog(force bool) (flushed bool) { + c.pendingLogs.Lock() + // Grab up to 30 MB. We can get away with up to 32 MB, but let's be cautious. + n, rem := 0, 30<<20 + for ; n < len(c.pendingLogs.lines); n++ { + ll := c.pendingLogs.lines[n] + // Each log line will require about 3 bytes of overhead. + nb := proto.Size(ll) + 3 + if nb > rem { + break + } + rem -= nb + } + lines := c.pendingLogs.lines[:n] + c.pendingLogs.lines = c.pendingLogs.lines[n:] + c.pendingLogs.Unlock() + + if len(lines) == 0 && !force { + // Nothing to flush. + return false + } + + rescueLogs := false + defer func() { + if rescueLogs { + c.pendingLogs.Lock() + c.pendingLogs.lines = append(lines, c.pendingLogs.lines...) + c.pendingLogs.Unlock() + } + }() + + buf, err := proto.Marshal(&logpb.UserAppLogGroup{ + LogLine: lines, + }) + if err != nil { + log.Printf("internal.flushLog: marshaling UserAppLogGroup: %v", err) + rescueLogs = true + return false + } + + req := &logpb.FlushRequest{ + Logs: buf, + } + res := &basepb.VoidProto{} + c.pendingLogs.Lock() + c.pendingLogs.flushes++ + c.pendingLogs.Unlock() + if err := Call(toContext(c), "logservice", "Flush", req, res); err != nil { + log.Printf("internal.flushLog: Flush RPC: %v", err) + rescueLogs = true + return false + } + return true +} + +const ( + // Log flushing parameters. + flushInterval = 1 * time.Second + forceFlushInterval = 60 * time.Second +) + +func (c *context) logFlusher(stop <-chan int) { + lastFlush := time.Now() + tick := time.NewTicker(flushInterval) + for { + select { + case <-stop: + // Request finished. + tick.Stop() + return + case <-tick.C: + force := time.Now().Sub(lastFlush) > forceFlushInterval + if c.flushLog(force) { + lastFlush = time.Now() + } + } + } +} + +func ContextForTesting(req *http.Request) netcontext.Context { + return toContext(&context{req: req}) +} diff --git a/vendor/google.golang.org/appengine/internal/api_classic.go b/vendor/google.golang.org/appengine/internal/api_classic.go new file mode 100644 index 00000000..597f66e6 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/api_classic.go @@ -0,0 +1,159 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import ( + "errors" + "fmt" + "net/http" + "time" + + "appengine" + "appengine_internal" + basepb "appengine_internal/base" + + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" +) + +var contextKey = "holds an appengine.Context" + +func fromContext(ctx netcontext.Context) appengine.Context { + c, _ := ctx.Value(&contextKey).(appengine.Context) + return c +} + +// This is only for classic App Engine adapters. +func ClassicContextFromContext(ctx netcontext.Context) appengine.Context { + return fromContext(ctx) +} + +func withContext(parent netcontext.Context, c appengine.Context) netcontext.Context { + ctx := netcontext.WithValue(parent, &contextKey, c) + + s := &basepb.StringProto{} + c.Call("__go__", "GetNamespace", &basepb.VoidProto{}, s, nil) + if ns := s.GetValue(); ns != "" { + ctx = NamespacedContext(ctx, ns) + } + + return ctx +} + +func IncomingHeaders(ctx netcontext.Context) http.Header { + if c := fromContext(ctx); c != nil { + if req, ok := c.Request().(*http.Request); ok { + return req.Header + } + } + return nil +} + +func WithContext(parent netcontext.Context, req *http.Request) netcontext.Context { + c := appengine.NewContext(req) + return withContext(parent, c) +} + +type testingContext struct { + appengine.Context + + req *http.Request +} + +func (t *testingContext) FullyQualifiedAppID() string { return "dev~testcontext" } +func (t *testingContext) Call(service, method string, _, _ appengine_internal.ProtoMessage, _ *appengine_internal.CallOptions) error { + if service == "__go__" && method == "GetNamespace" { + return nil + } + return fmt.Errorf("testingContext: unsupported Call") +} +func (t *testingContext) Request() interface{} { return t.req } + +func ContextForTesting(req *http.Request) netcontext.Context { + return withContext(netcontext.Background(), &testingContext{req: req}) +} + +func Call(ctx netcontext.Context, service, method string, in, out proto.Message) error { + if ns := NamespaceFromContext(ctx); ns != "" { + if fn, ok := NamespaceMods[service]; ok { + fn(in, ns) + } + } + + if f, ctx, ok := callOverrideFromContext(ctx); ok { + return f(ctx, service, method, in, out) + } + + // Handle already-done contexts quickly. + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + c := fromContext(ctx) + if c == nil { + // Give a good error message rather than a panic lower down. + return errors.New("not an App Engine context") + } + + // Apply transaction modifications if we're in a transaction. + if t := transactionFromContext(ctx); t != nil { + if t.finished { + return errors.New("transaction context has expired") + } + applyTransaction(in, &t.transaction) + } + + var opts *appengine_internal.CallOptions + if d, ok := ctx.Deadline(); ok { + opts = &appengine_internal.CallOptions{ + Timeout: d.Sub(time.Now()), + } + } + + err := c.Call(service, method, in, out, opts) + switch v := err.(type) { + case *appengine_internal.APIError: + return &APIError{ + Service: v.Service, + Detail: v.Detail, + Code: v.Code, + } + case *appengine_internal.CallError: + return &CallError{ + Detail: v.Detail, + Code: v.Code, + Timeout: v.Timeout, + } + } + return err +} + +func handleHTTP(w http.ResponseWriter, r *http.Request) { + panic("handleHTTP called; this should be impossible") +} + +func logf(c appengine.Context, level int64, format string, args ...interface{}) { + var fn func(format string, args ...interface{}) + switch level { + case 0: + fn = c.Debugf + case 1: + fn = c.Infof + case 2: + fn = c.Warningf + case 3: + fn = c.Errorf + case 4: + fn = c.Criticalf + default: + // This shouldn't happen. + fn = c.Criticalf + } + fn(format, args...) +} diff --git a/vendor/google.golang.org/appengine/internal/api_common.go b/vendor/google.golang.org/appengine/internal/api_common.go new file mode 100644 index 00000000..2db33a77 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/api_common.go @@ -0,0 +1,86 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +import ( + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" +) + +type CallOverrideFunc func(ctx netcontext.Context, service, method string, in, out proto.Message) error + +var callOverrideKey = "holds []CallOverrideFunc" + +func WithCallOverride(ctx netcontext.Context, f CallOverrideFunc) netcontext.Context { + // We avoid appending to any existing call override + // so we don't risk overwriting a popped stack below. + var cofs []CallOverrideFunc + if uf, ok := ctx.Value(&callOverrideKey).([]CallOverrideFunc); ok { + cofs = append(cofs, uf...) + } + cofs = append(cofs, f) + return netcontext.WithValue(ctx, &callOverrideKey, cofs) +} + +func callOverrideFromContext(ctx netcontext.Context) (CallOverrideFunc, netcontext.Context, bool) { + cofs, _ := ctx.Value(&callOverrideKey).([]CallOverrideFunc) + if len(cofs) == 0 { + return nil, nil, false + } + // We found a list of overrides; grab the last, and reconstitute a + // context that will hide it. + f := cofs[len(cofs)-1] + ctx = netcontext.WithValue(ctx, &callOverrideKey, cofs[:len(cofs)-1]) + return f, ctx, true +} + +type logOverrideFunc func(level int64, format string, args ...interface{}) + +var logOverrideKey = "holds a logOverrideFunc" + +func WithLogOverride(ctx netcontext.Context, f logOverrideFunc) netcontext.Context { + return netcontext.WithValue(ctx, &logOverrideKey, f) +} + +var appIDOverrideKey = "holds a string, being the full app ID" + +func WithAppIDOverride(ctx netcontext.Context, appID string) netcontext.Context { + return netcontext.WithValue(ctx, &appIDOverrideKey, appID) +} + +var namespaceKey = "holds the namespace string" + +func withNamespace(ctx netcontext.Context, ns string) netcontext.Context { + return netcontext.WithValue(ctx, &namespaceKey, ns) +} + +func NamespaceFromContext(ctx netcontext.Context) string { + // If there's no namespace, return the empty string. + ns, _ := ctx.Value(&namespaceKey).(string) + return ns +} + +// FullyQualifiedAppID returns the fully-qualified application ID. +// This may contain a partition prefix (e.g. "s~" for High Replication apps), +// or a domain prefix (e.g. "example.com:"). +func FullyQualifiedAppID(ctx netcontext.Context) string { + if id, ok := ctx.Value(&appIDOverrideKey).(string); ok { + return id + } + return fullyQualifiedAppID(ctx) +} + +func Logf(ctx netcontext.Context, level int64, format string, args ...interface{}) { + if f, ok := ctx.Value(&logOverrideKey).(logOverrideFunc); ok { + f(level, format, args...) + return + } + logf(fromContext(ctx), level, format, args...) +} + +// NamespacedContext wraps a Context to support namespaces. +func NamespacedContext(ctx netcontext.Context, namespace string) netcontext.Context { + return withNamespace(ctx, namespace) +} diff --git a/vendor/google.golang.org/appengine/internal/app_id.go b/vendor/google.golang.org/appengine/internal/app_id.go new file mode 100644 index 00000000..11df8c07 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/app_id.go @@ -0,0 +1,28 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +import ( + "strings" +) + +func parseFullAppID(appid string) (partition, domain, displayID string) { + if i := strings.Index(appid, "~"); i != -1 { + partition, appid = appid[:i], appid[i+1:] + } + if i := strings.Index(appid, ":"); i != -1 { + domain, appid = appid[:i], appid[i+1:] + } + return partition, domain, appid +} + +// appID returns "appid" or "domain.com:appid". +func appID(fullAppID string) string { + _, dom, dis := parseFullAppID(fullAppID) + if dom != "" { + return dom + ":" + dis + } + return dis +} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.pb.go b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go new file mode 100644 index 00000000..36a19565 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/base/api_base.pb.go @@ -0,0 +1,133 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/base/api_base.proto +// DO NOT EDIT! + +/* +Package base is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/base/api_base.proto + +It has these top-level messages: + StringProto + Integer32Proto + Integer64Proto + BoolProto + DoubleProto + BytesProto + VoidProto +*/ +package base + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type StringProto struct { + Value *string `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *StringProto) Reset() { *m = StringProto{} } +func (m *StringProto) String() string { return proto.CompactTextString(m) } +func (*StringProto) ProtoMessage() {} + +func (m *StringProto) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type Integer32Proto struct { + Value *int32 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Integer32Proto) Reset() { *m = Integer32Proto{} } +func (m *Integer32Proto) String() string { return proto.CompactTextString(m) } +func (*Integer32Proto) ProtoMessage() {} + +func (m *Integer32Proto) GetValue() int32 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type Integer64Proto struct { + Value *int64 `protobuf:"varint,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Integer64Proto) Reset() { *m = Integer64Proto{} } +func (m *Integer64Proto) String() string { return proto.CompactTextString(m) } +func (*Integer64Proto) ProtoMessage() {} + +func (m *Integer64Proto) GetValue() int64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type BoolProto struct { + Value *bool `protobuf:"varint,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *BoolProto) Reset() { *m = BoolProto{} } +func (m *BoolProto) String() string { return proto.CompactTextString(m) } +func (*BoolProto) ProtoMessage() {} + +func (m *BoolProto) GetValue() bool { + if m != nil && m.Value != nil { + return *m.Value + } + return false +} + +type DoubleProto struct { + Value *float64 `protobuf:"fixed64,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DoubleProto) Reset() { *m = DoubleProto{} } +func (m *DoubleProto) String() string { return proto.CompactTextString(m) } +func (*DoubleProto) ProtoMessage() {} + +func (m *DoubleProto) GetValue() float64 { + if m != nil && m.Value != nil { + return *m.Value + } + return 0 +} + +type BytesProto struct { + Value []byte `protobuf:"bytes,1,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *BytesProto) Reset() { *m = BytesProto{} } +func (m *BytesProto) String() string { return proto.CompactTextString(m) } +func (*BytesProto) ProtoMessage() {} + +func (m *BytesProto) GetValue() []byte { + if m != nil { + return m.Value + } + return nil +} + +type VoidProto struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *VoidProto) Reset() { *m = VoidProto{} } +func (m *VoidProto) String() string { return proto.CompactTextString(m) } +func (*VoidProto) ProtoMessage() {} diff --git a/vendor/google.golang.org/appengine/internal/base/api_base.proto b/vendor/google.golang.org/appengine/internal/base/api_base.proto new file mode 100644 index 00000000..56cd7a3c --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/base/api_base.proto @@ -0,0 +1,33 @@ +// Built-in base types for API calls. Primarily useful as return types. + +syntax = "proto2"; +option go_package = "base"; + +package appengine.base; + +message StringProto { + required string value = 1; +} + +message Integer32Proto { + required int32 value = 1; +} + +message Integer64Proto { + required int64 value = 1; +} + +message BoolProto { + required bool value = 1; +} + +message DoubleProto { + required double value = 1; +} + +message BytesProto { + required bytes value = 1 [ctype=CORD]; +} + +message VoidProto { +} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go new file mode 100644 index 00000000..8613cb73 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go @@ -0,0 +1,2778 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/datastore/datastore_v3.proto +// DO NOT EDIT! + +/* +Package datastore is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/datastore/datastore_v3.proto + +It has these top-level messages: + Action + PropertyValue + Property + Path + Reference + User + EntityProto + CompositeProperty + Index + CompositeIndex + IndexPostfix + IndexPosition + Snapshot + InternalHeader + Transaction + Query + CompiledQuery + CompiledCursor + Cursor + Error + Cost + GetRequest + GetResponse + PutRequest + PutResponse + TouchRequest + TouchResponse + DeleteRequest + DeleteResponse + NextRequest + QueryResult + AllocateIdsRequest + AllocateIdsResponse + CompositeIndices + AddActionsRequest + AddActionsResponse + BeginTransactionRequest + CommitResponse +*/ +package datastore + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type Property_Meaning int32 + +const ( + Property_NO_MEANING Property_Meaning = 0 + Property_BLOB Property_Meaning = 14 + Property_TEXT Property_Meaning = 15 + Property_BYTESTRING Property_Meaning = 16 + Property_ATOM_CATEGORY Property_Meaning = 1 + Property_ATOM_LINK Property_Meaning = 2 + Property_ATOM_TITLE Property_Meaning = 3 + Property_ATOM_CONTENT Property_Meaning = 4 + Property_ATOM_SUMMARY Property_Meaning = 5 + Property_ATOM_AUTHOR Property_Meaning = 6 + Property_GD_WHEN Property_Meaning = 7 + Property_GD_EMAIL Property_Meaning = 8 + Property_GEORSS_POINT Property_Meaning = 9 + Property_GD_IM Property_Meaning = 10 + Property_GD_PHONENUMBER Property_Meaning = 11 + Property_GD_POSTALADDRESS Property_Meaning = 12 + Property_GD_RATING Property_Meaning = 13 + Property_BLOBKEY Property_Meaning = 17 + Property_ENTITY_PROTO Property_Meaning = 19 + Property_INDEX_VALUE Property_Meaning = 18 +) + +var Property_Meaning_name = map[int32]string{ + 0: "NO_MEANING", + 14: "BLOB", + 15: "TEXT", + 16: "BYTESTRING", + 1: "ATOM_CATEGORY", + 2: "ATOM_LINK", + 3: "ATOM_TITLE", + 4: "ATOM_CONTENT", + 5: "ATOM_SUMMARY", + 6: "ATOM_AUTHOR", + 7: "GD_WHEN", + 8: "GD_EMAIL", + 9: "GEORSS_POINT", + 10: "GD_IM", + 11: "GD_PHONENUMBER", + 12: "GD_POSTALADDRESS", + 13: "GD_RATING", + 17: "BLOBKEY", + 19: "ENTITY_PROTO", + 18: "INDEX_VALUE", +} +var Property_Meaning_value = map[string]int32{ + "NO_MEANING": 0, + "BLOB": 14, + "TEXT": 15, + "BYTESTRING": 16, + "ATOM_CATEGORY": 1, + "ATOM_LINK": 2, + "ATOM_TITLE": 3, + "ATOM_CONTENT": 4, + "ATOM_SUMMARY": 5, + "ATOM_AUTHOR": 6, + "GD_WHEN": 7, + "GD_EMAIL": 8, + "GEORSS_POINT": 9, + "GD_IM": 10, + "GD_PHONENUMBER": 11, + "GD_POSTALADDRESS": 12, + "GD_RATING": 13, + "BLOBKEY": 17, + "ENTITY_PROTO": 19, + "INDEX_VALUE": 18, +} + +func (x Property_Meaning) Enum() *Property_Meaning { + p := new(Property_Meaning) + *p = x + return p +} +func (x Property_Meaning) String() string { + return proto.EnumName(Property_Meaning_name, int32(x)) +} +func (x *Property_Meaning) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Property_Meaning_value, data, "Property_Meaning") + if err != nil { + return err + } + *x = Property_Meaning(value) + return nil +} + +type Property_FtsTokenizationOption int32 + +const ( + Property_HTML Property_FtsTokenizationOption = 1 + Property_ATOM Property_FtsTokenizationOption = 2 +) + +var Property_FtsTokenizationOption_name = map[int32]string{ + 1: "HTML", + 2: "ATOM", +} +var Property_FtsTokenizationOption_value = map[string]int32{ + "HTML": 1, + "ATOM": 2, +} + +func (x Property_FtsTokenizationOption) Enum() *Property_FtsTokenizationOption { + p := new(Property_FtsTokenizationOption) + *p = x + return p +} +func (x Property_FtsTokenizationOption) String() string { + return proto.EnumName(Property_FtsTokenizationOption_name, int32(x)) +} +func (x *Property_FtsTokenizationOption) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Property_FtsTokenizationOption_value, data, "Property_FtsTokenizationOption") + if err != nil { + return err + } + *x = Property_FtsTokenizationOption(value) + return nil +} + +type EntityProto_Kind int32 + +const ( + EntityProto_GD_CONTACT EntityProto_Kind = 1 + EntityProto_GD_EVENT EntityProto_Kind = 2 + EntityProto_GD_MESSAGE EntityProto_Kind = 3 +) + +var EntityProto_Kind_name = map[int32]string{ + 1: "GD_CONTACT", + 2: "GD_EVENT", + 3: "GD_MESSAGE", +} +var EntityProto_Kind_value = map[string]int32{ + "GD_CONTACT": 1, + "GD_EVENT": 2, + "GD_MESSAGE": 3, +} + +func (x EntityProto_Kind) Enum() *EntityProto_Kind { + p := new(EntityProto_Kind) + *p = x + return p +} +func (x EntityProto_Kind) String() string { + return proto.EnumName(EntityProto_Kind_name, int32(x)) +} +func (x *EntityProto_Kind) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(EntityProto_Kind_value, data, "EntityProto_Kind") + if err != nil { + return err + } + *x = EntityProto_Kind(value) + return nil +} + +type Index_Property_Direction int32 + +const ( + Index_Property_ASCENDING Index_Property_Direction = 1 + Index_Property_DESCENDING Index_Property_Direction = 2 +) + +var Index_Property_Direction_name = map[int32]string{ + 1: "ASCENDING", + 2: "DESCENDING", +} +var Index_Property_Direction_value = map[string]int32{ + "ASCENDING": 1, + "DESCENDING": 2, +} + +func (x Index_Property_Direction) Enum() *Index_Property_Direction { + p := new(Index_Property_Direction) + *p = x + return p +} +func (x Index_Property_Direction) String() string { + return proto.EnumName(Index_Property_Direction_name, int32(x)) +} +func (x *Index_Property_Direction) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Index_Property_Direction_value, data, "Index_Property_Direction") + if err != nil { + return err + } + *x = Index_Property_Direction(value) + return nil +} + +type CompositeIndex_State int32 + +const ( + CompositeIndex_WRITE_ONLY CompositeIndex_State = 1 + CompositeIndex_READ_WRITE CompositeIndex_State = 2 + CompositeIndex_DELETED CompositeIndex_State = 3 + CompositeIndex_ERROR CompositeIndex_State = 4 +) + +var CompositeIndex_State_name = map[int32]string{ + 1: "WRITE_ONLY", + 2: "READ_WRITE", + 3: "DELETED", + 4: "ERROR", +} +var CompositeIndex_State_value = map[string]int32{ + "WRITE_ONLY": 1, + "READ_WRITE": 2, + "DELETED": 3, + "ERROR": 4, +} + +func (x CompositeIndex_State) Enum() *CompositeIndex_State { + p := new(CompositeIndex_State) + *p = x + return p +} +func (x CompositeIndex_State) String() string { + return proto.EnumName(CompositeIndex_State_name, int32(x)) +} +func (x *CompositeIndex_State) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(CompositeIndex_State_value, data, "CompositeIndex_State") + if err != nil { + return err + } + *x = CompositeIndex_State(value) + return nil +} + +type Snapshot_Status int32 + +const ( + Snapshot_INACTIVE Snapshot_Status = 0 + Snapshot_ACTIVE Snapshot_Status = 1 +) + +var Snapshot_Status_name = map[int32]string{ + 0: "INACTIVE", + 1: "ACTIVE", +} +var Snapshot_Status_value = map[string]int32{ + "INACTIVE": 0, + "ACTIVE": 1, +} + +func (x Snapshot_Status) Enum() *Snapshot_Status { + p := new(Snapshot_Status) + *p = x + return p +} +func (x Snapshot_Status) String() string { + return proto.EnumName(Snapshot_Status_name, int32(x)) +} +func (x *Snapshot_Status) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Snapshot_Status_value, data, "Snapshot_Status") + if err != nil { + return err + } + *x = Snapshot_Status(value) + return nil +} + +type Query_Hint int32 + +const ( + Query_ORDER_FIRST Query_Hint = 1 + Query_ANCESTOR_FIRST Query_Hint = 2 + Query_FILTER_FIRST Query_Hint = 3 +) + +var Query_Hint_name = map[int32]string{ + 1: "ORDER_FIRST", + 2: "ANCESTOR_FIRST", + 3: "FILTER_FIRST", +} +var Query_Hint_value = map[string]int32{ + "ORDER_FIRST": 1, + "ANCESTOR_FIRST": 2, + "FILTER_FIRST": 3, +} + +func (x Query_Hint) Enum() *Query_Hint { + p := new(Query_Hint) + *p = x + return p +} +func (x Query_Hint) String() string { + return proto.EnumName(Query_Hint_name, int32(x)) +} +func (x *Query_Hint) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Query_Hint_value, data, "Query_Hint") + if err != nil { + return err + } + *x = Query_Hint(value) + return nil +} + +type Query_Filter_Operator int32 + +const ( + Query_Filter_LESS_THAN Query_Filter_Operator = 1 + Query_Filter_LESS_THAN_OR_EQUAL Query_Filter_Operator = 2 + Query_Filter_GREATER_THAN Query_Filter_Operator = 3 + Query_Filter_GREATER_THAN_OR_EQUAL Query_Filter_Operator = 4 + Query_Filter_EQUAL Query_Filter_Operator = 5 + Query_Filter_IN Query_Filter_Operator = 6 + Query_Filter_EXISTS Query_Filter_Operator = 7 +) + +var Query_Filter_Operator_name = map[int32]string{ + 1: "LESS_THAN", + 2: "LESS_THAN_OR_EQUAL", + 3: "GREATER_THAN", + 4: "GREATER_THAN_OR_EQUAL", + 5: "EQUAL", + 6: "IN", + 7: "EXISTS", +} +var Query_Filter_Operator_value = map[string]int32{ + "LESS_THAN": 1, + "LESS_THAN_OR_EQUAL": 2, + "GREATER_THAN": 3, + "GREATER_THAN_OR_EQUAL": 4, + "EQUAL": 5, + "IN": 6, + "EXISTS": 7, +} + +func (x Query_Filter_Operator) Enum() *Query_Filter_Operator { + p := new(Query_Filter_Operator) + *p = x + return p +} +func (x Query_Filter_Operator) String() string { + return proto.EnumName(Query_Filter_Operator_name, int32(x)) +} +func (x *Query_Filter_Operator) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Query_Filter_Operator_value, data, "Query_Filter_Operator") + if err != nil { + return err + } + *x = Query_Filter_Operator(value) + return nil +} + +type Query_Order_Direction int32 + +const ( + Query_Order_ASCENDING Query_Order_Direction = 1 + Query_Order_DESCENDING Query_Order_Direction = 2 +) + +var Query_Order_Direction_name = map[int32]string{ + 1: "ASCENDING", + 2: "DESCENDING", +} +var Query_Order_Direction_value = map[string]int32{ + "ASCENDING": 1, + "DESCENDING": 2, +} + +func (x Query_Order_Direction) Enum() *Query_Order_Direction { + p := new(Query_Order_Direction) + *p = x + return p +} +func (x Query_Order_Direction) String() string { + return proto.EnumName(Query_Order_Direction_name, int32(x)) +} +func (x *Query_Order_Direction) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Query_Order_Direction_value, data, "Query_Order_Direction") + if err != nil { + return err + } + *x = Query_Order_Direction(value) + return nil +} + +type Error_ErrorCode int32 + +const ( + Error_BAD_REQUEST Error_ErrorCode = 1 + Error_CONCURRENT_TRANSACTION Error_ErrorCode = 2 + Error_INTERNAL_ERROR Error_ErrorCode = 3 + Error_NEED_INDEX Error_ErrorCode = 4 + Error_TIMEOUT Error_ErrorCode = 5 + Error_PERMISSION_DENIED Error_ErrorCode = 6 + Error_BIGTABLE_ERROR Error_ErrorCode = 7 + Error_COMMITTED_BUT_STILL_APPLYING Error_ErrorCode = 8 + Error_CAPABILITY_DISABLED Error_ErrorCode = 9 + Error_TRY_ALTERNATE_BACKEND Error_ErrorCode = 10 + Error_SAFE_TIME_TOO_OLD Error_ErrorCode = 11 +) + +var Error_ErrorCode_name = map[int32]string{ + 1: "BAD_REQUEST", + 2: "CONCURRENT_TRANSACTION", + 3: "INTERNAL_ERROR", + 4: "NEED_INDEX", + 5: "TIMEOUT", + 6: "PERMISSION_DENIED", + 7: "BIGTABLE_ERROR", + 8: "COMMITTED_BUT_STILL_APPLYING", + 9: "CAPABILITY_DISABLED", + 10: "TRY_ALTERNATE_BACKEND", + 11: "SAFE_TIME_TOO_OLD", +} +var Error_ErrorCode_value = map[string]int32{ + "BAD_REQUEST": 1, + "CONCURRENT_TRANSACTION": 2, + "INTERNAL_ERROR": 3, + "NEED_INDEX": 4, + "TIMEOUT": 5, + "PERMISSION_DENIED": 6, + "BIGTABLE_ERROR": 7, + "COMMITTED_BUT_STILL_APPLYING": 8, + "CAPABILITY_DISABLED": 9, + "TRY_ALTERNATE_BACKEND": 10, + "SAFE_TIME_TOO_OLD": 11, +} + +func (x Error_ErrorCode) Enum() *Error_ErrorCode { + p := new(Error_ErrorCode) + *p = x + return p +} +func (x Error_ErrorCode) String() string { + return proto.EnumName(Error_ErrorCode_name, int32(x)) +} +func (x *Error_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(Error_ErrorCode_value, data, "Error_ErrorCode") + if err != nil { + return err + } + *x = Error_ErrorCode(value) + return nil +} + +type PutRequest_AutoIdPolicy int32 + +const ( + PutRequest_CURRENT PutRequest_AutoIdPolicy = 0 + PutRequest_SEQUENTIAL PutRequest_AutoIdPolicy = 1 +) + +var PutRequest_AutoIdPolicy_name = map[int32]string{ + 0: "CURRENT", + 1: "SEQUENTIAL", +} +var PutRequest_AutoIdPolicy_value = map[string]int32{ + "CURRENT": 0, + "SEQUENTIAL": 1, +} + +func (x PutRequest_AutoIdPolicy) Enum() *PutRequest_AutoIdPolicy { + p := new(PutRequest_AutoIdPolicy) + *p = x + return p +} +func (x PutRequest_AutoIdPolicy) String() string { + return proto.EnumName(PutRequest_AutoIdPolicy_name, int32(x)) +} +func (x *PutRequest_AutoIdPolicy) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(PutRequest_AutoIdPolicy_value, data, "PutRequest_AutoIdPolicy") + if err != nil { + return err + } + *x = PutRequest_AutoIdPolicy(value) + return nil +} + +type Action struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Action) Reset() { *m = Action{} } +func (m *Action) String() string { return proto.CompactTextString(m) } +func (*Action) ProtoMessage() {} + +type PropertyValue struct { + Int64Value *int64 `protobuf:"varint,1,opt,name=int64Value" json:"int64Value,omitempty"` + BooleanValue *bool `protobuf:"varint,2,opt,name=booleanValue" json:"booleanValue,omitempty"` + StringValue *string `protobuf:"bytes,3,opt,name=stringValue" json:"stringValue,omitempty"` + DoubleValue *float64 `protobuf:"fixed64,4,opt,name=doubleValue" json:"doubleValue,omitempty"` + Pointvalue *PropertyValue_PointValue `protobuf:"group,5,opt,name=PointValue" json:"pointvalue,omitempty"` + Uservalue *PropertyValue_UserValue `protobuf:"group,8,opt,name=UserValue" json:"uservalue,omitempty"` + Referencevalue *PropertyValue_ReferenceValue `protobuf:"group,12,opt,name=ReferenceValue" json:"referencevalue,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue) Reset() { *m = PropertyValue{} } +func (m *PropertyValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue) ProtoMessage() {} + +func (m *PropertyValue) GetInt64Value() int64 { + if m != nil && m.Int64Value != nil { + return *m.Int64Value + } + return 0 +} + +func (m *PropertyValue) GetBooleanValue() bool { + if m != nil && m.BooleanValue != nil { + return *m.BooleanValue + } + return false +} + +func (m *PropertyValue) GetStringValue() string { + if m != nil && m.StringValue != nil { + return *m.StringValue + } + return "" +} + +func (m *PropertyValue) GetDoubleValue() float64 { + if m != nil && m.DoubleValue != nil { + return *m.DoubleValue + } + return 0 +} + +func (m *PropertyValue) GetPointvalue() *PropertyValue_PointValue { + if m != nil { + return m.Pointvalue + } + return nil +} + +func (m *PropertyValue) GetUservalue() *PropertyValue_UserValue { + if m != nil { + return m.Uservalue + } + return nil +} + +func (m *PropertyValue) GetReferencevalue() *PropertyValue_ReferenceValue { + if m != nil { + return m.Referencevalue + } + return nil +} + +type PropertyValue_PointValue struct { + X *float64 `protobuf:"fixed64,6,req,name=x" json:"x,omitempty"` + Y *float64 `protobuf:"fixed64,7,req,name=y" json:"y,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_PointValue) Reset() { *m = PropertyValue_PointValue{} } +func (m *PropertyValue_PointValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_PointValue) ProtoMessage() {} + +func (m *PropertyValue_PointValue) GetX() float64 { + if m != nil && m.X != nil { + return *m.X + } + return 0 +} + +func (m *PropertyValue_PointValue) GetY() float64 { + if m != nil && m.Y != nil { + return *m.Y + } + return 0 +} + +type PropertyValue_UserValue struct { + Email *string `protobuf:"bytes,9,req,name=email" json:"email,omitempty"` + AuthDomain *string `protobuf:"bytes,10,req,name=auth_domain" json:"auth_domain,omitempty"` + Nickname *string `protobuf:"bytes,11,opt,name=nickname" json:"nickname,omitempty"` + FederatedIdentity *string `protobuf:"bytes,21,opt,name=federated_identity" json:"federated_identity,omitempty"` + FederatedProvider *string `protobuf:"bytes,22,opt,name=federated_provider" json:"federated_provider,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_UserValue) Reset() { *m = PropertyValue_UserValue{} } +func (m *PropertyValue_UserValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_UserValue) ProtoMessage() {} + +func (m *PropertyValue_UserValue) GetEmail() string { + if m != nil && m.Email != nil { + return *m.Email + } + return "" +} + +func (m *PropertyValue_UserValue) GetAuthDomain() string { + if m != nil && m.AuthDomain != nil { + return *m.AuthDomain + } + return "" +} + +func (m *PropertyValue_UserValue) GetNickname() string { + if m != nil && m.Nickname != nil { + return *m.Nickname + } + return "" +} + +func (m *PropertyValue_UserValue) GetFederatedIdentity() string { + if m != nil && m.FederatedIdentity != nil { + return *m.FederatedIdentity + } + return "" +} + +func (m *PropertyValue_UserValue) GetFederatedProvider() string { + if m != nil && m.FederatedProvider != nil { + return *m.FederatedProvider + } + return "" +} + +type PropertyValue_ReferenceValue struct { + App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` + NameSpace *string `protobuf:"bytes,20,opt,name=name_space" json:"name_space,omitempty"` + Pathelement []*PropertyValue_ReferenceValue_PathElement `protobuf:"group,14,rep,name=PathElement" json:"pathelement,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_ReferenceValue) Reset() { *m = PropertyValue_ReferenceValue{} } +func (m *PropertyValue_ReferenceValue) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_ReferenceValue) ProtoMessage() {} + +func (m *PropertyValue_ReferenceValue) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *PropertyValue_ReferenceValue) GetNameSpace() string { + if m != nil && m.NameSpace != nil { + return *m.NameSpace + } + return "" +} + +func (m *PropertyValue_ReferenceValue) GetPathelement() []*PropertyValue_ReferenceValue_PathElement { + if m != nil { + return m.Pathelement + } + return nil +} + +type PropertyValue_ReferenceValue_PathElement struct { + Type *string `protobuf:"bytes,15,req,name=type" json:"type,omitempty"` + Id *int64 `protobuf:"varint,16,opt,name=id" json:"id,omitempty"` + Name *string `protobuf:"bytes,17,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PropertyValue_ReferenceValue_PathElement) Reset() { + *m = PropertyValue_ReferenceValue_PathElement{} +} +func (m *PropertyValue_ReferenceValue_PathElement) String() string { return proto.CompactTextString(m) } +func (*PropertyValue_ReferenceValue_PathElement) ProtoMessage() {} + +func (m *PropertyValue_ReferenceValue_PathElement) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +func (m *PropertyValue_ReferenceValue_PathElement) GetId() int64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *PropertyValue_ReferenceValue_PathElement) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type Property struct { + Meaning *Property_Meaning `protobuf:"varint,1,opt,name=meaning,enum=appengine.Property_Meaning,def=0" json:"meaning,omitempty"` + MeaningUri *string `protobuf:"bytes,2,opt,name=meaning_uri" json:"meaning_uri,omitempty"` + Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` + Value *PropertyValue `protobuf:"bytes,5,req,name=value" json:"value,omitempty"` + Multiple *bool `protobuf:"varint,4,req,name=multiple" json:"multiple,omitempty"` + Searchable *bool `protobuf:"varint,6,opt,name=searchable,def=0" json:"searchable,omitempty"` + FtsTokenizationOption *Property_FtsTokenizationOption `protobuf:"varint,8,opt,name=fts_tokenization_option,enum=appengine.Property_FtsTokenizationOption" json:"fts_tokenization_option,omitempty"` + Locale *string `protobuf:"bytes,9,opt,name=locale,def=en" json:"locale,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Property) Reset() { *m = Property{} } +func (m *Property) String() string { return proto.CompactTextString(m) } +func (*Property) ProtoMessage() {} + +const Default_Property_Meaning Property_Meaning = Property_NO_MEANING +const Default_Property_Searchable bool = false +const Default_Property_Locale string = "en" + +func (m *Property) GetMeaning() Property_Meaning { + if m != nil && m.Meaning != nil { + return *m.Meaning + } + return Default_Property_Meaning +} + +func (m *Property) GetMeaningUri() string { + if m != nil && m.MeaningUri != nil { + return *m.MeaningUri + } + return "" +} + +func (m *Property) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *Property) GetValue() *PropertyValue { + if m != nil { + return m.Value + } + return nil +} + +func (m *Property) GetMultiple() bool { + if m != nil && m.Multiple != nil { + return *m.Multiple + } + return false +} + +func (m *Property) GetSearchable() bool { + if m != nil && m.Searchable != nil { + return *m.Searchable + } + return Default_Property_Searchable +} + +func (m *Property) GetFtsTokenizationOption() Property_FtsTokenizationOption { + if m != nil && m.FtsTokenizationOption != nil { + return *m.FtsTokenizationOption + } + return Property_HTML +} + +func (m *Property) GetLocale() string { + if m != nil && m.Locale != nil { + return *m.Locale + } + return Default_Property_Locale +} + +type Path struct { + Element []*Path_Element `protobuf:"group,1,rep,name=Element" json:"element,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Path) Reset() { *m = Path{} } +func (m *Path) String() string { return proto.CompactTextString(m) } +func (*Path) ProtoMessage() {} + +func (m *Path) GetElement() []*Path_Element { + if m != nil { + return m.Element + } + return nil +} + +type Path_Element struct { + Type *string `protobuf:"bytes,2,req,name=type" json:"type,omitempty"` + Id *int64 `protobuf:"varint,3,opt,name=id" json:"id,omitempty"` + Name *string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Path_Element) Reset() { *m = Path_Element{} } +func (m *Path_Element) String() string { return proto.CompactTextString(m) } +func (*Path_Element) ProtoMessage() {} + +func (m *Path_Element) GetType() string { + if m != nil && m.Type != nil { + return *m.Type + } + return "" +} + +func (m *Path_Element) GetId() int64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *Path_Element) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +type Reference struct { + App *string `protobuf:"bytes,13,req,name=app" json:"app,omitempty"` + NameSpace *string `protobuf:"bytes,20,opt,name=name_space" json:"name_space,omitempty"` + Path *Path `protobuf:"bytes,14,req,name=path" json:"path,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Reference) Reset() { *m = Reference{} } +func (m *Reference) String() string { return proto.CompactTextString(m) } +func (*Reference) ProtoMessage() {} + +func (m *Reference) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *Reference) GetNameSpace() string { + if m != nil && m.NameSpace != nil { + return *m.NameSpace + } + return "" +} + +func (m *Reference) GetPath() *Path { + if m != nil { + return m.Path + } + return nil +} + +type User struct { + Email *string `protobuf:"bytes,1,req,name=email" json:"email,omitempty"` + AuthDomain *string `protobuf:"bytes,2,req,name=auth_domain" json:"auth_domain,omitempty"` + Nickname *string `protobuf:"bytes,3,opt,name=nickname" json:"nickname,omitempty"` + FederatedIdentity *string `protobuf:"bytes,6,opt,name=federated_identity" json:"federated_identity,omitempty"` + FederatedProvider *string `protobuf:"bytes,7,opt,name=federated_provider" json:"federated_provider,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *User) Reset() { *m = User{} } +func (m *User) String() string { return proto.CompactTextString(m) } +func (*User) ProtoMessage() {} + +func (m *User) GetEmail() string { + if m != nil && m.Email != nil { + return *m.Email + } + return "" +} + +func (m *User) GetAuthDomain() string { + if m != nil && m.AuthDomain != nil { + return *m.AuthDomain + } + return "" +} + +func (m *User) GetNickname() string { + if m != nil && m.Nickname != nil { + return *m.Nickname + } + return "" +} + +func (m *User) GetFederatedIdentity() string { + if m != nil && m.FederatedIdentity != nil { + return *m.FederatedIdentity + } + return "" +} + +func (m *User) GetFederatedProvider() string { + if m != nil && m.FederatedProvider != nil { + return *m.FederatedProvider + } + return "" +} + +type EntityProto struct { + Key *Reference `protobuf:"bytes,13,req,name=key" json:"key,omitempty"` + EntityGroup *Path `protobuf:"bytes,16,req,name=entity_group" json:"entity_group,omitempty"` + Owner *User `protobuf:"bytes,17,opt,name=owner" json:"owner,omitempty"` + Kind *EntityProto_Kind `protobuf:"varint,4,opt,name=kind,enum=appengine.EntityProto_Kind" json:"kind,omitempty"` + KindUri *string `protobuf:"bytes,5,opt,name=kind_uri" json:"kind_uri,omitempty"` + Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` + RawProperty []*Property `protobuf:"bytes,15,rep,name=raw_property" json:"raw_property,omitempty"` + Rank *int32 `protobuf:"varint,18,opt,name=rank" json:"rank,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *EntityProto) Reset() { *m = EntityProto{} } +func (m *EntityProto) String() string { return proto.CompactTextString(m) } +func (*EntityProto) ProtoMessage() {} + +func (m *EntityProto) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *EntityProto) GetEntityGroup() *Path { + if m != nil { + return m.EntityGroup + } + return nil +} + +func (m *EntityProto) GetOwner() *User { + if m != nil { + return m.Owner + } + return nil +} + +func (m *EntityProto) GetKind() EntityProto_Kind { + if m != nil && m.Kind != nil { + return *m.Kind + } + return EntityProto_GD_CONTACT +} + +func (m *EntityProto) GetKindUri() string { + if m != nil && m.KindUri != nil { + return *m.KindUri + } + return "" +} + +func (m *EntityProto) GetProperty() []*Property { + if m != nil { + return m.Property + } + return nil +} + +func (m *EntityProto) GetRawProperty() []*Property { + if m != nil { + return m.RawProperty + } + return nil +} + +func (m *EntityProto) GetRank() int32 { + if m != nil && m.Rank != nil { + return *m.Rank + } + return 0 +} + +type CompositeProperty struct { + IndexId *int64 `protobuf:"varint,1,req,name=index_id" json:"index_id,omitempty"` + Value []string `protobuf:"bytes,2,rep,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompositeProperty) Reset() { *m = CompositeProperty{} } +func (m *CompositeProperty) String() string { return proto.CompactTextString(m) } +func (*CompositeProperty) ProtoMessage() {} + +func (m *CompositeProperty) GetIndexId() int64 { + if m != nil && m.IndexId != nil { + return *m.IndexId + } + return 0 +} + +func (m *CompositeProperty) GetValue() []string { + if m != nil { + return m.Value + } + return nil +} + +type Index struct { + EntityType *string `protobuf:"bytes,1,req,name=entity_type" json:"entity_type,omitempty"` + Ancestor *bool `protobuf:"varint,5,req,name=ancestor" json:"ancestor,omitempty"` + Property []*Index_Property `protobuf:"group,2,rep,name=Property" json:"property,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Index) Reset() { *m = Index{} } +func (m *Index) String() string { return proto.CompactTextString(m) } +func (*Index) ProtoMessage() {} + +func (m *Index) GetEntityType() string { + if m != nil && m.EntityType != nil { + return *m.EntityType + } + return "" +} + +func (m *Index) GetAncestor() bool { + if m != nil && m.Ancestor != nil { + return *m.Ancestor + } + return false +} + +func (m *Index) GetProperty() []*Index_Property { + if m != nil { + return m.Property + } + return nil +} + +type Index_Property struct { + Name *string `protobuf:"bytes,3,req,name=name" json:"name,omitempty"` + Direction *Index_Property_Direction `protobuf:"varint,4,opt,name=direction,enum=appengine.Index_Property_Direction,def=1" json:"direction,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Index_Property) Reset() { *m = Index_Property{} } +func (m *Index_Property) String() string { return proto.CompactTextString(m) } +func (*Index_Property) ProtoMessage() {} + +const Default_Index_Property_Direction Index_Property_Direction = Index_Property_ASCENDING + +func (m *Index_Property) GetName() string { + if m != nil && m.Name != nil { + return *m.Name + } + return "" +} + +func (m *Index_Property) GetDirection() Index_Property_Direction { + if m != nil && m.Direction != nil { + return *m.Direction + } + return Default_Index_Property_Direction +} + +type CompositeIndex struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + Id *int64 `protobuf:"varint,2,req,name=id" json:"id,omitempty"` + Definition *Index `protobuf:"bytes,3,req,name=definition" json:"definition,omitempty"` + State *CompositeIndex_State `protobuf:"varint,4,req,name=state,enum=appengine.CompositeIndex_State" json:"state,omitempty"` + OnlyUseIfRequired *bool `protobuf:"varint,6,opt,name=only_use_if_required,def=0" json:"only_use_if_required,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompositeIndex) Reset() { *m = CompositeIndex{} } +func (m *CompositeIndex) String() string { return proto.CompactTextString(m) } +func (*CompositeIndex) ProtoMessage() {} + +const Default_CompositeIndex_OnlyUseIfRequired bool = false + +func (m *CompositeIndex) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *CompositeIndex) GetId() int64 { + if m != nil && m.Id != nil { + return *m.Id + } + return 0 +} + +func (m *CompositeIndex) GetDefinition() *Index { + if m != nil { + return m.Definition + } + return nil +} + +func (m *CompositeIndex) GetState() CompositeIndex_State { + if m != nil && m.State != nil { + return *m.State + } + return CompositeIndex_WRITE_ONLY +} + +func (m *CompositeIndex) GetOnlyUseIfRequired() bool { + if m != nil && m.OnlyUseIfRequired != nil { + return *m.OnlyUseIfRequired + } + return Default_CompositeIndex_OnlyUseIfRequired +} + +type IndexPostfix struct { + IndexValue []*IndexPostfix_IndexValue `protobuf:"bytes,1,rep,name=index_value" json:"index_value,omitempty"` + Key *Reference `protobuf:"bytes,2,opt,name=key" json:"key,omitempty"` + Before *bool `protobuf:"varint,3,opt,name=before,def=1" json:"before,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IndexPostfix) Reset() { *m = IndexPostfix{} } +func (m *IndexPostfix) String() string { return proto.CompactTextString(m) } +func (*IndexPostfix) ProtoMessage() {} + +const Default_IndexPostfix_Before bool = true + +func (m *IndexPostfix) GetIndexValue() []*IndexPostfix_IndexValue { + if m != nil { + return m.IndexValue + } + return nil +} + +func (m *IndexPostfix) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *IndexPostfix) GetBefore() bool { + if m != nil && m.Before != nil { + return *m.Before + } + return Default_IndexPostfix_Before +} + +type IndexPostfix_IndexValue struct { + PropertyName *string `protobuf:"bytes,1,req,name=property_name" json:"property_name,omitempty"` + Value *PropertyValue `protobuf:"bytes,2,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IndexPostfix_IndexValue) Reset() { *m = IndexPostfix_IndexValue{} } +func (m *IndexPostfix_IndexValue) String() string { return proto.CompactTextString(m) } +func (*IndexPostfix_IndexValue) ProtoMessage() {} + +func (m *IndexPostfix_IndexValue) GetPropertyName() string { + if m != nil && m.PropertyName != nil { + return *m.PropertyName + } + return "" +} + +func (m *IndexPostfix_IndexValue) GetValue() *PropertyValue { + if m != nil { + return m.Value + } + return nil +} + +type IndexPosition struct { + Key *string `protobuf:"bytes,1,opt,name=key" json:"key,omitempty"` + Before *bool `protobuf:"varint,2,opt,name=before,def=1" json:"before,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *IndexPosition) Reset() { *m = IndexPosition{} } +func (m *IndexPosition) String() string { return proto.CompactTextString(m) } +func (*IndexPosition) ProtoMessage() {} + +const Default_IndexPosition_Before bool = true + +func (m *IndexPosition) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *IndexPosition) GetBefore() bool { + if m != nil && m.Before != nil { + return *m.Before + } + return Default_IndexPosition_Before +} + +type Snapshot struct { + Ts *int64 `protobuf:"varint,1,req,name=ts" json:"ts,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Snapshot) Reset() { *m = Snapshot{} } +func (m *Snapshot) String() string { return proto.CompactTextString(m) } +func (*Snapshot) ProtoMessage() {} + +func (m *Snapshot) GetTs() int64 { + if m != nil && m.Ts != nil { + return *m.Ts + } + return 0 +} + +type InternalHeader struct { + Qos *string `protobuf:"bytes,1,opt,name=qos" json:"qos,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *InternalHeader) Reset() { *m = InternalHeader{} } +func (m *InternalHeader) String() string { return proto.CompactTextString(m) } +func (*InternalHeader) ProtoMessage() {} + +func (m *InternalHeader) GetQos() string { + if m != nil && m.Qos != nil { + return *m.Qos + } + return "" +} + +type Transaction struct { + Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` + Handle *uint64 `protobuf:"fixed64,1,req,name=handle" json:"handle,omitempty"` + App *string `protobuf:"bytes,2,req,name=app" json:"app,omitempty"` + MarkChanges *bool `protobuf:"varint,3,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Transaction) Reset() { *m = Transaction{} } +func (m *Transaction) String() string { return proto.CompactTextString(m) } +func (*Transaction) ProtoMessage() {} + +const Default_Transaction_MarkChanges bool = false + +func (m *Transaction) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *Transaction) GetHandle() uint64 { + if m != nil && m.Handle != nil { + return *m.Handle + } + return 0 +} + +func (m *Transaction) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *Transaction) GetMarkChanges() bool { + if m != nil && m.MarkChanges != nil { + return *m.MarkChanges + } + return Default_Transaction_MarkChanges +} + +type Query struct { + Header *InternalHeader `protobuf:"bytes,39,opt,name=header" json:"header,omitempty"` + App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` + NameSpace *string `protobuf:"bytes,29,opt,name=name_space" json:"name_space,omitempty"` + Kind *string `protobuf:"bytes,3,opt,name=kind" json:"kind,omitempty"` + Ancestor *Reference `protobuf:"bytes,17,opt,name=ancestor" json:"ancestor,omitempty"` + Filter []*Query_Filter `protobuf:"group,4,rep,name=Filter" json:"filter,omitempty"` + SearchQuery *string `protobuf:"bytes,8,opt,name=search_query" json:"search_query,omitempty"` + Order []*Query_Order `protobuf:"group,9,rep,name=Order" json:"order,omitempty"` + Hint *Query_Hint `protobuf:"varint,18,opt,name=hint,enum=appengine.Query_Hint" json:"hint,omitempty"` + Count *int32 `protobuf:"varint,23,opt,name=count" json:"count,omitempty"` + Offset *int32 `protobuf:"varint,12,opt,name=offset,def=0" json:"offset,omitempty"` + Limit *int32 `protobuf:"varint,16,opt,name=limit" json:"limit,omitempty"` + CompiledCursor *CompiledCursor `protobuf:"bytes,30,opt,name=compiled_cursor" json:"compiled_cursor,omitempty"` + EndCompiledCursor *CompiledCursor `protobuf:"bytes,31,opt,name=end_compiled_cursor" json:"end_compiled_cursor,omitempty"` + CompositeIndex []*CompositeIndex `protobuf:"bytes,19,rep,name=composite_index" json:"composite_index,omitempty"` + RequirePerfectPlan *bool `protobuf:"varint,20,opt,name=require_perfect_plan,def=0" json:"require_perfect_plan,omitempty"` + KeysOnly *bool `protobuf:"varint,21,opt,name=keys_only,def=0" json:"keys_only,omitempty"` + Transaction *Transaction `protobuf:"bytes,22,opt,name=transaction" json:"transaction,omitempty"` + Compile *bool `protobuf:"varint,25,opt,name=compile,def=0" json:"compile,omitempty"` + FailoverMs *int64 `protobuf:"varint,26,opt,name=failover_ms" json:"failover_ms,omitempty"` + Strong *bool `protobuf:"varint,32,opt,name=strong" json:"strong,omitempty"` + PropertyName []string `protobuf:"bytes,33,rep,name=property_name" json:"property_name,omitempty"` + GroupByPropertyName []string `protobuf:"bytes,34,rep,name=group_by_property_name" json:"group_by_property_name,omitempty"` + Distinct *bool `protobuf:"varint,24,opt,name=distinct" json:"distinct,omitempty"` + MinSafeTimeSeconds *int64 `protobuf:"varint,35,opt,name=min_safe_time_seconds" json:"min_safe_time_seconds,omitempty"` + SafeReplicaName []string `protobuf:"bytes,36,rep,name=safe_replica_name" json:"safe_replica_name,omitempty"` + PersistOffset *bool `protobuf:"varint,37,opt,name=persist_offset,def=0" json:"persist_offset,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Query) Reset() { *m = Query{} } +func (m *Query) String() string { return proto.CompactTextString(m) } +func (*Query) ProtoMessage() {} + +const Default_Query_Offset int32 = 0 +const Default_Query_RequirePerfectPlan bool = false +const Default_Query_KeysOnly bool = false +const Default_Query_Compile bool = false +const Default_Query_PersistOffset bool = false + +func (m *Query) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *Query) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *Query) GetNameSpace() string { + if m != nil && m.NameSpace != nil { + return *m.NameSpace + } + return "" +} + +func (m *Query) GetKind() string { + if m != nil && m.Kind != nil { + return *m.Kind + } + return "" +} + +func (m *Query) GetAncestor() *Reference { + if m != nil { + return m.Ancestor + } + return nil +} + +func (m *Query) GetFilter() []*Query_Filter { + if m != nil { + return m.Filter + } + return nil +} + +func (m *Query) GetSearchQuery() string { + if m != nil && m.SearchQuery != nil { + return *m.SearchQuery + } + return "" +} + +func (m *Query) GetOrder() []*Query_Order { + if m != nil { + return m.Order + } + return nil +} + +func (m *Query) GetHint() Query_Hint { + if m != nil && m.Hint != nil { + return *m.Hint + } + return Query_ORDER_FIRST +} + +func (m *Query) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *Query) GetOffset() int32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return Default_Query_Offset +} + +func (m *Query) GetLimit() int32 { + if m != nil && m.Limit != nil { + return *m.Limit + } + return 0 +} + +func (m *Query) GetCompiledCursor() *CompiledCursor { + if m != nil { + return m.CompiledCursor + } + return nil +} + +func (m *Query) GetEndCompiledCursor() *CompiledCursor { + if m != nil { + return m.EndCompiledCursor + } + return nil +} + +func (m *Query) GetCompositeIndex() []*CompositeIndex { + if m != nil { + return m.CompositeIndex + } + return nil +} + +func (m *Query) GetRequirePerfectPlan() bool { + if m != nil && m.RequirePerfectPlan != nil { + return *m.RequirePerfectPlan + } + return Default_Query_RequirePerfectPlan +} + +func (m *Query) GetKeysOnly() bool { + if m != nil && m.KeysOnly != nil { + return *m.KeysOnly + } + return Default_Query_KeysOnly +} + +func (m *Query) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *Query) GetCompile() bool { + if m != nil && m.Compile != nil { + return *m.Compile + } + return Default_Query_Compile +} + +func (m *Query) GetFailoverMs() int64 { + if m != nil && m.FailoverMs != nil { + return *m.FailoverMs + } + return 0 +} + +func (m *Query) GetStrong() bool { + if m != nil && m.Strong != nil { + return *m.Strong + } + return false +} + +func (m *Query) GetPropertyName() []string { + if m != nil { + return m.PropertyName + } + return nil +} + +func (m *Query) GetGroupByPropertyName() []string { + if m != nil { + return m.GroupByPropertyName + } + return nil +} + +func (m *Query) GetDistinct() bool { + if m != nil && m.Distinct != nil { + return *m.Distinct + } + return false +} + +func (m *Query) GetMinSafeTimeSeconds() int64 { + if m != nil && m.MinSafeTimeSeconds != nil { + return *m.MinSafeTimeSeconds + } + return 0 +} + +func (m *Query) GetSafeReplicaName() []string { + if m != nil { + return m.SafeReplicaName + } + return nil +} + +func (m *Query) GetPersistOffset() bool { + if m != nil && m.PersistOffset != nil { + return *m.PersistOffset + } + return Default_Query_PersistOffset +} + +type Query_Filter struct { + Op *Query_Filter_Operator `protobuf:"varint,6,req,name=op,enum=appengine.Query_Filter_Operator" json:"op,omitempty"` + Property []*Property `protobuf:"bytes,14,rep,name=property" json:"property,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Query_Filter) Reset() { *m = Query_Filter{} } +func (m *Query_Filter) String() string { return proto.CompactTextString(m) } +func (*Query_Filter) ProtoMessage() {} + +func (m *Query_Filter) GetOp() Query_Filter_Operator { + if m != nil && m.Op != nil { + return *m.Op + } + return Query_Filter_LESS_THAN +} + +func (m *Query_Filter) GetProperty() []*Property { + if m != nil { + return m.Property + } + return nil +} + +type Query_Order struct { + Property *string `protobuf:"bytes,10,req,name=property" json:"property,omitempty"` + Direction *Query_Order_Direction `protobuf:"varint,11,opt,name=direction,enum=appengine.Query_Order_Direction,def=1" json:"direction,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Query_Order) Reset() { *m = Query_Order{} } +func (m *Query_Order) String() string { return proto.CompactTextString(m) } +func (*Query_Order) ProtoMessage() {} + +const Default_Query_Order_Direction Query_Order_Direction = Query_Order_ASCENDING + +func (m *Query_Order) GetProperty() string { + if m != nil && m.Property != nil { + return *m.Property + } + return "" +} + +func (m *Query_Order) GetDirection() Query_Order_Direction { + if m != nil && m.Direction != nil { + return *m.Direction + } + return Default_Query_Order_Direction +} + +type CompiledQuery struct { + Primaryscan *CompiledQuery_PrimaryScan `protobuf:"group,1,req,name=PrimaryScan" json:"primaryscan,omitempty"` + Mergejoinscan []*CompiledQuery_MergeJoinScan `protobuf:"group,7,rep,name=MergeJoinScan" json:"mergejoinscan,omitempty"` + IndexDef *Index `protobuf:"bytes,21,opt,name=index_def" json:"index_def,omitempty"` + Offset *int32 `protobuf:"varint,10,opt,name=offset,def=0" json:"offset,omitempty"` + Limit *int32 `protobuf:"varint,11,opt,name=limit" json:"limit,omitempty"` + KeysOnly *bool `protobuf:"varint,12,req,name=keys_only" json:"keys_only,omitempty"` + PropertyName []string `protobuf:"bytes,24,rep,name=property_name" json:"property_name,omitempty"` + DistinctInfixSize *int32 `protobuf:"varint,25,opt,name=distinct_infix_size" json:"distinct_infix_size,omitempty"` + Entityfilter *CompiledQuery_EntityFilter `protobuf:"group,13,opt,name=EntityFilter" json:"entityfilter,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery) Reset() { *m = CompiledQuery{} } +func (m *CompiledQuery) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery) ProtoMessage() {} + +const Default_CompiledQuery_Offset int32 = 0 + +func (m *CompiledQuery) GetPrimaryscan() *CompiledQuery_PrimaryScan { + if m != nil { + return m.Primaryscan + } + return nil +} + +func (m *CompiledQuery) GetMergejoinscan() []*CompiledQuery_MergeJoinScan { + if m != nil { + return m.Mergejoinscan + } + return nil +} + +func (m *CompiledQuery) GetIndexDef() *Index { + if m != nil { + return m.IndexDef + } + return nil +} + +func (m *CompiledQuery) GetOffset() int32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return Default_CompiledQuery_Offset +} + +func (m *CompiledQuery) GetLimit() int32 { + if m != nil && m.Limit != nil { + return *m.Limit + } + return 0 +} + +func (m *CompiledQuery) GetKeysOnly() bool { + if m != nil && m.KeysOnly != nil { + return *m.KeysOnly + } + return false +} + +func (m *CompiledQuery) GetPropertyName() []string { + if m != nil { + return m.PropertyName + } + return nil +} + +func (m *CompiledQuery) GetDistinctInfixSize() int32 { + if m != nil && m.DistinctInfixSize != nil { + return *m.DistinctInfixSize + } + return 0 +} + +func (m *CompiledQuery) GetEntityfilter() *CompiledQuery_EntityFilter { + if m != nil { + return m.Entityfilter + } + return nil +} + +type CompiledQuery_PrimaryScan struct { + IndexName *string `protobuf:"bytes,2,opt,name=index_name" json:"index_name,omitempty"` + StartKey *string `protobuf:"bytes,3,opt,name=start_key" json:"start_key,omitempty"` + StartInclusive *bool `protobuf:"varint,4,opt,name=start_inclusive" json:"start_inclusive,omitempty"` + EndKey *string `protobuf:"bytes,5,opt,name=end_key" json:"end_key,omitempty"` + EndInclusive *bool `protobuf:"varint,6,opt,name=end_inclusive" json:"end_inclusive,omitempty"` + StartPostfixValue []string `protobuf:"bytes,22,rep,name=start_postfix_value" json:"start_postfix_value,omitempty"` + EndPostfixValue []string `protobuf:"bytes,23,rep,name=end_postfix_value" json:"end_postfix_value,omitempty"` + EndUnappliedLogTimestampUs *int64 `protobuf:"varint,19,opt,name=end_unapplied_log_timestamp_us" json:"end_unapplied_log_timestamp_us,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery_PrimaryScan) Reset() { *m = CompiledQuery_PrimaryScan{} } +func (m *CompiledQuery_PrimaryScan) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery_PrimaryScan) ProtoMessage() {} + +func (m *CompiledQuery_PrimaryScan) GetIndexName() string { + if m != nil && m.IndexName != nil { + return *m.IndexName + } + return "" +} + +func (m *CompiledQuery_PrimaryScan) GetStartKey() string { + if m != nil && m.StartKey != nil { + return *m.StartKey + } + return "" +} + +func (m *CompiledQuery_PrimaryScan) GetStartInclusive() bool { + if m != nil && m.StartInclusive != nil { + return *m.StartInclusive + } + return false +} + +func (m *CompiledQuery_PrimaryScan) GetEndKey() string { + if m != nil && m.EndKey != nil { + return *m.EndKey + } + return "" +} + +func (m *CompiledQuery_PrimaryScan) GetEndInclusive() bool { + if m != nil && m.EndInclusive != nil { + return *m.EndInclusive + } + return false +} + +func (m *CompiledQuery_PrimaryScan) GetStartPostfixValue() []string { + if m != nil { + return m.StartPostfixValue + } + return nil +} + +func (m *CompiledQuery_PrimaryScan) GetEndPostfixValue() []string { + if m != nil { + return m.EndPostfixValue + } + return nil +} + +func (m *CompiledQuery_PrimaryScan) GetEndUnappliedLogTimestampUs() int64 { + if m != nil && m.EndUnappliedLogTimestampUs != nil { + return *m.EndUnappliedLogTimestampUs + } + return 0 +} + +type CompiledQuery_MergeJoinScan struct { + IndexName *string `protobuf:"bytes,8,req,name=index_name" json:"index_name,omitempty"` + PrefixValue []string `protobuf:"bytes,9,rep,name=prefix_value" json:"prefix_value,omitempty"` + ValuePrefix *bool `protobuf:"varint,20,opt,name=value_prefix,def=0" json:"value_prefix,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery_MergeJoinScan) Reset() { *m = CompiledQuery_MergeJoinScan{} } +func (m *CompiledQuery_MergeJoinScan) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery_MergeJoinScan) ProtoMessage() {} + +const Default_CompiledQuery_MergeJoinScan_ValuePrefix bool = false + +func (m *CompiledQuery_MergeJoinScan) GetIndexName() string { + if m != nil && m.IndexName != nil { + return *m.IndexName + } + return "" +} + +func (m *CompiledQuery_MergeJoinScan) GetPrefixValue() []string { + if m != nil { + return m.PrefixValue + } + return nil +} + +func (m *CompiledQuery_MergeJoinScan) GetValuePrefix() bool { + if m != nil && m.ValuePrefix != nil { + return *m.ValuePrefix + } + return Default_CompiledQuery_MergeJoinScan_ValuePrefix +} + +type CompiledQuery_EntityFilter struct { + Distinct *bool `protobuf:"varint,14,opt,name=distinct,def=0" json:"distinct,omitempty"` + Kind *string `protobuf:"bytes,17,opt,name=kind" json:"kind,omitempty"` + Ancestor *Reference `protobuf:"bytes,18,opt,name=ancestor" json:"ancestor,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledQuery_EntityFilter) Reset() { *m = CompiledQuery_EntityFilter{} } +func (m *CompiledQuery_EntityFilter) String() string { return proto.CompactTextString(m) } +func (*CompiledQuery_EntityFilter) ProtoMessage() {} + +const Default_CompiledQuery_EntityFilter_Distinct bool = false + +func (m *CompiledQuery_EntityFilter) GetDistinct() bool { + if m != nil && m.Distinct != nil { + return *m.Distinct + } + return Default_CompiledQuery_EntityFilter_Distinct +} + +func (m *CompiledQuery_EntityFilter) GetKind() string { + if m != nil && m.Kind != nil { + return *m.Kind + } + return "" +} + +func (m *CompiledQuery_EntityFilter) GetAncestor() *Reference { + if m != nil { + return m.Ancestor + } + return nil +} + +type CompiledCursor struct { + Position *CompiledCursor_Position `protobuf:"group,2,opt,name=Position" json:"position,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledCursor) Reset() { *m = CompiledCursor{} } +func (m *CompiledCursor) String() string { return proto.CompactTextString(m) } +func (*CompiledCursor) ProtoMessage() {} + +func (m *CompiledCursor) GetPosition() *CompiledCursor_Position { + if m != nil { + return m.Position + } + return nil +} + +type CompiledCursor_Position struct { + StartKey *string `protobuf:"bytes,27,opt,name=start_key" json:"start_key,omitempty"` + Indexvalue []*CompiledCursor_Position_IndexValue `protobuf:"group,29,rep,name=IndexValue" json:"indexvalue,omitempty"` + Key *Reference `protobuf:"bytes,32,opt,name=key" json:"key,omitempty"` + StartInclusive *bool `protobuf:"varint,28,opt,name=start_inclusive,def=1" json:"start_inclusive,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledCursor_Position) Reset() { *m = CompiledCursor_Position{} } +func (m *CompiledCursor_Position) String() string { return proto.CompactTextString(m) } +func (*CompiledCursor_Position) ProtoMessage() {} + +const Default_CompiledCursor_Position_StartInclusive bool = true + +func (m *CompiledCursor_Position) GetStartKey() string { + if m != nil && m.StartKey != nil { + return *m.StartKey + } + return "" +} + +func (m *CompiledCursor_Position) GetIndexvalue() []*CompiledCursor_Position_IndexValue { + if m != nil { + return m.Indexvalue + } + return nil +} + +func (m *CompiledCursor_Position) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *CompiledCursor_Position) GetStartInclusive() bool { + if m != nil && m.StartInclusive != nil { + return *m.StartInclusive + } + return Default_CompiledCursor_Position_StartInclusive +} + +type CompiledCursor_Position_IndexValue struct { + Property *string `protobuf:"bytes,30,opt,name=property" json:"property,omitempty"` + Value *PropertyValue `protobuf:"bytes,31,req,name=value" json:"value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompiledCursor_Position_IndexValue) Reset() { *m = CompiledCursor_Position_IndexValue{} } +func (m *CompiledCursor_Position_IndexValue) String() string { return proto.CompactTextString(m) } +func (*CompiledCursor_Position_IndexValue) ProtoMessage() {} + +func (m *CompiledCursor_Position_IndexValue) GetProperty() string { + if m != nil && m.Property != nil { + return *m.Property + } + return "" +} + +func (m *CompiledCursor_Position_IndexValue) GetValue() *PropertyValue { + if m != nil { + return m.Value + } + return nil +} + +type Cursor struct { + Cursor *uint64 `protobuf:"fixed64,1,req,name=cursor" json:"cursor,omitempty"` + App *string `protobuf:"bytes,2,opt,name=app" json:"app,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cursor) Reset() { *m = Cursor{} } +func (m *Cursor) String() string { return proto.CompactTextString(m) } +func (*Cursor) ProtoMessage() {} + +func (m *Cursor) GetCursor() uint64 { + if m != nil && m.Cursor != nil { + return *m.Cursor + } + return 0 +} + +func (m *Cursor) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +type Error struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *Error) Reset() { *m = Error{} } +func (m *Error) String() string { return proto.CompactTextString(m) } +func (*Error) ProtoMessage() {} + +type Cost struct { + IndexWrites *int32 `protobuf:"varint,1,opt,name=index_writes" json:"index_writes,omitempty"` + IndexWriteBytes *int32 `protobuf:"varint,2,opt,name=index_write_bytes" json:"index_write_bytes,omitempty"` + EntityWrites *int32 `protobuf:"varint,3,opt,name=entity_writes" json:"entity_writes,omitempty"` + EntityWriteBytes *int32 `protobuf:"varint,4,opt,name=entity_write_bytes" json:"entity_write_bytes,omitempty"` + Commitcost *Cost_CommitCost `protobuf:"group,5,opt,name=CommitCost" json:"commitcost,omitempty"` + ApproximateStorageDelta *int32 `protobuf:"varint,8,opt,name=approximate_storage_delta" json:"approximate_storage_delta,omitempty"` + IdSequenceUpdates *int32 `protobuf:"varint,9,opt,name=id_sequence_updates" json:"id_sequence_updates,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cost) Reset() { *m = Cost{} } +func (m *Cost) String() string { return proto.CompactTextString(m) } +func (*Cost) ProtoMessage() {} + +func (m *Cost) GetIndexWrites() int32 { + if m != nil && m.IndexWrites != nil { + return *m.IndexWrites + } + return 0 +} + +func (m *Cost) GetIndexWriteBytes() int32 { + if m != nil && m.IndexWriteBytes != nil { + return *m.IndexWriteBytes + } + return 0 +} + +func (m *Cost) GetEntityWrites() int32 { + if m != nil && m.EntityWrites != nil { + return *m.EntityWrites + } + return 0 +} + +func (m *Cost) GetEntityWriteBytes() int32 { + if m != nil && m.EntityWriteBytes != nil { + return *m.EntityWriteBytes + } + return 0 +} + +func (m *Cost) GetCommitcost() *Cost_CommitCost { + if m != nil { + return m.Commitcost + } + return nil +} + +func (m *Cost) GetApproximateStorageDelta() int32 { + if m != nil && m.ApproximateStorageDelta != nil { + return *m.ApproximateStorageDelta + } + return 0 +} + +func (m *Cost) GetIdSequenceUpdates() int32 { + if m != nil && m.IdSequenceUpdates != nil { + return *m.IdSequenceUpdates + } + return 0 +} + +type Cost_CommitCost struct { + RequestedEntityPuts *int32 `protobuf:"varint,6,opt,name=requested_entity_puts" json:"requested_entity_puts,omitempty"` + RequestedEntityDeletes *int32 `protobuf:"varint,7,opt,name=requested_entity_deletes" json:"requested_entity_deletes,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Cost_CommitCost) Reset() { *m = Cost_CommitCost{} } +func (m *Cost_CommitCost) String() string { return proto.CompactTextString(m) } +func (*Cost_CommitCost) ProtoMessage() {} + +func (m *Cost_CommitCost) GetRequestedEntityPuts() int32 { + if m != nil && m.RequestedEntityPuts != nil { + return *m.RequestedEntityPuts + } + return 0 +} + +func (m *Cost_CommitCost) GetRequestedEntityDeletes() int32 { + if m != nil && m.RequestedEntityDeletes != nil { + return *m.RequestedEntityDeletes + } + return 0 +} + +type GetRequest struct { + Header *InternalHeader `protobuf:"bytes,6,opt,name=header" json:"header,omitempty"` + Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` + Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` + FailoverMs *int64 `protobuf:"varint,3,opt,name=failover_ms" json:"failover_ms,omitempty"` + Strong *bool `protobuf:"varint,4,opt,name=strong" json:"strong,omitempty"` + AllowDeferred *bool `protobuf:"varint,5,opt,name=allow_deferred,def=0" json:"allow_deferred,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetRequest) Reset() { *m = GetRequest{} } +func (m *GetRequest) String() string { return proto.CompactTextString(m) } +func (*GetRequest) ProtoMessage() {} + +const Default_GetRequest_AllowDeferred bool = false + +func (m *GetRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *GetRequest) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *GetRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *GetRequest) GetFailoverMs() int64 { + if m != nil && m.FailoverMs != nil { + return *m.FailoverMs + } + return 0 +} + +func (m *GetRequest) GetStrong() bool { + if m != nil && m.Strong != nil { + return *m.Strong + } + return false +} + +func (m *GetRequest) GetAllowDeferred() bool { + if m != nil && m.AllowDeferred != nil { + return *m.AllowDeferred + } + return Default_GetRequest_AllowDeferred +} + +type GetResponse struct { + Entity []*GetResponse_Entity `protobuf:"group,1,rep,name=Entity" json:"entity,omitempty"` + Deferred []*Reference `protobuf:"bytes,5,rep,name=deferred" json:"deferred,omitempty"` + InOrder *bool `protobuf:"varint,6,opt,name=in_order,def=1" json:"in_order,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetResponse) Reset() { *m = GetResponse{} } +func (m *GetResponse) String() string { return proto.CompactTextString(m) } +func (*GetResponse) ProtoMessage() {} + +const Default_GetResponse_InOrder bool = true + +func (m *GetResponse) GetEntity() []*GetResponse_Entity { + if m != nil { + return m.Entity + } + return nil +} + +func (m *GetResponse) GetDeferred() []*Reference { + if m != nil { + return m.Deferred + } + return nil +} + +func (m *GetResponse) GetInOrder() bool { + if m != nil && m.InOrder != nil { + return *m.InOrder + } + return Default_GetResponse_InOrder +} + +type GetResponse_Entity struct { + Entity *EntityProto `protobuf:"bytes,2,opt,name=entity" json:"entity,omitempty"` + Key *Reference `protobuf:"bytes,4,opt,name=key" json:"key,omitempty"` + Version *int64 `protobuf:"varint,3,opt,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *GetResponse_Entity) Reset() { *m = GetResponse_Entity{} } +func (m *GetResponse_Entity) String() string { return proto.CompactTextString(m) } +func (*GetResponse_Entity) ProtoMessage() {} + +func (m *GetResponse_Entity) GetEntity() *EntityProto { + if m != nil { + return m.Entity + } + return nil +} + +func (m *GetResponse_Entity) GetKey() *Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *GetResponse_Entity) GetVersion() int64 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +type PutRequest struct { + Header *InternalHeader `protobuf:"bytes,11,opt,name=header" json:"header,omitempty"` + Entity []*EntityProto `protobuf:"bytes,1,rep,name=entity" json:"entity,omitempty"` + Transaction *Transaction `protobuf:"bytes,2,opt,name=transaction" json:"transaction,omitempty"` + CompositeIndex []*CompositeIndex `protobuf:"bytes,3,rep,name=composite_index" json:"composite_index,omitempty"` + Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` + Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` + MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"` + Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` + AutoIdPolicy *PutRequest_AutoIdPolicy `protobuf:"varint,10,opt,name=auto_id_policy,enum=appengine.PutRequest_AutoIdPolicy,def=0" json:"auto_id_policy,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PutRequest) Reset() { *m = PutRequest{} } +func (m *PutRequest) String() string { return proto.CompactTextString(m) } +func (*PutRequest) ProtoMessage() {} + +const Default_PutRequest_Trusted bool = false +const Default_PutRequest_Force bool = false +const Default_PutRequest_MarkChanges bool = false +const Default_PutRequest_AutoIdPolicy PutRequest_AutoIdPolicy = PutRequest_CURRENT + +func (m *PutRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *PutRequest) GetEntity() []*EntityProto { + if m != nil { + return m.Entity + } + return nil +} + +func (m *PutRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *PutRequest) GetCompositeIndex() []*CompositeIndex { + if m != nil { + return m.CompositeIndex + } + return nil +} + +func (m *PutRequest) GetTrusted() bool { + if m != nil && m.Trusted != nil { + return *m.Trusted + } + return Default_PutRequest_Trusted +} + +func (m *PutRequest) GetForce() bool { + if m != nil && m.Force != nil { + return *m.Force + } + return Default_PutRequest_Force +} + +func (m *PutRequest) GetMarkChanges() bool { + if m != nil && m.MarkChanges != nil { + return *m.MarkChanges + } + return Default_PutRequest_MarkChanges +} + +func (m *PutRequest) GetSnapshot() []*Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +func (m *PutRequest) GetAutoIdPolicy() PutRequest_AutoIdPolicy { + if m != nil && m.AutoIdPolicy != nil { + return *m.AutoIdPolicy + } + return Default_PutRequest_AutoIdPolicy +} + +type PutResponse struct { + Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` + Cost *Cost `protobuf:"bytes,2,opt,name=cost" json:"cost,omitempty"` + Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *PutResponse) Reset() { *m = PutResponse{} } +func (m *PutResponse) String() string { return proto.CompactTextString(m) } +func (*PutResponse) ProtoMessage() {} + +func (m *PutResponse) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *PutResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +func (m *PutResponse) GetVersion() []int64 { + if m != nil { + return m.Version + } + return nil +} + +type TouchRequest struct { + Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` + Key []*Reference `protobuf:"bytes,1,rep,name=key" json:"key,omitempty"` + CompositeIndex []*CompositeIndex `protobuf:"bytes,2,rep,name=composite_index" json:"composite_index,omitempty"` + Force *bool `protobuf:"varint,3,opt,name=force,def=0" json:"force,omitempty"` + Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TouchRequest) Reset() { *m = TouchRequest{} } +func (m *TouchRequest) String() string { return proto.CompactTextString(m) } +func (*TouchRequest) ProtoMessage() {} + +const Default_TouchRequest_Force bool = false + +func (m *TouchRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *TouchRequest) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *TouchRequest) GetCompositeIndex() []*CompositeIndex { + if m != nil { + return m.CompositeIndex + } + return nil +} + +func (m *TouchRequest) GetForce() bool { + if m != nil && m.Force != nil { + return *m.Force + } + return Default_TouchRequest_Force +} + +func (m *TouchRequest) GetSnapshot() []*Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +type TouchResponse struct { + Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *TouchResponse) Reset() { *m = TouchResponse{} } +func (m *TouchResponse) String() string { return proto.CompactTextString(m) } +func (*TouchResponse) ProtoMessage() {} + +func (m *TouchResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +type DeleteRequest struct { + Header *InternalHeader `protobuf:"bytes,10,opt,name=header" json:"header,omitempty"` + Key []*Reference `protobuf:"bytes,6,rep,name=key" json:"key,omitempty"` + Transaction *Transaction `protobuf:"bytes,5,opt,name=transaction" json:"transaction,omitempty"` + Trusted *bool `protobuf:"varint,4,opt,name=trusted,def=0" json:"trusted,omitempty"` + Force *bool `protobuf:"varint,7,opt,name=force,def=0" json:"force,omitempty"` + MarkChanges *bool `protobuf:"varint,8,opt,name=mark_changes,def=0" json:"mark_changes,omitempty"` + Snapshot []*Snapshot `protobuf:"bytes,9,rep,name=snapshot" json:"snapshot,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } +func (m *DeleteRequest) String() string { return proto.CompactTextString(m) } +func (*DeleteRequest) ProtoMessage() {} + +const Default_DeleteRequest_Trusted bool = false +const Default_DeleteRequest_Force bool = false +const Default_DeleteRequest_MarkChanges bool = false + +func (m *DeleteRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *DeleteRequest) GetKey() []*Reference { + if m != nil { + return m.Key + } + return nil +} + +func (m *DeleteRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *DeleteRequest) GetTrusted() bool { + if m != nil && m.Trusted != nil { + return *m.Trusted + } + return Default_DeleteRequest_Trusted +} + +func (m *DeleteRequest) GetForce() bool { + if m != nil && m.Force != nil { + return *m.Force + } + return Default_DeleteRequest_Force +} + +func (m *DeleteRequest) GetMarkChanges() bool { + if m != nil && m.MarkChanges != nil { + return *m.MarkChanges + } + return Default_DeleteRequest_MarkChanges +} + +func (m *DeleteRequest) GetSnapshot() []*Snapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +type DeleteResponse struct { + Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` + Version []int64 `protobuf:"varint,3,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } +func (m *DeleteResponse) String() string { return proto.CompactTextString(m) } +func (*DeleteResponse) ProtoMessage() {} + +func (m *DeleteResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +func (m *DeleteResponse) GetVersion() []int64 { + if m != nil { + return m.Version + } + return nil +} + +type NextRequest struct { + Header *InternalHeader `protobuf:"bytes,5,opt,name=header" json:"header,omitempty"` + Cursor *Cursor `protobuf:"bytes,1,req,name=cursor" json:"cursor,omitempty"` + Count *int32 `protobuf:"varint,2,opt,name=count" json:"count,omitempty"` + Offset *int32 `protobuf:"varint,4,opt,name=offset,def=0" json:"offset,omitempty"` + Compile *bool `protobuf:"varint,3,opt,name=compile,def=0" json:"compile,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *NextRequest) Reset() { *m = NextRequest{} } +func (m *NextRequest) String() string { return proto.CompactTextString(m) } +func (*NextRequest) ProtoMessage() {} + +const Default_NextRequest_Offset int32 = 0 +const Default_NextRequest_Compile bool = false + +func (m *NextRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *NextRequest) GetCursor() *Cursor { + if m != nil { + return m.Cursor + } + return nil +} + +func (m *NextRequest) GetCount() int32 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *NextRequest) GetOffset() int32 { + if m != nil && m.Offset != nil { + return *m.Offset + } + return Default_NextRequest_Offset +} + +func (m *NextRequest) GetCompile() bool { + if m != nil && m.Compile != nil { + return *m.Compile + } + return Default_NextRequest_Compile +} + +type QueryResult struct { + Cursor *Cursor `protobuf:"bytes,1,opt,name=cursor" json:"cursor,omitempty"` + Result []*EntityProto `protobuf:"bytes,2,rep,name=result" json:"result,omitempty"` + SkippedResults *int32 `protobuf:"varint,7,opt,name=skipped_results" json:"skipped_results,omitempty"` + MoreResults *bool `protobuf:"varint,3,req,name=more_results" json:"more_results,omitempty"` + KeysOnly *bool `protobuf:"varint,4,opt,name=keys_only" json:"keys_only,omitempty"` + IndexOnly *bool `protobuf:"varint,9,opt,name=index_only" json:"index_only,omitempty"` + SmallOps *bool `protobuf:"varint,10,opt,name=small_ops" json:"small_ops,omitempty"` + CompiledQuery *CompiledQuery `protobuf:"bytes,5,opt,name=compiled_query" json:"compiled_query,omitempty"` + CompiledCursor *CompiledCursor `protobuf:"bytes,6,opt,name=compiled_cursor" json:"compiled_cursor,omitempty"` + Index []*CompositeIndex `protobuf:"bytes,8,rep,name=index" json:"index,omitempty"` + Version []int64 `protobuf:"varint,11,rep,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *QueryResult) Reset() { *m = QueryResult{} } +func (m *QueryResult) String() string { return proto.CompactTextString(m) } +func (*QueryResult) ProtoMessage() {} + +func (m *QueryResult) GetCursor() *Cursor { + if m != nil { + return m.Cursor + } + return nil +} + +func (m *QueryResult) GetResult() []*EntityProto { + if m != nil { + return m.Result + } + return nil +} + +func (m *QueryResult) GetSkippedResults() int32 { + if m != nil && m.SkippedResults != nil { + return *m.SkippedResults + } + return 0 +} + +func (m *QueryResult) GetMoreResults() bool { + if m != nil && m.MoreResults != nil { + return *m.MoreResults + } + return false +} + +func (m *QueryResult) GetKeysOnly() bool { + if m != nil && m.KeysOnly != nil { + return *m.KeysOnly + } + return false +} + +func (m *QueryResult) GetIndexOnly() bool { + if m != nil && m.IndexOnly != nil { + return *m.IndexOnly + } + return false +} + +func (m *QueryResult) GetSmallOps() bool { + if m != nil && m.SmallOps != nil { + return *m.SmallOps + } + return false +} + +func (m *QueryResult) GetCompiledQuery() *CompiledQuery { + if m != nil { + return m.CompiledQuery + } + return nil +} + +func (m *QueryResult) GetCompiledCursor() *CompiledCursor { + if m != nil { + return m.CompiledCursor + } + return nil +} + +func (m *QueryResult) GetIndex() []*CompositeIndex { + if m != nil { + return m.Index + } + return nil +} + +func (m *QueryResult) GetVersion() []int64 { + if m != nil { + return m.Version + } + return nil +} + +type AllocateIdsRequest struct { + Header *InternalHeader `protobuf:"bytes,4,opt,name=header" json:"header,omitempty"` + ModelKey *Reference `protobuf:"bytes,1,opt,name=model_key" json:"model_key,omitempty"` + Size *int64 `protobuf:"varint,2,opt,name=size" json:"size,omitempty"` + Max *int64 `protobuf:"varint,3,opt,name=max" json:"max,omitempty"` + Reserve []*Reference `protobuf:"bytes,5,rep,name=reserve" json:"reserve,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *AllocateIdsRequest) Reset() { *m = AllocateIdsRequest{} } +func (m *AllocateIdsRequest) String() string { return proto.CompactTextString(m) } +func (*AllocateIdsRequest) ProtoMessage() {} + +func (m *AllocateIdsRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AllocateIdsRequest) GetModelKey() *Reference { + if m != nil { + return m.ModelKey + } + return nil +} + +func (m *AllocateIdsRequest) GetSize() int64 { + if m != nil && m.Size != nil { + return *m.Size + } + return 0 +} + +func (m *AllocateIdsRequest) GetMax() int64 { + if m != nil && m.Max != nil { + return *m.Max + } + return 0 +} + +func (m *AllocateIdsRequest) GetReserve() []*Reference { + if m != nil { + return m.Reserve + } + return nil +} + +type AllocateIdsResponse struct { + Start *int64 `protobuf:"varint,1,req,name=start" json:"start,omitempty"` + End *int64 `protobuf:"varint,2,req,name=end" json:"end,omitempty"` + Cost *Cost `protobuf:"bytes,3,opt,name=cost" json:"cost,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *AllocateIdsResponse) Reset() { *m = AllocateIdsResponse{} } +func (m *AllocateIdsResponse) String() string { return proto.CompactTextString(m) } +func (*AllocateIdsResponse) ProtoMessage() {} + +func (m *AllocateIdsResponse) GetStart() int64 { + if m != nil && m.Start != nil { + return *m.Start + } + return 0 +} + +func (m *AllocateIdsResponse) GetEnd() int64 { + if m != nil && m.End != nil { + return *m.End + } + return 0 +} + +func (m *AllocateIdsResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +type CompositeIndices struct { + Index []*CompositeIndex `protobuf:"bytes,1,rep,name=index" json:"index,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CompositeIndices) Reset() { *m = CompositeIndices{} } +func (m *CompositeIndices) String() string { return proto.CompactTextString(m) } +func (*CompositeIndices) ProtoMessage() {} + +func (m *CompositeIndices) GetIndex() []*CompositeIndex { + if m != nil { + return m.Index + } + return nil +} + +type AddActionsRequest struct { + Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` + Transaction *Transaction `protobuf:"bytes,1,req,name=transaction" json:"transaction,omitempty"` + Action []*Action `protobuf:"bytes,2,rep,name=action" json:"action,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *AddActionsRequest) Reset() { *m = AddActionsRequest{} } +func (m *AddActionsRequest) String() string { return proto.CompactTextString(m) } +func (*AddActionsRequest) ProtoMessage() {} + +func (m *AddActionsRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *AddActionsRequest) GetTransaction() *Transaction { + if m != nil { + return m.Transaction + } + return nil +} + +func (m *AddActionsRequest) GetAction() []*Action { + if m != nil { + return m.Action + } + return nil +} + +type AddActionsResponse struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *AddActionsResponse) Reset() { *m = AddActionsResponse{} } +func (m *AddActionsResponse) String() string { return proto.CompactTextString(m) } +func (*AddActionsResponse) ProtoMessage() {} + +type BeginTransactionRequest struct { + Header *InternalHeader `protobuf:"bytes,3,opt,name=header" json:"header,omitempty"` + App *string `protobuf:"bytes,1,req,name=app" json:"app,omitempty"` + AllowMultipleEg *bool `protobuf:"varint,2,opt,name=allow_multiple_eg,def=0" json:"allow_multiple_eg,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *BeginTransactionRequest) Reset() { *m = BeginTransactionRequest{} } +func (m *BeginTransactionRequest) String() string { return proto.CompactTextString(m) } +func (*BeginTransactionRequest) ProtoMessage() {} + +const Default_BeginTransactionRequest_AllowMultipleEg bool = false + +func (m *BeginTransactionRequest) GetHeader() *InternalHeader { + if m != nil { + return m.Header + } + return nil +} + +func (m *BeginTransactionRequest) GetApp() string { + if m != nil && m.App != nil { + return *m.App + } + return "" +} + +func (m *BeginTransactionRequest) GetAllowMultipleEg() bool { + if m != nil && m.AllowMultipleEg != nil { + return *m.AllowMultipleEg + } + return Default_BeginTransactionRequest_AllowMultipleEg +} + +type CommitResponse struct { + Cost *Cost `protobuf:"bytes,1,opt,name=cost" json:"cost,omitempty"` + Version []*CommitResponse_Version `protobuf:"group,3,rep,name=Version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CommitResponse) Reset() { *m = CommitResponse{} } +func (m *CommitResponse) String() string { return proto.CompactTextString(m) } +func (*CommitResponse) ProtoMessage() {} + +func (m *CommitResponse) GetCost() *Cost { + if m != nil { + return m.Cost + } + return nil +} + +func (m *CommitResponse) GetVersion() []*CommitResponse_Version { + if m != nil { + return m.Version + } + return nil +} + +type CommitResponse_Version struct { + RootEntityKey *Reference `protobuf:"bytes,4,req,name=root_entity_key" json:"root_entity_key,omitempty"` + Version *int64 `protobuf:"varint,5,req,name=version" json:"version,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *CommitResponse_Version) Reset() { *m = CommitResponse_Version{} } +func (m *CommitResponse_Version) String() string { return proto.CompactTextString(m) } +func (*CommitResponse_Version) ProtoMessage() {} + +func (m *CommitResponse_Version) GetRootEntityKey() *Reference { + if m != nil { + return m.RootEntityKey + } + return nil +} + +func (m *CommitResponse_Version) GetVersion() int64 { + if m != nil && m.Version != nil { + return *m.Version + } + return 0 +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto new file mode 100755 index 00000000..e76f126f --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto @@ -0,0 +1,541 @@ +syntax = "proto2"; +option go_package = "datastore"; + +package appengine; + +message Action{} + +message PropertyValue { + optional int64 int64Value = 1; + optional bool booleanValue = 2; + optional string stringValue = 3; + optional double doubleValue = 4; + + optional group PointValue = 5 { + required double x = 6; + required double y = 7; + } + + optional group UserValue = 8 { + required string email = 9; + required string auth_domain = 10; + optional string nickname = 11; + optional string federated_identity = 21; + optional string federated_provider = 22; + } + + optional group ReferenceValue = 12 { + required string app = 13; + optional string name_space = 20; + repeated group PathElement = 14 { + required string type = 15; + optional int64 id = 16; + optional string name = 17; + } + } +} + +message Property { + enum Meaning { + NO_MEANING = 0; + BLOB = 14; + TEXT = 15; + BYTESTRING = 16; + + ATOM_CATEGORY = 1; + ATOM_LINK = 2; + ATOM_TITLE = 3; + ATOM_CONTENT = 4; + ATOM_SUMMARY = 5; + ATOM_AUTHOR = 6; + + GD_WHEN = 7; + GD_EMAIL = 8; + GEORSS_POINT = 9; + GD_IM = 10; + + GD_PHONENUMBER = 11; + GD_POSTALADDRESS = 12; + + GD_RATING = 13; + + BLOBKEY = 17; + ENTITY_PROTO = 19; + + INDEX_VALUE = 18; + }; + + optional Meaning meaning = 1 [default = NO_MEANING]; + optional string meaning_uri = 2; + + required string name = 3; + + required PropertyValue value = 5; + + required bool multiple = 4; + + optional bool searchable = 6 [default=false]; + + enum FtsTokenizationOption { + HTML = 1; + ATOM = 2; + } + + optional FtsTokenizationOption fts_tokenization_option = 8; + + optional string locale = 9 [default = "en"]; +} + +message Path { + repeated group Element = 1 { + required string type = 2; + optional int64 id = 3; + optional string name = 4; + } +} + +message Reference { + required string app = 13; + optional string name_space = 20; + required Path path = 14; +} + +message User { + required string email = 1; + required string auth_domain = 2; + optional string nickname = 3; + optional string federated_identity = 6; + optional string federated_provider = 7; +} + +message EntityProto { + required Reference key = 13; + required Path entity_group = 16; + optional User owner = 17; + + enum Kind { + GD_CONTACT = 1; + GD_EVENT = 2; + GD_MESSAGE = 3; + } + optional Kind kind = 4; + optional string kind_uri = 5; + + repeated Property property = 14; + repeated Property raw_property = 15; + + optional int32 rank = 18; +} + +message CompositeProperty { + required int64 index_id = 1; + repeated string value = 2; +} + +message Index { + required string entity_type = 1; + required bool ancestor = 5; + repeated group Property = 2 { + required string name = 3; + enum Direction { + ASCENDING = 1; + DESCENDING = 2; + } + optional Direction direction = 4 [default = ASCENDING]; + } +} + +message CompositeIndex { + required string app_id = 1; + required int64 id = 2; + required Index definition = 3; + + enum State { + WRITE_ONLY = 1; + READ_WRITE = 2; + DELETED = 3; + ERROR = 4; + } + required State state = 4; + + optional bool only_use_if_required = 6 [default = false]; +} + +message IndexPostfix { + message IndexValue { + required string property_name = 1; + required PropertyValue value = 2; + } + + repeated IndexValue index_value = 1; + + optional Reference key = 2; + + optional bool before = 3 [default=true]; +} + +message IndexPosition { + optional string key = 1; + + optional bool before = 2 [default=true]; +} + +message Snapshot { + enum Status { + INACTIVE = 0; + ACTIVE = 1; + } + + required int64 ts = 1; +} + +message InternalHeader { + optional string qos = 1; +} + +message Transaction { + optional InternalHeader header = 4; + required fixed64 handle = 1; + required string app = 2; + optional bool mark_changes = 3 [default = false]; +} + +message Query { + optional InternalHeader header = 39; + + required string app = 1; + optional string name_space = 29; + + optional string kind = 3; + optional Reference ancestor = 17; + + repeated group Filter = 4 { + enum Operator { + LESS_THAN = 1; + LESS_THAN_OR_EQUAL = 2; + GREATER_THAN = 3; + GREATER_THAN_OR_EQUAL = 4; + EQUAL = 5; + IN = 6; + EXISTS = 7; + } + + required Operator op = 6; + repeated Property property = 14; + } + + optional string search_query = 8; + + repeated group Order = 9 { + enum Direction { + ASCENDING = 1; + DESCENDING = 2; + } + + required string property = 10; + optional Direction direction = 11 [default = ASCENDING]; + } + + enum Hint { + ORDER_FIRST = 1; + ANCESTOR_FIRST = 2; + FILTER_FIRST = 3; + } + optional Hint hint = 18; + + optional int32 count = 23; + + optional int32 offset = 12 [default = 0]; + + optional int32 limit = 16; + + optional CompiledCursor compiled_cursor = 30; + optional CompiledCursor end_compiled_cursor = 31; + + repeated CompositeIndex composite_index = 19; + + optional bool require_perfect_plan = 20 [default = false]; + + optional bool keys_only = 21 [default = false]; + + optional Transaction transaction = 22; + + optional bool compile = 25 [default = false]; + + optional int64 failover_ms = 26; + + optional bool strong = 32; + + repeated string property_name = 33; + + repeated string group_by_property_name = 34; + + optional bool distinct = 24; + + optional int64 min_safe_time_seconds = 35; + + repeated string safe_replica_name = 36; + + optional bool persist_offset = 37 [default=false]; +} + +message CompiledQuery { + required group PrimaryScan = 1 { + optional string index_name = 2; + + optional string start_key = 3; + optional bool start_inclusive = 4; + optional string end_key = 5; + optional bool end_inclusive = 6; + + repeated string start_postfix_value = 22; + repeated string end_postfix_value = 23; + + optional int64 end_unapplied_log_timestamp_us = 19; + } + + repeated group MergeJoinScan = 7 { + required string index_name = 8; + + repeated string prefix_value = 9; + + optional bool value_prefix = 20 [default=false]; + } + + optional Index index_def = 21; + + optional int32 offset = 10 [default = 0]; + + optional int32 limit = 11; + + required bool keys_only = 12; + + repeated string property_name = 24; + + optional int32 distinct_infix_size = 25; + + optional group EntityFilter = 13 { + optional bool distinct = 14 [default=false]; + + optional string kind = 17; + optional Reference ancestor = 18; + } +} + +message CompiledCursor { + optional group Position = 2 { + optional string start_key = 27; + + repeated group IndexValue = 29 { + optional string property = 30; + required PropertyValue value = 31; + } + + optional Reference key = 32; + + optional bool start_inclusive = 28 [default=true]; + } +} + +message Cursor { + required fixed64 cursor = 1; + + optional string app = 2; +} + +message Error { + enum ErrorCode { + BAD_REQUEST = 1; + CONCURRENT_TRANSACTION = 2; + INTERNAL_ERROR = 3; + NEED_INDEX = 4; + TIMEOUT = 5; + PERMISSION_DENIED = 6; + BIGTABLE_ERROR = 7; + COMMITTED_BUT_STILL_APPLYING = 8; + CAPABILITY_DISABLED = 9; + TRY_ALTERNATE_BACKEND = 10; + SAFE_TIME_TOO_OLD = 11; + } +} + +message Cost { + optional int32 index_writes = 1; + optional int32 index_write_bytes = 2; + optional int32 entity_writes = 3; + optional int32 entity_write_bytes = 4; + optional group CommitCost = 5 { + optional int32 requested_entity_puts = 6; + optional int32 requested_entity_deletes = 7; + }; + optional int32 approximate_storage_delta = 8; + optional int32 id_sequence_updates = 9; +} + +message GetRequest { + optional InternalHeader header = 6; + + repeated Reference key = 1; + optional Transaction transaction = 2; + + optional int64 failover_ms = 3; + + optional bool strong = 4; + + optional bool allow_deferred = 5 [default=false]; +} + +message GetResponse { + repeated group Entity = 1 { + optional EntityProto entity = 2; + optional Reference key = 4; + + optional int64 version = 3; + } + + repeated Reference deferred = 5; + + optional bool in_order = 6 [default=true]; +} + +message PutRequest { + optional InternalHeader header = 11; + + repeated EntityProto entity = 1; + optional Transaction transaction = 2; + repeated CompositeIndex composite_index = 3; + + optional bool trusted = 4 [default = false]; + + optional bool force = 7 [default = false]; + + optional bool mark_changes = 8 [default = false]; + repeated Snapshot snapshot = 9; + + enum AutoIdPolicy { + CURRENT = 0; + SEQUENTIAL = 1; + } + optional AutoIdPolicy auto_id_policy = 10 [default = CURRENT]; +} + +message PutResponse { + repeated Reference key = 1; + optional Cost cost = 2; + repeated int64 version = 3; +} + +message TouchRequest { + optional InternalHeader header = 10; + + repeated Reference key = 1; + repeated CompositeIndex composite_index = 2; + optional bool force = 3 [default = false]; + repeated Snapshot snapshot = 9; +} + +message TouchResponse { + optional Cost cost = 1; +} + +message DeleteRequest { + optional InternalHeader header = 10; + + repeated Reference key = 6; + optional Transaction transaction = 5; + + optional bool trusted = 4 [default = false]; + + optional bool force = 7 [default = false]; + + optional bool mark_changes = 8 [default = false]; + repeated Snapshot snapshot = 9; +} + +message DeleteResponse { + optional Cost cost = 1; + repeated int64 version = 3; +} + +message NextRequest { + optional InternalHeader header = 5; + + required Cursor cursor = 1; + optional int32 count = 2; + + optional int32 offset = 4 [default = 0]; + + optional bool compile = 3 [default = false]; +} + +message QueryResult { + optional Cursor cursor = 1; + + repeated EntityProto result = 2; + + optional int32 skipped_results = 7; + + required bool more_results = 3; + + optional bool keys_only = 4; + + optional bool index_only = 9; + + optional bool small_ops = 10; + + optional CompiledQuery compiled_query = 5; + + optional CompiledCursor compiled_cursor = 6; + + repeated CompositeIndex index = 8; + + repeated int64 version = 11; +} + +message AllocateIdsRequest { + optional InternalHeader header = 4; + + optional Reference model_key = 1; + + optional int64 size = 2; + + optional int64 max = 3; + + repeated Reference reserve = 5; +} + +message AllocateIdsResponse { + required int64 start = 1; + required int64 end = 2; + optional Cost cost = 3; +} + +message CompositeIndices { + repeated CompositeIndex index = 1; +} + +message AddActionsRequest { + optional InternalHeader header = 3; + + required Transaction transaction = 1; + repeated Action action = 2; +} + +message AddActionsResponse { +} + +message BeginTransactionRequest { + optional InternalHeader header = 3; + + required string app = 1; + optional bool allow_multiple_eg = 2 [default = false]; +} + +message CommitResponse { + optional Cost cost = 1; + + repeated group Version = 3 { + required Reference root_entity_key = 4; + required int64 version = 5; + } +} diff --git a/vendor/google.golang.org/appengine/internal/identity.go b/vendor/google.golang.org/appengine/internal/identity.go new file mode 100644 index 00000000..d538701a --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/identity.go @@ -0,0 +1,14 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +import netcontext "golang.org/x/net/context" + +// These functions are implementations of the wrapper functions +// in ../appengine/identity.go. See that file for commentary. + +func AppID(c netcontext.Context) string { + return appID(FullyQualifiedAppID(c)) +} diff --git a/vendor/google.golang.org/appengine/internal/identity_classic.go b/vendor/google.golang.org/appengine/internal/identity_classic.go new file mode 100644 index 00000000..e6b9227c --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/identity_classic.go @@ -0,0 +1,27 @@ +// Copyright 2015 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import ( + "appengine" + + netcontext "golang.org/x/net/context" +) + +func DefaultVersionHostname(ctx netcontext.Context) string { + return appengine.DefaultVersionHostname(fromContext(ctx)) +} + +func RequestID(ctx netcontext.Context) string { return appengine.RequestID(fromContext(ctx)) } +func Datacenter(_ netcontext.Context) string { return appengine.Datacenter() } +func ServerSoftware() string { return appengine.ServerSoftware() } +func ModuleName(ctx netcontext.Context) string { return appengine.ModuleName(fromContext(ctx)) } +func VersionID(ctx netcontext.Context) string { return appengine.VersionID(fromContext(ctx)) } +func InstanceID() string { return appengine.InstanceID() } +func IsDevAppServer() bool { return appengine.IsDevAppServer() } + +func fullyQualifiedAppID(ctx netcontext.Context) string { return fromContext(ctx).FullyQualifiedAppID() } diff --git a/vendor/google.golang.org/appengine/internal/identity_vm.go b/vendor/google.golang.org/appengine/internal/identity_vm.go new file mode 100644 index 00000000..ebe68b78 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/identity_vm.go @@ -0,0 +1,97 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package internal + +import ( + "net/http" + "os" + + netcontext "golang.org/x/net/context" +) + +// These functions are implementations of the wrapper functions +// in ../appengine/identity.go. See that file for commentary. + +const ( + hDefaultVersionHostname = "X-AppEngine-Default-Version-Hostname" + hRequestLogId = "X-AppEngine-Request-Log-Id" + hDatacenter = "X-AppEngine-Datacenter" +) + +func ctxHeaders(ctx netcontext.Context) http.Header { + return fromContext(ctx).Request().Header +} + +func DefaultVersionHostname(ctx netcontext.Context) string { + return ctxHeaders(ctx).Get(hDefaultVersionHostname) +} + +func RequestID(ctx netcontext.Context) string { + return ctxHeaders(ctx).Get(hRequestLogId) +} + +func Datacenter(ctx netcontext.Context) string { + return ctxHeaders(ctx).Get(hDatacenter) +} + +func ServerSoftware() string { + // TODO(dsymonds): Remove fallback when we've verified this. + if s := os.Getenv("SERVER_SOFTWARE"); s != "" { + return s + } + return "Google App Engine/1.x.x" +} + +// TODO(dsymonds): Remove the metadata fetches. + +func ModuleName(_ netcontext.Context) string { + if s := os.Getenv("GAE_MODULE_NAME"); s != "" { + return s + } + return string(mustGetMetadata("instance/attributes/gae_backend_name")) +} + +func VersionID(_ netcontext.Context) string { + if s1, s2 := os.Getenv("GAE_MODULE_VERSION"), os.Getenv("GAE_MINOR_VERSION"); s1 != "" && s2 != "" { + return s1 + "." + s2 + } + return string(mustGetMetadata("instance/attributes/gae_backend_version")) + "." + string(mustGetMetadata("instance/attributes/gae_backend_minor_version")) +} + +func InstanceID() string { + if s := os.Getenv("GAE_MODULE_INSTANCE"); s != "" { + return s + } + return string(mustGetMetadata("instance/attributes/gae_backend_instance")) +} + +func partitionlessAppID() string { + // gae_project has everything except the partition prefix. + appID := os.Getenv("GAE_LONG_APP_ID") + if appID == "" { + appID = string(mustGetMetadata("instance/attributes/gae_project")) + } + return appID +} + +func fullyQualifiedAppID(_ netcontext.Context) string { + appID := partitionlessAppID() + + part := os.Getenv("GAE_PARTITION") + if part == "" { + part = string(mustGetMetadata("instance/attributes/gae_partition")) + } + + if part != "" { + appID = part + "~" + appID + } + return appID +} + +func IsDevAppServer() bool { + return os.Getenv("RUN_WITH_DEVAPPSERVER") != "" +} diff --git a/vendor/google.golang.org/appengine/internal/internal.go b/vendor/google.golang.org/appengine/internal/internal.go new file mode 100644 index 00000000..051ea398 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/internal.go @@ -0,0 +1,110 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// Package internal provides support for package appengine. +// +// Programs should not use this package directly. Its API is not stable. +// Use packages appengine and appengine/* instead. +package internal + +import ( + "fmt" + + "github.com/golang/protobuf/proto" + + remotepb "google.golang.org/appengine/internal/remote_api" +) + +// errorCodeMaps is a map of service name to the error code map for the service. +var errorCodeMaps = make(map[string]map[int32]string) + +// RegisterErrorCodeMap is called from API implementations to register their +// error code map. This should only be called from init functions. +func RegisterErrorCodeMap(service string, m map[int32]string) { + errorCodeMaps[service] = m +} + +type timeoutCodeKey struct { + service string + code int32 +} + +// timeoutCodes is the set of service+code pairs that represent timeouts. +var timeoutCodes = make(map[timeoutCodeKey]bool) + +func RegisterTimeoutErrorCode(service string, code int32) { + timeoutCodes[timeoutCodeKey{service, code}] = true +} + +// APIError is the type returned by appengine.Context's Call method +// when an API call fails in an API-specific way. This may be, for instance, +// a taskqueue API call failing with TaskQueueServiceError::UNKNOWN_QUEUE. +type APIError struct { + Service string + Detail string + Code int32 // API-specific error code +} + +func (e *APIError) Error() string { + if e.Code == 0 { + if e.Detail == "" { + return "APIError <empty>" + } + return e.Detail + } + s := fmt.Sprintf("API error %d", e.Code) + if m, ok := errorCodeMaps[e.Service]; ok { + s += " (" + e.Service + ": " + m[e.Code] + ")" + } else { + // Shouldn't happen, but provide a bit more detail if it does. + s = e.Service + " " + s + } + if e.Detail != "" { + s += ": " + e.Detail + } + return s +} + +func (e *APIError) IsTimeout() bool { + return timeoutCodes[timeoutCodeKey{e.Service, e.Code}] +} + +// CallError is the type returned by appengine.Context's Call method when an +// API call fails in a generic way, such as RpcError::CAPABILITY_DISABLED. +type CallError struct { + Detail string + Code int32 + // TODO: Remove this if we get a distinguishable error code. + Timeout bool +} + +func (e *CallError) Error() string { + var msg string + switch remotepb.RpcError_ErrorCode(e.Code) { + case remotepb.RpcError_UNKNOWN: + return e.Detail + case remotepb.RpcError_OVER_QUOTA: + msg = "Over quota" + case remotepb.RpcError_CAPABILITY_DISABLED: + msg = "Capability disabled" + case remotepb.RpcError_CANCELLED: + msg = "Canceled" + default: + msg = fmt.Sprintf("Call error %d", e.Code) + } + s := msg + ": " + e.Detail + if e.Timeout { + s += " (timeout)" + } + return s +} + +func (e *CallError) IsTimeout() bool { + return e.Timeout +} + +// NamespaceMods is a map from API service to a function that will mutate an RPC request to attach a namespace. +// The function should be prepared to be called on the same message more than once; it should only modify the +// RPC request the first time. +var NamespaceMods = make(map[string]func(m proto.Message, namespace string)) diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.pb.go b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go new file mode 100644 index 00000000..20c595be --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/log/log_service.pb.go @@ -0,0 +1,899 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/log/log_service.proto +// DO NOT EDIT! + +/* +Package log is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/log/log_service.proto + +It has these top-level messages: + LogServiceError + UserAppLogLine + UserAppLogGroup + FlushRequest + SetStatusRequest + LogOffset + LogLine + RequestLog + LogModuleVersion + LogReadRequest + LogReadResponse + LogUsageRecord + LogUsageRequest + LogUsageResponse +*/ +package log + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type LogServiceError_ErrorCode int32 + +const ( + LogServiceError_OK LogServiceError_ErrorCode = 0 + LogServiceError_INVALID_REQUEST LogServiceError_ErrorCode = 1 + LogServiceError_STORAGE_ERROR LogServiceError_ErrorCode = 2 +) + +var LogServiceError_ErrorCode_name = map[int32]string{ + 0: "OK", + 1: "INVALID_REQUEST", + 2: "STORAGE_ERROR", +} +var LogServiceError_ErrorCode_value = map[string]int32{ + "OK": 0, + "INVALID_REQUEST": 1, + "STORAGE_ERROR": 2, +} + +func (x LogServiceError_ErrorCode) Enum() *LogServiceError_ErrorCode { + p := new(LogServiceError_ErrorCode) + *p = x + return p +} +func (x LogServiceError_ErrorCode) String() string { + return proto.EnumName(LogServiceError_ErrorCode_name, int32(x)) +} +func (x *LogServiceError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(LogServiceError_ErrorCode_value, data, "LogServiceError_ErrorCode") + if err != nil { + return err + } + *x = LogServiceError_ErrorCode(value) + return nil +} + +type LogServiceError struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogServiceError) Reset() { *m = LogServiceError{} } +func (m *LogServiceError) String() string { return proto.CompactTextString(m) } +func (*LogServiceError) ProtoMessage() {} + +type UserAppLogLine struct { + TimestampUsec *int64 `protobuf:"varint,1,req,name=timestamp_usec" json:"timestamp_usec,omitempty"` + Level *int64 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` + Message *string `protobuf:"bytes,3,req,name=message" json:"message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UserAppLogLine) Reset() { *m = UserAppLogLine{} } +func (m *UserAppLogLine) String() string { return proto.CompactTextString(m) } +func (*UserAppLogLine) ProtoMessage() {} + +func (m *UserAppLogLine) GetTimestampUsec() int64 { + if m != nil && m.TimestampUsec != nil { + return *m.TimestampUsec + } + return 0 +} + +func (m *UserAppLogLine) GetLevel() int64 { + if m != nil && m.Level != nil { + return *m.Level + } + return 0 +} + +func (m *UserAppLogLine) GetMessage() string { + if m != nil && m.Message != nil { + return *m.Message + } + return "" +} + +type UserAppLogGroup struct { + LogLine []*UserAppLogLine `protobuf:"bytes,2,rep,name=log_line" json:"log_line,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *UserAppLogGroup) Reset() { *m = UserAppLogGroup{} } +func (m *UserAppLogGroup) String() string { return proto.CompactTextString(m) } +func (*UserAppLogGroup) ProtoMessage() {} + +func (m *UserAppLogGroup) GetLogLine() []*UserAppLogLine { + if m != nil { + return m.LogLine + } + return nil +} + +type FlushRequest struct { + Logs []byte `protobuf:"bytes,1,opt,name=logs" json:"logs,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *FlushRequest) Reset() { *m = FlushRequest{} } +func (m *FlushRequest) String() string { return proto.CompactTextString(m) } +func (*FlushRequest) ProtoMessage() {} + +func (m *FlushRequest) GetLogs() []byte { + if m != nil { + return m.Logs + } + return nil +} + +type SetStatusRequest struct { + Status *string `protobuf:"bytes,1,req,name=status" json:"status,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *SetStatusRequest) Reset() { *m = SetStatusRequest{} } +func (m *SetStatusRequest) String() string { return proto.CompactTextString(m) } +func (*SetStatusRequest) ProtoMessage() {} + +func (m *SetStatusRequest) GetStatus() string { + if m != nil && m.Status != nil { + return *m.Status + } + return "" +} + +type LogOffset struct { + RequestId []byte `protobuf:"bytes,1,opt,name=request_id" json:"request_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogOffset) Reset() { *m = LogOffset{} } +func (m *LogOffset) String() string { return proto.CompactTextString(m) } +func (*LogOffset) ProtoMessage() {} + +func (m *LogOffset) GetRequestId() []byte { + if m != nil { + return m.RequestId + } + return nil +} + +type LogLine struct { + Time *int64 `protobuf:"varint,1,req,name=time" json:"time,omitempty"` + Level *int32 `protobuf:"varint,2,req,name=level" json:"level,omitempty"` + LogMessage *string `protobuf:"bytes,3,req,name=log_message" json:"log_message,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogLine) Reset() { *m = LogLine{} } +func (m *LogLine) String() string { return proto.CompactTextString(m) } +func (*LogLine) ProtoMessage() {} + +func (m *LogLine) GetTime() int64 { + if m != nil && m.Time != nil { + return *m.Time + } + return 0 +} + +func (m *LogLine) GetLevel() int32 { + if m != nil && m.Level != nil { + return *m.Level + } + return 0 +} + +func (m *LogLine) GetLogMessage() string { + if m != nil && m.LogMessage != nil { + return *m.LogMessage + } + return "" +} + +type RequestLog struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + ModuleId *string `protobuf:"bytes,37,opt,name=module_id,def=default" json:"module_id,omitempty"` + VersionId *string `protobuf:"bytes,2,req,name=version_id" json:"version_id,omitempty"` + RequestId []byte `protobuf:"bytes,3,req,name=request_id" json:"request_id,omitempty"` + Offset *LogOffset `protobuf:"bytes,35,opt,name=offset" json:"offset,omitempty"` + Ip *string `protobuf:"bytes,4,req,name=ip" json:"ip,omitempty"` + Nickname *string `protobuf:"bytes,5,opt,name=nickname" json:"nickname,omitempty"` + StartTime *int64 `protobuf:"varint,6,req,name=start_time" json:"start_time,omitempty"` + EndTime *int64 `protobuf:"varint,7,req,name=end_time" json:"end_time,omitempty"` + Latency *int64 `protobuf:"varint,8,req,name=latency" json:"latency,omitempty"` + Mcycles *int64 `protobuf:"varint,9,req,name=mcycles" json:"mcycles,omitempty"` + Method *string `protobuf:"bytes,10,req,name=method" json:"method,omitempty"` + Resource *string `protobuf:"bytes,11,req,name=resource" json:"resource,omitempty"` + HttpVersion *string `protobuf:"bytes,12,req,name=http_version" json:"http_version,omitempty"` + Status *int32 `protobuf:"varint,13,req,name=status" json:"status,omitempty"` + ResponseSize *int64 `protobuf:"varint,14,req,name=response_size" json:"response_size,omitempty"` + Referrer *string `protobuf:"bytes,15,opt,name=referrer" json:"referrer,omitempty"` + UserAgent *string `protobuf:"bytes,16,opt,name=user_agent" json:"user_agent,omitempty"` + UrlMapEntry *string `protobuf:"bytes,17,req,name=url_map_entry" json:"url_map_entry,omitempty"` + Combined *string `protobuf:"bytes,18,req,name=combined" json:"combined,omitempty"` + ApiMcycles *int64 `protobuf:"varint,19,opt,name=api_mcycles" json:"api_mcycles,omitempty"` + Host *string `protobuf:"bytes,20,opt,name=host" json:"host,omitempty"` + Cost *float64 `protobuf:"fixed64,21,opt,name=cost" json:"cost,omitempty"` + TaskQueueName *string `protobuf:"bytes,22,opt,name=task_queue_name" json:"task_queue_name,omitempty"` + TaskName *string `protobuf:"bytes,23,opt,name=task_name" json:"task_name,omitempty"` + WasLoadingRequest *bool `protobuf:"varint,24,opt,name=was_loading_request" json:"was_loading_request,omitempty"` + PendingTime *int64 `protobuf:"varint,25,opt,name=pending_time" json:"pending_time,omitempty"` + ReplicaIndex *int32 `protobuf:"varint,26,opt,name=replica_index,def=-1" json:"replica_index,omitempty"` + Finished *bool `protobuf:"varint,27,opt,name=finished,def=1" json:"finished,omitempty"` + CloneKey []byte `protobuf:"bytes,28,opt,name=clone_key" json:"clone_key,omitempty"` + Line []*LogLine `protobuf:"bytes,29,rep,name=line" json:"line,omitempty"` + LinesIncomplete *bool `protobuf:"varint,36,opt,name=lines_incomplete" json:"lines_incomplete,omitempty"` + AppEngineRelease []byte `protobuf:"bytes,38,opt,name=app_engine_release" json:"app_engine_release,omitempty"` + ExitReason *int32 `protobuf:"varint,30,opt,name=exit_reason" json:"exit_reason,omitempty"` + WasThrottledForTime *bool `protobuf:"varint,31,opt,name=was_throttled_for_time" json:"was_throttled_for_time,omitempty"` + WasThrottledForRequests *bool `protobuf:"varint,32,opt,name=was_throttled_for_requests" json:"was_throttled_for_requests,omitempty"` + ThrottledTime *int64 `protobuf:"varint,33,opt,name=throttled_time" json:"throttled_time,omitempty"` + ServerName []byte `protobuf:"bytes,34,opt,name=server_name" json:"server_name,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RequestLog) Reset() { *m = RequestLog{} } +func (m *RequestLog) String() string { return proto.CompactTextString(m) } +func (*RequestLog) ProtoMessage() {} + +const Default_RequestLog_ModuleId string = "default" +const Default_RequestLog_ReplicaIndex int32 = -1 +const Default_RequestLog_Finished bool = true + +func (m *RequestLog) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *RequestLog) GetModuleId() string { + if m != nil && m.ModuleId != nil { + return *m.ModuleId + } + return Default_RequestLog_ModuleId +} + +func (m *RequestLog) GetVersionId() string { + if m != nil && m.VersionId != nil { + return *m.VersionId + } + return "" +} + +func (m *RequestLog) GetRequestId() []byte { + if m != nil { + return m.RequestId + } + return nil +} + +func (m *RequestLog) GetOffset() *LogOffset { + if m != nil { + return m.Offset + } + return nil +} + +func (m *RequestLog) GetIp() string { + if m != nil && m.Ip != nil { + return *m.Ip + } + return "" +} + +func (m *RequestLog) GetNickname() string { + if m != nil && m.Nickname != nil { + return *m.Nickname + } + return "" +} + +func (m *RequestLog) GetStartTime() int64 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *RequestLog) GetEndTime() int64 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *RequestLog) GetLatency() int64 { + if m != nil && m.Latency != nil { + return *m.Latency + } + return 0 +} + +func (m *RequestLog) GetMcycles() int64 { + if m != nil && m.Mcycles != nil { + return *m.Mcycles + } + return 0 +} + +func (m *RequestLog) GetMethod() string { + if m != nil && m.Method != nil { + return *m.Method + } + return "" +} + +func (m *RequestLog) GetResource() string { + if m != nil && m.Resource != nil { + return *m.Resource + } + return "" +} + +func (m *RequestLog) GetHttpVersion() string { + if m != nil && m.HttpVersion != nil { + return *m.HttpVersion + } + return "" +} + +func (m *RequestLog) GetStatus() int32 { + if m != nil && m.Status != nil { + return *m.Status + } + return 0 +} + +func (m *RequestLog) GetResponseSize() int64 { + if m != nil && m.ResponseSize != nil { + return *m.ResponseSize + } + return 0 +} + +func (m *RequestLog) GetReferrer() string { + if m != nil && m.Referrer != nil { + return *m.Referrer + } + return "" +} + +func (m *RequestLog) GetUserAgent() string { + if m != nil && m.UserAgent != nil { + return *m.UserAgent + } + return "" +} + +func (m *RequestLog) GetUrlMapEntry() string { + if m != nil && m.UrlMapEntry != nil { + return *m.UrlMapEntry + } + return "" +} + +func (m *RequestLog) GetCombined() string { + if m != nil && m.Combined != nil { + return *m.Combined + } + return "" +} + +func (m *RequestLog) GetApiMcycles() int64 { + if m != nil && m.ApiMcycles != nil { + return *m.ApiMcycles + } + return 0 +} + +func (m *RequestLog) GetHost() string { + if m != nil && m.Host != nil { + return *m.Host + } + return "" +} + +func (m *RequestLog) GetCost() float64 { + if m != nil && m.Cost != nil { + return *m.Cost + } + return 0 +} + +func (m *RequestLog) GetTaskQueueName() string { + if m != nil && m.TaskQueueName != nil { + return *m.TaskQueueName + } + return "" +} + +func (m *RequestLog) GetTaskName() string { + if m != nil && m.TaskName != nil { + return *m.TaskName + } + return "" +} + +func (m *RequestLog) GetWasLoadingRequest() bool { + if m != nil && m.WasLoadingRequest != nil { + return *m.WasLoadingRequest + } + return false +} + +func (m *RequestLog) GetPendingTime() int64 { + if m != nil && m.PendingTime != nil { + return *m.PendingTime + } + return 0 +} + +func (m *RequestLog) GetReplicaIndex() int32 { + if m != nil && m.ReplicaIndex != nil { + return *m.ReplicaIndex + } + return Default_RequestLog_ReplicaIndex +} + +func (m *RequestLog) GetFinished() bool { + if m != nil && m.Finished != nil { + return *m.Finished + } + return Default_RequestLog_Finished +} + +func (m *RequestLog) GetCloneKey() []byte { + if m != nil { + return m.CloneKey + } + return nil +} + +func (m *RequestLog) GetLine() []*LogLine { + if m != nil { + return m.Line + } + return nil +} + +func (m *RequestLog) GetLinesIncomplete() bool { + if m != nil && m.LinesIncomplete != nil { + return *m.LinesIncomplete + } + return false +} + +func (m *RequestLog) GetAppEngineRelease() []byte { + if m != nil { + return m.AppEngineRelease + } + return nil +} + +func (m *RequestLog) GetExitReason() int32 { + if m != nil && m.ExitReason != nil { + return *m.ExitReason + } + return 0 +} + +func (m *RequestLog) GetWasThrottledForTime() bool { + if m != nil && m.WasThrottledForTime != nil { + return *m.WasThrottledForTime + } + return false +} + +func (m *RequestLog) GetWasThrottledForRequests() bool { + if m != nil && m.WasThrottledForRequests != nil { + return *m.WasThrottledForRequests + } + return false +} + +func (m *RequestLog) GetThrottledTime() int64 { + if m != nil && m.ThrottledTime != nil { + return *m.ThrottledTime + } + return 0 +} + +func (m *RequestLog) GetServerName() []byte { + if m != nil { + return m.ServerName + } + return nil +} + +type LogModuleVersion struct { + ModuleId *string `protobuf:"bytes,1,opt,name=module_id,def=default" json:"module_id,omitempty"` + VersionId *string `protobuf:"bytes,2,opt,name=version_id" json:"version_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogModuleVersion) Reset() { *m = LogModuleVersion{} } +func (m *LogModuleVersion) String() string { return proto.CompactTextString(m) } +func (*LogModuleVersion) ProtoMessage() {} + +const Default_LogModuleVersion_ModuleId string = "default" + +func (m *LogModuleVersion) GetModuleId() string { + if m != nil && m.ModuleId != nil { + return *m.ModuleId + } + return Default_LogModuleVersion_ModuleId +} + +func (m *LogModuleVersion) GetVersionId() string { + if m != nil && m.VersionId != nil { + return *m.VersionId + } + return "" +} + +type LogReadRequest struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + VersionId []string `protobuf:"bytes,2,rep,name=version_id" json:"version_id,omitempty"` + ModuleVersion []*LogModuleVersion `protobuf:"bytes,19,rep,name=module_version" json:"module_version,omitempty"` + StartTime *int64 `protobuf:"varint,3,opt,name=start_time" json:"start_time,omitempty"` + EndTime *int64 `protobuf:"varint,4,opt,name=end_time" json:"end_time,omitempty"` + Offset *LogOffset `protobuf:"bytes,5,opt,name=offset" json:"offset,omitempty"` + RequestId [][]byte `protobuf:"bytes,6,rep,name=request_id" json:"request_id,omitempty"` + MinimumLogLevel *int32 `protobuf:"varint,7,opt,name=minimum_log_level" json:"minimum_log_level,omitempty"` + IncludeIncomplete *bool `protobuf:"varint,8,opt,name=include_incomplete" json:"include_incomplete,omitempty"` + Count *int64 `protobuf:"varint,9,opt,name=count" json:"count,omitempty"` + CombinedLogRegex *string `protobuf:"bytes,14,opt,name=combined_log_regex" json:"combined_log_regex,omitempty"` + HostRegex *string `protobuf:"bytes,15,opt,name=host_regex" json:"host_regex,omitempty"` + ReplicaIndex *int32 `protobuf:"varint,16,opt,name=replica_index" json:"replica_index,omitempty"` + IncludeAppLogs *bool `protobuf:"varint,10,opt,name=include_app_logs" json:"include_app_logs,omitempty"` + AppLogsPerRequest *int32 `protobuf:"varint,17,opt,name=app_logs_per_request" json:"app_logs_per_request,omitempty"` + IncludeHost *bool `protobuf:"varint,11,opt,name=include_host" json:"include_host,omitempty"` + IncludeAll *bool `protobuf:"varint,12,opt,name=include_all" json:"include_all,omitempty"` + CacheIterator *bool `protobuf:"varint,13,opt,name=cache_iterator" json:"cache_iterator,omitempty"` + NumShards *int32 `protobuf:"varint,18,opt,name=num_shards" json:"num_shards,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogReadRequest) Reset() { *m = LogReadRequest{} } +func (m *LogReadRequest) String() string { return proto.CompactTextString(m) } +func (*LogReadRequest) ProtoMessage() {} + +func (m *LogReadRequest) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *LogReadRequest) GetVersionId() []string { + if m != nil { + return m.VersionId + } + return nil +} + +func (m *LogReadRequest) GetModuleVersion() []*LogModuleVersion { + if m != nil { + return m.ModuleVersion + } + return nil +} + +func (m *LogReadRequest) GetStartTime() int64 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *LogReadRequest) GetEndTime() int64 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *LogReadRequest) GetOffset() *LogOffset { + if m != nil { + return m.Offset + } + return nil +} + +func (m *LogReadRequest) GetRequestId() [][]byte { + if m != nil { + return m.RequestId + } + return nil +} + +func (m *LogReadRequest) GetMinimumLogLevel() int32 { + if m != nil && m.MinimumLogLevel != nil { + return *m.MinimumLogLevel + } + return 0 +} + +func (m *LogReadRequest) GetIncludeIncomplete() bool { + if m != nil && m.IncludeIncomplete != nil { + return *m.IncludeIncomplete + } + return false +} + +func (m *LogReadRequest) GetCount() int64 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *LogReadRequest) GetCombinedLogRegex() string { + if m != nil && m.CombinedLogRegex != nil { + return *m.CombinedLogRegex + } + return "" +} + +func (m *LogReadRequest) GetHostRegex() string { + if m != nil && m.HostRegex != nil { + return *m.HostRegex + } + return "" +} + +func (m *LogReadRequest) GetReplicaIndex() int32 { + if m != nil && m.ReplicaIndex != nil { + return *m.ReplicaIndex + } + return 0 +} + +func (m *LogReadRequest) GetIncludeAppLogs() bool { + if m != nil && m.IncludeAppLogs != nil { + return *m.IncludeAppLogs + } + return false +} + +func (m *LogReadRequest) GetAppLogsPerRequest() int32 { + if m != nil && m.AppLogsPerRequest != nil { + return *m.AppLogsPerRequest + } + return 0 +} + +func (m *LogReadRequest) GetIncludeHost() bool { + if m != nil && m.IncludeHost != nil { + return *m.IncludeHost + } + return false +} + +func (m *LogReadRequest) GetIncludeAll() bool { + if m != nil && m.IncludeAll != nil { + return *m.IncludeAll + } + return false +} + +func (m *LogReadRequest) GetCacheIterator() bool { + if m != nil && m.CacheIterator != nil { + return *m.CacheIterator + } + return false +} + +func (m *LogReadRequest) GetNumShards() int32 { + if m != nil && m.NumShards != nil { + return *m.NumShards + } + return 0 +} + +type LogReadResponse struct { + Log []*RequestLog `protobuf:"bytes,1,rep,name=log" json:"log,omitempty"` + Offset *LogOffset `protobuf:"bytes,2,opt,name=offset" json:"offset,omitempty"` + LastEndTime *int64 `protobuf:"varint,3,opt,name=last_end_time" json:"last_end_time,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogReadResponse) Reset() { *m = LogReadResponse{} } +func (m *LogReadResponse) String() string { return proto.CompactTextString(m) } +func (*LogReadResponse) ProtoMessage() {} + +func (m *LogReadResponse) GetLog() []*RequestLog { + if m != nil { + return m.Log + } + return nil +} + +func (m *LogReadResponse) GetOffset() *LogOffset { + if m != nil { + return m.Offset + } + return nil +} + +func (m *LogReadResponse) GetLastEndTime() int64 { + if m != nil && m.LastEndTime != nil { + return *m.LastEndTime + } + return 0 +} + +type LogUsageRecord struct { + VersionId *string `protobuf:"bytes,1,opt,name=version_id" json:"version_id,omitempty"` + StartTime *int32 `protobuf:"varint,2,opt,name=start_time" json:"start_time,omitempty"` + EndTime *int32 `protobuf:"varint,3,opt,name=end_time" json:"end_time,omitempty"` + Count *int64 `protobuf:"varint,4,opt,name=count" json:"count,omitempty"` + TotalSize *int64 `protobuf:"varint,5,opt,name=total_size" json:"total_size,omitempty"` + Records *int32 `protobuf:"varint,6,opt,name=records" json:"records,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogUsageRecord) Reset() { *m = LogUsageRecord{} } +func (m *LogUsageRecord) String() string { return proto.CompactTextString(m) } +func (*LogUsageRecord) ProtoMessage() {} + +func (m *LogUsageRecord) GetVersionId() string { + if m != nil && m.VersionId != nil { + return *m.VersionId + } + return "" +} + +func (m *LogUsageRecord) GetStartTime() int32 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *LogUsageRecord) GetEndTime() int32 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *LogUsageRecord) GetCount() int64 { + if m != nil && m.Count != nil { + return *m.Count + } + return 0 +} + +func (m *LogUsageRecord) GetTotalSize() int64 { + if m != nil && m.TotalSize != nil { + return *m.TotalSize + } + return 0 +} + +func (m *LogUsageRecord) GetRecords() int32 { + if m != nil && m.Records != nil { + return *m.Records + } + return 0 +} + +type LogUsageRequest struct { + AppId *string `protobuf:"bytes,1,req,name=app_id" json:"app_id,omitempty"` + VersionId []string `protobuf:"bytes,2,rep,name=version_id" json:"version_id,omitempty"` + StartTime *int32 `protobuf:"varint,3,opt,name=start_time" json:"start_time,omitempty"` + EndTime *int32 `protobuf:"varint,4,opt,name=end_time" json:"end_time,omitempty"` + ResolutionHours *uint32 `protobuf:"varint,5,opt,name=resolution_hours,def=1" json:"resolution_hours,omitempty"` + CombineVersions *bool `protobuf:"varint,6,opt,name=combine_versions" json:"combine_versions,omitempty"` + UsageVersion *int32 `protobuf:"varint,7,opt,name=usage_version" json:"usage_version,omitempty"` + VersionsOnly *bool `protobuf:"varint,8,opt,name=versions_only" json:"versions_only,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogUsageRequest) Reset() { *m = LogUsageRequest{} } +func (m *LogUsageRequest) String() string { return proto.CompactTextString(m) } +func (*LogUsageRequest) ProtoMessage() {} + +const Default_LogUsageRequest_ResolutionHours uint32 = 1 + +func (m *LogUsageRequest) GetAppId() string { + if m != nil && m.AppId != nil { + return *m.AppId + } + return "" +} + +func (m *LogUsageRequest) GetVersionId() []string { + if m != nil { + return m.VersionId + } + return nil +} + +func (m *LogUsageRequest) GetStartTime() int32 { + if m != nil && m.StartTime != nil { + return *m.StartTime + } + return 0 +} + +func (m *LogUsageRequest) GetEndTime() int32 { + if m != nil && m.EndTime != nil { + return *m.EndTime + } + return 0 +} + +func (m *LogUsageRequest) GetResolutionHours() uint32 { + if m != nil && m.ResolutionHours != nil { + return *m.ResolutionHours + } + return Default_LogUsageRequest_ResolutionHours +} + +func (m *LogUsageRequest) GetCombineVersions() bool { + if m != nil && m.CombineVersions != nil { + return *m.CombineVersions + } + return false +} + +func (m *LogUsageRequest) GetUsageVersion() int32 { + if m != nil && m.UsageVersion != nil { + return *m.UsageVersion + } + return 0 +} + +func (m *LogUsageRequest) GetVersionsOnly() bool { + if m != nil && m.VersionsOnly != nil { + return *m.VersionsOnly + } + return false +} + +type LogUsageResponse struct { + Usage []*LogUsageRecord `protobuf:"bytes,1,rep,name=usage" json:"usage,omitempty"` + Summary *LogUsageRecord `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *LogUsageResponse) Reset() { *m = LogUsageResponse{} } +func (m *LogUsageResponse) String() string { return proto.CompactTextString(m) } +func (*LogUsageResponse) ProtoMessage() {} + +func (m *LogUsageResponse) GetUsage() []*LogUsageRecord { + if m != nil { + return m.Usage + } + return nil +} + +func (m *LogUsageResponse) GetSummary() *LogUsageRecord { + if m != nil { + return m.Summary + } + return nil +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/log/log_service.proto b/vendor/google.golang.org/appengine/internal/log/log_service.proto new file mode 100644 index 00000000..8981dc47 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/log/log_service.proto @@ -0,0 +1,150 @@ +syntax = "proto2"; +option go_package = "log"; + +package appengine; + +message LogServiceError { + enum ErrorCode { + OK = 0; + INVALID_REQUEST = 1; + STORAGE_ERROR = 2; + } +} + +message UserAppLogLine { + required int64 timestamp_usec = 1; + required int64 level = 2; + required string message = 3; +} + +message UserAppLogGroup { + repeated UserAppLogLine log_line = 2; +} + +message FlushRequest { + optional bytes logs = 1; +} + +message SetStatusRequest { + required string status = 1; +} + + +message LogOffset { + optional bytes request_id = 1; +} + +message LogLine { + required int64 time = 1; + required int32 level = 2; + required string log_message = 3; +} + +message RequestLog { + required string app_id = 1; + optional string module_id = 37 [default="default"]; + required string version_id = 2; + required bytes request_id = 3; + optional LogOffset offset = 35; + required string ip = 4; + optional string nickname = 5; + required int64 start_time = 6; + required int64 end_time = 7; + required int64 latency = 8; + required int64 mcycles = 9; + required string method = 10; + required string resource = 11; + required string http_version = 12; + required int32 status = 13; + required int64 response_size = 14; + optional string referrer = 15; + optional string user_agent = 16; + required string url_map_entry = 17; + required string combined = 18; + optional int64 api_mcycles = 19; + optional string host = 20; + optional double cost = 21; + + optional string task_queue_name = 22; + optional string task_name = 23; + + optional bool was_loading_request = 24; + optional int64 pending_time = 25; + optional int32 replica_index = 26 [default = -1]; + optional bool finished = 27 [default = true]; + optional bytes clone_key = 28; + + repeated LogLine line = 29; + + optional bool lines_incomplete = 36; + optional bytes app_engine_release = 38; + + optional int32 exit_reason = 30; + optional bool was_throttled_for_time = 31; + optional bool was_throttled_for_requests = 32; + optional int64 throttled_time = 33; + + optional bytes server_name = 34; +} + +message LogModuleVersion { + optional string module_id = 1 [default="default"]; + optional string version_id = 2; +} + +message LogReadRequest { + required string app_id = 1; + repeated string version_id = 2; + repeated LogModuleVersion module_version = 19; + + optional int64 start_time = 3; + optional int64 end_time = 4; + optional LogOffset offset = 5; + repeated bytes request_id = 6; + + optional int32 minimum_log_level = 7; + optional bool include_incomplete = 8; + optional int64 count = 9; + + optional string combined_log_regex = 14; + optional string host_regex = 15; + optional int32 replica_index = 16; + + optional bool include_app_logs = 10; + optional int32 app_logs_per_request = 17; + optional bool include_host = 11; + optional bool include_all = 12; + optional bool cache_iterator = 13; + optional int32 num_shards = 18; +} + +message LogReadResponse { + repeated RequestLog log = 1; + optional LogOffset offset = 2; + optional int64 last_end_time = 3; +} + +message LogUsageRecord { + optional string version_id = 1; + optional int32 start_time = 2; + optional int32 end_time = 3; + optional int64 count = 4; + optional int64 total_size = 5; + optional int32 records = 6; +} + +message LogUsageRequest { + required string app_id = 1; + repeated string version_id = 2; + optional int32 start_time = 3; + optional int32 end_time = 4; + optional uint32 resolution_hours = 5 [default = 1]; + optional bool combine_versions = 6; + optional int32 usage_version = 7; + optional bool versions_only = 8; +} + +message LogUsageResponse { + repeated LogUsageRecord usage = 1; + optional LogUsageRecord summary = 2; +} diff --git a/vendor/google.golang.org/appengine/internal/main.go b/vendor/google.golang.org/appengine/internal/main.go new file mode 100644 index 00000000..49036163 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/main.go @@ -0,0 +1,15 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build appengine + +package internal + +import ( + "appengine_internal" +) + +func Main() { + appengine_internal.Main() +} diff --git a/vendor/google.golang.org/appengine/internal/main_vm.go b/vendor/google.golang.org/appengine/internal/main_vm.go new file mode 100644 index 00000000..57331ad1 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/main_vm.go @@ -0,0 +1,44 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// +build !appengine + +package internal + +import ( + "io" + "log" + "net/http" + "net/url" + "os" +) + +func Main() { + installHealthChecker(http.DefaultServeMux) + + port := "8080" + if s := os.Getenv("PORT"); s != "" { + port = s + } + + if err := http.ListenAndServe(":"+port, http.HandlerFunc(handleHTTP)); err != nil { + log.Fatalf("http.ListenAndServe: %v", err) + } +} + +func installHealthChecker(mux *http.ServeMux) { + // If no health check handler has been installed by this point, add a trivial one. + const healthPath = "/_ah/health" + hreq := &http.Request{ + Method: "GET", + URL: &url.URL{ + Path: healthPath, + }, + } + if _, pat := mux.Handler(hreq); pat != healthPath { + mux.HandleFunc(healthPath, func(w http.ResponseWriter, r *http.Request) { + io.WriteString(w, "ok") + }) + } +} diff --git a/vendor/google.golang.org/appengine/internal/metadata.go b/vendor/google.golang.org/appengine/internal/metadata.go new file mode 100644 index 00000000..9cc1f71d --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/metadata.go @@ -0,0 +1,61 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +// This file has code for accessing metadata. +// +// References: +// https://cloud.google.com/compute/docs/metadata + +import ( + "fmt" + "io/ioutil" + "log" + "net/http" + "net/url" +) + +const ( + metadataHost = "metadata" + metadataPath = "/computeMetadata/v1/" +) + +var ( + metadataRequestHeaders = http.Header{ + "Metadata-Flavor": []string{"Google"}, + } +) + +// TODO(dsymonds): Do we need to support default values, like Python? +func mustGetMetadata(key string) []byte { + b, err := getMetadata(key) + if err != nil { + log.Fatalf("Metadata fetch failed: %v", err) + } + return b +} + +func getMetadata(key string) ([]byte, error) { + // TODO(dsymonds): May need to use url.Parse to support keys with query args. + req := &http.Request{ + Method: "GET", + URL: &url.URL{ + Scheme: "http", + Host: metadataHost, + Path: metadataPath + key, + }, + Header: metadataRequestHeaders, + Host: metadataHost, + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + defer resp.Body.Close() + if resp.StatusCode != 200 { + return nil, fmt.Errorf("metadata server returned HTTP %d", resp.StatusCode) + } + return ioutil.ReadAll(resp.Body) +} diff --git a/vendor/google.golang.org/appengine/internal/net.go b/vendor/google.golang.org/appengine/internal/net.go new file mode 100644 index 00000000..3b94cf0c --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/net.go @@ -0,0 +1,56 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +// This file implements a network dialer that limits the number of concurrent connections. +// It is only used for API calls. + +import ( + "log" + "net" + "runtime" + "sync" + "time" +) + +var limitSem = make(chan int, 100) // TODO(dsymonds): Use environment variable. + +func limitRelease() { + // non-blocking + select { + case <-limitSem: + default: + // This should not normally happen. + log.Print("appengine: unbalanced limitSem release!") + } +} + +func limitDial(network, addr string) (net.Conn, error) { + limitSem <- 1 + + // Dial with a timeout in case the API host is MIA. + // The connection should normally be very fast. + conn, err := net.DialTimeout(network, addr, 500*time.Millisecond) + if err != nil { + limitRelease() + return nil, err + } + lc := &limitConn{Conn: conn} + runtime.SetFinalizer(lc, (*limitConn).Close) // shouldn't usually be required + return lc, nil +} + +type limitConn struct { + close sync.Once + net.Conn +} + +func (lc *limitConn) Close() error { + defer lc.close.Do(func() { + limitRelease() + runtime.SetFinalizer(lc, nil) + }) + return lc.Conn.Close() +} diff --git a/vendor/google.golang.org/appengine/internal/regen.sh b/vendor/google.golang.org/appengine/internal/regen.sh new file mode 100755 index 00000000..2fdb546a --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/regen.sh @@ -0,0 +1,40 @@ +#!/bin/bash -e +# +# This script rebuilds the generated code for the protocol buffers. +# To run this you will need protoc and goprotobuf installed; +# see https://github.com/golang/protobuf for instructions. + +PKG=google.golang.org/appengine + +function die() { + echo 1>&2 $* + exit 1 +} + +# Sanity check that the right tools are accessible. +for tool in go protoc protoc-gen-go; do + q=$(which $tool) || die "didn't find $tool" + echo 1>&2 "$tool: $q" +done + +echo -n 1>&2 "finding package dir... " +pkgdir=$(go list -f '{{.Dir}}' $PKG) +echo 1>&2 $pkgdir +base=$(echo $pkgdir | sed "s,/$PKG\$,,") +echo 1>&2 "base: $base" +cd $base + +# Run protoc once per package. +for dir in $(find $PKG/internal -name '*.proto' | xargs dirname | sort | uniq); do + echo 1>&2 "* $dir" + protoc --go_out=. $dir/*.proto +done + +for f in $(find $PKG/internal -name '*.pb.go'); do + # Remove proto.RegisterEnum calls. + # These cause duplicate registration panics when these packages + # are used on classic App Engine. proto.RegisterEnum only affects + # parsing the text format; we don't care about that. + # https://code.google.com/p/googleappengine/issues/detail?id=11670#c17 + sed -i '/proto.RegisterEnum/d' $f +done diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go new file mode 100644 index 00000000..526bd39e --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go @@ -0,0 +1,231 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/remote_api/remote_api.proto +// DO NOT EDIT! + +/* +Package remote_api is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/remote_api/remote_api.proto + +It has these top-level messages: + Request + ApplicationError + RpcError + Response +*/ +package remote_api + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type RpcError_ErrorCode int32 + +const ( + RpcError_UNKNOWN RpcError_ErrorCode = 0 + RpcError_CALL_NOT_FOUND RpcError_ErrorCode = 1 + RpcError_PARSE_ERROR RpcError_ErrorCode = 2 + RpcError_SECURITY_VIOLATION RpcError_ErrorCode = 3 + RpcError_OVER_QUOTA RpcError_ErrorCode = 4 + RpcError_REQUEST_TOO_LARGE RpcError_ErrorCode = 5 + RpcError_CAPABILITY_DISABLED RpcError_ErrorCode = 6 + RpcError_FEATURE_DISABLED RpcError_ErrorCode = 7 + RpcError_BAD_REQUEST RpcError_ErrorCode = 8 + RpcError_RESPONSE_TOO_LARGE RpcError_ErrorCode = 9 + RpcError_CANCELLED RpcError_ErrorCode = 10 + RpcError_REPLAY_ERROR RpcError_ErrorCode = 11 + RpcError_DEADLINE_EXCEEDED RpcError_ErrorCode = 12 +) + +var RpcError_ErrorCode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "CALL_NOT_FOUND", + 2: "PARSE_ERROR", + 3: "SECURITY_VIOLATION", + 4: "OVER_QUOTA", + 5: "REQUEST_TOO_LARGE", + 6: "CAPABILITY_DISABLED", + 7: "FEATURE_DISABLED", + 8: "BAD_REQUEST", + 9: "RESPONSE_TOO_LARGE", + 10: "CANCELLED", + 11: "REPLAY_ERROR", + 12: "DEADLINE_EXCEEDED", +} +var RpcError_ErrorCode_value = map[string]int32{ + "UNKNOWN": 0, + "CALL_NOT_FOUND": 1, + "PARSE_ERROR": 2, + "SECURITY_VIOLATION": 3, + "OVER_QUOTA": 4, + "REQUEST_TOO_LARGE": 5, + "CAPABILITY_DISABLED": 6, + "FEATURE_DISABLED": 7, + "BAD_REQUEST": 8, + "RESPONSE_TOO_LARGE": 9, + "CANCELLED": 10, + "REPLAY_ERROR": 11, + "DEADLINE_EXCEEDED": 12, +} + +func (x RpcError_ErrorCode) Enum() *RpcError_ErrorCode { + p := new(RpcError_ErrorCode) + *p = x + return p +} +func (x RpcError_ErrorCode) String() string { + return proto.EnumName(RpcError_ErrorCode_name, int32(x)) +} +func (x *RpcError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(RpcError_ErrorCode_value, data, "RpcError_ErrorCode") + if err != nil { + return err + } + *x = RpcError_ErrorCode(value) + return nil +} + +type Request struct { + ServiceName *string `protobuf:"bytes,2,req,name=service_name" json:"service_name,omitempty"` + Method *string `protobuf:"bytes,3,req,name=method" json:"method,omitempty"` + Request []byte `protobuf:"bytes,4,req,name=request" json:"request,omitempty"` + RequestId *string `protobuf:"bytes,5,opt,name=request_id" json:"request_id,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Request) Reset() { *m = Request{} } +func (m *Request) String() string { return proto.CompactTextString(m) } +func (*Request) ProtoMessage() {} + +func (m *Request) GetServiceName() string { + if m != nil && m.ServiceName != nil { + return *m.ServiceName + } + return "" +} + +func (m *Request) GetMethod() string { + if m != nil && m.Method != nil { + return *m.Method + } + return "" +} + +func (m *Request) GetRequest() []byte { + if m != nil { + return m.Request + } + return nil +} + +func (m *Request) GetRequestId() string { + if m != nil && m.RequestId != nil { + return *m.RequestId + } + return "" +} + +type ApplicationError struct { + Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` + Detail *string `protobuf:"bytes,2,req,name=detail" json:"detail,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *ApplicationError) Reset() { *m = ApplicationError{} } +func (m *ApplicationError) String() string { return proto.CompactTextString(m) } +func (*ApplicationError) ProtoMessage() {} + +func (m *ApplicationError) GetCode() int32 { + if m != nil && m.Code != nil { + return *m.Code + } + return 0 +} + +func (m *ApplicationError) GetDetail() string { + if m != nil && m.Detail != nil { + return *m.Detail + } + return "" +} + +type RpcError struct { + Code *int32 `protobuf:"varint,1,req,name=code" json:"code,omitempty"` + Detail *string `protobuf:"bytes,2,opt,name=detail" json:"detail,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *RpcError) Reset() { *m = RpcError{} } +func (m *RpcError) String() string { return proto.CompactTextString(m) } +func (*RpcError) ProtoMessage() {} + +func (m *RpcError) GetCode() int32 { + if m != nil && m.Code != nil { + return *m.Code + } + return 0 +} + +func (m *RpcError) GetDetail() string { + if m != nil && m.Detail != nil { + return *m.Detail + } + return "" +} + +type Response struct { + Response []byte `protobuf:"bytes,1,opt,name=response" json:"response,omitempty"` + Exception []byte `protobuf:"bytes,2,opt,name=exception" json:"exception,omitempty"` + ApplicationError *ApplicationError `protobuf:"bytes,3,opt,name=application_error" json:"application_error,omitempty"` + JavaException []byte `protobuf:"bytes,4,opt,name=java_exception" json:"java_exception,omitempty"` + RpcError *RpcError `protobuf:"bytes,5,opt,name=rpc_error" json:"rpc_error,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *Response) Reset() { *m = Response{} } +func (m *Response) String() string { return proto.CompactTextString(m) } +func (*Response) ProtoMessage() {} + +func (m *Response) GetResponse() []byte { + if m != nil { + return m.Response + } + return nil +} + +func (m *Response) GetException() []byte { + if m != nil { + return m.Exception + } + return nil +} + +func (m *Response) GetApplicationError() *ApplicationError { + if m != nil { + return m.ApplicationError + } + return nil +} + +func (m *Response) GetJavaException() []byte { + if m != nil { + return m.JavaException + } + return nil +} + +func (m *Response) GetRpcError() *RpcError { + if m != nil { + return m.RpcError + } + return nil +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto new file mode 100644 index 00000000..f21763a4 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto @@ -0,0 +1,44 @@ +syntax = "proto2"; +option go_package = "remote_api"; + +package remote_api; + +message Request { + required string service_name = 2; + required string method = 3; + required bytes request = 4; + optional string request_id = 5; +} + +message ApplicationError { + required int32 code = 1; + required string detail = 2; +} + +message RpcError { + enum ErrorCode { + UNKNOWN = 0; + CALL_NOT_FOUND = 1; + PARSE_ERROR = 2; + SECURITY_VIOLATION = 3; + OVER_QUOTA = 4; + REQUEST_TOO_LARGE = 5; + CAPABILITY_DISABLED = 6; + FEATURE_DISABLED = 7; + BAD_REQUEST = 8; + RESPONSE_TOO_LARGE = 9; + CANCELLED = 10; + REPLAY_ERROR = 11; + DEADLINE_EXCEEDED = 12; + } + required int32 code = 1; + optional string detail = 2; +} + +message Response { + optional bytes response = 1; + optional bytes exception = 2; + optional ApplicationError application_error = 3; + optional bytes java_exception = 4; + optional RpcError rpc_error = 5; +} diff --git a/vendor/google.golang.org/appengine/internal/transaction.go b/vendor/google.golang.org/appengine/internal/transaction.go new file mode 100644 index 00000000..28a6d181 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/transaction.go @@ -0,0 +1,107 @@ +// Copyright 2014 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +package internal + +// This file implements hooks for applying datastore transactions. + +import ( + "errors" + "reflect" + + "github.com/golang/protobuf/proto" + netcontext "golang.org/x/net/context" + + basepb "google.golang.org/appengine/internal/base" + pb "google.golang.org/appengine/internal/datastore" +) + +var transactionSetters = make(map[reflect.Type]reflect.Value) + +// RegisterTransactionSetter registers a function that sets transaction information +// in a protocol buffer message. f should be a function with two arguments, +// the first being a protocol buffer type, and the second being *datastore.Transaction. +func RegisterTransactionSetter(f interface{}) { + v := reflect.ValueOf(f) + transactionSetters[v.Type().In(0)] = v +} + +// applyTransaction applies the transaction t to message pb +// by using the relevant setter passed to RegisterTransactionSetter. +func applyTransaction(pb proto.Message, t *pb.Transaction) { + v := reflect.ValueOf(pb) + if f, ok := transactionSetters[v.Type()]; ok { + f.Call([]reflect.Value{v, reflect.ValueOf(t)}) + } +} + +var transactionKey = "used for *Transaction" + +func transactionFromContext(ctx netcontext.Context) *transaction { + t, _ := ctx.Value(&transactionKey).(*transaction) + return t +} + +func withTransaction(ctx netcontext.Context, t *transaction) netcontext.Context { + return netcontext.WithValue(ctx, &transactionKey, t) +} + +type transaction struct { + transaction pb.Transaction + finished bool +} + +var ErrConcurrentTransaction = errors.New("internal: concurrent transaction") + +func RunTransactionOnce(c netcontext.Context, f func(netcontext.Context) error, xg bool) error { + if transactionFromContext(c) != nil { + return errors.New("nested transactions are not supported") + } + + // Begin the transaction. + t := &transaction{} + req := &pb.BeginTransactionRequest{ + App: proto.String(FullyQualifiedAppID(c)), + } + if xg { + req.AllowMultipleEg = proto.Bool(true) + } + if err := Call(c, "datastore_v3", "BeginTransaction", req, &t.transaction); err != nil { + return err + } + + // Call f, rolling back the transaction if f returns a non-nil error, or panics. + // The panic is not recovered. + defer func() { + if t.finished { + return + } + t.finished = true + // Ignore the error return value, since we are already returning a non-nil + // error (or we're panicking). + Call(c, "datastore_v3", "Rollback", &t.transaction, &basepb.VoidProto{}) + }() + if err := f(withTransaction(c, t)); err != nil { + return err + } + t.finished = true + + // Commit the transaction. + res := &pb.CommitResponse{} + err := Call(c, "datastore_v3", "Commit", &t.transaction, res) + if ae, ok := err.(*APIError); ok { + /* TODO: restore this conditional + if appengine.IsDevAppServer() { + */ + // The Python Dev AppServer raises an ApplicationError with error code 2 (which is + // Error.CONCURRENT_TRANSACTION) and message "Concurrency exception.". + if ae.Code == int32(pb.Error_BAD_REQUEST) && ae.Detail == "ApplicationError: 2 Concurrency exception." { + return ErrConcurrentTransaction + } + if ae.Code == int32(pb.Error_CONCURRENT_TRANSACTION) { + return ErrConcurrentTransaction + } + } + return err +} diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go new file mode 100644 index 00000000..af463fbb --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go @@ -0,0 +1,355 @@ +// Code generated by protoc-gen-go. +// source: google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +// DO NOT EDIT! + +/* +Package urlfetch is a generated protocol buffer package. + +It is generated from these files: + google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto + +It has these top-level messages: + URLFetchServiceError + URLFetchRequest + URLFetchResponse +*/ +package urlfetch + +import proto "github.com/golang/protobuf/proto" +import fmt "fmt" +import math "math" + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +type URLFetchServiceError_ErrorCode int32 + +const ( + URLFetchServiceError_OK URLFetchServiceError_ErrorCode = 0 + URLFetchServiceError_INVALID_URL URLFetchServiceError_ErrorCode = 1 + URLFetchServiceError_FETCH_ERROR URLFetchServiceError_ErrorCode = 2 + URLFetchServiceError_UNSPECIFIED_ERROR URLFetchServiceError_ErrorCode = 3 + URLFetchServiceError_RESPONSE_TOO_LARGE URLFetchServiceError_ErrorCode = 4 + URLFetchServiceError_DEADLINE_EXCEEDED URLFetchServiceError_ErrorCode = 5 + URLFetchServiceError_SSL_CERTIFICATE_ERROR URLFetchServiceError_ErrorCode = 6 + URLFetchServiceError_DNS_ERROR URLFetchServiceError_ErrorCode = 7 + URLFetchServiceError_CLOSED URLFetchServiceError_ErrorCode = 8 + URLFetchServiceError_INTERNAL_TRANSIENT_ERROR URLFetchServiceError_ErrorCode = 9 + URLFetchServiceError_TOO_MANY_REDIRECTS URLFetchServiceError_ErrorCode = 10 + URLFetchServiceError_MALFORMED_REPLY URLFetchServiceError_ErrorCode = 11 + URLFetchServiceError_CONNECTION_ERROR URLFetchServiceError_ErrorCode = 12 +) + +var URLFetchServiceError_ErrorCode_name = map[int32]string{ + 0: "OK", + 1: "INVALID_URL", + 2: "FETCH_ERROR", + 3: "UNSPECIFIED_ERROR", + 4: "RESPONSE_TOO_LARGE", + 5: "DEADLINE_EXCEEDED", + 6: "SSL_CERTIFICATE_ERROR", + 7: "DNS_ERROR", + 8: "CLOSED", + 9: "INTERNAL_TRANSIENT_ERROR", + 10: "TOO_MANY_REDIRECTS", + 11: "MALFORMED_REPLY", + 12: "CONNECTION_ERROR", +} +var URLFetchServiceError_ErrorCode_value = map[string]int32{ + "OK": 0, + "INVALID_URL": 1, + "FETCH_ERROR": 2, + "UNSPECIFIED_ERROR": 3, + "RESPONSE_TOO_LARGE": 4, + "DEADLINE_EXCEEDED": 5, + "SSL_CERTIFICATE_ERROR": 6, + "DNS_ERROR": 7, + "CLOSED": 8, + "INTERNAL_TRANSIENT_ERROR": 9, + "TOO_MANY_REDIRECTS": 10, + "MALFORMED_REPLY": 11, + "CONNECTION_ERROR": 12, +} + +func (x URLFetchServiceError_ErrorCode) Enum() *URLFetchServiceError_ErrorCode { + p := new(URLFetchServiceError_ErrorCode) + *p = x + return p +} +func (x URLFetchServiceError_ErrorCode) String() string { + return proto.EnumName(URLFetchServiceError_ErrorCode_name, int32(x)) +} +func (x *URLFetchServiceError_ErrorCode) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(URLFetchServiceError_ErrorCode_value, data, "URLFetchServiceError_ErrorCode") + if err != nil { + return err + } + *x = URLFetchServiceError_ErrorCode(value) + return nil +} + +type URLFetchRequest_RequestMethod int32 + +const ( + URLFetchRequest_GET URLFetchRequest_RequestMethod = 1 + URLFetchRequest_POST URLFetchRequest_RequestMethod = 2 + URLFetchRequest_HEAD URLFetchRequest_RequestMethod = 3 + URLFetchRequest_PUT URLFetchRequest_RequestMethod = 4 + URLFetchRequest_DELETE URLFetchRequest_RequestMethod = 5 + URLFetchRequest_PATCH URLFetchRequest_RequestMethod = 6 +) + +var URLFetchRequest_RequestMethod_name = map[int32]string{ + 1: "GET", + 2: "POST", + 3: "HEAD", + 4: "PUT", + 5: "DELETE", + 6: "PATCH", +} +var URLFetchRequest_RequestMethod_value = map[string]int32{ + "GET": 1, + "POST": 2, + "HEAD": 3, + "PUT": 4, + "DELETE": 5, + "PATCH": 6, +} + +func (x URLFetchRequest_RequestMethod) Enum() *URLFetchRequest_RequestMethod { + p := new(URLFetchRequest_RequestMethod) + *p = x + return p +} +func (x URLFetchRequest_RequestMethod) String() string { + return proto.EnumName(URLFetchRequest_RequestMethod_name, int32(x)) +} +func (x *URLFetchRequest_RequestMethod) UnmarshalJSON(data []byte) error { + value, err := proto.UnmarshalJSONEnum(URLFetchRequest_RequestMethod_value, data, "URLFetchRequest_RequestMethod") + if err != nil { + return err + } + *x = URLFetchRequest_RequestMethod(value) + return nil +} + +type URLFetchServiceError struct { + XXX_unrecognized []byte `json:"-"` +} + +func (m *URLFetchServiceError) Reset() { *m = URLFetchServiceError{} } +func (m *URLFetchServiceError) String() string { return proto.CompactTextString(m) } +func (*URLFetchServiceError) ProtoMessage() {} + +type URLFetchRequest struct { + Method *URLFetchRequest_RequestMethod `protobuf:"varint,1,req,name=Method,enum=appengine.URLFetchRequest_RequestMethod" json:"Method,omitempty"` + Url *string `protobuf:"bytes,2,req,name=Url" json:"Url,omitempty"` + Header []*URLFetchRequest_Header `protobuf:"group,3,rep,name=Header" json:"header,omitempty"` + Payload []byte `protobuf:"bytes,6,opt,name=Payload" json:"Payload,omitempty"` + FollowRedirects *bool `protobuf:"varint,7,opt,name=FollowRedirects,def=1" json:"FollowRedirects,omitempty"` + Deadline *float64 `protobuf:"fixed64,8,opt,name=Deadline" json:"Deadline,omitempty"` + MustValidateServerCertificate *bool `protobuf:"varint,9,opt,name=MustValidateServerCertificate,def=1" json:"MustValidateServerCertificate,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *URLFetchRequest) Reset() { *m = URLFetchRequest{} } +func (m *URLFetchRequest) String() string { return proto.CompactTextString(m) } +func (*URLFetchRequest) ProtoMessage() {} + +const Default_URLFetchRequest_FollowRedirects bool = true +const Default_URLFetchRequest_MustValidateServerCertificate bool = true + +func (m *URLFetchRequest) GetMethod() URLFetchRequest_RequestMethod { + if m != nil && m.Method != nil { + return *m.Method + } + return URLFetchRequest_GET +} + +func (m *URLFetchRequest) GetUrl() string { + if m != nil && m.Url != nil { + return *m.Url + } + return "" +} + +func (m *URLFetchRequest) GetHeader() []*URLFetchRequest_Header { + if m != nil { + return m.Header + } + return nil +} + +func (m *URLFetchRequest) GetPayload() []byte { + if m != nil { + return m.Payload + } + return nil +} + +func (m *URLFetchRequest) GetFollowRedirects() bool { + if m != nil && m.FollowRedirects != nil { + return *m.FollowRedirects + } + return Default_URLFetchRequest_FollowRedirects +} + +func (m *URLFetchRequest) GetDeadline() float64 { + if m != nil && m.Deadline != nil { + return *m.Deadline + } + return 0 +} + +func (m *URLFetchRequest) GetMustValidateServerCertificate() bool { + if m != nil && m.MustValidateServerCertificate != nil { + return *m.MustValidateServerCertificate + } + return Default_URLFetchRequest_MustValidateServerCertificate +} + +type URLFetchRequest_Header struct { + Key *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"` + Value *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *URLFetchRequest_Header) Reset() { *m = URLFetchRequest_Header{} } +func (m *URLFetchRequest_Header) String() string { return proto.CompactTextString(m) } +func (*URLFetchRequest_Header) ProtoMessage() {} + +func (m *URLFetchRequest_Header) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *URLFetchRequest_Header) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +type URLFetchResponse struct { + Content []byte `protobuf:"bytes,1,opt,name=Content" json:"Content,omitempty"` + StatusCode *int32 `protobuf:"varint,2,req,name=StatusCode" json:"StatusCode,omitempty"` + Header []*URLFetchResponse_Header `protobuf:"group,3,rep,name=Header" json:"header,omitempty"` + ContentWasTruncated *bool `protobuf:"varint,6,opt,name=ContentWasTruncated,def=0" json:"ContentWasTruncated,omitempty"` + ExternalBytesSent *int64 `protobuf:"varint,7,opt,name=ExternalBytesSent" json:"ExternalBytesSent,omitempty"` + ExternalBytesReceived *int64 `protobuf:"varint,8,opt,name=ExternalBytesReceived" json:"ExternalBytesReceived,omitempty"` + FinalUrl *string `protobuf:"bytes,9,opt,name=FinalUrl" json:"FinalUrl,omitempty"` + ApiCpuMilliseconds *int64 `protobuf:"varint,10,opt,name=ApiCpuMilliseconds,def=0" json:"ApiCpuMilliseconds,omitempty"` + ApiBytesSent *int64 `protobuf:"varint,11,opt,name=ApiBytesSent,def=0" json:"ApiBytesSent,omitempty"` + ApiBytesReceived *int64 `protobuf:"varint,12,opt,name=ApiBytesReceived,def=0" json:"ApiBytesReceived,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *URLFetchResponse) Reset() { *m = URLFetchResponse{} } +func (m *URLFetchResponse) String() string { return proto.CompactTextString(m) } +func (*URLFetchResponse) ProtoMessage() {} + +const Default_URLFetchResponse_ContentWasTruncated bool = false +const Default_URLFetchResponse_ApiCpuMilliseconds int64 = 0 +const Default_URLFetchResponse_ApiBytesSent int64 = 0 +const Default_URLFetchResponse_ApiBytesReceived int64 = 0 + +func (m *URLFetchResponse) GetContent() []byte { + if m != nil { + return m.Content + } + return nil +} + +func (m *URLFetchResponse) GetStatusCode() int32 { + if m != nil && m.StatusCode != nil { + return *m.StatusCode + } + return 0 +} + +func (m *URLFetchResponse) GetHeader() []*URLFetchResponse_Header { + if m != nil { + return m.Header + } + return nil +} + +func (m *URLFetchResponse) GetContentWasTruncated() bool { + if m != nil && m.ContentWasTruncated != nil { + return *m.ContentWasTruncated + } + return Default_URLFetchResponse_ContentWasTruncated +} + +func (m *URLFetchResponse) GetExternalBytesSent() int64 { + if m != nil && m.ExternalBytesSent != nil { + return *m.ExternalBytesSent + } + return 0 +} + +func (m *URLFetchResponse) GetExternalBytesReceived() int64 { + if m != nil && m.ExternalBytesReceived != nil { + return *m.ExternalBytesReceived + } + return 0 +} + +func (m *URLFetchResponse) GetFinalUrl() string { + if m != nil && m.FinalUrl != nil { + return *m.FinalUrl + } + return "" +} + +func (m *URLFetchResponse) GetApiCpuMilliseconds() int64 { + if m != nil && m.ApiCpuMilliseconds != nil { + return *m.ApiCpuMilliseconds + } + return Default_URLFetchResponse_ApiCpuMilliseconds +} + +func (m *URLFetchResponse) GetApiBytesSent() int64 { + if m != nil && m.ApiBytesSent != nil { + return *m.ApiBytesSent + } + return Default_URLFetchResponse_ApiBytesSent +} + +func (m *URLFetchResponse) GetApiBytesReceived() int64 { + if m != nil && m.ApiBytesReceived != nil { + return *m.ApiBytesReceived + } + return Default_URLFetchResponse_ApiBytesReceived +} + +type URLFetchResponse_Header struct { + Key *string `protobuf:"bytes,4,req,name=Key" json:"Key,omitempty"` + Value *string `protobuf:"bytes,5,req,name=Value" json:"Value,omitempty"` + XXX_unrecognized []byte `json:"-"` +} + +func (m *URLFetchResponse_Header) Reset() { *m = URLFetchResponse_Header{} } +func (m *URLFetchResponse_Header) String() string { return proto.CompactTextString(m) } +func (*URLFetchResponse_Header) ProtoMessage() {} + +func (m *URLFetchResponse_Header) GetKey() string { + if m != nil && m.Key != nil { + return *m.Key + } + return "" +} + +func (m *URLFetchResponse_Header) GetValue() string { + if m != nil && m.Value != nil { + return *m.Value + } + return "" +} + +func init() { +} diff --git a/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto new file mode 100644 index 00000000..f695edf6 --- /dev/null +++ b/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto @@ -0,0 +1,64 @@ +syntax = "proto2"; +option go_package = "urlfetch"; + +package appengine; + +message URLFetchServiceError { + enum ErrorCode { + OK = 0; + INVALID_URL = 1; + FETCH_ERROR = 2; + UNSPECIFIED_ERROR = 3; + RESPONSE_TOO_LARGE = 4; + DEADLINE_EXCEEDED = 5; + SSL_CERTIFICATE_ERROR = 6; + DNS_ERROR = 7; + CLOSED = 8; + INTERNAL_TRANSIENT_ERROR = 9; + TOO_MANY_REDIRECTS = 10; + MALFORMED_REPLY = 11; + CONNECTION_ERROR = 12; + } +} + +message URLFetchRequest { + enum RequestMethod { + GET = 1; + POST = 2; + HEAD = 3; + PUT = 4; + DELETE = 5; + PATCH = 6; + } + required RequestMethod Method = 1; + required string Url = 2; + repeated group Header = 3 { + required string Key = 4; + required string Value = 5; + } + optional bytes Payload = 6 [ctype=CORD]; + + optional bool FollowRedirects = 7 [default=true]; + + optional double Deadline = 8; + + optional bool MustValidateServerCertificate = 9 [default=true]; +} + +message URLFetchResponse { + optional bytes Content = 1; + required int32 StatusCode = 2; + repeated group Header = 3 { + required string Key = 4; + required string Value = 5; + } + optional bool ContentWasTruncated = 6 [default=false]; + optional int64 ExternalBytesSent = 7; + optional int64 ExternalBytesReceived = 8; + + optional string FinalUrl = 9; + + optional int64 ApiCpuMilliseconds = 10 [default=0]; + optional int64 ApiBytesSent = 11 [default=0]; + optional int64 ApiBytesReceived = 12 [default=0]; +} diff --git a/vendor/google.golang.org/appengine/urlfetch/urlfetch.go b/vendor/google.golang.org/appengine/urlfetch/urlfetch.go new file mode 100644 index 00000000..6ffe1e6d --- /dev/null +++ b/vendor/google.golang.org/appengine/urlfetch/urlfetch.go @@ -0,0 +1,210 @@ +// Copyright 2011 Google Inc. All rights reserved. +// Use of this source code is governed by the Apache 2.0 +// license that can be found in the LICENSE file. + +// Package urlfetch provides an http.RoundTripper implementation +// for fetching URLs via App Engine's urlfetch service. +package urlfetch // import "google.golang.org/appengine/urlfetch" + +import ( + "errors" + "fmt" + "io" + "io/ioutil" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "github.com/golang/protobuf/proto" + "golang.org/x/net/context" + + "google.golang.org/appengine/internal" + pb "google.golang.org/appengine/internal/urlfetch" +) + +// Transport is an implementation of http.RoundTripper for +// App Engine. Users should generally create an http.Client using +// this transport and use the Client rather than using this transport +// directly. +type Transport struct { + Context context.Context + + // Controls whether the application checks the validity of SSL certificates + // over HTTPS connections. A value of false (the default) instructs the + // application to send a request to the server only if the certificate is + // valid and signed by a trusted certificate authority (CA), and also + // includes a hostname that matches the certificate. A value of true + // instructs the application to perform no certificate validation. + AllowInvalidServerCertificate bool +} + +// Verify statically that *Transport implements http.RoundTripper. +var _ http.RoundTripper = (*Transport)(nil) + +// Client returns an *http.Client using a default urlfetch Transport. This +// client will have the default deadline of 5 seconds, and will check the +// validity of SSL certificates. +// +// Any deadline of the provided context will be used for requests through this client; +// if the client does not have a deadline then a 5 second default is used. +func Client(ctx context.Context) *http.Client { + return &http.Client{ + Transport: &Transport{ + Context: ctx, + }, + } +} + +type bodyReader struct { + content []byte + truncated bool + closed bool +} + +// ErrTruncatedBody is the error returned after the final Read() from a +// response's Body if the body has been truncated by App Engine's proxy. +var ErrTruncatedBody = errors.New("urlfetch: truncated body") + +func statusCodeToText(code int) string { + if t := http.StatusText(code); t != "" { + return t + } + return strconv.Itoa(code) +} + +func (br *bodyReader) Read(p []byte) (n int, err error) { + if br.closed { + if br.truncated { + return 0, ErrTruncatedBody + } + return 0, io.EOF + } + n = copy(p, br.content) + if n > 0 { + br.content = br.content[n:] + return + } + if br.truncated { + br.closed = true + return 0, ErrTruncatedBody + } + return 0, io.EOF +} + +func (br *bodyReader) Close() error { + br.closed = true + br.content = nil + return nil +} + +// A map of the URL Fetch-accepted methods that take a request body. +var methodAcceptsRequestBody = map[string]bool{ + "POST": true, + "PUT": true, + "PATCH": true, +} + +// urlString returns a valid string given a URL. This function is necessary because +// the String method of URL doesn't correctly handle URLs with non-empty Opaque values. +// See http://code.google.com/p/go/issues/detail?id=4860. +func urlString(u *url.URL) string { + if u.Opaque == "" || strings.HasPrefix(u.Opaque, "//") { + return u.String() + } + aux := *u + aux.Opaque = "//" + aux.Host + aux.Opaque + return aux.String() +} + +// RoundTrip issues a single HTTP request and returns its response. Per the +// http.RoundTripper interface, RoundTrip only returns an error if there +// was an unsupported request or the URL Fetch proxy fails. +// Note that HTTP response codes such as 5xx, 403, 404, etc are not +// errors as far as the transport is concerned and will be returned +// with err set to nil. +func (t *Transport) RoundTrip(req *http.Request) (res *http.Response, err error) { + methNum, ok := pb.URLFetchRequest_RequestMethod_value[req.Method] + if !ok { + return nil, fmt.Errorf("urlfetch: unsupported HTTP method %q", req.Method) + } + + method := pb.URLFetchRequest_RequestMethod(methNum) + + freq := &pb.URLFetchRequest{ + Method: &method, + Url: proto.String(urlString(req.URL)), + FollowRedirects: proto.Bool(false), // http.Client's responsibility + MustValidateServerCertificate: proto.Bool(!t.AllowInvalidServerCertificate), + } + if deadline, ok := t.Context.Deadline(); ok { + freq.Deadline = proto.Float64(deadline.Sub(time.Now()).Seconds()) + } + + for k, vals := range req.Header { + for _, val := range vals { + freq.Header = append(freq.Header, &pb.URLFetchRequest_Header{ + Key: proto.String(k), + Value: proto.String(val), + }) + } + } + if methodAcceptsRequestBody[req.Method] && req.Body != nil { + // Avoid a []byte copy if req.Body has a Bytes method. + switch b := req.Body.(type) { + case interface { + Bytes() []byte + }: + freq.Payload = b.Bytes() + default: + freq.Payload, err = ioutil.ReadAll(req.Body) + if err != nil { + return nil, err + } + } + } + + fres := &pb.URLFetchResponse{} + if err := internal.Call(t.Context, "urlfetch", "Fetch", freq, fres); err != nil { + return nil, err + } + + res = &http.Response{} + res.StatusCode = int(*fres.StatusCode) + res.Status = fmt.Sprintf("%d %s", res.StatusCode, statusCodeToText(res.StatusCode)) + res.Header = make(http.Header) + res.Request = req + + // Faked: + res.ProtoMajor = 1 + res.ProtoMinor = 1 + res.Proto = "HTTP/1.1" + res.Close = true + + for _, h := range fres.Header { + hkey := http.CanonicalHeaderKey(*h.Key) + hval := *h.Value + if hkey == "Content-Length" { + // Will get filled in below for all but HEAD requests. + if req.Method == "HEAD" { + res.ContentLength, _ = strconv.ParseInt(hval, 10, 64) + } + continue + } + res.Header.Add(hkey, hval) + } + + if req.Method != "HEAD" { + res.ContentLength = int64(len(fres.Content)) + } + + truncated := fres.GetContentWasTruncated() + res.Body = &bodyReader{content: fres.Content, truncated: truncated} + return +} + +func init() { + internal.RegisterErrorCodeMap("urlfetch", pb.URLFetchServiceError_ErrorCode_name) + internal.RegisterTimeoutErrorCode("urlfetch", int32(pb.URLFetchServiceError_DEADLINE_EXCEEDED)) +}