0
Fork 0
mirror of https://github.com/willnorris/imageproxy.git synced 2024-12-16 21:56:43 -05:00

switch to use go module support

versions of all dependencies remain the same, but now use `go mod` to
manage them rather than govendor.  This does result in a few extra files
being checked in, since govendor would ignore non-build files and go mod
does not.
This commit is contained in:
Will Norris 2018-09-15 07:38:09 +00:00
parent bc59afcf2a
commit 9c3cbc1733
14 changed files with 3215 additions and 831 deletions

4
.gitignore vendored
View file

@ -2,7 +2,11 @@ build
.goxc.local.json
*.test
vendor/**/.travis.yml
vendor/**/.gitignore
vendor/**/.goxc.json
vendor/**/AUTHORS
vendor/**/CONTRIBUTORS
vendor/**/Makefile
vendor/**/*_ZH.md
vendor/**/*.sh

48
go.mod Normal file
View file

@ -0,0 +1,48 @@
module willnorris.com/go/imageproxy
require (
cloud.google.com/go v0.0.0-20180131234750-2de512d2700d
github.com/Azure/azure-sdk-for-go v12.3.0-beta+incompatible // indirect
github.com/Azure/go-autorest v9.9.0+incompatible // indirect
github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788
github.com/aws/aws-sdk-go v0.0.0-20180126231901-00cca3f093a8
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgrijalva/jwt-go v3.1.0+incompatible // indirect
github.com/die-net/lrucache v0.0.0-20171111232917-04b9315ab7a6
github.com/disintegration/imaging v1.3.0
github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2 // indirect
github.com/garyburd/redigo v1.5.0
github.com/go-ini/ini v1.25.4 // indirect
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect
github.com/golang/protobuf v1.0.0 // indirect
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a // indirect
github.com/google/go-cmp v0.2.0 // indirect
github.com/googleapis/gax-go v2.0.0+incompatible // indirect
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c // indirect
github.com/gregjones/httpcache v0.0.0-20171119193500-2bcd89a1743f
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8 // indirect
github.com/jtolds/gls v4.2.1+incompatible // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c // indirect
github.com/muesli/smartcrop v0.0.0-20171215203440-9032446b30f6
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 // indirect
github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rwcarlsen/goexif v0.0.0-20141222211634-41dad3aa0833
github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5 // indirect
github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf // indirect
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a // indirect
github.com/stretchr/testify v1.2.2 // indirect
golang.org/x/image v0.0.0-20171214225156-12117c17ca67
golang.org/x/net v0.0.0-20180201232540-b417086c80e9 // indirect
golang.org/x/oauth2 v0.0.0-20180126164932-a032972e2806 // indirect
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect
golang.org/x/text v0.0.0-20171227012246-e19ae1496984 // indirect
google.golang.org/api v0.0.0-20180202000329-f7618f4b41ca // indirect
google.golang.org/appengine v0.0.0-20171212223047-5bee14b453b4 // indirect
google.golang.org/genproto v0.0.0-20180125080656-4eb30f4778ee // indirect
google.golang.org/grpc v0.0.0-20180201193814-f9628db66d14 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/yaml.v2 v2.2.1 // indirect
willnorris.com/go/gifresize v1.0.0
)

92
go.sum Normal file
View file

@ -0,0 +1,92 @@
cloud.google.com/go v0.0.0-20180131234750-2de512d2700d h1:Wj6Dk68uwFxqLKT1lV03UFLcfh5+HTLs+YCGlUc06M8=
cloud.google.com/go v0.0.0-20180131234750-2de512d2700d/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/Azure/azure-sdk-for-go v12.3.0-beta+incompatible h1:rrdWQEPInXBEqI10Nfu7FCp7BDdLSLWvkHwDWiXOEjw=
github.com/Azure/azure-sdk-for-go v12.3.0-beta+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/go-autorest v9.9.0+incompatible h1:U3u8yuM3dZPg6vjJ/Hl2hQlaP+WNOeSHY6Fk4g1e6Ps=
github.com/Azure/go-autorest v9.9.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788 h1:OxWBmk9BZqWOHVs+hrElt/BiexDGcStcsADt0f4cUx8=
github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788/go.mod h1:lY1dZd8HBzJ10eqKERHn3CU59tfhzcAVb2c0ZhIWSOk=
github.com/aws/aws-sdk-go v0.0.0-20180126231901-00cca3f093a8 h1:xqzpCUtYUsmKRnKjKOmGh/kqa+zdhaCYuYAEwXzHCSY=
github.com/aws/aws-sdk-go v0.0.0-20180126231901-00cca3f093a8/go.mod h1:ZRmQr0FajVIyZ4ZzBYKG5P3ZqPz9IHG41ZoMu1ADI3k=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.1.0+incompatible h1:FFziAwDQQ2dz1XClWMkwvukur3evtZx7x/wMHKM1i20=
github.com/dgrijalva/jwt-go v3.1.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/die-net/lrucache v0.0.0-20171111232917-04b9315ab7a6 h1:UhONZXj9L+pdHs+qUEPMsQkG3BdhMHSCQk8KXRm83ho=
github.com/die-net/lrucache v0.0.0-20171111232917-04b9315ab7a6/go.mod h1:ew0MSjCVDdtGMjF3kzLK9hwdgF5mOE8SbYVF3Rc7mkU=
github.com/disintegration/imaging v1.3.0 h1:AihaBC+K3RHP7JL8scqq2GgNQhVzMcCYh7gJbAjAvpo=
github.com/disintegration/imaging v1.3.0/go.mod h1:9B/deIUIrliYkyMTuXJd6OUFLcrZ2tf+3Qlwnaf/CjU=
github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2 h1:G9/PqfhOrt8JXnw0DGTfVoOkKHDhOlEZqhE/cu+NvQM=
github.com/dnaeon/go-vcr v0.0.0-20180814043457-aafff18a5cc2/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
github.com/garyburd/redigo v1.5.0 h1:OcZhiwwjKtBe7TO4TlXpj/1E3I2RVg1uLxwMT4VFF5w=
github.com/garyburd/redigo v1.5.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo=
github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/protobuf v1.0.0 h1:lsek0oXi8iFE9L+EXARyHIjU5rlWIhhTkjDz3vHhWWQ=
github.com/golang/protobuf v1.0.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a h1:ZJu5NB1Bk5ms4vw0Xu4i+jD32SE9jQXyfnOvwhHqlT0=
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/googleapis/gax-go v2.0.0+incompatible h1:j0GKcs05QVmm7yesiZq2+9cxHkNK9YM6zKx4D2qucQU=
github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY=
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c h1:16eHWuMGvCjSfgRJKqIzapE78onvvTbdi1rMkU00lZw=
github.com/gopherjs/gopherjs v0.0.0-20180825215210-0210a2f0f73c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gregjones/httpcache v0.0.0-20171119193500-2bcd89a1743f h1:kOkUP6rcVVqC+KlKKENKtgfFfJyDySYhqL9srXooghY=
github.com/gregjones/httpcache v0.0.0-20171119193500-2bcd89a1743f/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8 h1:12VvqtR6Aowv3l/EQUlocDHW2Cp4G9WJVH7uyH8QFJE=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jtolds/gls v4.2.1+incompatible h1:fSuqC+Gmlu6l/ZYAoZzx2pyucC8Xza35fpRVWLVmUEE=
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c h1:N7uWGS2fTwH/4BwxbHiJZNAFTSJ5yPU0emHsQWvkxEY=
github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
github.com/muesli/smartcrop v0.0.0-20171215203440-9032446b30f6 h1:m5kCp2hHRMu7z95f+aIK80l8N1tx+UXAqNoYpRS9v3o=
github.com/muesli/smartcrop v0.0.0-20171215203440-9032446b30f6/go.mod h1:i2fCI/UorTfgEpPPLWiFBv4pye+YAG78RwcQLUkocpI=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5 h1:BvoENQQU+fZ9uukda/RzCAL/191HHwJA5b13R6diVlY=
github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3 h1:ZKRE3mqKoxObHs5oWjLnA1WxXhmlDDAVuE0VsuLIoNk=
github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rwcarlsen/goexif v0.0.0-20141222211634-41dad3aa0833 h1:jwa1bSL1nx8Yz7pOXkjXJCbKAffj5i2Rrl9ALRqSy6Y=
github.com/rwcarlsen/goexif v0.0.0-20141222211634-41dad3aa0833/go.mod h1:hPqNNc0+uJM6H+SuU8sEs5K5IQeKccPqeSjfgcKGgPk=
github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5 h1:tfcGHuraNSEY9xRb9ckCMqMD7xAjzrYI1WpD7DA+nz8=
github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf h1:6V1qxN6Usn4jy8unvggSJz/NC790tefw8Zdy6OZS5co=
github.com/smartystreets/assertions v0.0.0-20180820201707-7c9eb446e3cf/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a h1:JSvGDIbmil4Ui/dDdFBExb7/cmkNjyX5F97oglmvCDo=
github.com/smartystreets/goconvey v0.0.0-20180222194500-ef6db91d284a/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
golang.org/x/image v0.0.0-20171214225156-12117c17ca67 h1:L8S612DBEq9tpLTxczHuhrf5il+KEdSha8b5A5njQMc=
golang.org/x/image v0.0.0-20171214225156-12117c17ca67/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
golang.org/x/net v0.0.0-20180201232540-b417086c80e9 h1:2srMuQrhUnBbRCQTYMFbAtec0kzANvdPwGdfLIXUodw=
golang.org/x/net v0.0.0-20180201232540-b417086c80e9/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/oauth2 v0.0.0-20180126164932-a032972e2806 h1:KZrxuLRRjPt8IU4XrMl45WQaER+p8WGu9cN8EekYVzM=
golang.org/x/oauth2 v0.0.0-20180126164932-a032972e2806/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/text v0.0.0-20171227012246-e19ae1496984 h1:ulYJn/BqO4fMRe1xAQzWjokgjsQLPpb21GltxXHI3fQ=
golang.org/x/text v0.0.0-20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
google.golang.org/api v0.0.0-20180202000329-f7618f4b41ca h1:bPw62MiF+sPyq2Apz3MT+qTY+hEgfVEUfkO4dVCK5oo=
google.golang.org/api v0.0.0-20180202000329-f7618f4b41ca/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
google.golang.org/appengine v0.0.0-20171212223047-5bee14b453b4 h1:gggB/NnRSjJj9dpMAaxm4mMTFai1QLGL39CGXmQvr+s=
google.golang.org/appengine v0.0.0-20171212223047-5bee14b453b4/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
google.golang.org/genproto v0.0.0-20180125080656-4eb30f4778ee h1:z84t4XBifcyxT9HA96QiKwGaWYiO7vfoqu7vWoa6lQk=
google.golang.org/genproto v0.0.0-20180125080656-4eb30f4778ee/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/grpc v0.0.0-20180201193814-f9628db66d14 h1:y8LqgDoOxiN/KHkwtrvzgzZtDvk5EAQCGBeWgpRUt1Q=
google.golang.org/grpc v0.0.0-20180201193814-f9628db66d14/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
willnorris.com/go/gifresize v1.0.0 h1:KkdTSrFE1mhzAgTO8/ukK6ZP4SVptL4G3d1lx5X5qMw=
willnorris.com/go/gifresize v1.0.0/go.mod h1:eBM8gogBGCcaH603vxSpnfjwXIpq6nmnj/jauBDKtAk=

76
vendor/github.com/google/btree/btree_mem.go generated vendored Normal file
View file

@ -0,0 +1,76 @@
// Copyright 2014 Google Inc.
//
// 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.
// +build ignore
// This binary compares memory usage between btree and gollrb.
package main
import (
"flag"
"fmt"
"math/rand"
"runtime"
"time"
"github.com/google/btree"
"github.com/petar/GoLLRB/llrb"
)
var (
size = flag.Int("size", 1000000, "size of the tree to build")
degree = flag.Int("degree", 8, "degree of btree")
gollrb = flag.Bool("llrb", false, "use llrb instead of btree")
)
func main() {
flag.Parse()
vals := rand.Perm(*size)
var t, v interface{}
v = vals
var stats runtime.MemStats
for i := 0; i < 10; i++ {
runtime.GC()
}
fmt.Println("-------- BEFORE ----------")
runtime.ReadMemStats(&stats)
fmt.Printf("%+v\n", stats)
start := time.Now()
if *gollrb {
tr := llrb.New()
for _, v := range vals {
tr.ReplaceOrInsert(llrb.Int(v))
}
t = tr // keep it around
} else {
tr := btree.New(*degree)
for _, v := range vals {
tr.ReplaceOrInsert(btree.Int(v))
}
t = tr // keep it around
}
fmt.Printf("%v inserts in %v\n", *size, time.Since(start))
fmt.Println("-------- AFTER ----------")
runtime.ReadMemStats(&stats)
fmt.Printf("%+v\n", stats)
for i := 0; i < 10; i++ {
runtime.GC()
}
fmt.Println("-------- AFTER GC ----------")
runtime.ReadMemStats(&stats)
fmt.Printf("%+v\n", stats)
if t == v {
fmt.Println("to make sure vals and tree aren't GC'd")
}
}

View file

@ -0,0 +1,79 @@
// +build ignore
package main
import (
"flag"
"fmt"
"io"
"log"
"os"
"path/filepath"
"strings"
"github.com/rwcarlsen/goexif/exif"
"github.com/rwcarlsen/goexif/tiff"
)
func main() {
flag.Parse()
fname := flag.Arg(0)
dst, err := os.Create(fname)
if err != nil {
log.Fatal(err)
}
defer dst.Close()
dir, err := os.Open("samples")
if err != nil {
log.Fatal(err)
}
defer dir.Close()
names, err := dir.Readdirnames(0)
if err != nil {
log.Fatal(err)
}
for i, name := range names {
names[i] = filepath.Join("samples", name)
}
makeExpected(names, dst)
}
func makeExpected(files []string, w io.Writer) {
fmt.Fprintf(w, "package exif\n\n")
fmt.Fprintf(w, "var regressExpected = map[string]map[FieldName]string{\n")
for _, name := range files {
f, err := os.Open(name)
if err != nil {
continue
}
x, err := exif.Decode(f)
if err != nil {
f.Close()
continue
}
fmt.Fprintf(w, "\"%v\": map[FieldName]string{\n", filepath.Base(name))
x.Walk(&regresswalk{w})
fmt.Fprintf(w, "},\n")
f.Close()
}
fmt.Fprintf(w, "}")
}
type regresswalk struct {
wr io.Writer
}
func (w *regresswalk) Walk(name exif.FieldName, tag *tiff.Tag) error {
if strings.HasPrefix(string(name), exif.UnknownPrefix) {
fmt.Fprintf(w.wr, "\"%v\": `%v`,\n", name, tag.String())
} else {
fmt.Fprintf(w.wr, "%v: `%v`,\n", name, tag.String())
}
return nil
}

1404
vendor/golang.org/x/image/draw/gen.go generated vendored Normal file

File diff suppressed because it is too large Load diff

133
vendor/golang.org/x/text/unicode/bidi/gen.go generated vendored Normal file
View file

@ -0,0 +1,133 @@
// 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
package main
import (
"flag"
"log"
"golang.org/x/text/internal/gen"
"golang.org/x/text/internal/triegen"
"golang.org/x/text/internal/ucd"
)
var outputFile = flag.String("out", "tables.go", "output file")
func main() {
gen.Init()
gen.Repackage("gen_trieval.go", "trieval.go", "bidi")
gen.Repackage("gen_ranges.go", "ranges_test.go", "bidi")
genTables()
}
// bidiClass names and codes taken from class "bc" in
// http://www.unicode.org/Public/8.0.0/ucd/PropertyValueAliases.txt
var bidiClass = map[string]Class{
"AL": AL, // ArabicLetter
"AN": AN, // ArabicNumber
"B": B, // ParagraphSeparator
"BN": BN, // BoundaryNeutral
"CS": CS, // CommonSeparator
"EN": EN, // EuropeanNumber
"ES": ES, // EuropeanSeparator
"ET": ET, // EuropeanTerminator
"L": L, // LeftToRight
"NSM": NSM, // NonspacingMark
"ON": ON, // OtherNeutral
"R": R, // RightToLeft
"S": S, // SegmentSeparator
"WS": WS, // WhiteSpace
"FSI": Control,
"PDF": Control,
"PDI": Control,
"LRE": Control,
"LRI": Control,
"LRO": Control,
"RLE": Control,
"RLI": Control,
"RLO": Control,
}
func genTables() {
if numClass > 0x0F {
log.Fatalf("Too many Class constants (%#x > 0x0F).", numClass)
}
w := gen.NewCodeWriter()
defer w.WriteVersionedGoFile(*outputFile, "bidi")
gen.WriteUnicodeVersion(w)
t := triegen.NewTrie("bidi")
// Build data about bracket mapping. These bits need to be or-ed with
// any other bits.
orMask := map[rune]uint64{}
xorMap := map[rune]int{}
xorMasks := []rune{0} // First value is no-op.
ucd.Parse(gen.OpenUCDFile("BidiBrackets.txt"), func(p *ucd.Parser) {
r1 := p.Rune(0)
r2 := p.Rune(1)
xor := r1 ^ r2
if _, ok := xorMap[xor]; !ok {
xorMap[xor] = len(xorMasks)
xorMasks = append(xorMasks, xor)
}
entry := uint64(xorMap[xor]) << xorMaskShift
switch p.String(2) {
case "o":
entry |= openMask
case "c", "n":
default:
log.Fatalf("Unknown bracket class %q.", p.String(2))
}
orMask[r1] = entry
})
w.WriteComment(`
xorMasks contains masks to be xor-ed with brackets to get the reverse
version.`)
w.WriteVar("xorMasks", xorMasks)
done := map[rune]bool{}
insert := func(r rune, c Class) {
if !done[r] {
t.Insert(r, orMask[r]|uint64(c))
done[r] = true
}
}
// Insert the derived BiDi properties.
ucd.Parse(gen.OpenUCDFile("extracted/DerivedBidiClass.txt"), func(p *ucd.Parser) {
r := p.Rune(0)
class, ok := bidiClass[p.String(1)]
if !ok {
log.Fatalf("%U: Unknown BiDi class %q", r, p.String(1))
}
insert(r, class)
})
visitDefaults(insert)
// TODO: use sparse blocks. This would reduce table size considerably
// from the looks of it.
sz, err := t.Gen(w)
if err != nil {
log.Fatal(err)
}
w.Size += sz
}
// dummy values to make methods in gen_common compile. The real versions
// will be generated by this file to tables.go.
var (
xorMasks []rune
)

57
vendor/golang.org/x/text/unicode/bidi/gen_ranges.go generated vendored Normal file
View file

@ -0,0 +1,57 @@
// 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
package main
import (
"unicode"
"golang.org/x/text/internal/gen"
"golang.org/x/text/internal/ucd"
"golang.org/x/text/unicode/rangetable"
)
// These tables are hand-extracted from:
// http://www.unicode.org/Public/8.0.0/ucd/extracted/DerivedBidiClass.txt
func visitDefaults(fn func(r rune, c Class)) {
// first write default values for ranges listed above.
visitRunes(fn, AL, []rune{
0x0600, 0x07BF, // Arabic
0x08A0, 0x08FF, // Arabic Extended-A
0xFB50, 0xFDCF, // Arabic Presentation Forms
0xFDF0, 0xFDFF,
0xFE70, 0xFEFF,
0x0001EE00, 0x0001EEFF, // Arabic Mathematical Alpha Symbols
})
visitRunes(fn, R, []rune{
0x0590, 0x05FF, // Hebrew
0x07C0, 0x089F, // Nko et al.
0xFB1D, 0xFB4F,
0x00010800, 0x00010FFF, // Cypriot Syllabary et. al.
0x0001E800, 0x0001EDFF,
0x0001EF00, 0x0001EFFF,
})
visitRunes(fn, ET, []rune{ // European Terminator
0x20A0, 0x20Cf, // Currency symbols
})
rangetable.Visit(unicode.Noncharacter_Code_Point, func(r rune) {
fn(r, BN) // Boundary Neutral
})
ucd.Parse(gen.OpenUCDFile("DerivedCoreProperties.txt"), func(p *ucd.Parser) {
if p.String(1) == "Default_Ignorable_Code_Point" {
fn(p.Rune(0), BN) // Boundary Neutral
}
})
}
func visitRunes(fn func(r rune, c Class), c Class, runes []rune) {
for i := 0; i < len(runes); i += 2 {
lo, hi := runes[i], runes[i+1]
for j := lo; j <= hi; j++ {
fn(j, c)
}
}
}

64
vendor/golang.org/x/text/unicode/bidi/gen_trieval.go generated vendored Normal file
View file

@ -0,0 +1,64 @@
// 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
package main
// Class is the Unicode BiDi class. Each rune has a single class.
type Class uint
const (
L Class = iota // LeftToRight
R // RightToLeft
EN // EuropeanNumber
ES // EuropeanSeparator
ET // EuropeanTerminator
AN // ArabicNumber
CS // CommonSeparator
B // ParagraphSeparator
S // SegmentSeparator
WS // WhiteSpace
ON // OtherNeutral
BN // BoundaryNeutral
NSM // NonspacingMark
AL // ArabicLetter
Control // Control LRO - PDI
numClass
LRO // LeftToRightOverride
RLO // RightToLeftOverride
LRE // LeftToRightEmbedding
RLE // RightToLeftEmbedding
PDF // PopDirectionalFormat
LRI // LeftToRightIsolate
RLI // RightToLeftIsolate
FSI // FirstStrongIsolate
PDI // PopDirectionalIsolate
unknownClass = ^Class(0)
)
var controlToClass = map[rune]Class{
0x202D: LRO, // LeftToRightOverride,
0x202E: RLO, // RightToLeftOverride,
0x202A: LRE, // LeftToRightEmbedding,
0x202B: RLE, // RightToLeftEmbedding,
0x202C: PDF, // PopDirectionalFormat,
0x2066: LRI, // LeftToRightIsolate,
0x2067: RLI, // RightToLeftIsolate,
0x2068: FSI, // FirstStrongIsolate,
0x2069: PDI, // PopDirectionalIsolate,
}
// A trie entry has the following bits:
// 7..5 XOR mask for brackets
// 4 1: Bracket open, 0: Bracket close
// 3..0 Class type
const (
openMask = 0x10
xorMaskShift = 5
)

976
vendor/golang.org/x/text/unicode/norm/maketables.go generated vendored Normal file
View file

@ -0,0 +1,976 @@
// 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 ignore
// Normalization table generator.
// Data read from the web.
// See forminfo.go for a description of the trie values associated with each rune.
package main
import (
"bytes"
"flag"
"fmt"
"io"
"log"
"sort"
"strconv"
"strings"
"golang.org/x/text/internal/gen"
"golang.org/x/text/internal/triegen"
"golang.org/x/text/internal/ucd"
)
func main() {
gen.Init()
loadUnicodeData()
compactCCC()
loadCompositionExclusions()
completeCharFields(FCanonical)
completeCharFields(FCompatibility)
computeNonStarterCounts()
verifyComputed()
printChars()
testDerived()
printTestdata()
makeTables()
}
var (
tablelist = flag.String("tables",
"all",
"comma-separated list of which tables to generate; "+
"can be 'decomp', 'recomp', 'info' and 'all'")
test = flag.Bool("test",
false,
"test existing tables against DerivedNormalizationProps and generate test data for regression testing")
verbose = flag.Bool("verbose",
false,
"write data to stdout as it is parsed")
)
const MaxChar = 0x10FFFF // anything above this shouldn't exist
// Quick Check properties of runes allow us to quickly
// determine whether a rune may occur in a normal form.
// For a given normal form, a rune may be guaranteed to occur
// verbatim (QC=Yes), may or may not combine with another
// rune (QC=Maybe), or may not occur (QC=No).
type QCResult int
const (
QCUnknown QCResult = iota
QCYes
QCNo
QCMaybe
)
func (r QCResult) String() string {
switch r {
case QCYes:
return "Yes"
case QCNo:
return "No"
case QCMaybe:
return "Maybe"
}
return "***UNKNOWN***"
}
const (
FCanonical = iota // NFC or NFD
FCompatibility // NFKC or NFKD
FNumberOfFormTypes
)
const (
MComposed = iota // NFC or NFKC
MDecomposed // NFD or NFKD
MNumberOfModes
)
// This contains only the properties we're interested in.
type Char struct {
name string
codePoint rune // if zero, this index is not a valid code point.
ccc uint8 // canonical combining class
origCCC uint8
excludeInComp bool // from CompositionExclusions.txt
compatDecomp bool // it has a compatibility expansion
nTrailingNonStarters uint8
nLeadingNonStarters uint8 // must be equal to trailing if non-zero
forms [FNumberOfFormTypes]FormInfo // For FCanonical and FCompatibility
state State
}
var chars = make([]Char, MaxChar+1)
var cccMap = make(map[uint8]uint8)
func (c Char) String() string {
buf := new(bytes.Buffer)
fmt.Fprintf(buf, "%U [%s]:\n", c.codePoint, c.name)
fmt.Fprintf(buf, " ccc: %v\n", c.ccc)
fmt.Fprintf(buf, " excludeInComp: %v\n", c.excludeInComp)
fmt.Fprintf(buf, " compatDecomp: %v\n", c.compatDecomp)
fmt.Fprintf(buf, " state: %v\n", c.state)
fmt.Fprintf(buf, " NFC:\n")
fmt.Fprint(buf, c.forms[FCanonical])
fmt.Fprintf(buf, " NFKC:\n")
fmt.Fprint(buf, c.forms[FCompatibility])
return buf.String()
}
// In UnicodeData.txt, some ranges are marked like this:
// 3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
// 4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
// parseCharacter keeps a state variable indicating the weirdness.
type State int
const (
SNormal State = iota // known to be zero for the type
SFirst
SLast
SMissing
)
var lastChar = rune('\u0000')
func (c Char) isValid() bool {
return c.codePoint != 0 && c.state != SMissing
}
type FormInfo struct {
quickCheck [MNumberOfModes]QCResult // index: MComposed or MDecomposed
verified [MNumberOfModes]bool // index: MComposed or MDecomposed
combinesForward bool // May combine with rune on the right
combinesBackward bool // May combine with rune on the left
isOneWay bool // Never appears in result
inDecomp bool // Some decompositions result in this char.
decomp Decomposition
expandedDecomp Decomposition
}
func (f FormInfo) String() string {
buf := bytes.NewBuffer(make([]byte, 0))
fmt.Fprintf(buf, " quickCheck[C]: %v\n", f.quickCheck[MComposed])
fmt.Fprintf(buf, " quickCheck[D]: %v\n", f.quickCheck[MDecomposed])
fmt.Fprintf(buf, " cmbForward: %v\n", f.combinesForward)
fmt.Fprintf(buf, " cmbBackward: %v\n", f.combinesBackward)
fmt.Fprintf(buf, " isOneWay: %v\n", f.isOneWay)
fmt.Fprintf(buf, " inDecomp: %v\n", f.inDecomp)
fmt.Fprintf(buf, " decomposition: %X\n", f.decomp)
fmt.Fprintf(buf, " expandedDecomp: %X\n", f.expandedDecomp)
return buf.String()
}
type Decomposition []rune
func parseDecomposition(s string, skipfirst bool) (a []rune, err error) {
decomp := strings.Split(s, " ")
if len(decomp) > 0 && skipfirst {
decomp = decomp[1:]
}
for _, d := range decomp {
point, err := strconv.ParseUint(d, 16, 64)
if err != nil {
return a, err
}
a = append(a, rune(point))
}
return a, nil
}
func loadUnicodeData() {
f := gen.OpenUCDFile("UnicodeData.txt")
defer f.Close()
p := ucd.New(f)
for p.Next() {
r := p.Rune(ucd.CodePoint)
char := &chars[r]
char.ccc = uint8(p.Uint(ucd.CanonicalCombiningClass))
decmap := p.String(ucd.DecompMapping)
exp, err := parseDecomposition(decmap, false)
isCompat := false
if err != nil {
if len(decmap) > 0 {
exp, err = parseDecomposition(decmap, true)
if err != nil {
log.Fatalf(`%U: bad decomp |%v|: "%s"`, r, decmap, err)
}
isCompat = true
}
}
char.name = p.String(ucd.Name)
char.codePoint = r
char.forms[FCompatibility].decomp = exp
if !isCompat {
char.forms[FCanonical].decomp = exp
} else {
char.compatDecomp = true
}
if len(decmap) > 0 {
char.forms[FCompatibility].decomp = exp
}
}
if err := p.Err(); err != nil {
log.Fatal(err)
}
}
// compactCCC converts the sparse set of CCC values to a continguous one,
// reducing the number of bits needed from 8 to 6.
func compactCCC() {
m := make(map[uint8]uint8)
for i := range chars {
c := &chars[i]
m[c.ccc] = 0
}
cccs := []int{}
for v, _ := range m {
cccs = append(cccs, int(v))
}
sort.Ints(cccs)
for i, c := range cccs {
cccMap[uint8(i)] = uint8(c)
m[uint8(c)] = uint8(i)
}
for i := range chars {
c := &chars[i]
c.origCCC = c.ccc
c.ccc = m[c.ccc]
}
if len(m) >= 1<<6 {
log.Fatalf("too many difference CCC values: %d >= 64", len(m))
}
}
// CompositionExclusions.txt has form:
// 0958 # ...
// See http://unicode.org/reports/tr44/ for full explanation
func loadCompositionExclusions() {
f := gen.OpenUCDFile("CompositionExclusions.txt")
defer f.Close()
p := ucd.New(f)
for p.Next() {
c := &chars[p.Rune(0)]
if c.excludeInComp {
log.Fatalf("%U: Duplicate entry in exclusions.", c.codePoint)
}
c.excludeInComp = true
}
if e := p.Err(); e != nil {
log.Fatal(e)
}
}
// hasCompatDecomp returns true if any of the recursive
// decompositions contains a compatibility expansion.
// In this case, the character may not occur in NFK*.
func hasCompatDecomp(r rune) bool {
c := &chars[r]
if c.compatDecomp {
return true
}
for _, d := range c.forms[FCompatibility].decomp {
if hasCompatDecomp(d) {
return true
}
}
return false
}
// Hangul related constants.
const (
HangulBase = 0xAC00
HangulEnd = 0xD7A4 // hangulBase + Jamo combinations (19 * 21 * 28)
JamoLBase = 0x1100
JamoLEnd = 0x1113
JamoVBase = 0x1161
JamoVEnd = 0x1176
JamoTBase = 0x11A8
JamoTEnd = 0x11C3
JamoLVTCount = 19 * 21 * 28
JamoTCount = 28
)
func isHangul(r rune) bool {
return HangulBase <= r && r < HangulEnd
}
func isHangulWithoutJamoT(r rune) bool {
if !isHangul(r) {
return false
}
r -= HangulBase
return r < JamoLVTCount && r%JamoTCount == 0
}
func ccc(r rune) uint8 {
return chars[r].ccc
}
// Insert a rune in a buffer, ordered by Canonical Combining Class.
func insertOrdered(b Decomposition, r rune) Decomposition {
n := len(b)
b = append(b, 0)
cc := ccc(r)
if cc > 0 {
// Use bubble sort.
for ; n > 0; n-- {
if ccc(b[n-1]) <= cc {
break
}
b[n] = b[n-1]
}
}
b[n] = r
return b
}
// Recursively decompose.
func decomposeRecursive(form int, r rune, d Decomposition) Decomposition {
dcomp := chars[r].forms[form].decomp
if len(dcomp) == 0 {
return insertOrdered(d, r)
}
for _, c := range dcomp {
d = decomposeRecursive(form, c, d)
}
return d
}
func completeCharFields(form int) {
// Phase 0: pre-expand decomposition.
for i := range chars {
f := &chars[i].forms[form]
if len(f.decomp) == 0 {
continue
}
exp := make(Decomposition, 0)
for _, c := range f.decomp {
exp = decomposeRecursive(form, c, exp)
}
f.expandedDecomp = exp
}
// Phase 1: composition exclusion, mark decomposition.
for i := range chars {
c := &chars[i]
f := &c.forms[form]
// Marks script-specific exclusions and version restricted.
f.isOneWay = c.excludeInComp
// Singletons
f.isOneWay = f.isOneWay || len(f.decomp) == 1
// Non-starter decompositions
if len(f.decomp) > 1 {
chk := c.ccc != 0 || chars[f.decomp[0]].ccc != 0
f.isOneWay = f.isOneWay || chk
}
// Runes that decompose into more than two runes.
f.isOneWay = f.isOneWay || len(f.decomp) > 2
if form == FCompatibility {
f.isOneWay = f.isOneWay || hasCompatDecomp(c.codePoint)
}
for _, r := range f.decomp {
chars[r].forms[form].inDecomp = true
}
}
// Phase 2: forward and backward combining.
for i := range chars {
c := &chars[i]
f := &c.forms[form]
if !f.isOneWay && len(f.decomp) == 2 {
f0 := &chars[f.decomp[0]].forms[form]
f1 := &chars[f.decomp[1]].forms[form]
if !f0.isOneWay {
f0.combinesForward = true
}
if !f1.isOneWay {
f1.combinesBackward = true
}
}
if isHangulWithoutJamoT(rune(i)) {
f.combinesForward = true
}
}
// Phase 3: quick check values.
for i := range chars {
c := &chars[i]
f := &c.forms[form]
switch {
case len(f.decomp) > 0:
f.quickCheck[MDecomposed] = QCNo
case isHangul(rune(i)):
f.quickCheck[MDecomposed] = QCNo
default:
f.quickCheck[MDecomposed] = QCYes
}
switch {
case f.isOneWay:
f.quickCheck[MComposed] = QCNo
case (i & 0xffff00) == JamoLBase:
f.quickCheck[MComposed] = QCYes
if JamoLBase <= i && i < JamoLEnd {
f.combinesForward = true
}
if JamoVBase <= i && i < JamoVEnd {
f.quickCheck[MComposed] = QCMaybe
f.combinesBackward = true
f.combinesForward = true
}
if JamoTBase <= i && i < JamoTEnd {
f.quickCheck[MComposed] = QCMaybe
f.combinesBackward = true
}
case !f.combinesBackward:
f.quickCheck[MComposed] = QCYes
default:
f.quickCheck[MComposed] = QCMaybe
}
}
}
func computeNonStarterCounts() {
// Phase 4: leading and trailing non-starter count
for i := range chars {
c := &chars[i]
runes := []rune{rune(i)}
// We always use FCompatibility so that the CGJ insertion points do not
// change for repeated normalizations with different forms.
if exp := c.forms[FCompatibility].expandedDecomp; len(exp) > 0 {
runes = exp
}
// We consider runes that combine backwards to be non-starters for the
// purpose of Stream-Safe Text Processing.
for _, r := range runes {
if cr := &chars[r]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward {
break
}
c.nLeadingNonStarters++
}
for i := len(runes) - 1; i >= 0; i-- {
if cr := &chars[runes[i]]; cr.ccc == 0 && !cr.forms[FCompatibility].combinesBackward {
break
}
c.nTrailingNonStarters++
}
if c.nTrailingNonStarters > 3 {
log.Fatalf("%U: Decomposition with more than 3 (%d) trailing modifiers (%U)", i, c.nTrailingNonStarters, runes)
}
if isHangul(rune(i)) {
c.nTrailingNonStarters = 2
if isHangulWithoutJamoT(rune(i)) {
c.nTrailingNonStarters = 1
}
}
if l, t := c.nLeadingNonStarters, c.nTrailingNonStarters; l > 0 && l != t {
log.Fatalf("%U: number of leading and trailing non-starters should be equal (%d vs %d)", i, l, t)
}
if t := c.nTrailingNonStarters; t > 3 {
log.Fatalf("%U: number of trailing non-starters is %d > 3", t)
}
}
}
func printBytes(w io.Writer, b []byte, name string) {
fmt.Fprintf(w, "// %s: %d bytes\n", name, len(b))
fmt.Fprintf(w, "var %s = [...]byte {", name)
for i, c := range b {
switch {
case i%64 == 0:
fmt.Fprintf(w, "\n// Bytes %x - %x\n", i, i+63)
case i%8 == 0:
fmt.Fprintf(w, "\n")
}
fmt.Fprintf(w, "0x%.2X, ", c)
}
fmt.Fprint(w, "\n}\n\n")
}
// See forminfo.go for format.
func makeEntry(f *FormInfo, c *Char) uint16 {
e := uint16(0)
if r := c.codePoint; HangulBase <= r && r < HangulEnd {
e |= 0x40
}
if f.combinesForward {
e |= 0x20
}
if f.quickCheck[MDecomposed] == QCNo {
e |= 0x4
}
switch f.quickCheck[MComposed] {
case QCYes:
case QCNo:
e |= 0x10
case QCMaybe:
e |= 0x18
default:
log.Fatalf("Illegal quickcheck value %v.", f.quickCheck[MComposed])
}
e |= uint16(c.nTrailingNonStarters)
return e
}
// decompSet keeps track of unique decompositions, grouped by whether
// the decomposition is followed by a trailing and/or leading CCC.
type decompSet [7]map[string]bool
const (
normalDecomp = iota
firstMulti
firstCCC
endMulti
firstLeadingCCC
firstCCCZeroExcept
firstStarterWithNLead
lastDecomp
)
var cname = []string{"firstMulti", "firstCCC", "endMulti", "firstLeadingCCC", "firstCCCZeroExcept", "firstStarterWithNLead", "lastDecomp"}
func makeDecompSet() decompSet {
m := decompSet{}
for i := range m {
m[i] = make(map[string]bool)
}
return m
}
func (m *decompSet) insert(key int, s string) {
m[key][s] = true
}
func printCharInfoTables(w io.Writer) int {
mkstr := func(r rune, f *FormInfo) (int, string) {
d := f.expandedDecomp
s := string([]rune(d))
if max := 1 << 6; len(s) >= max {
const msg = "%U: too many bytes in decomposition: %d >= %d"
log.Fatalf(msg, r, len(s), max)
}
head := uint8(len(s))
if f.quickCheck[MComposed] != QCYes {
head |= 0x40
}
if f.combinesForward {
head |= 0x80
}
s = string([]byte{head}) + s
lccc := ccc(d[0])
tccc := ccc(d[len(d)-1])
cc := ccc(r)
if cc != 0 && lccc == 0 && tccc == 0 {
log.Fatalf("%U: trailing and leading ccc are 0 for non-zero ccc %d", r, cc)
}
if tccc < lccc && lccc != 0 {
const msg = "%U: lccc (%d) must be <= tcc (%d)"
log.Fatalf(msg, r, lccc, tccc)
}
index := normalDecomp
nTrail := chars[r].nTrailingNonStarters
nLead := chars[r].nLeadingNonStarters
if tccc > 0 || lccc > 0 || nTrail > 0 {
tccc <<= 2
tccc |= nTrail
s += string([]byte{tccc})
index = endMulti
for _, r := range d[1:] {
if ccc(r) == 0 {
index = firstCCC
}
}
if lccc > 0 || nLead > 0 {
s += string([]byte{lccc})
if index == firstCCC {
log.Fatalf("%U: multi-segment decomposition not supported for decompositions with leading CCC != 0", r)
}
index = firstLeadingCCC
}
if cc != lccc {
if cc != 0 {
log.Fatalf("%U: for lccc != ccc, expected ccc to be 0; was %d", r, cc)
}
index = firstCCCZeroExcept
}
} else if len(d) > 1 {
index = firstMulti
}
return index, s
}
decompSet := makeDecompSet()
const nLeadStr = "\x00\x01" // 0-byte length and tccc with nTrail.
decompSet.insert(firstStarterWithNLead, nLeadStr)
// Store the uniqued decompositions in a byte buffer,
// preceded by their byte length.
for _, c := range chars {
for _, f := range c.forms {
if len(f.expandedDecomp) == 0 {
continue
}
if f.combinesBackward {
log.Fatalf("%U: combinesBackward and decompose", c.codePoint)
}
index, s := mkstr(c.codePoint, &f)
decompSet.insert(index, s)
}
}
decompositions := bytes.NewBuffer(make([]byte, 0, 10000))
size := 0
positionMap := make(map[string]uint16)
decompositions.WriteString("\000")
fmt.Fprintln(w, "const (")
for i, m := range decompSet {
sa := []string{}
for s := range m {
sa = append(sa, s)
}
sort.Strings(sa)
for _, s := range sa {
p := decompositions.Len()
decompositions.WriteString(s)
positionMap[s] = uint16(p)
}
if cname[i] != "" {
fmt.Fprintf(w, "%s = 0x%X\n", cname[i], decompositions.Len())
}
}
fmt.Fprintln(w, "maxDecomp = 0x8000")
fmt.Fprintln(w, ")")
b := decompositions.Bytes()
printBytes(w, b, "decomps")
size += len(b)
varnames := []string{"nfc", "nfkc"}
for i := 0; i < FNumberOfFormTypes; i++ {
trie := triegen.NewTrie(varnames[i])
for r, c := range chars {
f := c.forms[i]
d := f.expandedDecomp
if len(d) != 0 {
_, key := mkstr(c.codePoint, &f)
trie.Insert(rune(r), uint64(positionMap[key]))
if c.ccc != ccc(d[0]) {
// We assume the lead ccc of a decomposition !=0 in this case.
if ccc(d[0]) == 0 {
log.Fatalf("Expected leading CCC to be non-zero; ccc is %d", c.ccc)
}
}
} else if c.nLeadingNonStarters > 0 && len(f.expandedDecomp) == 0 && c.ccc == 0 && !f.combinesBackward {
// Handle cases where it can't be detected that the nLead should be equal
// to nTrail.
trie.Insert(c.codePoint, uint64(positionMap[nLeadStr]))
} else if v := makeEntry(&f, &c)<<8 | uint16(c.ccc); v != 0 {
trie.Insert(c.codePoint, uint64(0x8000|v))
}
}
sz, err := trie.Gen(w, triegen.Compact(&normCompacter{name: varnames[i]}))
if err != nil {
log.Fatal(err)
}
size += sz
}
return size
}
func contains(sa []string, s string) bool {
for _, a := range sa {
if a == s {
return true
}
}
return false
}
func makeTables() {
w := &bytes.Buffer{}
size := 0
if *tablelist == "" {
return
}
list := strings.Split(*tablelist, ",")
if *tablelist == "all" {
list = []string{"recomp", "info"}
}
// Compute maximum decomposition size.
max := 0
for _, c := range chars {
if n := len(string(c.forms[FCompatibility].expandedDecomp)); n > max {
max = n
}
}
fmt.Fprintln(w, "const (")
fmt.Fprintln(w, "\t// Version is the Unicode edition from which the tables are derived.")
fmt.Fprintf(w, "\tVersion = %q\n", gen.UnicodeVersion())
fmt.Fprintln(w)
fmt.Fprintln(w, "\t// MaxTransformChunkSize indicates the maximum number of bytes that Transform")
fmt.Fprintln(w, "\t// may need to write atomically for any Form. Making a destination buffer at")
fmt.Fprintln(w, "\t// least this size ensures that Transform can always make progress and that")
fmt.Fprintln(w, "\t// the user does not need to grow the buffer on an ErrShortDst.")
fmt.Fprintf(w, "\tMaxTransformChunkSize = %d+maxNonStarters*4\n", len(string(0x034F))+max)
fmt.Fprintln(w, ")\n")
// Print the CCC remap table.
size += len(cccMap)
fmt.Fprintf(w, "var ccc = [%d]uint8{", len(cccMap))
for i := 0; i < len(cccMap); i++ {
if i%8 == 0 {
fmt.Fprintln(w)
}
fmt.Fprintf(w, "%3d, ", cccMap[uint8(i)])
}
fmt.Fprintln(w, "\n}\n")
if contains(list, "info") {
size += printCharInfoTables(w)
}
if contains(list, "recomp") {
// Note that we use 32 bit keys, instead of 64 bit.
// This clips the bits of three entries, but we know
// this won't cause a collision. The compiler will catch
// any changes made to UnicodeData.txt that introduces
// a collision.
// Note that the recomposition map for NFC and NFKC
// are identical.
// Recomposition map
nrentries := 0
for _, c := range chars {
f := c.forms[FCanonical]
if !f.isOneWay && len(f.decomp) > 0 {
nrentries++
}
}
sz := nrentries * 8
size += sz
fmt.Fprintf(w, "// recompMap: %d bytes (entries only)\n", sz)
fmt.Fprintln(w, "var recompMap = map[uint32]rune{")
for i, c := range chars {
f := c.forms[FCanonical]
d := f.decomp
if !f.isOneWay && len(d) > 0 {
key := uint32(uint16(d[0]))<<16 + uint32(uint16(d[1]))
fmt.Fprintf(w, "0x%.8X: 0x%.4X,\n", key, i)
}
}
fmt.Fprintf(w, "}\n\n")
}
fmt.Fprintf(w, "// Total size of tables: %dKB (%d bytes)\n", (size+512)/1024, size)
gen.WriteVersionedGoFile("tables.go", "norm", w.Bytes())
}
func printChars() {
if *verbose {
for _, c := range chars {
if !c.isValid() || c.state == SMissing {
continue
}
fmt.Println(c)
}
}
}
// verifyComputed does various consistency tests.
func verifyComputed() {
for i, c := range chars {
for _, f := range c.forms {
isNo := (f.quickCheck[MDecomposed] == QCNo)
if (len(f.decomp) > 0) != isNo && !isHangul(rune(i)) {
log.Fatalf("%U: NF*D QC must be No if rune decomposes", i)
}
isMaybe := f.quickCheck[MComposed] == QCMaybe
if f.combinesBackward != isMaybe {
log.Fatalf("%U: NF*C QC must be Maybe if combinesBackward", i)
}
if len(f.decomp) > 0 && f.combinesForward && isMaybe {
log.Fatalf("%U: NF*C QC must be Yes or No if combinesForward and decomposes", i)
}
if len(f.expandedDecomp) != 0 {
continue
}
if a, b := c.nLeadingNonStarters > 0, (c.ccc > 0 || f.combinesBackward); a != b {
// We accept these runes to be treated differently (it only affects
// segment breaking in iteration, most likely on improper use), but
// reconsider if more characters are added.
// U+FF9E HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L;<narrow> 3099;;;;N;;;;;
// U+FF9F HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L;<narrow> 309A;;;;N;;;;;
// U+3133 HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<compat> 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;;
// U+318E HANGUL LETTER ARAEAE;Lo;0;L;<compat> 11A1;;;;N;HANGUL LETTER ALAE AE;;;;
// U+FFA3 HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L;<narrow> 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;;
// U+FFDC HALFWIDTH HANGUL LETTER I;Lo;0;L;<narrow> 3163;;;;N;;;;;
if i != 0xFF9E && i != 0xFF9F && !(0x3133 <= i && i <= 0x318E) && !(0xFFA3 <= i && i <= 0xFFDC) {
log.Fatalf("%U: nLead was %v; want %v", i, a, b)
}
}
}
nfc := c.forms[FCanonical]
nfkc := c.forms[FCompatibility]
if nfc.combinesBackward != nfkc.combinesBackward {
log.Fatalf("%U: Cannot combine combinesBackward\n", c.codePoint)
}
}
}
// Use values in DerivedNormalizationProps.txt to compare against the
// values we computed.
// DerivedNormalizationProps.txt has form:
// 00C0..00C5 ; NFD_QC; N # ...
// 0374 ; NFD_QC; N # ...
// See http://unicode.org/reports/tr44/ for full explanation
func testDerived() {
f := gen.OpenUCDFile("DerivedNormalizationProps.txt")
defer f.Close()
p := ucd.New(f)
for p.Next() {
r := p.Rune(0)
c := &chars[r]
var ftype, mode int
qt := p.String(1)
switch qt {
case "NFC_QC":
ftype, mode = FCanonical, MComposed
case "NFD_QC":
ftype, mode = FCanonical, MDecomposed
case "NFKC_QC":
ftype, mode = FCompatibility, MComposed
case "NFKD_QC":
ftype, mode = FCompatibility, MDecomposed
default:
continue
}
var qr QCResult
switch p.String(2) {
case "Y":
qr = QCYes
case "N":
qr = QCNo
case "M":
qr = QCMaybe
default:
log.Fatalf(`Unexpected quick check value "%s"`, p.String(2))
}
if got := c.forms[ftype].quickCheck[mode]; got != qr {
log.Printf("%U: FAILED %s (was %v need %v)\n", r, qt, got, qr)
}
c.forms[ftype].verified[mode] = true
}
if err := p.Err(); err != nil {
log.Fatal(err)
}
// Any unspecified value must be QCYes. Verify this.
for i, c := range chars {
for j, fd := range c.forms {
for k, qr := range fd.quickCheck {
if !fd.verified[k] && qr != QCYes {
m := "%U: FAIL F:%d M:%d (was %v need Yes) %s\n"
log.Printf(m, i, j, k, qr, c.name)
}
}
}
}
}
var testHeader = `const (
Yes = iota
No
Maybe
)
type formData struct {
qc uint8
combinesForward bool
decomposition string
}
type runeData struct {
r rune
ccc uint8
nLead uint8
nTrail uint8
f [2]formData // 0: canonical; 1: compatibility
}
func f(qc uint8, cf bool, dec string) [2]formData {
return [2]formData{{qc, cf, dec}, {qc, cf, dec}}
}
func g(qc, qck uint8, cf, cfk bool, d, dk string) [2]formData {
return [2]formData{{qc, cf, d}, {qck, cfk, dk}}
}
var testData = []runeData{
`
func printTestdata() {
type lastInfo struct {
ccc uint8
nLead uint8
nTrail uint8
f string
}
last := lastInfo{}
w := &bytes.Buffer{}
fmt.Fprintf(w, testHeader)
for r, c := range chars {
f := c.forms[FCanonical]
qc, cf, d := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp)
f = c.forms[FCompatibility]
qck, cfk, dk := f.quickCheck[MComposed], f.combinesForward, string(f.expandedDecomp)
s := ""
if d == dk && qc == qck && cf == cfk {
s = fmt.Sprintf("f(%s, %v, %q)", qc, cf, d)
} else {
s = fmt.Sprintf("g(%s, %s, %v, %v, %q, %q)", qc, qck, cf, cfk, d, dk)
}
current := lastInfo{c.ccc, c.nLeadingNonStarters, c.nTrailingNonStarters, s}
if last != current {
fmt.Fprintf(w, "\t{0x%x, %d, %d, %d, %s},\n", r, c.origCCC, c.nLeadingNonStarters, c.nTrailingNonStarters, s)
last = current
}
}
fmt.Fprintln(w, "}")
gen.WriteVersionedGoFile("data_test.go", "norm", w.Bytes())
}

117
vendor/golang.org/x/text/unicode/norm/triegen.go generated vendored Normal file
View file

@ -0,0 +1,117 @@
// 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 ignore
// Trie table generator.
// Used by make*tables tools to generate a go file with trie data structures
// for mapping UTF-8 to a 16-bit value. All but the last byte in a UTF-8 byte
// sequence are used to lookup offsets in the index table to be used for the
// next byte. The last byte is used to index into a table with 16-bit values.
package main
import (
"fmt"
"io"
)
const maxSparseEntries = 16
type normCompacter struct {
sparseBlocks [][]uint64
sparseOffset []uint16
sparseCount int
name string
}
func mostFrequentStride(a []uint64) int {
counts := make(map[int]int)
var v int
for _, x := range a {
if stride := int(x) - v; v != 0 && stride >= 0 {
counts[stride]++
}
v = int(x)
}
var maxs, maxc int
for stride, cnt := range counts {
if cnt > maxc || (cnt == maxc && stride < maxs) {
maxs, maxc = stride, cnt
}
}
return maxs
}
func countSparseEntries(a []uint64) int {
stride := mostFrequentStride(a)
var v, count int
for _, tv := range a {
if int(tv)-v != stride {
if tv != 0 {
count++
}
}
v = int(tv)
}
return count
}
func (c *normCompacter) Size(v []uint64) (sz int, ok bool) {
if n := countSparseEntries(v); n <= maxSparseEntries {
return (n+1)*4 + 2, true
}
return 0, false
}
func (c *normCompacter) Store(v []uint64) uint32 {
h := uint32(len(c.sparseOffset))
c.sparseBlocks = append(c.sparseBlocks, v)
c.sparseOffset = append(c.sparseOffset, uint16(c.sparseCount))
c.sparseCount += countSparseEntries(v) + 1
return h
}
func (c *normCompacter) Handler() string {
return c.name + "Sparse.lookup"
}
func (c *normCompacter) Print(w io.Writer) (retErr error) {
p := func(f string, x ...interface{}) {
if _, err := fmt.Fprintf(w, f, x...); retErr == nil && err != nil {
retErr = err
}
}
ls := len(c.sparseBlocks)
p("// %sSparseOffset: %d entries, %d bytes\n", c.name, ls, ls*2)
p("var %sSparseOffset = %#v\n\n", c.name, c.sparseOffset)
ns := c.sparseCount
p("// %sSparseValues: %d entries, %d bytes\n", c.name, ns, ns*4)
p("var %sSparseValues = [%d]valueRange {", c.name, ns)
for i, b := range c.sparseBlocks {
p("\n// Block %#x, offset %#x", i, c.sparseOffset[i])
var v int
stride := mostFrequentStride(b)
n := countSparseEntries(b)
p("\n{value:%#04x,lo:%#02x},", stride, uint8(n))
for i, nv := range b {
if int(nv)-v != stride {
if v != 0 {
p(",hi:%#02x},", 0x80+i-1)
}
if nv != 0 {
p("\n{value:%#04x,lo:%#02x", nv, 0x80+i)
}
}
v = int(nv)
}
if v != 0 {
p(",hi:%#02x},", 0x80+len(b)-1)
}
}
p("\n}\n\n")
return
}

0
vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto generated vendored Executable file → Normal file
View file

165
vendor/modules.txt vendored Normal file
View file

@ -0,0 +1,165 @@
# cloud.google.com/go v0.0.0-20180131234750-2de512d2700d
cloud.google.com/go/storage
cloud.google.com/go/iam
cloud.google.com/go/internal
cloud.google.com/go/internal/optional
cloud.google.com/go/internal/version
cloud.google.com/go/compute/metadata
# github.com/Azure/azure-sdk-for-go v12.3.0-beta+incompatible
github.com/Azure/azure-sdk-for-go/storage
# github.com/Azure/go-autorest v9.9.0+incompatible
github.com/Azure/go-autorest/autorest
github.com/Azure/go-autorest/autorest/azure
github.com/Azure/go-autorest/autorest/adal
github.com/Azure/go-autorest/autorest/date
# github.com/PaulARoy/azurestoragecache v0.0.0-20170906084534-3c249a3ba788
github.com/PaulARoy/azurestoragecache
# github.com/aws/aws-sdk-go v0.0.0-20180126231901-00cca3f093a8
github.com/aws/aws-sdk-go/aws
github.com/aws/aws-sdk-go/aws/awserr
github.com/aws/aws-sdk-go/aws/session
github.com/aws/aws-sdk-go/service/s3
github.com/aws/aws-sdk-go/aws/credentials
github.com/aws/aws-sdk-go/aws/endpoints
github.com/aws/aws-sdk-go/aws/client
github.com/aws/aws-sdk-go/aws/corehandlers
github.com/aws/aws-sdk-go/aws/credentials/stscreds
github.com/aws/aws-sdk-go/aws/defaults
github.com/aws/aws-sdk-go/aws/request
github.com/aws/aws-sdk-go/aws/awsutil
github.com/aws/aws-sdk-go/aws/client/metadata
github.com/aws/aws-sdk-go/aws/signer/v4
github.com/aws/aws-sdk-go/private/protocol
github.com/aws/aws-sdk-go/private/protocol/restxml
github.com/aws/aws-sdk-go/internal/shareddefaults
github.com/aws/aws-sdk-go/service/sts
github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds
github.com/aws/aws-sdk-go/aws/credentials/endpointcreds
github.com/aws/aws-sdk-go/aws/ec2metadata
github.com/aws/aws-sdk-go/private/protocol/rest
github.com/aws/aws-sdk-go/private/protocol/query
github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil
github.com/aws/aws-sdk-go/private/protocol/query/queryutil
# github.com/dgrijalva/jwt-go v3.1.0+incompatible
github.com/dgrijalva/jwt-go
# github.com/die-net/lrucache v0.0.0-20171111232917-04b9315ab7a6
github.com/die-net/lrucache
github.com/die-net/lrucache/twotier
# github.com/disintegration/imaging v1.3.0
github.com/disintegration/imaging
# github.com/garyburd/redigo v1.5.0
github.com/garyburd/redigo/redis
github.com/garyburd/redigo/internal
# github.com/go-ini/ini v1.25.4
github.com/go-ini/ini
# github.com/golang/protobuf v1.0.0
github.com/golang/protobuf/proto
github.com/golang/protobuf/ptypes
github.com/golang/protobuf/protoc-gen-go/descriptor
github.com/golang/protobuf/ptypes/any
github.com/golang/protobuf/ptypes/duration
github.com/golang/protobuf/ptypes/timestamp
# github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a
github.com/google/btree
# github.com/googleapis/gax-go v2.0.0+incompatible
github.com/googleapis/gax-go
# github.com/gregjones/httpcache v0.0.0-20171119193500-2bcd89a1743f
github.com/gregjones/httpcache
github.com/gregjones/httpcache/diskcache
github.com/gregjones/httpcache/redis
# github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8
github.com/jmespath/go-jmespath
# github.com/marstr/guid v0.0.0-20170427235115-8bdf7d1a087c
github.com/marstr/guid
# github.com/muesli/smartcrop v0.0.0-20171215203440-9032446b30f6
github.com/muesli/smartcrop
# github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5
github.com/nfnt/resize
# github.com/peterbourgon/diskv v0.0.0-20171120014656-2973218375c3
github.com/peterbourgon/diskv
# github.com/rwcarlsen/goexif v0.0.0-20141222211634-41dad3aa0833
github.com/rwcarlsen/goexif/exif
github.com/rwcarlsen/goexif/tiff
# github.com/satori/go.uuid v0.0.0-20180103174451-36e9d2ebbde5
github.com/satori/go.uuid
# golang.org/x/image v0.0.0-20171214225156-12117c17ca67
golang.org/x/image/tiff
golang.org/x/image/webp
golang.org/x/image/bmp
golang.org/x/image/draw
golang.org/x/image/tiff/lzw
golang.org/x/image/riff
golang.org/x/image/vp8
golang.org/x/image/vp8l
golang.org/x/image/math/f64
# golang.org/x/net v0.0.0-20180201232540-b417086c80e9
golang.org/x/net/context
golang.org/x/net/context/ctxhttp
golang.org/x/net/http2
golang.org/x/net/trace
golang.org/x/net/http2/hpack
golang.org/x/net/idna
golang.org/x/net/lex/httplex
golang.org/x/net/internal/timeseries
# golang.org/x/oauth2 v0.0.0-20180126164932-a032972e2806
golang.org/x/oauth2
golang.org/x/oauth2/internal
golang.org/x/oauth2/google
golang.org/x/oauth2/jws
golang.org/x/oauth2/jwt
# golang.org/x/text v0.0.0-20171227012246-e19ae1496984
golang.org/x/text/secure/bidirule
golang.org/x/text/unicode/bidi
golang.org/x/text/unicode/norm
golang.org/x/text/transform
# google.golang.org/api v0.0.0-20180202000329-f7618f4b41ca
google.golang.org/api/googleapi
google.golang.org/api/iterator
google.golang.org/api/option
google.golang.org/api/storage/v1
google.golang.org/api/transport/http
google.golang.org/api/googleapi/internal/uritemplates
google.golang.org/api/internal
google.golang.org/api/gensupport
google.golang.org/api/googleapi/transport
# google.golang.org/appengine v0.0.0-20171212223047-5bee14b453b4
google.golang.org/appengine/urlfetch
google.golang.org/appengine/internal
google.golang.org/appengine/internal/urlfetch
google.golang.org/appengine
google.golang.org/appengine/internal/base
google.golang.org/appengine/internal/datastore
google.golang.org/appengine/internal/log
google.golang.org/appengine/internal/remote_api
google.golang.org/appengine/internal/app_identity
google.golang.org/appengine/internal/modules
# google.golang.org/genproto v0.0.0-20180125080656-4eb30f4778ee
google.golang.org/genproto/googleapis/iam/v1
google.golang.org/genproto/googleapis/api/annotations
google.golang.org/genproto/googleapis/rpc/status
# google.golang.org/grpc v0.0.0-20180201193814-f9628db66d14
google.golang.org/grpc
google.golang.org/grpc/status
google.golang.org/grpc/codes
google.golang.org/grpc/balancer
google.golang.org/grpc/balancer/roundrobin
google.golang.org/grpc/connectivity
google.golang.org/grpc/credentials
google.golang.org/grpc/encoding
google.golang.org/grpc/encoding/proto
google.golang.org/grpc/grpclb/grpc_lb_v1/messages
google.golang.org/grpc/grpclog
google.golang.org/grpc/internal
google.golang.org/grpc/keepalive
google.golang.org/grpc/metadata
google.golang.org/grpc/naming
google.golang.org/grpc/peer
google.golang.org/grpc/resolver
google.golang.org/grpc/resolver/dns
google.golang.org/grpc/resolver/passthrough
google.golang.org/grpc/stats
google.golang.org/grpc/tap
google.golang.org/grpc/transport
google.golang.org/grpc/balancer/base
# willnorris.com/go/gifresize v1.0.0
willnorris.com/go/gifresize

831
vendor/vendor.json vendored
View file

@ -1,831 +0,0 @@
{
"comment": "",
"ignore": "test",
"package": [
{
"path": "appengine",
"revision": ""
},
{
"path": "appengine_internal",
"revision": ""
},
{
"path": "appengine_internal/base",
"revision": ""
},
{
"checksumSHA1": "AH7jcN7pvaPDU6UjHdpT081DDGk=",
"path": "cloud.google.com/go/compute/metadata",
"revision": "2de512d2700d45e7db3bc7b5decfa0a6713a252c",
"revisionTime": "2018-01-31T20:58:25Z"
},
{
"checksumSHA1": "/ixPd+hSgsbAjBI/fPqmHtTFRM8=",
"path": "cloud.google.com/go/iam",
"revision": "2de512d2700d45e7db3bc7b5decfa0a6713a252c",
"revisionTime": "2018-01-31T20:58:25Z"
},
{
"checksumSHA1": "+2A2Mazq65iiT8xIDgSh5cypBSQ=",
"path": "cloud.google.com/go/internal",
"revision": "2de512d2700d45e7db3bc7b5decfa0a6713a252c",
"revisionTime": "2018-01-31T20:58:25Z"
},
{
"checksumSHA1": "MCns2LLZtUZEx6JWyYBrcbSuTXg=",
"path": "cloud.google.com/go/internal/optional",
"revision": "2de512d2700d45e7db3bc7b5decfa0a6713a252c",
"revisionTime": "2018-01-31T20:58:25Z"
},
{
"checksumSHA1": "Kiv6zkk0B9R4wmWX2nizyU4FqBs=",
"path": "cloud.google.com/go/internal/version",
"revision": "2de512d2700d45e7db3bc7b5decfa0a6713a252c",
"revisionTime": "2018-01-31T20:58:25Z"
},
{
"checksumSHA1": "PkbOqDgZwhkn4iTXLQGM6tURyEg=",
"path": "cloud.google.com/go/storage",
"revision": "2de512d2700d45e7db3bc7b5decfa0a6713a252c",
"revisionTime": "2018-01-31T20:58:25Z"
},
{
"checksumSHA1": "Q11VoP2I9ES8zeMHPsGhy9BxJMQ=",
"path": "github.com/Azure/azure-sdk-for-go/storage",
"revision": "a75e7321dcb5045edbbdba24b594d8f3f1b31352",
"revisionTime": "2018-01-30T20:45:22Z"
},
{
"checksumSHA1": "sM9XTbrCfgS5BPxpFLeM5YwOZWg=",
"path": "github.com/Azure/go-autorest/autorest",
"revision": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab",
"revisionTime": "2018-01-30T19:06:02Z"
},
{
"checksumSHA1": "SOWyKVEKE3f4h7oE5/EV0a7YZmA=",
"path": "github.com/Azure/go-autorest/autorest/adal",
"revision": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab",
"revisionTime": "2018-01-30T19:06:02Z"
},
{
"checksumSHA1": "3xE3L8S3TMLhkTJS69P8tFANvLQ=",
"path": "github.com/Azure/go-autorest/autorest/azure",
"revision": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab",
"revisionTime": "2018-01-30T19:06:02Z"
},
{
"checksumSHA1": "9nXCi9qQsYjxCeajJKWttxgEt0I=",
"path": "github.com/Azure/go-autorest/autorest/date",
"revision": "d4e6b95c12a08b4de2d48b45d5b4d594e5d32fab",
"revisionTime": "2018-01-30T19:06:02Z"
},
{
"checksumSHA1": "pim0S/Q+VMPsZJlyaEhGYzqjIlE=",
"path": "github.com/PaulARoy/azurestoragecache",
"revision": "3c249a3ba78867d6f4e2fc7f5264145ffb5dd0d9",
"revisionTime": "2017-09-06T08:45:34Z"
},
{
"checksumSHA1": "3qbWQO79tzfxr3IXc5P/l0XbVaI=",
"path": "github.com/aws/aws-sdk-go/aws",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "Y9W+4GimK4Fuxq+vyIskVYFRnX4=",
"path": "github.com/aws/aws-sdk-go/aws/awserr",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "yyYr41HZ1Aq0hWc3J5ijXwYEcac=",
"path": "github.com/aws/aws-sdk-go/aws/awsutil",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "9nE/FjZ4pYrT883KtV2/aI+Gayo=",
"path": "github.com/aws/aws-sdk-go/aws/client",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "ieAJ+Cvp/PKv1LpUEnUXpc3OI6E=",
"path": "github.com/aws/aws-sdk-go/aws/client/metadata",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "7/8j/q0TWtOgXyvEcv4B2Dhl00o=",
"path": "github.com/aws/aws-sdk-go/aws/corehandlers",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "Y+cPwQL0dZMyqp3wI+KJWmA9KQ8=",
"path": "github.com/aws/aws-sdk-go/aws/credentials",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "u3GOAJLmdvbuNUeUEcZSEAOeL/0=",
"path": "github.com/aws/aws-sdk-go/aws/credentials/ec2rolecreds",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "NUJUTWlc1sV8b7WjfiYc4JZbXl0=",
"path": "github.com/aws/aws-sdk-go/aws/credentials/endpointcreds",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "JEYqmF83O5n5bHkupAzA6STm0no=",
"path": "github.com/aws/aws-sdk-go/aws/credentials/stscreds",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "OnU/n7R33oYXiB4SAGd5pK7I0Bs=",
"path": "github.com/aws/aws-sdk-go/aws/defaults",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "/EXbk/z2TWjWc1Hvb4QYs3Wmhb8=",
"path": "github.com/aws/aws-sdk-go/aws/ec2metadata",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "QzwFDjKBl8XUPtQ3Sgd7+rRestk=",
"path": "github.com/aws/aws-sdk-go/aws/endpoints",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "657ICMok3uC5dm5e9bKcVF2HaxE=",
"path": "github.com/aws/aws-sdk-go/aws/request",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "HcGL4e6Uep4/80eCUI5xkcWjpQ0=",
"path": "github.com/aws/aws-sdk-go/aws/session",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "iU00ZjhAml/13g+1YXT21IqoXqg=",
"path": "github.com/aws/aws-sdk-go/aws/signer/v4",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "04ypv4x12l4q0TksA1zEVsmgpvw=",
"path": "github.com/aws/aws-sdk-go/internal/shareddefaults",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "NStHCXEvYqG72GknZyv1jaKaeH0=",
"path": "github.com/aws/aws-sdk-go/private/protocol",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "ZqY5RWavBLWTo6j9xqdyBEaNFRk=",
"path": "github.com/aws/aws-sdk-go/private/protocol/query",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "9V1PvtFQ9MObZTc3sa86WcuOtOU=",
"path": "github.com/aws/aws-sdk-go/private/protocol/query/queryutil",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "pkeoOfZpHRvFG/AOZeTf0lwtsFg=",
"path": "github.com/aws/aws-sdk-go/private/protocol/rest",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "ODo+ko8D6unAxZuN1jGzMcN4QCc=",
"path": "github.com/aws/aws-sdk-go/private/protocol/restxml",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "0qYPUga28aQVkxZgBR3Z86AbGUQ=",
"path": "github.com/aws/aws-sdk-go/private/protocol/xml/xmlutil",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "sCaHoPWsJXRHFbilUKwN71qFTOI=",
"path": "github.com/aws/aws-sdk-go/service/s3",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "W1oFtpaT4TWIIJrAvFcn/XdcT7g=",
"path": "github.com/aws/aws-sdk-go/service/sts",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "+TKtBzv23ywvmmqRiGEjUba4YmI=",
"path": "github.com/dgrijalva/jwt-go",
"revision": "dbeaa9332f19a944acb5736b4456cfcc02140e29",
"revisionTime": "2017-10-19T21:57:19Z"
},
{
"checksumSHA1": "ixCQL3bWowRQGeWOS0eg2JWTy4Q=",
"path": "github.com/die-net/lrucache",
"revision": "04b9315ab7a61886b4e51dba37a9c7cc14885fae",
"revisionTime": "2017-11-11T23:29:17Z"
},
{
"checksumSHA1": "bLKUgAPC8sntHXaqNmt5h9ZwNkI=",
"path": "github.com/die-net/lrucache/twotier",
"revision": "04b9315ab7a61886b4e51dba37a9c7cc14885fae",
"revisionTime": "2017-11-11T23:29:17Z"
},
{
"checksumSHA1": "0uj3/cNtus6GcTck+pG0Mevdrg0=",
"path": "github.com/disintegration/imaging",
"revision": "1884593a19ddc6f2ea050403430d02c1d0fc1283",
"revisionTime": "2017-12-09T18:20:14Z"
},
{
"checksumSHA1": "2UmMbNHc8FBr98mJFN1k8ISOIHk=",
"path": "github.com/garyburd/redigo/internal",
"revision": "d1ed5c67e5794de818ea85e6b522fda02623a484",
"revisionTime": "2017-12-29T01:14:44Z"
},
{
"checksumSHA1": "sc/XC7agvewnB1AGXMGZRkVzM8c=",
"path": "github.com/garyburd/redigo/redis",
"revision": "d1ed5c67e5794de818ea85e6b522fda02623a484",
"revisionTime": "2017-12-29T01:14:44Z"
},
{
"checksumSHA1": "VvZKmbuBN1QAG699KduTdmSPwA4=",
"origin": "github.com/aws/aws-sdk-go/vendor/github.com/go-ini/ini",
"path": "github.com/go-ini/ini",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "WX1+2gktHcBmE9MGwFSGs7oqexU=",
"path": "github.com/golang/protobuf/proto",
"revision": "925541529c1fa6821df4e44ce2723319eb2be768",
"revisionTime": "2018-01-25T21:43:03Z"
},
{
"checksumSHA1": "XNHQiRltA7NQJV0RvUroY+cf+zg=",
"path": "github.com/golang/protobuf/protoc-gen-go/descriptor",
"revision": "925541529c1fa6821df4e44ce2723319eb2be768",
"revisionTime": "2018-01-25T21:43:03Z"
},
{
"checksumSHA1": "VfkiItDBFFkZluaAMAzJipDXNBY=",
"path": "github.com/golang/protobuf/ptypes",
"revision": "925541529c1fa6821df4e44ce2723319eb2be768",
"revisionTime": "2018-01-25T21:43:03Z"
},
{
"checksumSHA1": "UB9scpDxeFjQe5tEthuR4zCLRu4=",
"path": "github.com/golang/protobuf/ptypes/any",
"revision": "925541529c1fa6821df4e44ce2723319eb2be768",
"revisionTime": "2018-01-25T21:43:03Z"
},
{
"checksumSHA1": "hUjAj0dheFVDl84BAnSWj9qy2iY=",
"path": "github.com/golang/protobuf/ptypes/duration",
"revision": "925541529c1fa6821df4e44ce2723319eb2be768",
"revisionTime": "2018-01-25T21:43:03Z"
},
{
"checksumSHA1": "O2ItP5rmfrgxPufhjJXbFlXuyL8=",
"path": "github.com/golang/protobuf/ptypes/timestamp",
"revision": "925541529c1fa6821df4e44ce2723319eb2be768",
"revisionTime": "2018-01-25T21:43:03Z"
},
{
"checksumSHA1": "PKVjAJ/e0p/jWtGpZycgoZBLdb4=",
"path": "github.com/google/btree",
"revision": "e89373fe6b4a7413d7acd6da1725b83ef713e6e4",
"revisionTime": "2018-01-24T18:54:31Z"
},
{
"checksumSHA1": "y1/eOdw+BOXCuT83J7mP3ReXaf8=",
"path": "github.com/googleapis/gax-go",
"revision": "317e0006254c44a0ac427cc52a0e083ff0b9622f",
"revisionTime": "2017-09-15T02:47:31Z"
},
{
"checksumSHA1": "cxruT37CPesmfhB+LoLCb2fiR3k=",
"path": "github.com/gregjones/httpcache",
"revision": "2bcd89a1743fd4b373f7370ce8ddc14dfbd18229",
"revisionTime": "2017-11-19T19:35:00Z"
},
{
"checksumSHA1": "A+TX1jxqy7iWvcb9ZldoG1b5SsY=",
"path": "github.com/gregjones/httpcache/diskcache",
"revision": "2bcd89a1743fd4b373f7370ce8ddc14dfbd18229",
"revisionTime": "2017-11-19T19:35:00Z"
},
{
"checksumSHA1": "wUtgc8prI1FSfPlueFHtw2EQNDo=",
"path": "github.com/gregjones/httpcache/redis",
"revision": "2bcd89a1743fd4b373f7370ce8ddc14dfbd18229",
"revisionTime": "2017-11-19T19:35:00Z"
},
{
"checksumSHA1": "0ZrwvB6KoGPj2PoDNSEJwxQ6Mog=",
"origin": "github.com/aws/aws-sdk-go/vendor/github.com/jmespath/go-jmespath",
"path": "github.com/jmespath/go-jmespath",
"revision": "00cca3f093a8236a93fbbeeae7d28ad83811683c",
"revisionTime": "2018-01-26T23:19:01Z"
},
{
"checksumSHA1": "T9E+5mKBQ/BX4wlNxgaPfetxdeI=",
"path": "github.com/marstr/guid",
"revision": "8bdf7d1a087ccc975cf37dd6507da50698fd19ca",
"revisionTime": "2017-04-27T23:51:15Z"
},
{
"checksumSHA1": "EmBHokgSNY1B0aBQALGldIUyXgI=",
"path": "github.com/muesli/smartcrop",
"revision": "9032446b30f6284f8718490b6bcff8a1d51173cf",
"revisionTime": "2017-12-15T20:34:40Z"
},
{
"checksumSHA1": "r5eQHkttko6kxroDEENXbmXKrSs=",
"path": "github.com/nfnt/resize",
"revision": "891127d8d1b52734debe1b3c3d7e747502b6c366",
"revisionTime": "2016-07-24T20:39:20Z"
},
{
"checksumSHA1": "K1Y3/a6mmpc31MzB2pvsC5fHrek=",
"path": "github.com/peterbourgon/diskv",
"revision": "2973218375c3d13162e1d3afe1708aaee318ef3f",
"revisionTime": "2017-11-20T01:46:56Z"
},
{
"checksumSHA1": "l6EC85ae4bAo+LT6GlejMwFms1I=",
"path": "github.com/rwcarlsen/goexif/exif",
"revision": "41dad3aa083329f3f672b7095a9ea8a0c384bbe8",
"revisionTime": "2014-12-22T21:16:34Z"
},
{
"checksumSHA1": "bBmKkRYPKiGH8ZbLZH8LOY6xmxQ=",
"path": "github.com/rwcarlsen/goexif/tiff",
"revision": "41dad3aa083329f3f672b7095a9ea8a0c384bbe8",
"revisionTime": "2014-12-22T21:16:34Z"
},
{
"checksumSHA1": "eDQ6f1EsNf+frcRO/9XukSEchm8=",
"path": "github.com/satori/go.uuid",
"revision": "36e9d2ebbde5e3f13ab2e25625fd453271d6522e",
"revisionTime": "2018-01-03T17:44:51Z"
},
{
"checksumSHA1": "UD/pejajPyS7WaWVXq2NU1eK4Ic=",
"path": "golang.org/x/image/bmp",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "pQJ69B9xWCyF5FsO214fi+tnL44=",
"path": "golang.org/x/image/draw",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "o7VkCGBiKM5HXzVzrIci1YDlpvc=",
"path": "golang.org/x/image/math/f64",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "zdekzNuFGSoxAZ8cURGsrhBObZs=",
"path": "golang.org/x/image/riff",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "SmD/LkP3vgBGPKT6I38wH7Jb6QI=",
"path": "golang.org/x/image/tiff",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "PF6VjvpNpOdR8epWH1Liyy7x1Qg=",
"path": "golang.org/x/image/tiff/lzw",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "ebUbLKyTEaupuKj5KsceDfkn+UA=",
"path": "golang.org/x/image/vp8",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "MF/A3WDD30iVwlktK0itZ0PTJho=",
"path": "golang.org/x/image/vp8l",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "wwirbKM4d69iWA4s9JwpXTsda3A=",
"path": "golang.org/x/image/webp",
"revision": "12117c17ca67ffa1ce22e9409f3b0b0a93ac08c7",
"revisionTime": "2017-12-12T19:22:48Z"
},
{
"checksumSHA1": "GtamqiJoL7PGHsN454AoffBFMa8=",
"path": "golang.org/x/net/context",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "WHc3uByvGaMcnSoI21fhzYgbOgg=",
"path": "golang.org/x/net/context/ctxhttp",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "uL4gYOb0zwNKV0/2r/Wt8r3mwvE=",
"path": "golang.org/x/net/http2",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "ezWhc7n/FtqkLDQKeU2JbW+80tE=",
"path": "golang.org/x/net/http2/hpack",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "RcrB7tgYS/GMW4QrwVdMOTNqIU8=",
"path": "golang.org/x/net/idna",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "UxahDzW2v4mf/+aFxruuupaoIwo=",
"path": "golang.org/x/net/internal/timeseries",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "3xyuaSNmClqG4YWC7g0isQIbUTc=",
"path": "golang.org/x/net/lex/httplex",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "u/r66lwYfgg682u5hZG7/E7+VCY=",
"path": "golang.org/x/net/trace",
"revision": "b417086c80e91bfa321ef761574721644b8b9f61",
"revisionTime": "2018-02-01T22:46:22Z"
},
{
"checksumSHA1": "njV1GJojWGOLSQqXB34S35ct190=",
"path": "golang.org/x/oauth2",
"revision": "a032972e28060ca4f5644acffae3dfc268cc09db",
"revisionTime": "2017-10-11T17:22:33Z"
},
{
"checksumSHA1": "oSg3tdOtNm3xxj6X9FNxikU4w14=",
"path": "golang.org/x/oauth2/google",
"revision": "a032972e28060ca4f5644acffae3dfc268cc09db",
"revisionTime": "2017-10-11T17:22:33Z"
},
{
"checksumSHA1": "Mf9Ha0R/QhPvL5aBhHLIurfGlEw=",
"path": "golang.org/x/oauth2/internal",
"revision": "a032972e28060ca4f5644acffae3dfc268cc09db",
"revisionTime": "2017-10-11T17:22:33Z"
},
{
"checksumSHA1": "huVltYnXdRFDJLgp/ZP9IALzG7g=",
"path": "golang.org/x/oauth2/jws",
"revision": "a032972e28060ca4f5644acffae3dfc268cc09db",
"revisionTime": "2017-10-11T17:22:33Z"
},
{
"checksumSHA1": "QPndO4ODVdEBILRhJ6869UDAoHc=",
"path": "golang.org/x/oauth2/jwt",
"revision": "a032972e28060ca4f5644acffae3dfc268cc09db",
"revisionTime": "2017-10-11T17:22:33Z"
},
{
"checksumSHA1": "CbpjEkkOeh0fdM/V8xKDdI0AA88=",
"path": "golang.org/x/text/secure/bidirule",
"revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3",
"revisionTime": "2017-12-24T20:31:28Z"
},
{
"checksumSHA1": "ziMb9+ANGRJSSIuxYdRbA+cDRBQ=",
"path": "golang.org/x/text/transform",
"revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3",
"revisionTime": "2017-12-24T20:31:28Z"
},
{
"checksumSHA1": "w8kDfZ1Ug+qAcVU0v8obbu3aDOY=",
"path": "golang.org/x/text/unicode/bidi",
"revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3",
"revisionTime": "2017-12-24T20:31:28Z"
},
{
"checksumSHA1": "BCNYmf4Ek93G4lk5x3ucNi/lTwA=",
"path": "golang.org/x/text/unicode/norm",
"revision": "e19ae1496984b1c655b8044a65c0300a3c878dd3",
"revisionTime": "2017-12-24T20:31:28Z"
},
{
"checksumSHA1": "EooPqEpEyY/7NCRwHDMWhhlkQNw=",
"path": "google.golang.org/api/gensupport",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "BWKmb7kGYbfbvXO6E7tCpTh9zKE=",
"path": "google.golang.org/api/googleapi",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "1K0JxrUfDqAB3MyRiU1LKjfHyf4=",
"path": "google.golang.org/api/googleapi/internal/uritemplates",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "Mr2fXhMRzlQCgANFm91s536pG7E=",
"path": "google.golang.org/api/googleapi/transport",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "CpjSGeyQJbLLPxVl/CWs5o9p+jU=",
"path": "google.golang.org/api/internal",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "HXuMQALvqd+ZLG0pC1l7gX8nNyE=",
"path": "google.golang.org/api/iterator",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "Z9LQvCPO0WV9PdjgIXlfVOGZRlM=",
"path": "google.golang.org/api/option",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "wO2s4Y+8FI6NciOpPPEeDK4/cH8=",
"path": "google.golang.org/api/storage/v1",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "ykzqoYJiMCS6LGBq/zszKFbxGeA=",
"path": "google.golang.org/api/transport/http",
"revision": "f7618f4b41caffc0e9f141e6f67957587341dde2",
"revisionTime": "2018-02-02T00:03:29Z"
},
{
"checksumSHA1": "QoM8iwt2FVbTHR+Lav3dXmEu/7o=",
"path": "google.golang.org/appengine",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "NA+ebc/RfKLZ+wxPs3lRn94H3gA=",
"path": "google.golang.org/appengine/internal",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "x6Thdfyasqd68dWZWqzWWeIfAfI=",
"path": "google.golang.org/appengine/internal/app_identity",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "TsNO8P0xUlLNyh3Ic/tzSp/fDWM=",
"path": "google.golang.org/appengine/internal/base",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "5QsV5oLGSfKZqTCVXP6NRz5T4Tw=",
"path": "google.golang.org/appengine/internal/datastore",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "Gep2T9zmVYV8qZfK2gu3zrmG6QE=",
"path": "google.golang.org/appengine/internal/log",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "eLZVX1EHLclFtQnjDIszsdyWRHo=",
"path": "google.golang.org/appengine/internal/modules",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "a1XY7rz3BieOVqVI2Et6rKiwQCk=",
"path": "google.golang.org/appengine/internal/remote_api",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "QtAbHtHmDzcf6vOV9eqlCpKgjiw=",
"path": "google.golang.org/appengine/internal/urlfetch",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "akOV9pYnCbcPA8wJUutSQVibdyg=",
"path": "google.golang.org/appengine/urlfetch",
"revision": "5bee14b453b4c71be47ec1781b0fa61c2ea182db",
"revisionTime": "2017-12-12T22:30:47Z"
},
{
"checksumSHA1": "GkjRB7ms/necD0ePmzqT6gDsu+4=",
"path": "google.golang.org/genproto/googleapis/api/annotations",
"revision": "4eb30f4778eed4c258ba66527a0d4f9ec8a36c45",
"revisionTime": "2018-01-25T08:06:56Z"
},
{
"checksumSHA1": "auPKasjLqxoK/Du/izQcyKCjE7c=",
"path": "google.golang.org/genproto/googleapis/iam/v1",
"revision": "4eb30f4778eed4c258ba66527a0d4f9ec8a36c45",
"revisionTime": "2018-01-25T08:06:56Z"
},
{
"checksumSHA1": "Tc3BU26zThLzcyqbVtiSEp7EpU8=",
"path": "google.golang.org/genproto/googleapis/rpc/status",
"revision": "4eb30f4778eed4c258ba66527a0d4f9ec8a36c45",
"revisionTime": "2018-01-25T08:06:56Z"
},
{
"checksumSHA1": "0+ixS0s6A6gdRBpBe+6pmOSQoVk=",
"path": "google.golang.org/grpc",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "xBhmO0Vn4kzbmySioX+2gBImrkk=",
"path": "google.golang.org/grpc/balancer",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "CPWX/IgaQSR3+78j4sPrvHNkW+U=",
"path": "google.golang.org/grpc/balancer/base",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "DJ1AtOk4Pu7bqtUMob95Hw8HPNw=",
"path": "google.golang.org/grpc/balancer/roundrobin",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "j8Qs+yfgwYYOtodB/1bSlbzV5rs=",
"path": "google.golang.org/grpc/codes",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "XH2WYcDNwVO47zYShREJjcYXm0Y=",
"path": "google.golang.org/grpc/connectivity",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "KthiDKNPHMeIu967enqtE4NaZzI=",
"path": "google.golang.org/grpc/credentials",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "mJTBJC0n9J2CV+tHX+dJosYOZmg=",
"path": "google.golang.org/grpc/encoding",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "LKKkn7EYA+Do9Qwb2/SUKLFNxoo=",
"path": "google.golang.org/grpc/encoding/proto",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "H7SuPUqbPcdbNqgl+k3ohuwMAwE=",
"path": "google.golang.org/grpc/grpclb/grpc_lb_v1/messages",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "ntHev01vgZgeIh5VFRmbLx/BSTo=",
"path": "google.golang.org/grpc/grpclog",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "Qvf3zdmRCSsiM/VoBv0qB/naHtU=",
"path": "google.golang.org/grpc/internal",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "hcuHgKp8W0wIzoCnNfKI8NUss5o=",
"path": "google.golang.org/grpc/keepalive",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "4UsKpzk7AgcAISi3p11vW66nbJI=",
"path": "google.golang.org/grpc/metadata",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "5dwF592DPvhF2Wcex3m7iV6aGRQ=",
"path": "google.golang.org/grpc/naming",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "n5EgDdBqFMa2KQFhtl+FF/4gIFo=",
"path": "google.golang.org/grpc/peer",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "y8Ta+ctMP9CUTiPyPyxiD154d8w=",
"path": "google.golang.org/grpc/resolver",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "WpWF+bDzObsHf+bjoGpb/abeFxo=",
"path": "google.golang.org/grpc/resolver/dns",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "zs9M4xE8Lyg4wvuYvR00XoBxmuw=",
"path": "google.golang.org/grpc/resolver/passthrough",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "G9lgXNi7qClo5sM2s6TbTHLFR3g=",
"path": "google.golang.org/grpc/stats",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "tUo+M0Cb0W9ZEIt5BH30wJz/Kjc=",
"path": "google.golang.org/grpc/status",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "qvArRhlrww5WvRmbyMF2mUfbJew=",
"path": "google.golang.org/grpc/tap",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "rk9Qbb14xfXM91p41SU1APrgP98=",
"path": "google.golang.org/grpc/transport",
"revision": "f9628db66d141773eefe7f72d9635677c830dbd8",
"revisionTime": "2018-02-01T19:38:14Z"
},
{
"checksumSHA1": "cBdDkft9ir+lyLbeRQ4zCAoR0AY=",
"path": "willnorris.com/go/gifresize",
"revision": "6a222229fa0697e6da06ec80f8ffd0ada346669d",
"revisionTime": "2016-04-28T23:14:23Z"
}
],
"rootPath": "willnorris.com/go/imageproxy"
}