Browse Source

Merge pull request #10563 from grafana/golang_dep

Migrated from govendor to dep
Carl Bergquist 8 years ago
parent
commit
987a546e74
100 changed files with 9998 additions and 4181 deletions
  1. 479 0
      Gopkg.lock
  2. 194 0
      Gopkg.toml
  3. 15 0
      vendor/cloud.google.com/go/AUTHORS
  4. 152 0
      vendor/cloud.google.com/go/CONTRIBUTING.md
  5. 38 0
      vendor/cloud.google.com/go/CONTRIBUTORS
  6. 54 0
      vendor/cloud.google.com/go/MIGRATION.md
  7. 502 0
      vendor/cloud.google.com/go/README.md
  8. 20 0
      vendor/cloud.google.com/go/cloud.go
  9. 0 256
      vendor/cloud.google.com/go/iam/iam.go
  10. 0 94
      vendor/cloud.google.com/go/internal/optional/optional.go
  11. 0 56
      vendor/cloud.google.com/go/internal/retry.go
  12. 0 6
      vendor/cloud.google.com/go/internal/version/update_version.sh
  13. 0 71
      vendor/cloud.google.com/go/internal/version/version.go
  14. BIN
      vendor/cloud.google.com/go/keys.tar.enc
  15. 557 0
      vendor/cloud.google.com/go/old-news.md
  16. 88 0
      vendor/cloud.google.com/go/run-tests.sh
  17. 0 252
      vendor/cloud.google.com/go/storage/acl.go
  18. 0 590
      vendor/cloud.google.com/go/storage/bucket.go
  19. 0 201
      vendor/cloud.google.com/go/storage/copy.go
  20. 0 161
      vendor/cloud.google.com/go/storage/doc.go
  21. 0 26
      vendor/cloud.google.com/go/storage/go17.go
  22. 0 108
      vendor/cloud.google.com/go/storage/iam.go
  23. 0 43
      vendor/cloud.google.com/go/storage/invoke.go
  24. 0 26
      vendor/cloud.google.com/go/storage/not_go17.go
  25. 0 74
      vendor/cloud.google.com/go/storage/reader.go
  26. 0 1117
      vendor/cloud.google.com/go/storage/storage.go
  27. 0 192
      vendor/cloud.google.com/go/storage/writer.go
  28. 4 1
      vendor/github.com/BurntSushi/toml/.travis.yml
  29. 1 1
      vendor/github.com/BurntSushi/toml/COMPATIBLE
  30. 8 10
      vendor/github.com/BurntSushi/toml/README.md
  31. 0 14
      vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING
  32. 0 14
      vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/README.md
  33. 0 90
      vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/main.go
  34. 0 14
      vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING
  35. 0 14
      vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/README.md
  36. 0 131
      vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/main.go
  37. 0 14
      vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING
  38. 0 22
      vendor/github.com/BurntSushi/toml/cmd/tomlv/README.md
  39. 0 61
      vendor/github.com/BurntSushi/toml/cmd/tomlv/main.go
  40. 42 25
      vendor/github.com/BurntSushi/toml/decode.go
  41. 1 2
      vendor/github.com/BurntSushi/toml/decode_meta.go
  42. 516 19
      vendor/github.com/BurntSushi/toml/decode_test.go
  43. 1 1
      vendor/github.com/BurntSushi/toml/doc.go
  44. 73 56
      vendor/github.com/BurntSushi/toml/encode.go
  45. 87 14
      vendor/github.com/BurntSushi/toml/encode_test.go
  46. 288 209
      vendor/github.com/BurntSushi/toml/lex.go
  47. 118 24
      vendor/github.com/BurntSushi/toml/parse.go
  48. 6 5
      vendor/github.com/BurntSushi/toml/type_fields.go
  49. 24 0
      vendor/github.com/Unknwon/com/.gitignore
  50. 10 0
      vendor/github.com/Unknwon/com/convert.go
  51. 0 1
      vendor/github.com/Unknwon/com/testdata/SaveFile.txt
  52. 0 1
      vendor/github.com/Unknwon/com/testdata/SaveFileS.txt
  53. 0 1
      vendor/github.com/Unknwon/com/testdata/statDir/SaveFile.txt
  54. 0 1
      vendor/github.com/Unknwon/com/testdata/statDir/SaveFileS.txt
  55. 0 1
      vendor/github.com/Unknwon/com/testdata/statDir/secondLevel/SaveFile.txt
  56. 0 1
      vendor/github.com/Unknwon/com/testdata/statDir/secondLevel/SaveFileS.txt
  57. 0 0
      vendor/github.com/Unknwon/com/testdata/statDir/secondLevel/sample_file.txt
  58. 56 0
      vendor/github.com/apache/thrift/.clang-format
  59. 1 0
      vendor/github.com/apache/thrift/.dockerignore
  60. 1 0
      vendor/github.com/apache/thrift/.gitattributes
  61. 326 0
      vendor/github.com/apache/thrift/.gitignore
  62. 2366 0
      vendor/github.com/apache/thrift/CHANGES
  63. 117 0
      vendor/github.com/apache/thrift/CMakeLists.txt
  64. 49 0
      vendor/github.com/apache/thrift/CONTRIBUTING.md
  65. 61 0
      vendor/github.com/apache/thrift/Dockerfile
  66. 131 0
      vendor/github.com/apache/thrift/Makefile.am
  67. 166 0
      vendor/github.com/apache/thrift/README.md
  68. 18 0
      vendor/github.com/apache/thrift/Thrift.podspec
  69. 54 0
      vendor/github.com/apache/thrift/bootstrap.sh
  70. 16 0
      vendor/github.com/apache/thrift/bower.json
  71. 89 0
      vendor/github.com/apache/thrift/cleanup.sh
  72. 30 0
      vendor/github.com/apache/thrift/composer.json
  73. 959 0
      vendor/github.com/apache/thrift/configure.ac
  74. 132 0
      vendor/github.com/apache/thrift/doap.rdf
  75. 109 0
      vendor/github.com/apache/thrift/lib/Makefile.am
  76. 42 0
      vendor/github.com/apache/thrift/lib/go/Makefile.am
  77. 81 0
      vendor/github.com/apache/thrift/lib/go/README.md
  78. 1 0
      vendor/github.com/apache/thrift/lib/go/coding_standards.md
  79. 54 0
      vendor/github.com/apache/thrift/package.json
  80. 140 0
      vendor/github.com/apache/thrift/sonar-project.properties
  81. 11 0
      vendor/github.com/aws/aws-sdk-go/.gitignore
  82. 14 0
      vendor/github.com/aws/aws-sdk-go/.godoc_config
  83. 1107 0
      vendor/github.com/aws/aws-sdk-go/CHANGELOG.md
  84. 1 1
      vendor/github.com/aws/aws-sdk-go/CONTRIBUTING.md
  85. 20 0
      vendor/github.com/aws/aws-sdk-go/Gopkg.lock
  86. 48 0
      vendor/github.com/aws/aws-sdk-go/Gopkg.toml
  87. 8 1
      vendor/github.com/aws/aws-sdk-go/Makefile
  88. 5 3
      vendor/github.com/aws/aws-sdk-go/README.md
  89. 50 8
      vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go
  90. 1 1
      vendor/github.com/aws/aws-sdk-go/aws/config.go
  91. 3 3
      vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go
  92. 18 0
      vendor/github.com/aws/aws-sdk-go/aws/convert_types.go
  93. 32 2
      vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go
  94. 270 38
      vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go
  95. 126 22
      vendor/github.com/aws/aws-sdk-go/aws/request/request.go
  96. 2 2
      vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go
  97. 5 2
      vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go
  98. 0 60
      vendor/github.com/aws/aws-sdk-go/aws/session/testdata/shared_config
  99. 0 1
      vendor/github.com/aws/aws-sdk-go/aws/session/testdata/shared_config_invalid_ini
  100. 0 17
      vendor/github.com/aws/aws-sdk-go/aws/session/testdata/shared_config_other

+ 479 - 0
Gopkg.lock

@@ -0,0 +1,479 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+  name = "cloud.google.com/go"
+  packages = ["compute/metadata"]
+  revision = "050b16d2314d5fc3d4c9a51e4cd5c7468e77f162"
+  version = "v0.17.0"
+
+[[projects]]
+  name = "github.com/BurntSushi/toml"
+  packages = ["."]
+  revision = "b26d9c308763d68093482582cea63d69be07a0f0"
+  version = "v0.3.0"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/Unknwon/com"
+  packages = ["."]
+  revision = "7677a1d7c1137cd3dd5ba7a076d0c898a1ef4520"
+
+[[projects]]
+  name = "github.com/apache/thrift"
+  packages = ["lib/go/thrift"]
+  revision = "b2a4d4ae21c789b689dd162deb819665567f481c"
+  version = "0.10.0"
+
+[[projects]]
+  name = "github.com/aws/aws-sdk-go"
+  packages = ["aws","aws/awserr","aws/awsutil","aws/client","aws/client/metadata","aws/corehandlers","aws/credentials","aws/credentials/ec2rolecreds","aws/credentials/endpointcreds","aws/credentials/stscreds","aws/defaults","aws/ec2metadata","aws/endpoints","aws/request","aws/session","aws/signer/v4","internal/shareddefaults","private/protocol","private/protocol/ec2query","private/protocol/query","private/protocol/query/queryutil","private/protocol/rest","private/protocol/restxml","private/protocol/xml/xmlutil","service/cloudwatch","service/ec2","service/ec2/ec2iface","service/s3","service/sts"]
+  revision = "c13a879e75646fe750d21bcb05bf2cabea9791c1"
+  version = "v1.12.65"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/benbjohnson/clock"
+  packages = ["."]
+  revision = "7dc76406b6d3c05b5f71a86293cbcf3c4ea03b19"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/beorn7/perks"
+  packages = ["quantile"]
+  revision = "4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9"
+
+[[projects]]
+  name = "github.com/bitly/go-simplejson"
+  packages = ["."]
+  revision = "aabad6e819789e569bd6aabf444c935aa9ba1e44"
+  version = "v0.5.0"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/bmizerany/assert"
+  packages = ["."]
+  revision = "b7ed37b82869576c289d7d97fb2bbd8b64a0cb28"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/bradfitz/gomemcache"
+  packages = ["memcache"]
+  revision = "1952afaa557dc08e8e0d89eafab110fb501c1a2b"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/codahale/hdrhistogram"
+  packages = ["."]
+  revision = "3a0bb77429bd3a61596f5e8a3172445844342120"
+
+[[projects]]
+  name = "github.com/codegangsta/cli"
+  packages = ["."]
+  revision = "cfb38830724cc34fedffe9a2a29fb54fa9169cd1"
+  version = "v1.20.0"
+
+[[projects]]
+  name = "github.com/davecgh/go-spew"
+  packages = ["spew"]
+  revision = "346938d642f2ec3594ed81d874461961cd0faa76"
+  version = "v1.1.0"
+
+[[projects]]
+  name = "github.com/fatih/color"
+  packages = ["."]
+  revision = "570b54cabe6b8eb0bc2dfce68d964677d63b5260"
+  version = "v1.5.0"
+
+[[projects]]
+  name = "github.com/go-ini/ini"
+  packages = ["."]
+  revision = "32e4c1e6bc4e7d0d8451aa6b75200d19e37a536a"
+  version = "v1.32.0"
+
+[[projects]]
+  name = "github.com/go-ldap/ldap"
+  packages = ["."]
+  revision = "bb7a9ca6e4fbc2129e3db588a34bc970ffe811a9"
+  version = "v2.5.1"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/go-macaron/binding"
+  packages = ["."]
+  revision = "ac54ee249c27dca7e76fad851a4a04b73bd1b183"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/go-macaron/gzip"
+  packages = ["."]
+  revision = "cad1c6580a07c56f5f6bc52d66002a05985c5854"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/go-macaron/inject"
+  packages = ["."]
+  revision = "d8a0b8677191f4380287cfebd08e462217bac7ad"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/go-macaron/session"
+  packages = [".","memcache","mysql","postgres","redis"]
+  revision = "b8e286a0dba8f4999042d6b258daf51b31d08938"
+
+[[projects]]
+  name = "github.com/go-sql-driver/mysql"
+  packages = ["."]
+  revision = "a0583e0143b1624142adab07e0e97fe106d99561"
+  version = "v1.3"
+
+[[projects]]
+  name = "github.com/go-stack/stack"
+  packages = ["."]
+  revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc"
+  version = "v1.7.0"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/go-xorm/builder"
+  packages = ["."]
+  revision = "488224409dd8aa2ce7a5baf8d10d55764a913738"
+
+[[projects]]
+  name = "github.com/go-xorm/core"
+  packages = ["."]
+  revision = "e8409d73255791843585964791443dbad877058c"
+
+[[projects]]
+  name = "github.com/go-xorm/xorm"
+  packages = ["."]
+  revision = "6687a2b4e824f4d87f2d65060ec5cb0d896dff1e"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/golang/protobuf"
+  packages = ["proto","ptypes","ptypes/any","ptypes/duration","ptypes/timestamp"]
+  revision = "1e59b77b52bf8e4b449a57e6f79f21226d571845"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/gopherjs/gopherjs"
+  packages = ["js"]
+  revision = "178c176a91fe05e3e6c58fa5c989bad19e6cdcb3"
+
+[[projects]]
+  name = "github.com/gorilla/websocket"
+  packages = ["."]
+  revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b"
+  version = "v1.2.0"
+
+[[projects]]
+  name = "github.com/gosimple/slug"
+  packages = ["."]
+  revision = "e9f42fa127660e552d0ad2b589868d403a9be7c6"
+  version = "v1.1.1"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/grafana/grafana_plugin_model"
+  packages = ["go/datasource"]
+  revision = "dfe5dc0a6ce05825ba7fe2d0323d92e631bffa89"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/hashicorp/go-hclog"
+  packages = ["."]
+  revision = "ca137eb4b4389c9bc6f1a6d887f056bf16c00510"
+
+[[projects]]
+  name = "github.com/hashicorp/go-plugin"
+  packages = ["."]
+  revision = "3e6d191694b5a3a2b99755f31b47fa209e4bcd09"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/hashicorp/go-version"
+  packages = ["."]
+  revision = "4fe82ae3040f80a03d04d2cccb5606a626b8e1ee"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/hashicorp/yamux"
+  packages = ["."]
+  revision = "683f49123a33db61abfb241b7ac5e4af4dc54d55"
+
+[[projects]]
+  name = "github.com/inconshreveable/log15"
+  packages = ["."]
+  revision = "0decfc6c20d9ca0ad143b0e89dcaa20f810b4fb3"
+  version = "v2.13"
+
+[[projects]]
+  name = "github.com/jmespath/go-jmespath"
+  packages = ["."]
+  revision = "0b12d6b5"
+
+[[projects]]
+  name = "github.com/jtolds/gls"
+  packages = ["."]
+  revision = "77f18212c9c7edc9bd6a33d383a7b545ce62f064"
+  version = "v4.2.1"
+
+[[projects]]
+  name = "github.com/klauspost/compress"
+  packages = ["flate","gzip"]
+  revision = "6c8db69c4b49dd4df1fff66996cf556176d0b9bf"
+  version = "v1.2.1"
+
+[[projects]]
+  name = "github.com/klauspost/cpuid"
+  packages = ["."]
+  revision = "ae7887de9fa5d2db4eaa8174a7eff2c1ac00f2da"
+  version = "v1.1"
+
+[[projects]]
+  name = "github.com/klauspost/crc32"
+  packages = ["."]
+  revision = "cb6bfca970f6908083f26f39a79009d608efd5cd"
+  version = "v1.1"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/kr/pretty"
+  packages = ["."]
+  revision = "cfb55aafdaf3ec08f0db22699ab822c50091b1c4"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/kr/text"
+  packages = ["."]
+  revision = "7cafcd837844e784b526369c9bce262804aebc60"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/lib/pq"
+  packages = [".","oid"]
+  revision = "27ea5d92de30060e7121ddd543fe14e9a327e0cc"
+
+[[projects]]
+  name = "github.com/mattn/go-colorable"
+  packages = ["."]
+  revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072"
+  version = "v0.0.9"
+
+[[projects]]
+  name = "github.com/mattn/go-isatty"
+  packages = ["."]
+  revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39"
+  version = "v0.0.3"
+
+[[projects]]
+  name = "github.com/mattn/go-sqlite3"
+  packages = ["."]
+  revision = "6c771bb9887719704b210e87e934f08be014bdb1"
+  version = "v1.6.0"
+
+[[projects]]
+  name = "github.com/matttproud/golang_protobuf_extensions"
+  packages = ["pbutil"]
+  revision = "3247c84500bff8d9fb6d579d800f20b3e091582c"
+  version = "v1.0.0"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/mitchellh/go-testing-interface"
+  packages = ["."]
+  revision = "a61a99592b77c9ba629d254a693acffaeb4b7e28"
+
+[[projects]]
+  name = "github.com/opentracing/opentracing-go"
+  packages = [".","ext","log"]
+  revision = "1949ddbfd147afd4d964a9f00b24eb291e0e7c38"
+  version = "v1.0.2"
+
+[[projects]]
+  name = "github.com/patrickmn/go-cache"
+  packages = ["."]
+  revision = "a3647f8e31d79543b2d0f0ae2fe5c379d72cedc0"
+  version = "v2.1.0"
+
+[[projects]]
+  name = "github.com/prometheus/client_golang"
+  packages = ["api","api/prometheus/v1","prometheus","prometheus/promhttp"]
+  revision = "967789050ba94deca04a5e84cce8ad472ce313c1"
+  version = "v0.9.0-pre1"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/prometheus/client_model"
+  packages = ["go"]
+  revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/prometheus/common"
+  packages = ["expfmt","internal/bitbucket.org/ww/goautoneg","model"]
+  revision = "89604d197083d4781071d3c65855d24ecfb0a563"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/prometheus/procfs"
+  packages = [".","xfs"]
+  revision = "b15cd069a83443be3154b719d0cc9fe8117f09fb"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/rainycape/unidecode"
+  packages = ["."]
+  revision = "cb7f23ec59bec0d61b19c56cd88cee3d0cc1870c"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/sergi/go-diff"
+  packages = ["diffmatchpatch"]
+  revision = "1744e2970ca51c86172c8190fadad617561ed6e7"
+
+[[projects]]
+  name = "github.com/smartystreets/assertions"
+  packages = [".","internal/go-render/render","internal/oglematchers"]
+  revision = "0b37b35ec7434b77e77a4bb29b79677cced992ea"
+  version = "1.8.1"
+
+[[projects]]
+  name = "github.com/smartystreets/goconvey"
+  packages = ["convey","convey/gotest","convey/reporting"]
+  revision = "9e8dc3f972df6c8fcc0375ef492c24d0bb204857"
+  version = "1.6.3"
+
+[[projects]]
+  name = "github.com/uber/jaeger-client-go"
+  packages = [".","config","internal/baggage","internal/baggage/remote","internal/spanlog","log","rpcmetrics","thrift-gen/agent","thrift-gen/baggage","thrift-gen/jaeger","thrift-gen/sampling","thrift-gen/zipkincore","utils"]
+  revision = "3ac96c6e679cb60a74589b0d0aa7c70a906183f7"
+  version = "v2.11.2"
+
+[[projects]]
+  name = "github.com/uber/jaeger-lib"
+  packages = ["metrics"]
+  revision = "7f95f4f7e80028096410abddaae2556e4c61b59f"
+  version = "v1.3.1"
+
+[[projects]]
+  name = "github.com/yudai/gojsondiff"
+  packages = [".","formatter"]
+  revision = "7b1b7adf999dab73a6eb02669c3d82dbb27a3dd6"
+  version = "1.0.0"
+
+[[projects]]
+  branch = "master"
+  name = "github.com/yudai/golcs"
+  packages = ["."]
+  revision = "ecda9a501e8220fae3b4b600c3db4b0ba22cfc68"
+
+[[projects]]
+  branch = "master"
+  name = "golang.org/x/crypto"
+  packages = ["pbkdf2"]
+  revision = "13931e22f9e72ea58bb73048bc752b48c6d4d4ac"
+
+[[projects]]
+  branch = "master"
+  name = "golang.org/x/net"
+  packages = ["context","context/ctxhttp","http2","http2/hpack","idna","internal/timeseries","lex/httplex","trace"]
+  revision = "5ccada7d0a7ba9aeb5d3aca8d3501b4c2a509fec"
+
+[[projects]]
+  branch = "master"
+  name = "golang.org/x/oauth2"
+  packages = [".","google","internal","jws","jwt"]
+  revision = "b28fcf2b08a19742b43084fb40ab78ac6c3d8067"
+
+[[projects]]
+  branch = "master"
+  name = "golang.org/x/sync"
+  packages = ["errgroup"]
+  revision = "fd80eb99c8f653c847d294a001bdf2a3a6f768f5"
+
+[[projects]]
+  branch = "master"
+  name = "golang.org/x/sys"
+  packages = ["unix"]
+  revision = "2c42eef0765b9837fbdab12011af7830f55f88f0"
+
+[[projects]]
+  branch = "master"
+  name = "golang.org/x/text"
+  packages = ["collate","collate/build","internal/colltab","internal/gen","internal/tag","internal/triegen","internal/ucd","language","secure/bidirule","transform","unicode/bidi","unicode/cldr","unicode/norm","unicode/rangetable"]
+  revision = "e19ae1496984b1c655b8044a65c0300a3c878dd3"
+
+[[projects]]
+  name = "google.golang.org/appengine"
+  packages = [".","internal","internal/app_identity","internal/base","internal/datastore","internal/log","internal/modules","internal/remote_api","internal/urlfetch","urlfetch"]
+  revision = "150dc57a1b433e64154302bdc40b6bb8aefa313a"
+  version = "v1.0.0"
+
+[[projects]]
+  branch = "master"
+  name = "google.golang.org/genproto"
+  packages = ["googleapis/rpc/status"]
+  revision = "a8101f21cf983e773d0c1133ebc5424792003214"
+
+[[projects]]
+  name = "google.golang.org/grpc"
+  packages = [".","balancer","balancer/base","balancer/roundrobin","codes","connectivity","credentials","encoding","grpclb/grpc_lb_v1/messages","grpclog","health","health/grpc_health_v1","internal","keepalive","metadata","naming","peer","resolver","resolver/dns","resolver/passthrough","stats","status","tap","transport"]
+  revision = "7cea4cc846bcf00cbb27595b07da5de875ef7de9"
+  version = "v1.9.1"
+
+[[projects]]
+  branch = "v3"
+  name = "gopkg.in/alexcesaro/quotedprintable.v3"
+  packages = ["."]
+  revision = "2caba252f4dc53eaf6b553000885530023f54623"
+
+[[projects]]
+  name = "gopkg.in/asn1-ber.v1"
+  packages = ["."]
+  revision = "379148ca0225df7a432012b8df0355c2a2063ac0"
+  version = "v1.2"
+
+[[projects]]
+  name = "gopkg.in/bufio.v1"
+  packages = ["."]
+  revision = "567b2bfa514e796916c4747494d6ff5132a1dfce"
+  version = "v1"
+
+[[projects]]
+  branch = "v2"
+  name = "gopkg.in/gomail.v2"
+  packages = ["."]
+  revision = "81ebce5c23dfd25c6c67194b37d3dd3f338c98b1"
+
+[[projects]]
+  name = "gopkg.in/ini.v1"
+  packages = ["."]
+  revision = "32e4c1e6bc4e7d0d8451aa6b75200d19e37a536a"
+  version = "v1.32.0"
+
+[[projects]]
+  name = "gopkg.in/macaron.v1"
+  packages = ["."]
+  revision = "75f2e9b42e99652f0d82b28ccb73648f44615faa"
+  version = "v1.2.4"
+
+[[projects]]
+  name = "gopkg.in/redis.v2"
+  packages = ["."]
+  revision = "e6179049628164864e6e84e973cfb56335748dea"
+  version = "v2.3.2"
+
+[[projects]]
+  branch = "v2"
+  name = "gopkg.in/yaml.v2"
+  packages = ["."]
+  revision = "d670f9405373e636a5a2765eea47fac0c9bc91a4"
+
+[solve-meta]
+  analyzer-name = "dep"
+  analyzer-version = 1
+  inputs-digest = "1824c50aa4685fb22643ab89d45457238d9e6c8f7980315c2a41bb35222ea1a7"
+  solver-name = "gps-cdcl"
+  solver-version = 1

+ 194 - 0
Gopkg.toml

@@ -0,0 +1,194 @@
+
+# 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"
+
+
+[[constraint]]
+  name = "github.com/BurntSushi/toml"
+  version = "0.3.0"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/Unknwon/com"
+  #version = "1.0.0"
+
+[[constraint]]
+  name = "github.com/aws/aws-sdk-go"
+  version = "1.12.65"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/benbjohnson/clock"
+
+[[constraint]]
+  name = "github.com/bitly/go-simplejson"
+  version = "0.5.0"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/bmizerany/assert"
+
+[[constraint]]
+  name = "github.com/codegangsta/cli"
+  version = "1.20.0"
+
+[[constraint]]
+  name = "github.com/davecgh/go-spew"
+  version = "1.1.0"
+
+[[constraint]]
+  name = "github.com/fatih/color"
+  version = "1.5.0"
+
+[[constraint]]
+  name = "github.com/go-ldap/ldap"
+  version = "2.5.1"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/go-macaron/binding"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/go-macaron/gzip"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/go-macaron/session"
+
+[[constraint]]
+  name = "github.com/go-sql-driver/mysql"
+  version = "1.3.0"
+
+[[constraint]]
+  name = "github.com/go-stack/stack"
+  version = "1.7.0"
+
+[[constraint]]
+  name = "github.com/go-xorm/core"
+  revision = "e8409d73255791843585964791443dbad877058c"
+  #version = "0.5.7" //keeping this since we would rather depend on version then commit
+
+[[constraint]]
+  name = "github.com/go-xorm/xorm"
+  revision = "6687a2b4e824f4d87f2d65060ec5cb0d896dff1e"
+  #version = "0.6.4" //keeping this since we would rather depend on version then commit
+
+[[constraint]]
+  name = "github.com/gorilla/websocket"
+  version = "1.2.0"
+
+[[constraint]]
+  name = "github.com/gosimple/slug"
+  version = "1.1.1"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/grafana/grafana_plugin_model"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/hashicorp/go-hclog"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/hashicorp/go-version"
+
+[[constraint]]
+  name = "github.com/inconshreveable/log15"
+  version = "2.13.0"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/lib/pq"
+
+[[constraint]]
+  name = "github.com/mattn/go-isatty"
+  version = "0.0.3"
+
+[[constraint]]
+  name = "github.com/mattn/go-sqlite3"
+  version = "1.6.0"
+
+[[constraint]]
+  name = "github.com/opentracing/opentracing-go"
+  version = "1.0.2"
+
+[[constraint]]
+  name = "github.com/patrickmn/go-cache"
+  version = "2.1.0"
+
+[[constraint]]
+  name = "github.com/prometheus/client_golang"
+  version = "0.9.0-pre1"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/prometheus/client_model"
+
+[[constraint]]
+  branch = "master"
+  name = "github.com/prometheus/common"
+
+[[constraint]]
+  name = "github.com/smartystreets/goconvey"
+  version = "1.6.3"
+
+[[constraint]]
+  name = "github.com/uber/jaeger-client-go"
+  version = "2.11.2"
+
+[[constraint]]
+  name = "github.com/yudai/gojsondiff"
+  version = "1.0.0"
+
+[[constraint]]
+  branch = "master"
+  name = "golang.org/x/net"
+
+[[constraint]]
+  branch = "master"
+  name = "golang.org/x/oauth2"
+
+[[constraint]]
+  branch = "master"
+  name = "golang.org/x/sync"
+
+[[constraint]]
+  name = "gopkg.in/gomail.v2"
+  branch = "v2" 
+
+[[constraint]]
+  name = "gopkg.in/ini.v1"
+  version = "1.32.0"
+
+[[constraint]]
+  name = "gopkg.in/macaron.v1"
+  version = "1.2.4"
+
+[[constraint]]
+  branch = "v2"
+  name = "gopkg.in/yaml.v2"
+
+[prune]
+  non-go = true
+  test-go = true
+  unused-packages = true

+ 15 - 0
vendor/cloud.google.com/go/AUTHORS

@@ -0,0 +1,15 @@
+# This is the official list of cloud authors for copyright purposes.
+# This file is distinct from the CONTRIBUTORS files.
+# See the latter for an explanation.
+
+# Names should be added to this file as:
+# Name or Organization <email address>
+# The email address is not required for organizations.
+
+Filippo Valsorda <hi@filippo.io>
+Google Inc.
+Ingo Oeser <nightlyone@googlemail.com>
+Palm Stone Games, Inc.
+Paweł Knap <pawelknap88@gmail.com>
+Péter Szilágyi <peterke@gmail.com>
+Tyler Treat <ttreat31@gmail.com>

+ 152 - 0
vendor/cloud.google.com/go/CONTRIBUTING.md

@@ -0,0 +1,152 @@
+# Contributing
+
+1. Sign one of the contributor license agreements below.
+1. `go get golang.org/x/review/git-codereview` to install the code reviewing tool.
+    1. You will need to ensure that your `GOBIN` directory (by default
+       `$GOPATH/bin`) is in your `PATH` so that git can find the command.
+    1. If you would like, you may want to set up aliases for git-codereview,
+       such that `git codereview change` becomes `git change`. See the
+       [godoc](https://godoc.org/golang.org/x/review/git-codereview) for details.
+    1. Should you run into issues with the git-codereview tool, please note
+       that all error messages will assume that you have set up these
+       aliases.
+1. Get the cloud package by running `go get -d cloud.google.com/go`.
+    1. If you have already checked out the source, make sure that the remote git
+       origin is https://code.googlesource.com/gocloud:
+
+            git remote set-url origin https://code.googlesource.com/gocloud
+1. Make sure your auth is configured correctly by visiting
+   https://code.googlesource.com, clicking "Generate Password", and following
+   the directions.
+1. Make changes and create a change by running `git codereview change <name>`,
+provide a commit message, and use `git codereview mail` to create a Gerrit CL.
+1. Keep amending to the change with `git codereview change` and mail as your receive
+feedback. Each new mailed amendment will create a new patch set for your change in Gerrit.
+
+## Integration Tests
+
+In addition to the unit tests, you may run the integration test suite.
+
+To run the integrations tests, creating and configuration of a project in the
+Google Developers Console is required.
+
+After creating a project, you must [create a service account](https://developers.google.com/identity/protocols/OAuth2ServiceAccount#creatinganaccount).
+Ensure the project-level **Owner** 
+[IAM role](console.cloud.google.com/iam-admin/iam/project) role is added to the
+service account. Alternatively, the account can be granted all of the following roles:
+- **Editor** 
+- **Logs Configuration Writer** 
+- **PubSub Admin**
+
+Once you create a project, set the following environment variables to be able to
+run the against the actual APIs.
+
+- **GCLOUD_TESTS_GOLANG_PROJECT_ID**: Developers Console project's ID (e.g. bamboo-shift-455)
+- **GCLOUD_TESTS_GOLANG_KEY**: The path to the JSON key file.
+- **GCLOUD_TESTS_API_KEY**: Your API key.
+
+Firestore requires a different project and key:
+
+- **GCLOUD_TESTS_GOLANG_FIRESTORE_PROJECT_ID**: Developers Console project's ID
+  supporting Firestore
+- **GCLOUD_TESTS_GOLANG_FIRESTORE_KEY**: The path to the JSON key file.
+
+Install the [gcloud command-line tool][gcloudcli] to your machine and use it
+to create some resources used in integration tests.
+
+From the project's root directory:
+
+``` sh
+# Set the default project in your env.
+$ gcloud config set project $GCLOUD_TESTS_GOLANG_PROJECT_ID
+
+# Authenticate the gcloud tool with your account.
+$ gcloud auth login
+
+# Create the indexes used in the datastore integration tests.
+$ gcloud preview datastore create-indexes datastore/testdata/index.yaml
+
+# Create a Google Cloud storage bucket with the same name as your test project,
+# and with the Stackdriver Logging service account as owner, for the sink
+# integration tests in logging.
+$ gsutil mb gs://$GCLOUD_TESTS_GOLANG_PROJECT_ID
+$ gsutil acl ch -g cloud-logs@google.com:O gs://$GCLOUD_TESTS_GOLANG_PROJECT_ID
+
+# Create a PubSub topic for integration tests of storage notifications.
+$ gcloud beta pubsub topics create go-storage-notification-test
+
+# Create a Spanner instance for the spanner integration tests.
+$ gcloud beta spanner instances create go-integration-test --config regional-us-central1 --nodes 1 --description 'Instance for go client test'
+# NOTE: Spanner instances are priced by the node-hour, so you may want to delete
+# the instance after testing with 'gcloud beta spanner instances delete'.
+
+
+```
+
+Once you've set the environment variables, you can run the integration tests by
+running:
+
+``` sh
+$ go test -v cloud.google.com/go/...
+```
+
+## Contributor License Agreements
+
+Before we can accept your pull requests you'll need to sign a Contributor
+License Agreement (CLA):
+
+- **If you are an individual writing original source code** and **you own the
+intellectual property**, then you'll need to sign an [individual CLA][indvcla].
+- **If you work for a company that wants to allow you to contribute your
+work**, then you'll need to sign a [corporate CLA][corpcla].
+
+You can sign these electronically (just scroll to the bottom). After that,
+we'll be able to accept your pull requests.
+
+## Contributor Code of Conduct
+
+As contributors and maintainers of this project,
+and in the interest of fostering an open and welcoming community,
+we pledge to respect all people who contribute through reporting issues,
+posting feature requests, updating documentation,
+submitting pull requests or patches, and other activities.
+
+We are committed to making participation in this project
+a harassment-free experience for everyone,
+regardless of level of experience, gender, gender identity and expression,
+sexual orientation, disability, personal appearance,
+body size, race, ethnicity, age, religion, or nationality.
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery
+* Personal attacks
+* Trolling or insulting/derogatory comments
+* Public or private harassment
+* Publishing other's private information,
+such as physical or electronic
+addresses, without explicit permission
+* Other unethical or unprofessional conduct.
+
+Project maintainers have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct.
+By adopting this Code of Conduct,
+project maintainers commit themselves to fairly and consistently
+applying these principles to every aspect of managing this project.
+Project maintainers who do not follow or enforce the Code of Conduct
+may be permanently removed from the project team.
+
+This code of conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community.
+
+Instances of abusive, harassing, or otherwise unacceptable behavior
+may be reported by opening an issue
+or contacting one or more of the project maintainers.
+
+This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0,
+available at [http://contributor-covenant.org/version/1/2/0/](http://contributor-covenant.org/version/1/2/0/)
+
+[gcloudcli]: https://developers.google.com/cloud/sdk/gcloud/
+[indvcla]: https://developers.google.com/open-source/cla/individual
+[corpcla]: https://developers.google.com/open-source/cla/corporate

+ 38 - 0
vendor/cloud.google.com/go/CONTRIBUTORS

@@ -0,0 +1,38 @@
+# People who have agreed to one of the CLAs and can contribute patches.
+# The AUTHORS file lists the copyright holders; this file
+# lists people.  For example, Google employees are listed here
+# but not in AUTHORS, because Google holds the copyright.
+#
+# https://developers.google.com/open-source/cla/individual
+# https://developers.google.com/open-source/cla/corporate
+#
+# Names should be added to this file as:
+#     Name <email address>
+
+# Keep the list alphabetically sorted.
+
+Alexis Hunt <lexer@google.com>
+Andreas Litt <andreas.litt@gmail.com>
+Andrew Gerrand <adg@golang.org>
+Brad Fitzpatrick <bradfitz@golang.org>
+Burcu Dogan <jbd@google.com>
+Dave Day <djd@golang.org>
+David Sansome <me@davidsansome.com>
+David Symonds <dsymonds@golang.org>
+Filippo Valsorda <hi@filippo.io>
+Glenn Lewis <gmlewis@google.com>
+Ingo Oeser <nightlyone@googlemail.com>
+Johan Euphrosine <proppy@google.com>
+Jonathan Amsterdam <jba@google.com>
+Kunpei Sakai <namusyaka@gmail.com>
+Luna Duclos <luna.duclos@palmstonegames.com>
+Magnus Hiie <magnus.hiie@gmail.com>
+Michael McGreevy <mcgreevy@golang.org>
+Omar Jarjur <ojarjur@google.com>
+Paweł Knap <pawelknap88@gmail.com>
+Péter Szilágyi <peterke@gmail.com>
+Sarah Adams <shadams@google.com>
+Thanatat Tamtan <acoshift@gmail.com>
+Toby Burress <kurin@google.com>
+Tuo Shan <shantuo@google.com>
+Tyler Treat <ttreat31@gmail.com>

+ 54 - 0
vendor/cloud.google.com/go/MIGRATION.md

@@ -0,0 +1,54 @@
+# Code Changes
+
+## v0.10.0
+
+- pubsub: Replace
+
+    ```
+    sub.ModifyPushConfig(ctx, pubsub.PushConfig{Endpoint: "https://example.com/push"})
+    ```
+
+  with
+
+    ```
+    sub.Update(ctx, pubsub.SubscriptionConfigToUpdate{
+        PushConfig: &pubsub.PushConfig{Endpoint: "https://example.com/push"},
+    })
+    ```
+
+- trace: traceGRPCServerInterceptor will be provided from *trace.Client.
+Given an initialized `*trace.Client` named `tc`, instead of
+
+    ```
+    s := grpc.NewServer(grpc.UnaryInterceptor(trace.GRPCServerInterceptor(tc)))
+    ```
+
+  write
+
+    ```
+    s := grpc.NewServer(grpc.UnaryInterceptor(tc.GRPCServerInterceptor()))
+    ```
+
+- trace trace.GRPCClientInterceptor will also provided from *trace.Client.
+Instead of
+
+    ```
+    conn, err := grpc.Dial(srv.Addr, grpc.WithUnaryInterceptor(trace.GRPCClientInterceptor()))
+    ```
+
+  write
+
+    ```
+    conn, err := grpc.Dial(srv.Addr, grpc.WithUnaryInterceptor(tc.GRPCClientInterceptor()))
+    ```
+
+- trace: We removed the deprecated `trace.EnableGRPCTracing`. Use the gRPC
+interceptor as a dial option as shown below when initializing Cloud package
+clients:
+
+    ```
+    c, err := pubsub.NewClient(ctx, "project-id", option.WithGRPCDialOption(grpc.WithUnaryInterceptor(tc.GRPCClientInterceptor())))
+    if err != nil {
+        ...
+    }
+    ```

+ 502 - 0
vendor/cloud.google.com/go/README.md

@@ -0,0 +1,502 @@
+# Google Cloud Client Libraries for Go
+
+[![GoDoc](https://godoc.org/cloud.google.com/go?status.svg)](https://godoc.org/cloud.google.com/go)
+
+Go packages for [Google Cloud Platform](https://cloud.google.com) services.
+
+``` go
+import "cloud.google.com/go"
+```
+
+To install the packages on your system,
+
+```
+$ go get -u cloud.google.com/go/...
+```
+
+**NOTE:** Some of these packages are under development, and may occasionally
+make backwards-incompatible changes.
+
+**NOTE:** Github repo is a mirror of [https://code.googlesource.com/gocloud](https://code.googlesource.com/gocloud).
+
+  * [News](#news)
+  * [Supported APIs](#supported-apis)
+  * [Go Versions Supported](#go-versions-supported)
+  * [Authorization](#authorization)
+  * [Cloud Datastore](#cloud-datastore-)
+  * [Cloud Storage](#cloud-storage-)
+  * [Cloud Pub/Sub](#cloud-pub-sub-)
+  * [Cloud BigQuery](#cloud-bigquery-)
+  * [Stackdriver Logging](#stackdriver-logging-)
+  * [Cloud Spanner](#cloud-spanner-)
+
+
+## News
+
+_December 11, 2017_
+
+*v0.17.0*
+
+- firestore BREAKING CHANGES:
+  - Remove UpdateMap and UpdateStruct; rename UpdatePaths to Update.
+    Change
+        `docref.UpdateMap(ctx, map[string]interface{}{"a.b", 1})`
+    to
+        `docref.Update(ctx, []firestore.Update{{Path: "a.b", Value: 1}})`
+
+    Change
+        `docref.UpdateStruct(ctx, []string{"Field"}, aStruct)`
+    to
+        `docref.Update(ctx, []firestore.Update{{Path: "Field", Value: aStruct.Field}})`
+  - Rename MergePaths to Merge; require args to be FieldPaths
+  - A value stored as an integer can be read into a floating-point field, and vice versa.
+- bigtable/cmd/cbt:
+  - Support deleting a column.
+  - Add regex option for row read.
+- spanner: Mark stable.
+- storage:
+  - Add Reader.ContentEncoding method.
+  - Fix handling of SignedURL headers.
+- bigquery:
+  - If Uploader.Put is called with no rows, it returns nil without making a
+    call.
+  - Schema inference supports the "nullable" option in struct tags for
+    non-required fields.
+  - TimePartitioning supports "Field".
+
+
+_October 30, 2017_
+
+*v0.16.0*
+
+- Other bigquery changes:
+  - `JobIterator.Next` returns `*Job`; removed `JobInfo` (BREAKING CHANGE).
+  - UseStandardSQL is deprecated; set UseLegacySQL to true if you need
+    Legacy SQL.
+  - Uploader.Put will generate a random insert ID if you do not provide one.
+  - Support time partitioning for load jobs.
+  - Support dry-run queries.
+  - A `Job` remembers its last retrieved status.
+  - Support retrieving job configuration.
+  - Support labels for jobs and tables.
+  - Support dataset access lists.
+  - Improve support for external data sources, including data from Bigtable and
+    Google Sheets, and tables with external data.
+  - Support updating a table's view configuration.
+  - Fix uploading civil times with nanoseconds.
+
+- storage: 
+  - Support PubSub notifications.
+  - Support Requester Pays buckets.
+
+- profiler: Support goroutine and mutex profile types.
+
+
+_October 3, 2017_
+
+*v0.15.0*
+
+- firestore: beta release. See the
+  [announcement](https://firebase.googleblog.com/2017/10/introducing-cloud-firestore.html).
+
+- errorreporting: The existing package has been redesigned.
+
+- errors: This package has been removed. Use errorreporting.
+
+
+[Older news](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/old-news.md)
+
+## Supported APIs
+
+Google API                       | Status       | Package
+---------------------------------|--------------|-----------------------------------------------------------
+[Datastore][cloud-datastore]     | stable       | [`cloud.google.com/go/datastore`][cloud-datastore-ref]
+[Firestore][cloud-firestore]     | beta         | [`cloud.google.com/go/firestore`][cloud-firestore-ref]
+[Storage][cloud-storage]         | stable       | [`cloud.google.com/go/storage`][cloud-storage-ref]
+[Bigtable][cloud-bigtable]       | beta         | [`cloud.google.com/go/bigtable`][cloud-bigtable-ref]
+[BigQuery][cloud-bigquery]       | beta         | [`cloud.google.com/go/bigquery`][cloud-bigquery-ref]
+[Logging][cloud-logging]         | stable       | [`cloud.google.com/go/logging`][cloud-logging-ref]
+[Monitoring][cloud-monitoring]   | beta         | [`cloud.google.com/go/monitoring/apiv3`][cloud-monitoring-ref]
+[Pub/Sub][cloud-pubsub]          | beta         | [`cloud.google.com/go/pubsub`][cloud-pubsub-ref]
+[Vision][cloud-vision]           | stable       | [`cloud.google.com/go/vision/apiv1`][cloud-vision-ref]
+[Language][cloud-language]       | stable       | [`cloud.google.com/go/language/apiv1`][cloud-language-ref]
+[Speech][cloud-speech]           | stable       | [`cloud.google.com/go/speech/apiv1`][cloud-speech-ref]
+[Spanner][cloud-spanner]         | stable       | [`cloud.google.com/go/spanner`][cloud-spanner-ref]
+[Translation][cloud-translation] | stable       | [`cloud.google.com/go/translate`][cloud-translation-ref]
+[Trace][cloud-trace]             | alpha        | [`cloud.google.com/go/trace`][cloud-trace-ref]
+[Video Intelligence][cloud-video]| beta         | [`cloud.google.com/go/videointelligence/apiv1beta1`][cloud-video-ref]
+[ErrorReporting][cloud-errors]   | alpha        | [`cloud.google.com/go/errorreporting`][cloud-errors-ref]
+
+
+> **Alpha status**: the API is still being actively developed. As a
+> result, it might change in backward-incompatible ways and is not recommended
+> for production use.
+>
+> **Beta status**: the API is largely complete, but still has outstanding
+> features and bugs to be addressed. There may be minor backwards-incompatible
+> changes where necessary.
+>
+> **Stable status**: the API is mature and ready for production use. We will
+> continue addressing bugs and feature requests.
+
+Documentation and examples are available at
+https://godoc.org/cloud.google.com/go
+
+Visit or join the
+[google-api-go-announce group](https://groups.google.com/forum/#!forum/google-api-go-announce)
+for updates on these packages.
+
+## Go Versions Supported
+
+We support the two most recent major versions of Go. If Google App Engine uses
+an older version, we support that as well. You can see which versions are
+currently supported by looking at the lines following `go:` in
+[`.travis.yml`](.travis.yml).
+
+## Authorization
+
+By default, each API will use [Google Application Default Credentials][default-creds]
+for authorization credentials used in calling the API endpoints. This will allow your
+application to run in many environments without requiring explicit configuration.
+
+[snip]:# (auth)
+```go
+client, err := storage.NewClient(ctx)
+```
+
+To authorize using a
+[JSON key file](https://cloud.google.com/iam/docs/managing-service-account-keys),
+pass
+[`option.WithServiceAccountFile`](https://godoc.org/google.golang.org/api/option#WithServiceAccountFile)
+to the `NewClient` function of the desired package. For example:
+
+[snip]:# (auth-JSON)
+```go
+client, err := storage.NewClient(ctx, option.WithServiceAccountFile("path/to/keyfile.json"))
+```
+
+You can exert more control over authorization by using the
+[`golang.org/x/oauth2`](https://godoc.org/golang.org/x/oauth2) package to
+create an `oauth2.TokenSource`. Then pass
+[`option.WithTokenSource`](https://godoc.org/google.golang.org/api/option#WithTokenSource)
+to the `NewClient` function:
+[snip]:# (auth-ts)
+```go
+tokenSource := ...
+client, err := storage.NewClient(ctx, option.WithTokenSource(tokenSource))
+```
+
+## Cloud Datastore [![GoDoc](https://godoc.org/cloud.google.com/go/datastore?status.svg)](https://godoc.org/cloud.google.com/go/datastore)
+
+- [About Cloud Datastore][cloud-datastore]
+- [Activating the API for your project][cloud-datastore-activation]
+- [API documentation][cloud-datastore-docs]
+- [Go client documentation](https://godoc.org/cloud.google.com/go/datastore)
+- [Complete sample program](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/datastore/tasks)
+
+### Example Usage
+
+First create a `datastore.Client` to use throughout your application:
+
+[snip]:# (datastore-1)
+```go
+client, err := datastore.NewClient(ctx, "my-project-id")
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+Then use that client to interact with the API:
+
+[snip]:# (datastore-2)
+```go
+type Post struct {
+	Title       string
+	Body        string `datastore:",noindex"`
+	PublishedAt time.Time
+}
+keys := []*datastore.Key{
+	datastore.NameKey("Post", "post1", nil),
+	datastore.NameKey("Post", "post2", nil),
+}
+posts := []*Post{
+	{Title: "Post 1", Body: "...", PublishedAt: time.Now()},
+	{Title: "Post 2", Body: "...", PublishedAt: time.Now()},
+}
+if _, err := client.PutMulti(ctx, keys, posts); err != nil {
+	log.Fatal(err)
+}
+```
+
+## Cloud Storage [![GoDoc](https://godoc.org/cloud.google.com/go/storage?status.svg)](https://godoc.org/cloud.google.com/go/storage)
+
+- [About Cloud Storage][cloud-storage]
+- [API documentation][cloud-storage-docs]
+- [Go client documentation](https://godoc.org/cloud.google.com/go/storage)
+- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/storage)
+
+### Example Usage
+
+First create a `storage.Client` to use throughout your application:
+
+[snip]:# (storage-1)
+```go
+client, err := storage.NewClient(ctx)
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+[snip]:# (storage-2)
+```go
+// Read the object1 from bucket.
+rc, err := client.Bucket("bucket").Object("object1").NewReader(ctx)
+if err != nil {
+	log.Fatal(err)
+}
+defer rc.Close()
+body, err := ioutil.ReadAll(rc)
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+## Cloud Pub/Sub [![GoDoc](https://godoc.org/cloud.google.com/go/pubsub?status.svg)](https://godoc.org/cloud.google.com/go/pubsub)
+
+- [About Cloud Pubsub][cloud-pubsub]
+- [API documentation][cloud-pubsub-docs]
+- [Go client documentation](https://godoc.org/cloud.google.com/go/pubsub)
+- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/pubsub)
+
+### Example Usage
+
+First create a `pubsub.Client` to use throughout your application:
+
+[snip]:# (pubsub-1)
+```go
+client, err := pubsub.NewClient(ctx, "project-id")
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+Then use the client to publish and subscribe:
+
+[snip]:# (pubsub-2)
+```go
+// Publish "hello world" on topic1.
+topic := client.Topic("topic1")
+res := topic.Publish(ctx, &pubsub.Message{
+	Data: []byte("hello world"),
+})
+// The publish happens asynchronously.
+// Later, you can get the result from res:
+...
+msgID, err := res.Get(ctx)
+if err != nil {
+	log.Fatal(err)
+}
+
+// Use a callback to receive messages via subscription1.
+sub := client.Subscription("subscription1")
+err = sub.Receive(ctx, func(ctx context.Context, m *pubsub.Message) {
+	fmt.Println(m.Data)
+	m.Ack() // Acknowledge that we've consumed the message.
+})
+if err != nil {
+	log.Println(err)
+}
+```
+
+## Cloud BigQuery [![GoDoc](https://godoc.org/cloud.google.com/go/bigquery?status.svg)](https://godoc.org/cloud.google.com/go/bigquery)
+
+- [About Cloud BigQuery][cloud-bigquery]
+- [API documentation][cloud-bigquery-docs]
+- [Go client documentation][cloud-bigquery-ref]
+- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/bigquery)
+
+### Example Usage
+
+First create a `bigquery.Client` to use throughout your application:
+[snip]:# (bq-1)
+```go
+c, err := bigquery.NewClient(ctx, "my-project-ID")
+if err != nil {
+	// TODO: Handle error.
+}
+```
+
+Then use that client to interact with the API:
+[snip]:# (bq-2)
+```go
+// Construct a query.
+q := c.Query(`
+    SELECT year, SUM(number)
+    FROM [bigquery-public-data:usa_names.usa_1910_2013]
+    WHERE name = "William"
+    GROUP BY year
+    ORDER BY year
+`)
+// Execute the query.
+it, err := q.Read(ctx)
+if err != nil {
+	// TODO: Handle error.
+}
+// Iterate through the results.
+for {
+	var values []bigquery.Value
+	err := it.Next(&values)
+	if err == iterator.Done {
+		break
+	}
+	if err != nil {
+		// TODO: Handle error.
+	}
+	fmt.Println(values)
+}
+```
+
+
+## Stackdriver Logging [![GoDoc](https://godoc.org/cloud.google.com/go/logging?status.svg)](https://godoc.org/cloud.google.com/go/logging)
+
+- [About Stackdriver Logging][cloud-logging]
+- [API documentation][cloud-logging-docs]
+- [Go client documentation][cloud-logging-ref]
+- [Complete sample programs](https://github.com/GoogleCloudPlatform/golang-samples/tree/master/logging)
+
+### Example Usage
+
+First create a `logging.Client` to use throughout your application:
+[snip]:# (logging-1)
+```go
+ctx := context.Background()
+client, err := logging.NewClient(ctx, "my-project")
+if err != nil {
+	// TODO: Handle error.
+}
+```
+
+Usually, you'll want to add log entries to a buffer to be periodically flushed
+(automatically and asynchronously) to the Stackdriver Logging service.
+[snip]:# (logging-2)
+```go
+logger := client.Logger("my-log")
+logger.Log(logging.Entry{Payload: "something happened!"})
+```
+
+Close your client before your program exits, to flush any buffered log entries.
+[snip]:# (logging-3)
+```go
+err = client.Close()
+if err != nil {
+	// TODO: Handle error.
+}
+```
+
+## Cloud Spanner [![GoDoc](https://godoc.org/cloud.google.com/go/spanner?status.svg)](https://godoc.org/cloud.google.com/go/spanner)
+
+- [About Cloud Spanner][cloud-spanner]
+- [API documentation][cloud-spanner-docs]
+- [Go client documentation](https://godoc.org/cloud.google.com/go/spanner)
+
+### Example Usage
+
+First create a `spanner.Client` to use throughout your application:
+
+[snip]:# (spanner-1)
+```go
+client, err := spanner.NewClient(ctx, "projects/P/instances/I/databases/D")
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+[snip]:# (spanner-2)
+```go
+// Simple Reads And Writes
+_, err = client.Apply(ctx, []*spanner.Mutation{
+	spanner.Insert("Users",
+		[]string{"name", "email"},
+		[]interface{}{"alice", "a@example.com"})})
+if err != nil {
+	log.Fatal(err)
+}
+row, err := client.Single().ReadRow(ctx, "Users",
+	spanner.Key{"alice"}, []string{"email"})
+if err != nil {
+	log.Fatal(err)
+}
+```
+
+
+## Contributing
+
+Contributions are welcome. Please, see the
+[CONTRIBUTING](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/CONTRIBUTING.md)
+document for details. We're using Gerrit for our code reviews. Please don't open pull
+requests against this repo, new pull requests will be automatically closed.
+
+Please note that this project is released with a Contributor Code of Conduct.
+By participating in this project you agree to abide by its terms.
+See [Contributor Code of Conduct](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/CONTRIBUTING.md#contributor-code-of-conduct)
+for more information.
+
+[cloud-datastore]: https://cloud.google.com/datastore/
+[cloud-datastore-ref]: https://godoc.org/cloud.google.com/go/datastore
+[cloud-datastore-docs]: https://cloud.google.com/datastore/docs
+[cloud-datastore-activation]: https://cloud.google.com/datastore/docs/activate
+
+[cloud-firestore]: https://cloud.google.com/firestore/
+[cloud-firestore-ref]: https://godoc.org/cloud.google.com/go/firestore
+[cloud-firestore-docs]: https://cloud.google.com/firestore/docs
+[cloud-firestore-activation]: https://cloud.google.com/firestore/docs/activate
+
+[cloud-pubsub]: https://cloud.google.com/pubsub/
+[cloud-pubsub-ref]: https://godoc.org/cloud.google.com/go/pubsub
+[cloud-pubsub-docs]: https://cloud.google.com/pubsub/docs
+
+[cloud-storage]: https://cloud.google.com/storage/
+[cloud-storage-ref]: https://godoc.org/cloud.google.com/go/storage
+[cloud-storage-docs]: https://cloud.google.com/storage/docs
+[cloud-storage-create-bucket]: https://cloud.google.com/storage/docs/cloud-console#_creatingbuckets
+
+[cloud-bigtable]: https://cloud.google.com/bigtable/
+[cloud-bigtable-ref]: https://godoc.org/cloud.google.com/go/bigtable
+
+[cloud-bigquery]: https://cloud.google.com/bigquery/
+[cloud-bigquery-docs]: https://cloud.google.com/bigquery/docs
+[cloud-bigquery-ref]: https://godoc.org/cloud.google.com/go/bigquery
+
+[cloud-logging]: https://cloud.google.com/logging/
+[cloud-logging-docs]: https://cloud.google.com/logging/docs
+[cloud-logging-ref]: https://godoc.org/cloud.google.com/go/logging
+
+[cloud-monitoring]: https://cloud.google.com/monitoring/
+[cloud-monitoring-ref]: https://godoc.org/cloud.google.com/go/monitoring/apiv3
+
+[cloud-vision]: https://cloud.google.com/vision
+[cloud-vision-ref]: https://godoc.org/cloud.google.com/go/vision/apiv1
+
+[cloud-language]: https://cloud.google.com/natural-language
+[cloud-language-ref]: https://godoc.org/cloud.google.com/go/language/apiv1
+
+[cloud-speech]: https://cloud.google.com/speech
+[cloud-speech-ref]: https://godoc.org/cloud.google.com/go/speech/apiv1
+
+[cloud-spanner]: https://cloud.google.com/spanner/
+[cloud-spanner-ref]: https://godoc.org/cloud.google.com/go/spanner
+[cloud-spanner-docs]: https://cloud.google.com/spanner/docs
+
+[cloud-translation]: https://cloud.google.com/translation
+[cloud-translation-ref]: https://godoc.org/cloud.google.com/go/translation
+
+[cloud-trace]: https://cloud.google.com/trace/
+[cloud-trace-ref]: https://godoc.org/cloud.google.com/go/trace
+
+[cloud-video]: https://cloud.google.com/video-intelligence/
+[cloud-video-ref]: https://godoc.org/cloud.google.com/go/videointelligence/apiv1beta1
+
+[cloud-errors]: https://cloud.google.com/error-reporting/
+[cloud-errors-ref]: https://godoc.org/cloud.google.com/go/errorreporting
+
+[default-creds]: https://developers.google.com/identity/protocols/application-default-credentials

+ 20 - 0
vendor/cloud.google.com/go/cloud.go

@@ -0,0 +1,20 @@
+// Copyright 2014 Google Inc. All Rights Reserved.
+//
+// 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.
+
+// Package cloud is the root of the packages used to access Google Cloud
+// Services. See https://godoc.org/cloud.google.com/go for a full list
+// of sub-packages.
+//
+// This package documents how to authorize and authenticate the sub packages.
+package cloud // import "cloud.google.com/go"

+ 0 - 256
vendor/cloud.google.com/go/iam/iam.go

@@ -1,256 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-// Package iam supports the resource-specific operations of Google Cloud
-// IAM (Identity and Access Management) for the Google Cloud Libraries.
-// See https://cloud.google.com/iam for more about IAM.
-//
-// Users of the Google Cloud Libraries will typically not use this package
-// directly. Instead they will begin with some resource that supports IAM, like
-// a pubsub topic, and call its IAM method to get a Handle for that resource.
-package iam
-
-import (
-	"golang.org/x/net/context"
-	pb "google.golang.org/genproto/googleapis/iam/v1"
-	"google.golang.org/grpc"
-)
-
-// client abstracts the IAMPolicy API to allow multiple implementations.
-type client interface {
-	Get(ctx context.Context, resource string) (*pb.Policy, error)
-	Set(ctx context.Context, resource string, p *pb.Policy) error
-	Test(ctx context.Context, resource string, perms []string) ([]string, error)
-}
-
-// grpcClient implements client for the standard gRPC-based IAMPolicy service.
-type grpcClient struct {
-	c pb.IAMPolicyClient
-}
-
-func (g *grpcClient) Get(ctx context.Context, resource string) (*pb.Policy, error) {
-	proto, err := g.c.GetIamPolicy(ctx, &pb.GetIamPolicyRequest{Resource: resource})
-	if err != nil {
-		return nil, err
-	}
-	return proto, nil
-}
-func (g *grpcClient) Set(ctx context.Context, resource string, p *pb.Policy) error {
-	_, err := g.c.SetIamPolicy(ctx, &pb.SetIamPolicyRequest{
-		Resource: resource,
-		Policy:   p,
-	})
-	return err
-}
-
-func (g *grpcClient) Test(ctx context.Context, resource string, perms []string) ([]string, error) {
-	res, err := g.c.TestIamPermissions(ctx, &pb.TestIamPermissionsRequest{
-		Resource:    resource,
-		Permissions: perms,
-	})
-	if err != nil {
-		return nil, err
-	}
-	return res.Permissions, nil
-}
-
-// A Handle provides IAM operations for a resource.
-type Handle struct {
-	c        client
-	resource string
-}
-
-// InternalNewHandle is for use by the Google Cloud Libraries only.
-//
-// InternalNewHandle returns a Handle for resource.
-// The conn parameter refers to a server that must support the IAMPolicy service.
-func InternalNewHandle(conn *grpc.ClientConn, resource string) *Handle {
-	return InternalNewHandleClient(&grpcClient{c: pb.NewIAMPolicyClient(conn)}, resource)
-}
-
-// InternalNewHandleClient is for use by the Google Cloud Libraries only.
-//
-// InternalNewHandleClient returns a Handle for resource using the given
-// client implementation.
-func InternalNewHandleClient(c client, resource string) *Handle {
-	return &Handle{
-		c:        c,
-		resource: resource,
-	}
-}
-
-// Policy retrieves the IAM policy for the resource.
-func (h *Handle) Policy(ctx context.Context) (*Policy, error) {
-	proto, err := h.c.Get(ctx, h.resource)
-	if err != nil {
-		return nil, err
-	}
-	return &Policy{InternalProto: proto}, nil
-}
-
-// SetPolicy replaces the resource's current policy with the supplied Policy.
-//
-// If policy was created from a prior call to Get, then the modification will
-// only succeed if the policy has not changed since the Get.
-func (h *Handle) SetPolicy(ctx context.Context, policy *Policy) error {
-	return h.c.Set(ctx, h.resource, policy.InternalProto)
-}
-
-// TestPermissions returns the subset of permissions that the caller has on the resource.
-func (h *Handle) TestPermissions(ctx context.Context, permissions []string) ([]string, error) {
-	return h.c.Test(ctx, h.resource, permissions)
-}
-
-// A RoleName is a name representing a collection of permissions.
-type RoleName string
-
-// Common role names.
-const (
-	Owner  RoleName = "roles/owner"
-	Editor RoleName = "roles/editor"
-	Viewer RoleName = "roles/viewer"
-)
-
-const (
-	// AllUsers is a special member that denotes all users, even unauthenticated ones.
-	AllUsers = "allUsers"
-
-	// AllAuthenticatedUsers is a special member that denotes all authenticated users.
-	AllAuthenticatedUsers = "allAuthenticatedUsers"
-)
-
-// A Policy is a list of Bindings representing roles
-// granted to members.
-//
-// The zero Policy is a valid policy with no bindings.
-type Policy struct {
-	// TODO(jba): when type aliases are available, put Policy into an internal package
-	// and provide an exported alias here.
-
-	// This field is exported for use by the Google Cloud Libraries only.
-	// It may become unexported in a future release.
-	InternalProto *pb.Policy
-}
-
-// Members returns the list of members with the supplied role.
-// The return value should not be modified. Use Add and Remove
-// to modify the members of a role.
-func (p *Policy) Members(r RoleName) []string {
-	b := p.binding(r)
-	if b == nil {
-		return nil
-	}
-	return b.Members
-}
-
-// HasRole reports whether member has role r.
-func (p *Policy) HasRole(member string, r RoleName) bool {
-	return memberIndex(member, p.binding(r)) >= 0
-}
-
-// Add adds member member to role r if it is not already present.
-// A new binding is created if there is no binding for the role.
-func (p *Policy) Add(member string, r RoleName) {
-	b := p.binding(r)
-	if b == nil {
-		if p.InternalProto == nil {
-			p.InternalProto = &pb.Policy{}
-		}
-		p.InternalProto.Bindings = append(p.InternalProto.Bindings, &pb.Binding{
-			Role:    string(r),
-			Members: []string{member},
-		})
-		return
-	}
-	if memberIndex(member, b) < 0 {
-		b.Members = append(b.Members, member)
-		return
-	}
-}
-
-// Remove removes member from role r if it is present.
-func (p *Policy) Remove(member string, r RoleName) {
-	bi := p.bindingIndex(r)
-	if bi < 0 {
-		return
-	}
-	bindings := p.InternalProto.Bindings
-	b := bindings[bi]
-	mi := memberIndex(member, b)
-	if mi < 0 {
-		return
-	}
-	// Order doesn't matter for bindings or members, so to remove, move the last item
-	// into the removed spot and shrink the slice.
-	if len(b.Members) == 1 {
-		// Remove binding.
-		last := len(bindings) - 1
-		bindings[bi] = bindings[last]
-		bindings[last] = nil
-		p.InternalProto.Bindings = bindings[:last]
-		return
-	}
-	// Remove member.
-	// TODO(jba): worry about multiple copies of m?
-	last := len(b.Members) - 1
-	b.Members[mi] = b.Members[last]
-	b.Members[last] = ""
-	b.Members = b.Members[:last]
-}
-
-// Roles returns the names of all the roles that appear in the Policy.
-func (p *Policy) Roles() []RoleName {
-	if p.InternalProto == nil {
-		return nil
-	}
-	var rns []RoleName
-	for _, b := range p.InternalProto.Bindings {
-		rns = append(rns, RoleName(b.Role))
-	}
-	return rns
-}
-
-// binding returns the Binding for the suppied role, or nil if there isn't one.
-func (p *Policy) binding(r RoleName) *pb.Binding {
-	i := p.bindingIndex(r)
-	if i < 0 {
-		return nil
-	}
-	return p.InternalProto.Bindings[i]
-}
-
-func (p *Policy) bindingIndex(r RoleName) int {
-	if p.InternalProto == nil {
-		return -1
-	}
-	for i, b := range p.InternalProto.Bindings {
-		if b.Role == string(r) {
-			return i
-		}
-	}
-	return -1
-}
-
-// memberIndex returns the index of m in b's Members, or -1 if not found.
-func memberIndex(m string, b *pb.Binding) int {
-	if b == nil {
-		return -1
-	}
-	for i, mm := range b.Members {
-		if mm == m {
-			return i
-		}
-	}
-	return -1
-}

+ 0 - 94
vendor/cloud.google.com/go/internal/optional/optional.go

@@ -1,94 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-// Package optional provides versions of primitive types that can
-// be nil. These are useful in methods that update some of an API object's
-// fields.
-package optional
-
-import (
-	"fmt"
-	"strings"
-)
-
-type (
-	// Bool is either a bool or nil.
-	Bool interface{}
-
-	// String is either a string or nil.
-	String interface{}
-
-	// Int is either an int or nil.
-	Int interface{}
-
-	// Uint is either a uint or nil.
-	Uint interface{}
-
-	// Float64 is either a float64 or nil.
-	Float64 interface{}
-)
-
-// ToBool returns its argument as a bool.
-// It panics if its argument is nil or not a bool.
-func ToBool(v Bool) bool {
-	x, ok := v.(bool)
-	if !ok {
-		doPanic("Bool", v)
-	}
-	return x
-}
-
-// ToString returns its argument as a string.
-// It panics if its argument is nil or not a string.
-func ToString(v String) string {
-	x, ok := v.(string)
-	if !ok {
-		doPanic("String", v)
-	}
-	return x
-}
-
-// ToInt returns its argument as an int.
-// It panics if its argument is nil or not an int.
-func ToInt(v Int) int {
-	x, ok := v.(int)
-	if !ok {
-		doPanic("Int", v)
-	}
-	return x
-}
-
-// ToUint returns its argument as a uint.
-// It panics if its argument is nil or not a uint.
-func ToUint(v Uint) uint {
-	x, ok := v.(uint)
-	if !ok {
-		doPanic("Uint", v)
-	}
-	return x
-}
-
-// ToFloat64 returns its argument as a float64.
-// It panics if its argument is nil or not a float64.
-func ToFloat64(v Float64) float64 {
-	x, ok := v.(float64)
-	if !ok {
-		doPanic("Float64", v)
-	}
-	return x
-}
-
-func doPanic(capType string, v interface{}) {
-	panic(fmt.Sprintf("optional.%s value should be %s, got %T", capType, strings.ToLower(capType), v))
-}

+ 0 - 56
vendor/cloud.google.com/go/internal/retry.go

@@ -1,56 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package internal
-
-import (
-	"fmt"
-	"time"
-
-	gax "github.com/googleapis/gax-go"
-
-	"golang.org/x/net/context"
-)
-
-// Retry calls the supplied function f repeatedly according to the provided
-// backoff parameters. It returns when one of the following occurs:
-// When f's first return value is true, Retry immediately returns with f's second
-// return value.
-// When the provided context is done, Retry returns with an error that
-// includes both ctx.Error() and the last error returned by f.
-func Retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error)) error {
-	return retry(ctx, bo, f, gax.Sleep)
-}
-
-func retry(ctx context.Context, bo gax.Backoff, f func() (stop bool, err error),
-	sleep func(context.Context, time.Duration) error) error {
-	var lastErr error
-	for {
-		stop, err := f()
-		if stop {
-			return err
-		}
-		// Remember the last "real" error from f.
-		if err != nil && err != context.Canceled && err != context.DeadlineExceeded {
-			lastErr = err
-		}
-		p := bo.Pause()
-		if cerr := sleep(ctx, p); cerr != nil {
-			if lastErr != nil {
-				return fmt.Errorf("%v; last function err: %v", cerr, lastErr)
-			}
-			return cerr
-		}
-	}
-}

+ 0 - 6
vendor/cloud.google.com/go/internal/version/update_version.sh

@@ -1,6 +0,0 @@
-#!/bin/bash
-
-today=$(date +%Y%m%d)
-
-sed -i -r -e 's/const Repo = "([0-9]{8})"/const Repo = "'$today'"/' $GOFILE
-

+ 0 - 71
vendor/cloud.google.com/go/internal/version/version.go

@@ -1,71 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-//go:generate ./update_version.sh
-
-// Package version contains version information for Google Cloud Client
-// Libraries for Go, as reported in request headers.
-package version
-
-import (
-	"runtime"
-	"strings"
-	"unicode"
-)
-
-// Repo is the current version of the client libraries in this
-// repo. It should be a date in YYYYMMDD format.
-const Repo = "20170621"
-
-// Go returns the Go runtime version. The returned string
-// has no whitespace.
-func Go() string {
-	return goVersion
-}
-
-var goVersion = goVer(runtime.Version())
-
-const develPrefix = "devel +"
-
-func goVer(s string) string {
-	if strings.HasPrefix(s, develPrefix) {
-		s = s[len(develPrefix):]
-		if p := strings.IndexFunc(s, unicode.IsSpace); p >= 0 {
-			s = s[:p]
-		}
-		return s
-	}
-
-	if strings.HasPrefix(s, "go1") {
-		s = s[2:]
-		var prerelease string
-		if p := strings.IndexFunc(s, notSemverRune); p >= 0 {
-			s, prerelease = s[:p], s[p:]
-		}
-		if strings.HasSuffix(s, ".") {
-			s += "0"
-		} else if strings.Count(s, ".") < 2 {
-			s += ".0"
-		}
-		if prerelease != "" {
-			s += "-" + prerelease
-		}
-		return s
-	}
-	return ""
-}
-
-func notSemverRune(r rune) bool {
-	return strings.IndexRune("0123456789.", r) < 0
-}

BIN
vendor/cloud.google.com/go/keys.tar.enc


+ 557 - 0
vendor/cloud.google.com/go/old-news.md

@@ -0,0 +1,557 @@
+_September 28, 2017_
+
+*v0.14.0*
+
+- bigquery BREAKING CHANGES:
+  - Standard SQL is the default for queries and views.
+  - `Table.Create` takes `TableMetadata` as a second argument, instead of
+    options.
+  - `Dataset.Create` takes `DatasetMetadata` as a second argument.
+  - `DatasetMetadata` field `ID` renamed to `FullID`
+  - `TableMetadata` field `ID` renamed to `FullID`
+
+- Other bigquery changes:
+  - The client will append a random suffix to a provided job ID if you set
+    `AddJobIDSuffix` to true in a job config.
+  - Listing jobs is supported.
+  - Better retry logic.
+
+- vision, language, speech: clients are now stable
+
+- monitoring: client is now beta
+
+- profiler:
+  - Rename InstanceName to Instance, ZoneName to Zone
+  - Auto-detect service name and version on AppEngine.
+
+_September 8, 2017_
+
+*v0.13.0*
+
+- bigquery: UseLegacySQL options for CreateTable and QueryConfig. Use these
+  options to continue using Legacy SQL after the client switches its default
+  to Standard SQL.
+
+- bigquery: Support for updating dataset labels.
+
+- bigquery: Set DatasetIterator.ProjectID to list datasets in a project other
+  than the client's. DatasetsInProject is no longer needed and is deprecated.
+
+- bigtable: Fail ListInstances when any zones fail.
+
+- spanner: support decoding of slices of basic types (e.g. []string, []int64,
+  etc.)
+
+- logging/logadmin: UpdateSink no longer creates a sink if it is missing
+  (actually a change to the underlying service, not the client)
+
+- profiler: Service and ServiceVersion replace Target in Config.
+
+_August 22, 2017_
+
+*v0.12.0*
+
+- pubsub: Subscription.Receive now uses streaming pull.
+
+- pubsub: add Client.TopicInProject to access topics in a different project
+  than the client.
+
+- errors: renamed errorreporting. The errors package will be removed shortly.
+
+- datastore: improved retry behavior.
+
+- bigquery: support updates to dataset metadata, with etags.
+
+- bigquery: add etag support to Table.Update (BREAKING: etag argument added).
+
+- bigquery: generate all job IDs on the client.
+
+- storage: support bucket lifecycle configurations.
+
+
+_July 31, 2017_
+
+*v0.11.0*
+
+- Clients for spanner, pubsub and video are now in beta.
+
+- New client for DLP.
+
+- spanner: performance and testing improvements.
+
+- storage: requester-pays buckets are supported.
+
+- storage, profiler, bigtable, bigquery: bug fixes and other minor improvements.
+
+- pubsub: bug fixes and other minor improvements
+
+_June 17, 2017_
+
+
+*v0.10.0*
+
+- pubsub: Subscription.ModifyPushConfig replaced with Subscription.Update.
+
+- pubsub: Subscription.Receive now runs concurrently for higher throughput.
+
+- vision: cloud.google.com/go/vision is deprecated. Use
+cloud.google.com/go/vision/apiv1 instead.
+
+- translation: now stable.
+
+- trace: several changes to the surface. See the link below.
+
+[Code changes required from v0.9.0.](https://github.com/GoogleCloudPlatform/google-cloud-go/blob/master/MIGRATION.md)
+
+
+_March 17, 2017_
+
+Breaking Pubsub changes.
+* Publish is now asynchronous
+([announcement](https://groups.google.com/d/topic/google-api-go-announce/aaqRDIQ3rvU/discussion)).
+* Subscription.Pull replaced by Subscription.Receive, which takes a callback ([announcement](https://groups.google.com/d/topic/google-api-go-announce/8pt6oetAdKc/discussion)).
+* Message.Done replaced with Message.Ack and Message.Nack.
+
+_February 14, 2017_
+
+Release of a client library for Spanner. See
+the
+[blog post](https://cloudplatform.googleblog.com/2017/02/introducing-Cloud-Spanner-a-global-database-service-for-mission-critical-applications.html).
+
+Note that although the Spanner service is beta, the Go client library is alpha.
+
+_December 12, 2016_
+
+Beta release of BigQuery, DataStore, Logging and Storage. See the
+[blog post](https://cloudplatform.googleblog.com/2016/12/announcing-new-google-cloud-client.html).
+
+Also, BigQuery now supports structs. Read a row directly into a struct with
+`RowIterator.Next`, and upload a row directly from a struct with `Uploader.Put`.
+You can also use field tags. See the [package documentation][cloud-bigquery-ref]
+for details.
+
+_December 5, 2016_
+
+More changes to BigQuery:
+
+* The `ValueList` type was removed. It is no longer necessary. Instead of
+   ```go
+   var v ValueList
+   ... it.Next(&v) ..
+   ```
+   use
+
+   ```go
+   var v []Value
+   ... it.Next(&v) ...
+   ```
+
+* Previously, repeatedly calling `RowIterator.Next` on the same `[]Value` or
+  `ValueList` would append to the slice. Now each call resets the size to zero first.
+
+* Schema inference will infer the SQL type BYTES for a struct field of
+  type []byte. Previously it inferred STRING.
+
+* The types `uint`, `uint64` and `uintptr` are no longer supported in schema
+  inference. BigQuery's integer type is INT64, and those types may hold values
+  that are not correctly represented in a 64-bit signed integer.
+
+* The SQL types DATE, TIME and DATETIME are now supported. They correspond to
+  the `Date`, `Time` and `DateTime` types in the new `cloud.google.com/go/civil`
+  package.
+
+_November 17, 2016_
+
+Change to BigQuery: values from INTEGER columns will now be returned as int64,
+not int. This will avoid errors arising from large values on 32-bit systems.
+
+_November 8, 2016_
+
+New datastore feature: datastore now encodes your nested Go structs as Entity values,
+instead of a flattened list of the embedded struct's fields.
+This means that you may now have twice-nested slices, eg.
+```go
+type State struct {
+  Cities  []struct{
+    Populations []int
+  }
+}
+```
+
+See [the announcement](https://groups.google.com/forum/#!topic/google-api-go-announce/79jtrdeuJAg) for
+more details.
+
+_November 8, 2016_
+
+Breaking changes to datastore: contexts no longer hold namespaces; instead you
+must set a key's namespace explicitly. Also, key functions have been changed
+and renamed.
+
+* The WithNamespace function has been removed. To specify a namespace in a Query, use the Query.Namespace method:
+  ```go
+  q := datastore.NewQuery("Kind").Namespace("ns")
+  ```
+
+* All the fields of Key are exported. That means you can construct any Key with a struct literal:
+  ```go
+  k := &Key{Kind: "Kind",  ID: 37, Namespace: "ns"}
+  ```
+
+* As a result of the above, the Key methods Kind, ID, d.Name, Parent, SetParent and Namespace have been removed.
+
+* `NewIncompleteKey` has been removed, replaced by `IncompleteKey`. Replace
+  ```go
+  NewIncompleteKey(ctx, kind, parent)
+  ```
+  with
+  ```go
+  IncompleteKey(kind, parent)
+  ```
+  and if you do use namespaces, make sure you set the namespace on the returned key.
+
+* `NewKey` has been removed, replaced by `NameKey` and `IDKey`. Replace
+  ```go
+  NewKey(ctx, kind, name, 0, parent)
+  NewKey(ctx, kind, "", id, parent)
+  ```
+  with
+  ```go
+  NameKey(kind, name, parent)
+  IDKey(kind, id, parent)
+  ```
+  and if you do use namespaces, make sure you set the namespace on the returned key.
+
+* The `Done` variable has been removed. Replace `datastore.Done` with `iterator.Done`, from the package `google.golang.org/api/iterator`.
+
+* The `Client.Close` method will have a return type of error. It will return the result of closing the underlying gRPC connection.
+
+See [the announcement](https://groups.google.com/forum/#!topic/google-api-go-announce/hqXtM_4Ix-0) for
+more details.
+
+_October 27, 2016_
+
+Breaking change to bigquery: `NewGCSReference` is now a function,
+not a method on `Client`.
+
+New bigquery feature: `Table.LoaderFrom` now accepts a `ReaderSource`, enabling
+loading data into a table from a file or any `io.Reader`.
+
+_October 21, 2016_
+
+Breaking change to pubsub: removed `pubsub.Done`.
+
+Use `iterator.Done` instead, where `iterator` is the package
+`google.golang.org/api/iterator`.
+
+_October 19, 2016_
+
+Breaking changes to cloud.google.com/go/bigquery:
+
+* Client.Table and Client.OpenTable have been removed.
+    Replace
+    ```go
+    client.OpenTable("project", "dataset", "table")
+    ```
+    with
+    ```go
+    client.DatasetInProject("project", "dataset").Table("table")
+    ```
+
+* Client.CreateTable has been removed.
+    Replace
+    ```go
+    client.CreateTable(ctx, "project", "dataset", "table")
+    ```
+    with
+    ```go
+    client.DatasetInProject("project", "dataset").Table("table").Create(ctx)
+    ```
+
+* Dataset.ListTables have been replaced with Dataset.Tables.
+    Replace
+    ```go
+    tables, err := ds.ListTables(ctx)
+    ```
+    with
+    ```go
+    it := ds.Tables(ctx)
+    for {
+        table, err := it.Next()
+        if err == iterator.Done {
+            break
+        }
+        if err != nil {
+            // TODO: Handle error.
+        }
+        // TODO: use table.
+    }
+    ```
+
+* Client.Read has been replaced with Job.Read, Table.Read and Query.Read.
+    Replace
+    ```go
+    it, err := client.Read(ctx, job)
+    ```
+    with
+    ```go
+    it, err := job.Read(ctx)
+    ```
+  and similarly for reading from tables or queries.
+
+* The iterator returned from the Read methods is now named RowIterator. Its
+  behavior is closer to the other iterators in these libraries. It no longer
+  supports the Schema method; see the next item.
+    Replace
+    ```go
+    for it.Next(ctx) {
+        var vals ValueList
+        if err := it.Get(&vals); err != nil {
+            // TODO: Handle error.
+        }
+        // TODO: use vals.
+    }
+    if err := it.Err(); err != nil {
+        // TODO: Handle error.
+    }
+    ```
+    with
+    ```
+    for {
+        var vals ValueList
+        err := it.Next(&vals)
+        if err == iterator.Done {
+            break
+        }
+        if err != nil {
+            // TODO: Handle error.
+        }
+        // TODO: use vals.
+    }
+    ```
+    Instead of the `RecordsPerRequest(n)` option, write
+    ```go
+    it.PageInfo().MaxSize = n
+    ```
+    Instead of the `StartIndex(i)` option, write
+    ```go
+    it.StartIndex = i
+    ```
+
+* ValueLoader.Load now takes a Schema in addition to a slice of Values.
+    Replace
+    ```go
+    func (vl *myValueLoader) Load(v []bigquery.Value)
+    ```
+    with
+    ```go
+    func (vl *myValueLoader) Load(v []bigquery.Value, s bigquery.Schema)
+    ```
+
+
+* Table.Patch is replace by Table.Update.
+    Replace
+    ```go
+    p := table.Patch()
+    p.Description("new description")
+    metadata, err := p.Apply(ctx)
+    ```
+    with
+    ```go
+    metadata, err := table.Update(ctx, bigquery.TableMetadataToUpdate{
+        Description: "new description",
+    })
+    ```
+
+* Client.Copy is replaced by separate methods for each of its four functions.
+  All options have been replaced by struct fields.
+
+  * To load data from Google Cloud Storage into a table, use Table.LoaderFrom.
+
+    Replace
+    ```go
+    client.Copy(ctx, table, gcsRef)
+    ```
+    with
+    ```go
+    table.LoaderFrom(gcsRef).Run(ctx)
+    ```
+    Instead of passing options to Copy, set fields on the Loader:
+    ```go
+    loader := table.LoaderFrom(gcsRef)
+    loader.WriteDisposition = bigquery.WriteTruncate
+    ```
+
+  * To extract data from a table into Google Cloud Storage, use
+    Table.ExtractorTo. Set fields on the returned Extractor instead of
+    passing options.
+
+    Replace
+    ```go
+    client.Copy(ctx, gcsRef, table)
+    ```
+    with
+    ```go
+    table.ExtractorTo(gcsRef).Run(ctx)
+    ```
+
+  * To copy data into a table from one or more other tables, use
+    Table.CopierFrom. Set fields on the returned Copier instead of passing options.
+
+    Replace
+    ```go
+    client.Copy(ctx, dstTable, srcTable)
+    ```
+    with
+    ```go
+    dst.Table.CopierFrom(srcTable).Run(ctx)
+    ```
+
+  * To start a query job, create a Query and call its Run method. Set fields
+  on the query instead of passing options.
+
+    Replace
+    ```go
+    client.Copy(ctx, table, query)
+    ```
+    with
+    ```go
+    query.Run(ctx)
+    ```
+
+* Table.NewUploader has been renamed to Table.Uploader. Instead of options,
+  configure an Uploader by setting its fields.
+    Replace
+    ```go
+    u := table.NewUploader(bigquery.UploadIgnoreUnknownValues())
+    ```
+    with
+    ```go
+    u := table.NewUploader(bigquery.UploadIgnoreUnknownValues())
+    u.IgnoreUnknownValues = true
+    ```
+
+_October 10, 2016_
+
+Breaking changes to cloud.google.com/go/storage:
+
+* AdminClient replaced by methods on Client.
+    Replace
+    ```go
+    adminClient.CreateBucket(ctx, bucketName, attrs)
+    ```
+    with
+    ```go
+    client.Bucket(bucketName).Create(ctx, projectID, attrs)
+    ```
+
+* BucketHandle.List replaced by BucketHandle.Objects.
+    Replace
+    ```go
+    for query != nil {
+        objs, err := bucket.List(d.ctx, query)
+        if err != nil { ... }
+        query = objs.Next
+        for _, obj := range objs.Results {
+            fmt.Println(obj)
+        }
+    }
+    ```
+    with
+    ```go
+    iter := bucket.Objects(d.ctx, query)
+    for {
+        obj, err := iter.Next()
+        if err == iterator.Done {
+            break
+        }
+        if err != nil { ... }
+        fmt.Println(obj)
+    }
+    ```
+    (The `iterator` package is at `google.golang.org/api/iterator`.)
+
+    Replace `Query.Cursor` with `ObjectIterator.PageInfo().Token`.
+    
+    Replace `Query.MaxResults` with `ObjectIterator.PageInfo().MaxSize`.
+
+
+* ObjectHandle.CopyTo replaced by ObjectHandle.CopierFrom.
+    Replace
+    ```go
+    attrs, err := src.CopyTo(ctx, dst, nil)
+    ```
+    with
+    ```go
+    attrs, err := dst.CopierFrom(src).Run(ctx)
+    ```
+
+    Replace
+    ```go
+    attrs, err := src.CopyTo(ctx, dst, &storage.ObjectAttrs{ContextType: "text/html"})
+    ```
+    with
+    ```go
+    c := dst.CopierFrom(src)
+    c.ContextType = "text/html"
+    attrs, err := c.Run(ctx)
+    ```
+
+* ObjectHandle.ComposeFrom replaced by ObjectHandle.ComposerFrom.
+    Replace
+    ```go
+    attrs, err := dst.ComposeFrom(ctx, []*storage.ObjectHandle{src1, src2}, nil)
+    ```
+    with
+    ```go
+    attrs, err := dst.ComposerFrom(src1, src2).Run(ctx)
+    ```
+
+* ObjectHandle.Update's ObjectAttrs argument replaced by ObjectAttrsToUpdate.
+    Replace
+    ```go
+    attrs, err := obj.Update(ctx, &storage.ObjectAttrs{ContextType: "text/html"})
+    ```
+    with
+    ```go
+    attrs, err := obj.Update(ctx, storage.ObjectAttrsToUpdate{ContextType: "text/html"})
+    ```
+
+* ObjectHandle.WithConditions replaced by ObjectHandle.If.
+    Replace
+    ```go
+    obj.WithConditions(storage.Generation(gen), storage.IfMetaGenerationMatch(mgen))
+    ```
+    with
+    ```go
+    obj.Generation(gen).If(storage.Conditions{MetagenerationMatch: mgen})
+    ```
+
+    Replace
+    ```go
+    obj.WithConditions(storage.IfGenerationMatch(0))
+    ```
+    with
+    ```go
+    obj.If(storage.Conditions{DoesNotExist: true})
+    ```
+
+* `storage.Done` replaced by `iterator.Done` (from package `google.golang.org/api/iterator`).
+
+_October 6, 2016_
+
+Package preview/logging deleted. Use logging instead.
+
+_September 27, 2016_
+
+Logging client replaced with preview version (see below).
+
+_September 8, 2016_
+
+* New clients for some of Google's Machine Learning APIs: Vision, Speech, and
+Natural Language.
+
+* Preview version of a new [Stackdriver Logging][cloud-logging] client in
+[`cloud.google.com/go/preview/logging`](https://godoc.org/cloud.google.com/go/preview/logging).
+This client uses gRPC as its transport layer, and supports log reading, sinks
+and metrics. It will replace the current client at `cloud.google.com/go/logging` shortly.
+

+ 88 - 0
vendor/cloud.google.com/go/run-tests.sh

@@ -0,0 +1,88 @@
+#!/bin/bash
+
+# Selectively run tests for this repo, based on what has changed
+# in a commit. Runs short tests for the whole repo, and full tests
+# for changed directories.
+
+set -e
+
+prefix=cloud.google.com/go
+
+dryrun=false
+if [[ $1 == "-n" ]]; then
+  dryrun=true
+  shift
+fi
+
+if [[ $1 == "" ]]; then
+  echo >&2 "usage: $0 [-n] COMMIT"
+  exit 1
+fi
+
+# Files or directories that cause all tests to run if modified.
+declare -A run_all
+run_all=([.travis.yml]=1 [run-tests.sh]=1)
+
+function run {
+  if $dryrun; then
+    echo $*
+  else
+    (set -x; $*)
+  fi
+}
+
+
+# Find all the packages that have changed in this commit.
+declare -A changed_packages
+
+for f in $(git diff-tree --no-commit-id --name-only -r $1); do
+  if [[ ${run_all[$f]} == 1 ]]; then
+    # This change requires a full test. Do it and exit.
+    run go test -race -v $prefix/...
+    exit
+  fi
+  # Map, e.g., "spanner/client.go" to "$prefix/spanner".
+  d=$(dirname $f)
+  if [[ $d == "." ]]; then
+    pkg=$prefix
+  else
+    pkg=$prefix/$d
+  fi
+  changed_packages[$pkg]=1
+done
+
+echo "changed packages: ${!changed_packages[*]}"
+
+
+# Reports whether its argument, a package name, depends (recursively)
+# on a changed package.
+function depends_on_changed_package {
+  # According to go list, a package does not depend on itself, so
+  # we test that separately.
+  if [[ ${changed_packages[$1]} == 1 ]]; then
+    return 0
+  fi
+  for dep in $(go list -f '{{range .Deps}}{{.}} {{end}}' $1); do
+    if [[ ${changed_packages[$dep]} == 1 ]]; then
+      return 0
+    fi
+  done
+  return 1
+}
+
+# Collect the packages into two separate lists. (It is faster go test a list of
+# packages than to individually go test each one.)
+
+shorts=
+fulls=
+for pkg in $(go list $prefix/...); do      # for each package in the repo
+  if depends_on_changed_package $pkg; then # if it depends on a changed package
+    fulls="$fulls $pkg"                    # run the full test
+  else                                     # otherwise
+    shorts="$shorts $pkg"                  # run the short test
+  fi
+done
+run go test -race -v -short $shorts
+if [[ $fulls != "" ]]; then
+  run go test -race -v $fulls
+fi

+ 0 - 252
vendor/cloud.google.com/go/storage/acl.go

@@ -1,252 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"fmt"
-	"net/http"
-	"reflect"
-
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	raw "google.golang.org/api/storage/v1"
-)
-
-// ACLRole is the level of access to grant.
-type ACLRole string
-
-const (
-	RoleOwner  ACLRole = "OWNER"
-	RoleReader ACLRole = "READER"
-	RoleWriter ACLRole = "WRITER"
-)
-
-// ACLEntity refers to a user or group.
-// They are sometimes referred to as grantees.
-//
-// It could be in the form of:
-// "user-<userId>", "user-<email>", "group-<groupId>", "group-<email>",
-// "domain-<domain>" and "project-team-<projectId>".
-//
-// Or one of the predefined constants: AllUsers, AllAuthenticatedUsers.
-type ACLEntity string
-
-const (
-	AllUsers              ACLEntity = "allUsers"
-	AllAuthenticatedUsers ACLEntity = "allAuthenticatedUsers"
-)
-
-// ACLRule represents a grant for a role to an entity (user, group or team) for a Google Cloud Storage object or bucket.
-type ACLRule struct {
-	Entity ACLEntity
-	Role   ACLRole
-}
-
-// ACLHandle provides operations on an access control list for a Google Cloud Storage bucket or object.
-type ACLHandle struct {
-	c           *Client
-	bucket      string
-	object      string
-	isDefault   bool
-	userProject string // for requester-pays buckets
-}
-
-// Delete permanently deletes the ACL entry for the given entity.
-func (a *ACLHandle) Delete(ctx context.Context, entity ACLEntity) error {
-	if a.object != "" {
-		return a.objectDelete(ctx, entity)
-	}
-	if a.isDefault {
-		return a.bucketDefaultDelete(ctx, entity)
-	}
-	return a.bucketDelete(ctx, entity)
-}
-
-// Set sets the permission level for the given entity.
-func (a *ACLHandle) Set(ctx context.Context, entity ACLEntity, role ACLRole) error {
-	if a.object != "" {
-		return a.objectSet(ctx, entity, role, false)
-	}
-	if a.isDefault {
-		return a.objectSet(ctx, entity, role, true)
-	}
-	return a.bucketSet(ctx, entity, role)
-}
-
-// List retrieves ACL entries.
-func (a *ACLHandle) List(ctx context.Context) ([]ACLRule, error) {
-	if a.object != "" {
-		return a.objectList(ctx)
-	}
-	if a.isDefault {
-		return a.bucketDefaultList(ctx)
-	}
-	return a.bucketList(ctx)
-}
-
-func (a *ACLHandle) bucketDefaultList(ctx context.Context) ([]ACLRule, error) {
-	var acls *raw.ObjectAccessControls
-	var err error
-	err = runWithRetry(ctx, func() error {
-		req := a.c.raw.DefaultObjectAccessControls.List(a.bucket)
-		a.configureCall(req, ctx)
-		acls, err = req.Do()
-		return err
-	})
-	if err != nil {
-		return nil, fmt.Errorf("storage: error listing default object ACL for bucket %q: %v", a.bucket, err)
-	}
-	return toACLRules(acls.Items), nil
-}
-
-func (a *ACLHandle) bucketDefaultDelete(ctx context.Context, entity ACLEntity) error {
-	err := runWithRetry(ctx, func() error {
-		req := a.c.raw.DefaultObjectAccessControls.Delete(a.bucket, string(entity))
-		a.configureCall(req, ctx)
-		return req.Do()
-	})
-	if err != nil {
-		return fmt.Errorf("storage: error deleting default ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
-	}
-	return nil
-}
-
-func (a *ACLHandle) bucketList(ctx context.Context) ([]ACLRule, error) {
-	var acls *raw.BucketAccessControls
-	var err error
-	err = runWithRetry(ctx, func() error {
-		req := a.c.raw.BucketAccessControls.List(a.bucket)
-		a.configureCall(req, ctx)
-		acls, err = req.Do()
-		return err
-	})
-	if err != nil {
-		return nil, fmt.Errorf("storage: error listing bucket ACL for bucket %q: %v", a.bucket, err)
-	}
-	r := make([]ACLRule, len(acls.Items))
-	for i, v := range acls.Items {
-		r[i].Entity = ACLEntity(v.Entity)
-		r[i].Role = ACLRole(v.Role)
-	}
-	return r, nil
-}
-
-func (a *ACLHandle) bucketSet(ctx context.Context, entity ACLEntity, role ACLRole) error {
-	acl := &raw.BucketAccessControl{
-		Bucket: a.bucket,
-		Entity: string(entity),
-		Role:   string(role),
-	}
-	err := runWithRetry(ctx, func() error {
-		req := a.c.raw.BucketAccessControls.Update(a.bucket, string(entity), acl)
-		a.configureCall(req, ctx)
-		_, err := req.Do()
-		return err
-	})
-	if err != nil {
-		return fmt.Errorf("storage: error updating bucket ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
-	}
-	return nil
-}
-
-func (a *ACLHandle) bucketDelete(ctx context.Context, entity ACLEntity) error {
-	err := runWithRetry(ctx, func() error {
-		req := a.c.raw.BucketAccessControls.Delete(a.bucket, string(entity))
-		a.configureCall(req, ctx)
-		return req.Do()
-	})
-	if err != nil {
-		return fmt.Errorf("storage: error deleting bucket ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
-	}
-	return nil
-}
-
-func (a *ACLHandle) objectList(ctx context.Context) ([]ACLRule, error) {
-	var acls *raw.ObjectAccessControls
-	var err error
-	err = runWithRetry(ctx, func() error {
-		req := a.c.raw.ObjectAccessControls.List(a.bucket, a.object)
-		a.configureCall(req, ctx)
-		acls, err = req.Do()
-		return err
-	})
-	if err != nil {
-		return nil, fmt.Errorf("storage: error listing object ACL for bucket %q, file %q: %v", a.bucket, a.object, err)
-	}
-	return toACLRules(acls.Items), nil
-}
-
-func (a *ACLHandle) objectSet(ctx context.Context, entity ACLEntity, role ACLRole, isBucketDefault bool) error {
-	type setRequest interface {
-		Do(opts ...googleapi.CallOption) (*raw.ObjectAccessControl, error)
-		Header() http.Header
-	}
-
-	acl := &raw.ObjectAccessControl{
-		Bucket: a.bucket,
-		Entity: string(entity),
-		Role:   string(role),
-	}
-	var req setRequest
-	if isBucketDefault {
-		req = a.c.raw.DefaultObjectAccessControls.Update(a.bucket, string(entity), acl)
-	} else {
-		req = a.c.raw.ObjectAccessControls.Update(a.bucket, a.object, string(entity), acl)
-	}
-	a.configureCall(req, ctx)
-	err := runWithRetry(ctx, func() error {
-		_, err := req.Do()
-		return err
-	})
-	if err != nil {
-		if isBucketDefault {
-			return fmt.Errorf("storage: error updating default ACL entry for bucket %q, entity %q: %v", a.bucket, entity, err)
-		} else {
-			return fmt.Errorf("storage: error updating object ACL entry for bucket %q, object %q, entity %q: %v", a.bucket, a.object, entity, err)
-		}
-	}
-	return nil
-}
-
-func (a *ACLHandle) objectDelete(ctx context.Context, entity ACLEntity) error {
-	err := runWithRetry(ctx, func() error {
-		req := a.c.raw.ObjectAccessControls.Delete(a.bucket, a.object, string(entity))
-		a.configureCall(req, ctx)
-		return req.Do()
-	})
-	if err != nil {
-		return fmt.Errorf("storage: error deleting object ACL entry for bucket %q, file %q, entity %q: %v", a.bucket, a.object, entity, err)
-	}
-	return nil
-}
-
-func (a *ACLHandle) configureCall(call interface {
-	Header() http.Header
-}, ctx context.Context) {
-	vc := reflect.ValueOf(call)
-	vc.MethodByName("Context").Call([]reflect.Value{reflect.ValueOf(ctx)})
-	if a.userProject != "" {
-		vc.MethodByName("UserProject").Call([]reflect.Value{reflect.ValueOf(a.userProject)})
-	}
-	setClientHeader(call.Header())
-}
-
-func toACLRules(items []*raw.ObjectAccessControl) []ACLRule {
-	r := make([]ACLRule, 0, len(items))
-	for _, item := range items {
-		r = append(r, ACLRule{Entity: ACLEntity(item.Entity), Role: ACLRole(item.Role)})
-	}
-	return r
-}

+ 0 - 590
vendor/cloud.google.com/go/storage/bucket.go

@@ -1,590 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"fmt"
-	"net/http"
-	"reflect"
-	"time"
-
-	"cloud.google.com/go/internal/optional"
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	"google.golang.org/api/iterator"
-	raw "google.golang.org/api/storage/v1"
-)
-
-// BucketHandle provides operations on a Google Cloud Storage bucket.
-// Use Client.Bucket to get a handle.
-type BucketHandle struct {
-	c                *Client
-	name             string
-	acl              ACLHandle
-	defaultObjectACL ACLHandle
-	conds            *BucketConditions
-	userProject      string // project for requester-pays buckets
-}
-
-// Bucket returns a BucketHandle, which provides operations on the named bucket.
-// This call does not perform any network operations.
-//
-// The supplied name must contain only lowercase letters, numbers, dashes,
-// underscores, and dots. The full specification for valid bucket names can be
-// found at:
-//   https://cloud.google.com/storage/docs/bucket-naming
-func (c *Client) Bucket(name string) *BucketHandle {
-	return &BucketHandle{
-		c:    c,
-		name: name,
-		acl: ACLHandle{
-			c:      c,
-			bucket: name,
-		},
-		defaultObjectACL: ACLHandle{
-			c:         c,
-			bucket:    name,
-			isDefault: true,
-		},
-	}
-}
-
-// Create creates the Bucket in the project.
-// If attrs is nil the API defaults will be used.
-func (b *BucketHandle) Create(ctx context.Context, projectID string, attrs *BucketAttrs) error {
-	var bkt *raw.Bucket
-	if attrs != nil {
-		bkt = attrs.toRawBucket()
-	} else {
-		bkt = &raw.Bucket{}
-	}
-	bkt.Name = b.name
-	req := b.c.raw.Buckets.Insert(projectID, bkt)
-	setClientHeader(req.Header())
-	return runWithRetry(ctx, func() error { _, err := req.Context(ctx).Do(); return err })
-}
-
-// Delete deletes the Bucket.
-func (b *BucketHandle) Delete(ctx context.Context) error {
-	req, err := b.newDeleteCall()
-	if err != nil {
-		return err
-	}
-	return runWithRetry(ctx, func() error { return req.Context(ctx).Do() })
-}
-
-func (b *BucketHandle) newDeleteCall() (*raw.BucketsDeleteCall, error) {
-	req := b.c.raw.Buckets.Delete(b.name)
-	setClientHeader(req.Header())
-	if err := applyBucketConds("BucketHandle.Delete", b.conds, req); err != nil {
-		return nil, err
-	}
-	if b.userProject != "" {
-		req.UserProject(b.userProject)
-	}
-	return req, nil
-}
-
-// ACL returns an ACLHandle, which provides access to the bucket's access control list.
-// This controls who can list, create or overwrite the objects in a bucket.
-// This call does not perform any network operations.
-func (b *BucketHandle) ACL() *ACLHandle {
-	return &b.acl
-}
-
-// DefaultObjectACL returns an ACLHandle, which provides access to the bucket's default object ACLs.
-// These ACLs are applied to newly created objects in this bucket that do not have a defined ACL.
-// This call does not perform any network operations.
-func (b *BucketHandle) DefaultObjectACL() *ACLHandle {
-	return &b.defaultObjectACL
-}
-
-// Object returns an ObjectHandle, which provides operations on the named object.
-// This call does not perform any network operations.
-//
-// name must consist entirely of valid UTF-8-encoded runes. The full specification
-// for valid object names can be found at:
-//   https://cloud.google.com/storage/docs/bucket-naming
-func (b *BucketHandle) Object(name string) *ObjectHandle {
-	return &ObjectHandle{
-		c:      b.c,
-		bucket: b.name,
-		object: name,
-		acl: ACLHandle{
-			c:           b.c,
-			bucket:      b.name,
-			object:      name,
-			userProject: b.userProject,
-		},
-		gen:         -1,
-		userProject: b.userProject,
-	}
-}
-
-// Attrs returns the metadata for the bucket.
-func (b *BucketHandle) Attrs(ctx context.Context) (*BucketAttrs, error) {
-	req, err := b.newGetCall()
-	if err != nil {
-		return nil, err
-	}
-	var resp *raw.Bucket
-	err = runWithRetry(ctx, func() error {
-		resp, err = req.Context(ctx).Do()
-		return err
-	})
-	if e, ok := err.(*googleapi.Error); ok && e.Code == http.StatusNotFound {
-		return nil, ErrBucketNotExist
-	}
-	if err != nil {
-		return nil, err
-	}
-	return newBucket(resp), nil
-}
-
-func (b *BucketHandle) newGetCall() (*raw.BucketsGetCall, error) {
-	req := b.c.raw.Buckets.Get(b.name).Projection("full")
-	setClientHeader(req.Header())
-	if err := applyBucketConds("BucketHandle.Attrs", b.conds, req); err != nil {
-		return nil, err
-	}
-	if b.userProject != "" {
-		req.UserProject(b.userProject)
-	}
-	return req, nil
-}
-
-func (b *BucketHandle) Update(ctx context.Context, uattrs BucketAttrsToUpdate) (*BucketAttrs, error) {
-	req, err := b.newPatchCall(&uattrs)
-	if err != nil {
-		return nil, err
-	}
-	// TODO(jba): retry iff metagen is set?
-	rb, err := req.Context(ctx).Do()
-	if err != nil {
-		return nil, err
-	}
-	return newBucket(rb), nil
-}
-
-func (b *BucketHandle) newPatchCall(uattrs *BucketAttrsToUpdate) (*raw.BucketsPatchCall, error) {
-	rb := uattrs.toRawBucket()
-	req := b.c.raw.Buckets.Patch(b.name, rb).Projection("full")
-	setClientHeader(req.Header())
-	if err := applyBucketConds("BucketHandle.Update", b.conds, req); err != nil {
-		return nil, err
-	}
-	if b.userProject != "" {
-		req.UserProject(b.userProject)
-	}
-	return req, nil
-}
-
-// BucketAttrs represents the metadata for a Google Cloud Storage bucket.
-type BucketAttrs struct {
-	// Name is the name of the bucket.
-	Name string
-
-	// ACL is the list of access control rules on the bucket.
-	ACL []ACLRule
-
-	// DefaultObjectACL is the list of access controls to
-	// apply to new objects when no object ACL is provided.
-	DefaultObjectACL []ACLRule
-
-	// Location is the location of the bucket. It defaults to "US".
-	Location string
-
-	// MetaGeneration is the metadata generation of the bucket.
-	MetaGeneration int64
-
-	// StorageClass is the default storage class of the bucket. This defines
-	// how objects in the bucket are stored and determines the SLA
-	// and the cost of storage. Typical values are "MULTI_REGIONAL",
-	// "REGIONAL", "NEARLINE", "COLDLINE", "STANDARD" and
-	// "DURABLE_REDUCED_AVAILABILITY". Defaults to "STANDARD", which
-	// is equivalent to "MULTI_REGIONAL" or "REGIONAL" depending on
-	// the bucket's location settings.
-	StorageClass string
-
-	// Created is the creation time of the bucket.
-	Created time.Time
-
-	// VersioningEnabled reports whether this bucket has versioning enabled.
-	// This field is read-only.
-	VersioningEnabled bool
-
-	// Labels are the bucket's labels.
-	Labels map[string]string
-
-	// RequesterPays reports whether the bucket is a Requester Pays bucket.
-	RequesterPays bool
-}
-
-func newBucket(b *raw.Bucket) *BucketAttrs {
-	if b == nil {
-		return nil
-	}
-	bucket := &BucketAttrs{
-		Name:              b.Name,
-		Location:          b.Location,
-		MetaGeneration:    b.Metageneration,
-		StorageClass:      b.StorageClass,
-		Created:           convertTime(b.TimeCreated),
-		VersioningEnabled: b.Versioning != nil && b.Versioning.Enabled,
-		Labels:            b.Labels,
-		RequesterPays:     b.Billing != nil && b.Billing.RequesterPays,
-	}
-	acl := make([]ACLRule, len(b.Acl))
-	for i, rule := range b.Acl {
-		acl[i] = ACLRule{
-			Entity: ACLEntity(rule.Entity),
-			Role:   ACLRole(rule.Role),
-		}
-	}
-	bucket.ACL = acl
-	objACL := make([]ACLRule, len(b.DefaultObjectAcl))
-	for i, rule := range b.DefaultObjectAcl {
-		objACL[i] = ACLRule{
-			Entity: ACLEntity(rule.Entity),
-			Role:   ACLRole(rule.Role),
-		}
-	}
-	bucket.DefaultObjectACL = objACL
-	return bucket
-}
-
-// toRawBucket copies the editable attribute from b to the raw library's Bucket type.
-func (b *BucketAttrs) toRawBucket() *raw.Bucket {
-	var acl []*raw.BucketAccessControl
-	if len(b.ACL) > 0 {
-		acl = make([]*raw.BucketAccessControl, len(b.ACL))
-		for i, rule := range b.ACL {
-			acl[i] = &raw.BucketAccessControl{
-				Entity: string(rule.Entity),
-				Role:   string(rule.Role),
-			}
-		}
-	}
-	dACL := toRawObjectACL(b.DefaultObjectACL)
-	// Copy label map.
-	var labels map[string]string
-	if len(b.Labels) > 0 {
-		labels = make(map[string]string, len(b.Labels))
-		for k, v := range b.Labels {
-			labels[k] = v
-		}
-	}
-	// Ignore VersioningEnabled if it is false. This is OK because
-	// we only call this method when creating a bucket, and by default
-	// new buckets have versioning off.
-	var v *raw.BucketVersioning
-	if b.VersioningEnabled {
-		v = &raw.BucketVersioning{Enabled: true}
-	}
-	var bb *raw.BucketBilling
-	if b.RequesterPays {
-		bb = &raw.BucketBilling{RequesterPays: true}
-	}
-	return &raw.Bucket{
-		Name:             b.Name,
-		DefaultObjectAcl: dACL,
-		Location:         b.Location,
-		StorageClass:     b.StorageClass,
-		Acl:              acl,
-		Versioning:       v,
-		Labels:           labels,
-		Billing:          bb,
-	}
-}
-
-type BucketAttrsToUpdate struct {
-	// VersioningEnabled, if set, updates whether the bucket uses versioning.
-	VersioningEnabled optional.Bool
-
-	// RequesterPays, if set, updates whether the bucket is a Requester Pays bucket.
-	RequesterPays optional.Bool
-
-	setLabels    map[string]string
-	deleteLabels map[string]bool
-}
-
-// SetLabel causes a label to be added or modified when ua is used
-// in a call to Bucket.Update.
-func (ua *BucketAttrsToUpdate) SetLabel(name, value string) {
-	if ua.setLabels == nil {
-		ua.setLabels = map[string]string{}
-	}
-	ua.setLabels[name] = value
-}
-
-// DeleteLabel causes a label to be deleted when ua is used in a
-// call to Bucket.Update.
-func (ua *BucketAttrsToUpdate) DeleteLabel(name string) {
-	if ua.deleteLabels == nil {
-		ua.deleteLabels = map[string]bool{}
-	}
-	ua.deleteLabels[name] = true
-}
-
-func (ua *BucketAttrsToUpdate) toRawBucket() *raw.Bucket {
-	rb := &raw.Bucket{}
-	if ua.VersioningEnabled != nil {
-		rb.Versioning = &raw.BucketVersioning{
-			Enabled:         optional.ToBool(ua.VersioningEnabled),
-			ForceSendFields: []string{"Enabled"},
-		}
-	}
-	if ua.RequesterPays != nil {
-		rb.Billing = &raw.BucketBilling{
-			RequesterPays:   optional.ToBool(ua.RequesterPays),
-			ForceSendFields: []string{"RequesterPays"},
-		}
-	}
-	if ua.setLabels != nil || ua.deleteLabels != nil {
-		rb.Labels = map[string]string{}
-		for k, v := range ua.setLabels {
-			rb.Labels[k] = v
-		}
-		if len(rb.Labels) == 0 && len(ua.deleteLabels) > 0 {
-			rb.ForceSendFields = append(rb.ForceSendFields, "Labels")
-		}
-		for l := range ua.deleteLabels {
-			rb.NullFields = append(rb.NullFields, "Labels."+l)
-		}
-	}
-	return rb
-}
-
-// If returns a new BucketHandle that applies a set of preconditions.
-// Preconditions already set on the BucketHandle are ignored.
-// Operations on the new handle will only occur if the preconditions are
-// satisfied. The only valid preconditions for buckets are MetagenerationMatch
-// and MetagenerationNotMatch.
-func (b *BucketHandle) If(conds BucketConditions) *BucketHandle {
-	b2 := *b
-	b2.conds = &conds
-	return &b2
-}
-
-// BucketConditions constrain bucket methods to act on specific metagenerations.
-//
-// The zero value is an empty set of constraints.
-type BucketConditions struct {
-	// MetagenerationMatch specifies that the bucket must have the given
-	// metageneration for the operation to occur.
-	// If MetagenerationMatch is zero, it has no effect.
-	MetagenerationMatch int64
-
-	// MetagenerationNotMatch specifies that the bucket must not have the given
-	// metageneration for the operation to occur.
-	// If MetagenerationNotMatch is zero, it has no effect.
-	MetagenerationNotMatch int64
-}
-
-func (c *BucketConditions) validate(method string) error {
-	if *c == (BucketConditions{}) {
-		return fmt.Errorf("storage: %s: empty conditions", method)
-	}
-	if c.MetagenerationMatch != 0 && c.MetagenerationNotMatch != 0 {
-		return fmt.Errorf("storage: %s: multiple conditions specified for metageneration", method)
-	}
-	return nil
-}
-
-// UserProject returns a new BucketHandle that passes the project ID as the user
-// project for all subsequent calls. A user project is required for all operations
-// on requester-pays buckets.
-func (b *BucketHandle) UserProject(projectID string) *BucketHandle {
-	b2 := *b
-	b2.userProject = projectID
-	b2.acl.userProject = projectID
-	b2.defaultObjectACL.userProject = projectID
-	return &b2
-}
-
-// applyBucketConds modifies the provided call using the conditions in conds.
-// call is something that quacks like a *raw.WhateverCall.
-func applyBucketConds(method string, conds *BucketConditions, call interface{}) error {
-	if conds == nil {
-		return nil
-	}
-	if err := conds.validate(method); err != nil {
-		return err
-	}
-	cval := reflect.ValueOf(call)
-	switch {
-	case conds.MetagenerationMatch != 0:
-		if !setConditionField(cval, "IfMetagenerationMatch", conds.MetagenerationMatch) {
-			return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", method)
-		}
-	case conds.MetagenerationNotMatch != 0:
-		if !setConditionField(cval, "IfMetagenerationNotMatch", conds.MetagenerationNotMatch) {
-			return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", method)
-		}
-	}
-	return nil
-}
-
-// Objects returns an iterator over the objects in the bucket that match the Query q.
-// If q is nil, no filtering is done.
-func (b *BucketHandle) Objects(ctx context.Context, q *Query) *ObjectIterator {
-	it := &ObjectIterator{
-		ctx:    ctx,
-		bucket: b,
-	}
-	it.pageInfo, it.nextFunc = iterator.NewPageInfo(
-		it.fetch,
-		func() int { return len(it.items) },
-		func() interface{} { b := it.items; it.items = nil; return b })
-	if q != nil {
-		it.query = *q
-	}
-	return it
-}
-
-// An ObjectIterator is an iterator over ObjectAttrs.
-type ObjectIterator struct {
-	ctx      context.Context
-	bucket   *BucketHandle
-	query    Query
-	pageInfo *iterator.PageInfo
-	nextFunc func() error
-	items    []*ObjectAttrs
-}
-
-// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
-func (it *ObjectIterator) PageInfo() *iterator.PageInfo { return it.pageInfo }
-
-// Next returns the next result. Its second return value is iterator.Done if
-// there are no more results. Once Next returns iterator.Done, all subsequent
-// calls will return iterator.Done.
-//
-// If Query.Delimiter is non-empty, some of the ObjectAttrs returned by Next will
-// have a non-empty Prefix field, and a zero value for all other fields. These
-// represent prefixes.
-func (it *ObjectIterator) Next() (*ObjectAttrs, error) {
-	if err := it.nextFunc(); err != nil {
-		return nil, err
-	}
-	item := it.items[0]
-	it.items = it.items[1:]
-	return item, nil
-}
-
-func (it *ObjectIterator) fetch(pageSize int, pageToken string) (string, error) {
-	req := it.bucket.c.raw.Objects.List(it.bucket.name)
-	setClientHeader(req.Header())
-	req.Projection("full")
-	req.Delimiter(it.query.Delimiter)
-	req.Prefix(it.query.Prefix)
-	req.Versions(it.query.Versions)
-	req.PageToken(pageToken)
-	if it.bucket.userProject != "" {
-		req.UserProject(it.bucket.userProject)
-	}
-	if pageSize > 0 {
-		req.MaxResults(int64(pageSize))
-	}
-	var resp *raw.Objects
-	var err error
-	err = runWithRetry(it.ctx, func() error {
-		resp, err = req.Context(it.ctx).Do()
-		return err
-	})
-	if err != nil {
-		if e, ok := err.(*googleapi.Error); ok && e.Code == http.StatusNotFound {
-			err = ErrBucketNotExist
-		}
-		return "", err
-	}
-	for _, item := range resp.Items {
-		it.items = append(it.items, newObject(item))
-	}
-	for _, prefix := range resp.Prefixes {
-		it.items = append(it.items, &ObjectAttrs{Prefix: prefix})
-	}
-	return resp.NextPageToken, nil
-}
-
-// TODO(jbd): Add storage.buckets.update.
-
-// Buckets returns an iterator over the buckets in the project. You may
-// optionally set the iterator's Prefix field to restrict the list to buckets
-// whose names begin with the prefix. By default, all buckets in the project
-// are returned.
-func (c *Client) Buckets(ctx context.Context, projectID string) *BucketIterator {
-	it := &BucketIterator{
-		ctx:       ctx,
-		client:    c,
-		projectID: projectID,
-	}
-	it.pageInfo, it.nextFunc = iterator.NewPageInfo(
-		it.fetch,
-		func() int { return len(it.buckets) },
-		func() interface{} { b := it.buckets; it.buckets = nil; return b })
-	return it
-}
-
-// A BucketIterator is an iterator over BucketAttrs.
-type BucketIterator struct {
-	// Prefix restricts the iterator to buckets whose names begin with it.
-	Prefix string
-
-	ctx       context.Context
-	client    *Client
-	projectID string
-	buckets   []*BucketAttrs
-	pageInfo  *iterator.PageInfo
-	nextFunc  func() error
-}
-
-// Next returns the next result. Its second return value is iterator.Done if
-// there are no more results. Once Next returns iterator.Done, all subsequent
-// calls will return iterator.Done.
-func (it *BucketIterator) Next() (*BucketAttrs, error) {
-	if err := it.nextFunc(); err != nil {
-		return nil, err
-	}
-	b := it.buckets[0]
-	it.buckets = it.buckets[1:]
-	return b, nil
-}
-
-// PageInfo supports pagination. See the google.golang.org/api/iterator package for details.
-func (it *BucketIterator) PageInfo() *iterator.PageInfo { return it.pageInfo }
-
-func (it *BucketIterator) fetch(pageSize int, pageToken string) (string, error) {
-	req := it.client.raw.Buckets.List(it.projectID)
-	setClientHeader(req.Header())
-	req.Projection("full")
-	req.Prefix(it.Prefix)
-	req.PageToken(pageToken)
-	if pageSize > 0 {
-		req.MaxResults(int64(pageSize))
-	}
-	var resp *raw.Buckets
-	var err error
-	err = runWithRetry(it.ctx, func() error {
-		resp, err = req.Context(it.ctx).Do()
-		return err
-	})
-	if err != nil {
-		return "", err
-	}
-	for _, item := range resp.Items {
-		it.buckets = append(it.buckets, newBucket(item))
-	}
-	return resp.NextPageToken, nil
-}

+ 0 - 201
vendor/cloud.google.com/go/storage/copy.go

@@ -1,201 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"errors"
-	"fmt"
-
-	"golang.org/x/net/context"
-	raw "google.golang.org/api/storage/v1"
-)
-
-// CopierFrom creates a Copier that can copy src to dst.
-// You can immediately call Run on the returned Copier, or
-// you can configure it first.
-//
-// For Requester Pays buckets, the user project of dst is billed, unless it is empty,
-// in which case the user project of src is billed.
-func (dst *ObjectHandle) CopierFrom(src *ObjectHandle) *Copier {
-	return &Copier{dst: dst, src: src}
-}
-
-// A Copier copies a source object to a destination.
-type Copier struct {
-	// ObjectAttrs are optional attributes to set on the destination object.
-	// Any attributes must be initialized before any calls on the Copier. Nil
-	// or zero-valued attributes are ignored.
-	ObjectAttrs
-
-	// RewriteToken can be set before calling Run to resume a copy
-	// operation. After Run returns a non-nil error, RewriteToken will
-	// have been updated to contain the value needed to resume the copy.
-	RewriteToken string
-
-	// ProgressFunc can be used to monitor the progress of a multi-RPC copy
-	// operation. If ProgressFunc is not nil and copying requires multiple
-	// calls to the underlying service (see
-	// https://cloud.google.com/storage/docs/json_api/v1/objects/rewrite), then
-	// ProgressFunc will be invoked after each call with the number of bytes of
-	// content copied so far and the total size in bytes of the source object.
-	//
-	// ProgressFunc is intended to make upload progress available to the
-	// application. For example, the implementation of ProgressFunc may update
-	// a progress bar in the application's UI, or log the result of
-	// float64(copiedBytes)/float64(totalBytes).
-	//
-	// ProgressFunc should return quickly without blocking.
-	ProgressFunc func(copiedBytes, totalBytes uint64)
-
-	dst, src *ObjectHandle
-}
-
-// Run performs the copy.
-func (c *Copier) Run(ctx context.Context) (*ObjectAttrs, error) {
-	if err := c.src.validate(); err != nil {
-		return nil, err
-	}
-	if err := c.dst.validate(); err != nil {
-		return nil, err
-	}
-	// Convert destination attributes to raw form, omitting the bucket.
-	// If the bucket is included but name or content-type aren't, the service
-	// returns a 400 with "Required" as the only message. Omitting the bucket
-	// does not cause any problems.
-	rawObject := c.ObjectAttrs.toRawObject("")
-	for {
-		res, err := c.callRewrite(ctx, rawObject)
-		if err != nil {
-			return nil, err
-		}
-		if c.ProgressFunc != nil {
-			c.ProgressFunc(uint64(res.TotalBytesRewritten), uint64(res.ObjectSize))
-		}
-		if res.Done { // Finished successfully.
-			return newObject(res.Resource), nil
-		}
-	}
-}
-
-func (c *Copier) callRewrite(ctx context.Context, rawObj *raw.Object) (*raw.RewriteResponse, error) {
-	call := c.dst.c.raw.Objects.Rewrite(c.src.bucket, c.src.object, c.dst.bucket, c.dst.object, rawObj)
-
-	call.Context(ctx).Projection("full")
-	if c.RewriteToken != "" {
-		call.RewriteToken(c.RewriteToken)
-	}
-	if err := applyConds("Copy destination", c.dst.gen, c.dst.conds, call); err != nil {
-		return nil, err
-	}
-	if c.dst.userProject != "" {
-		call.UserProject(c.dst.userProject)
-	} else if c.src.userProject != "" {
-		call.UserProject(c.src.userProject)
-	}
-	if err := applySourceConds(c.src.gen, c.src.conds, call); err != nil {
-		return nil, err
-	}
-	if err := setEncryptionHeaders(call.Header(), c.dst.encryptionKey, false); err != nil {
-		return nil, err
-	}
-	if err := setEncryptionHeaders(call.Header(), c.src.encryptionKey, true); err != nil {
-		return nil, err
-	}
-	var res *raw.RewriteResponse
-	var err error
-	setClientHeader(call.Header())
-	err = runWithRetry(ctx, func() error { res, err = call.Do(); return err })
-	if err != nil {
-		return nil, err
-	}
-	c.RewriteToken = res.RewriteToken
-	return res, nil
-}
-
-// ComposerFrom creates a Composer that can compose srcs into dst.
-// You can immediately call Run on the returned Composer, or you can
-// configure it first.
-//
-// The encryption key for the destination object will be used to decrypt all
-// source objects and encrypt the destination object. It is an error
-// to specify an encryption key for any of the source objects.
-func (dst *ObjectHandle) ComposerFrom(srcs ...*ObjectHandle) *Composer {
-	return &Composer{dst: dst, srcs: srcs}
-}
-
-// A Composer composes source objects into a destination object.
-//
-// For Requester Pays buckets, the user project of dst is billed.
-type Composer struct {
-	// ObjectAttrs are optional attributes to set on the destination object.
-	// Any attributes must be initialized before any calls on the Composer. Nil
-	// or zero-valued attributes are ignored.
-	ObjectAttrs
-
-	dst  *ObjectHandle
-	srcs []*ObjectHandle
-}
-
-// Run performs the compose operation.
-func (c *Composer) Run(ctx context.Context) (*ObjectAttrs, error) {
-	if err := c.dst.validate(); err != nil {
-		return nil, err
-	}
-	if len(c.srcs) == 0 {
-		return nil, errors.New("storage: at least one source object must be specified")
-	}
-
-	req := &raw.ComposeRequest{}
-	// Compose requires a non-empty Destination, so we always set it,
-	// even if the caller-provided ObjectAttrs is the zero value.
-	req.Destination = c.ObjectAttrs.toRawObject(c.dst.bucket)
-	for _, src := range c.srcs {
-		if err := src.validate(); err != nil {
-			return nil, err
-		}
-		if src.bucket != c.dst.bucket {
-			return nil, fmt.Errorf("storage: all source objects must be in bucket %q, found %q", c.dst.bucket, src.bucket)
-		}
-		if src.encryptionKey != nil {
-			return nil, fmt.Errorf("storage: compose source %s.%s must not have encryption key", src.bucket, src.object)
-		}
-		srcObj := &raw.ComposeRequestSourceObjects{
-			Name: src.object,
-		}
-		if err := applyConds("ComposeFrom source", src.gen, src.conds, composeSourceObj{srcObj}); err != nil {
-			return nil, err
-		}
-		req.SourceObjects = append(req.SourceObjects, srcObj)
-	}
-
-	call := c.dst.c.raw.Objects.Compose(c.dst.bucket, c.dst.object, req).Context(ctx)
-	if err := applyConds("ComposeFrom destination", c.dst.gen, c.dst.conds, call); err != nil {
-		return nil, err
-	}
-	if c.dst.userProject != "" {
-		call.UserProject(c.dst.userProject)
-	}
-	if err := setEncryptionHeaders(call.Header(), c.dst.encryptionKey, false); err != nil {
-		return nil, err
-	}
-	var obj *raw.Object
-	var err error
-	setClientHeader(call.Header())
-	err = runWithRetry(ctx, func() error { obj, err = call.Do(); return err })
-	if err != nil {
-		return nil, err
-	}
-	return newObject(obj), nil
-}

+ 0 - 161
vendor/cloud.google.com/go/storage/doc.go

@@ -1,161 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-/*
-Package storage provides an easy way to work with Google Cloud Storage.
-Google Cloud Storage stores data in named objects, which are grouped into buckets.
-
-More information about Google Cloud Storage is available at
-https://cloud.google.com/storage/docs.
-
-All of the methods of this package use exponential backoff to retry calls
-that fail with certain errors, as described in
-https://cloud.google.com/storage/docs/exponential-backoff.
-
-Note: This package is in beta.  Some backwards-incompatible changes may occur.
-
-
-Creating a Client
-
-To start working with this package, create a client:
-
-    ctx := context.Background()
-    client, err := storage.NewClient(ctx)
-    if err != nil {
-        // TODO: Handle error.
-    }
-
-Buckets
-
-A Google Cloud Storage bucket is a collection of objects. To work with a
-bucket, make a bucket handle:
-
-    bkt := client.Bucket(bucketName)
-
-A handle is a reference to a bucket. You can have a handle even if the
-bucket doesn't exist yet. To create a bucket in Google Cloud Storage,
-call Create on the handle:
-
-    if err := bkt.Create(ctx, projectID, nil); err != nil {
-        // TODO: Handle error.
-    }
-
-Note that although buckets are associated with projects, bucket names are
-global across all projects.
-
-Each bucket has associated metadata, represented in this package by
-BucketAttrs. The third argument to BucketHandle.Create allows you to set
-the intial BucketAttrs of a bucket. To retrieve a bucket's attributes, use
-Attrs:
-
-    attrs, err := bkt.Attrs(ctx)
-    if err != nil {
-        // TODO: Handle error.
-    }
-    fmt.Printf("bucket %s, created at %s, is located in %s with storage class %s\n",
-        attrs.Name, attrs.Created, attrs.Location, attrs.StorageClass)
-
-Objects
-
-An object holds arbitrary data as a sequence of bytes, like a file. You
-refer to objects using a handle, just as with buckets. You can use the
-standard Go io.Reader and io.Writer interfaces to read and write
-object data:
-
-    obj := bkt.Object("data")
-    // Write something to obj.
-    // w implements io.Writer.
-    w := obj.NewWriter(ctx)
-    // Write some text to obj. This will overwrite whatever is there.
-    if _, err := fmt.Fprintf(w, "This object contains text.\n"); err != nil {
-        // TODO: Handle error.
-    }
-    // Close, just like writing a file.
-    if err := w.Close(); err != nil {
-        // TODO: Handle error.
-    }
-
-    // Read it back.
-    r, err := obj.NewReader(ctx)
-    if err != nil {
-        // TODO: Handle error.
-    }
-    defer r.Close()
-    if _, err := io.Copy(os.Stdout, r); err != nil {
-        // TODO: Handle error.
-    }
-    // Prints "This object contains text."
-
-Objects also have attributes, which you can fetch with Attrs:
-
-    objAttrs, err := obj.Attrs(ctx)
-    if err != nil {
-        // TODO: Handle error.
-    }
-    fmt.Printf("object %s has size %d and can be read using %s\n",
-        objAttrs.Name, objAttrs.Size, objAttrs.MediaLink)
-
-ACLs
-
-Both objects and buckets have ACLs (Access Control Lists). An ACL is a list of
-ACLRules, each of which specifies the role of a user, group or project. ACLs
-are suitable for fine-grained control, but you may prefer using IAM to control
-access at the project level (see
-https://cloud.google.com/storage/docs/access-control/iam).
-
-To list the ACLs of a bucket or object, obtain an ACLHandle and call its List method:
-
-    acls, err := obj.ACL().List(ctx)
-    if err != nil {
-        // TODO: Handle error.
-    }
-    for _, rule := range acls {
-        fmt.Printf("%s has role %s\n", rule.Entity, rule.Role)
-    }
-
-You can also set and delete ACLs.
-
-Conditions
-
-Every object has a generation and a metageneration. The generation changes
-whenever the content changes, and the metageneration changes whenever the
-metadata changes. Conditions let you check these values before an operation;
-the operation only executes if the conditions match. You can use conditions to
-prevent race conditions in read-modify-write operations.
-
-For example, say you've read an object's metadata into objAttrs. Now
-you want to write to that object, but only if its contents haven't changed
-since you read it. Here is how to express that:
-
-    w = obj.If(storage.Conditions{GenerationMatch: objAttrs.Generation}).NewWriter(ctx)
-    // Proceed with writing as above.
-
-Signed URLs
-
-You can obtain a URL that lets anyone read or write an object for a limited time.
-You don't need to create a client to do this. See the documentation of
-SignedURL for details.
-
-    url, err := storage.SignedURL(bucketName, "shared-object", opts)
-    if err != nil {
-        // TODO: Handle error.
-    }
-    fmt.Println(url)
-
-Authentication
-
-See examples of authorization and authentication at
-https://godoc.org/cloud.google.com/go#pkg-examples.
-*/
-package storage // import "cloud.google.com/go/storage"

+ 0 - 26
vendor/cloud.google.com/go/storage/go17.go

@@ -1,26 +0,0 @@
-// Copyright 2017 Google Inc. All Rights Reserved.
-//
-// 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 go1.7
-
-package storage
-
-import (
-	"context"
-	"net/http"
-)
-
-func withContext(r *http.Request, ctx context.Context) *http.Request {
-	return r.WithContext(ctx)
-}

+ 0 - 108
vendor/cloud.google.com/go/storage/iam.go

@@ -1,108 +0,0 @@
-// Copyright 2017 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"cloud.google.com/go/iam"
-	"golang.org/x/net/context"
-	raw "google.golang.org/api/storage/v1"
-	iampb "google.golang.org/genproto/googleapis/iam/v1"
-)
-
-// IAM provides access to IAM access control for the bucket.
-func (b *BucketHandle) IAM() *iam.Handle {
-	return iam.InternalNewHandleClient(&iamClient{raw: b.c.raw}, b.name)
-}
-
-// iamClient implements the iam.client interface.
-type iamClient struct {
-	raw *raw.Service
-}
-
-func (c *iamClient) Get(ctx context.Context, resource string) (*iampb.Policy, error) {
-	req := c.raw.Buckets.GetIamPolicy(resource)
-	setClientHeader(req.Header())
-	var rp *raw.Policy
-	var err error
-	err = runWithRetry(ctx, func() error {
-		rp, err = req.Context(ctx).Do()
-		return err
-	})
-	if err != nil {
-		return nil, err
-	}
-	return iamFromStoragePolicy(rp), nil
-}
-
-func (c *iamClient) Set(ctx context.Context, resource string, p *iampb.Policy) error {
-	rp := iamToStoragePolicy(p)
-	req := c.raw.Buckets.SetIamPolicy(resource, rp)
-	setClientHeader(req.Header())
-	return runWithRetry(ctx, func() error {
-		_, err := req.Context(ctx).Do()
-		return err
-	})
-}
-
-func (c *iamClient) Test(ctx context.Context, resource string, perms []string) ([]string, error) {
-	req := c.raw.Buckets.TestIamPermissions(resource, perms)
-	setClientHeader(req.Header())
-	var res *raw.TestIamPermissionsResponse
-	var err error
-	err = runWithRetry(ctx, func() error {
-		res, err = req.Context(ctx).Do()
-		return err
-	})
-	if err != nil {
-		return nil, err
-	}
-	return res.Permissions, nil
-}
-
-func iamToStoragePolicy(ip *iampb.Policy) *raw.Policy {
-	return &raw.Policy{
-		Bindings: iamToStorageBindings(ip.Bindings),
-		Etag:     string(ip.Etag),
-	}
-}
-
-func iamToStorageBindings(ibs []*iampb.Binding) []*raw.PolicyBindings {
-	var rbs []*raw.PolicyBindings
-	for _, ib := range ibs {
-		rbs = append(rbs, &raw.PolicyBindings{
-			Role:    ib.Role,
-			Members: ib.Members,
-		})
-	}
-	return rbs
-}
-
-func iamFromStoragePolicy(rp *raw.Policy) *iampb.Policy {
-	return &iampb.Policy{
-		Bindings: iamFromStorageBindings(rp.Bindings),
-		Etag:     []byte(rp.Etag),
-	}
-}
-
-func iamFromStorageBindings(rbs []*raw.PolicyBindings) []*iampb.Binding {
-	var ibs []*iampb.Binding
-	for _, rb := range rbs {
-		ibs = append(ibs, &iampb.Binding{
-			Role:    rb.Role,
-			Members: rb.Members,
-		})
-	}
-	return ibs
-}

+ 0 - 43
vendor/cloud.google.com/go/storage/invoke.go

@@ -1,43 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"cloud.google.com/go/internal"
-	gax "github.com/googleapis/gax-go"
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-)
-
-// runWithRetry calls the function until it returns nil or a non-retryable error, or
-// the context is done.
-func runWithRetry(ctx context.Context, call func() error) error {
-	return internal.Retry(ctx, gax.Backoff{}, func() (stop bool, err error) {
-		err = call()
-		if err == nil {
-			return true, nil
-		}
-		e, ok := err.(*googleapi.Error)
-		if !ok {
-			return true, err
-		}
-		// Retry on 429 and 5xx, according to
-		// https://cloud.google.com/storage/docs/exponential-backoff.
-		if e.Code == 429 || (e.Code >= 500 && e.Code < 600) {
-			return false, nil
-		}
-		return true, err
-	})
-}

+ 0 - 26
vendor/cloud.google.com/go/storage/not_go17.go

@@ -1,26 +0,0 @@
-// Copyright 2017 Google Inc. All Rights Reserved.
-//
-// 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 !go1.7
-
-package storage
-
-import (
-	"net/http"
-)
-
-func withContext(r *http.Request, _ interface{}) *http.Request {
-	// In Go 1.6 and below, ignore the context.
-	return r
-}

+ 0 - 74
vendor/cloud.google.com/go/storage/reader.go

@@ -1,74 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"fmt"
-	"hash/crc32"
-	"io"
-)
-
-var crc32cTable = crc32.MakeTable(crc32.Castagnoli)
-
-// Reader reads a Cloud Storage object.
-// It implements io.Reader.
-type Reader struct {
-	body         io.ReadCloser
-	remain, size int64
-	contentType  string
-	checkCRC     bool   // should we check the CRC?
-	wantCRC      uint32 // the CRC32c value the server sent in the header
-	gotCRC       uint32 // running crc
-}
-
-// Close closes the Reader. It must be called when done reading.
-func (r *Reader) Close() error {
-	return r.body.Close()
-}
-
-func (r *Reader) Read(p []byte) (int, error) {
-	n, err := r.body.Read(p)
-	if r.remain != -1 {
-		r.remain -= int64(n)
-	}
-	if r.checkCRC {
-		r.gotCRC = crc32.Update(r.gotCRC, crc32cTable, p[:n])
-		// Check CRC here. It would be natural to check it in Close, but
-		// everybody defers Close on the assumption that it doesn't return
-		// anything worth looking at.
-		if r.remain == 0 && r.gotCRC != r.wantCRC {
-			return n, fmt.Errorf("storage: bad CRC on read: got %d, want %d",
-				r.gotCRC, r.wantCRC)
-		}
-	}
-	return n, err
-}
-
-// Size returns the size of the object in bytes.
-// The returned value is always the same and is not affected by
-// calls to Read or Close.
-func (r *Reader) Size() int64 {
-	return r.size
-}
-
-// Remain returns the number of bytes left to read, or -1 if unknown.
-func (r *Reader) Remain() int64 {
-	return r.remain
-}
-
-// ContentType returns the content type of the object.
-func (r *Reader) ContentType() string {
-	return r.contentType
-}

+ 0 - 1117
vendor/cloud.google.com/go/storage/storage.go

@@ -1,1117 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"bytes"
-	"crypto"
-	"crypto/rand"
-	"crypto/rsa"
-	"crypto/sha256"
-	"crypto/x509"
-	"encoding/base64"
-	"encoding/pem"
-	"errors"
-	"fmt"
-	"io"
-	"io/ioutil"
-	"net/http"
-	"net/url"
-	"reflect"
-	"strconv"
-	"strings"
-	"time"
-	"unicode/utf8"
-
-	"google.golang.org/api/option"
-	htransport "google.golang.org/api/transport/http"
-
-	"cloud.google.com/go/internal/optional"
-	"cloud.google.com/go/internal/version"
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	raw "google.golang.org/api/storage/v1"
-)
-
-var (
-	ErrBucketNotExist = errors.New("storage: bucket doesn't exist")
-	ErrObjectNotExist = errors.New("storage: object doesn't exist")
-)
-
-const userAgent = "gcloud-golang-storage/20151204"
-
-const (
-	// ScopeFullControl grants permissions to manage your
-	// data and permissions in Google Cloud Storage.
-	ScopeFullControl = raw.DevstorageFullControlScope
-
-	// ScopeReadOnly grants permissions to
-	// view your data in Google Cloud Storage.
-	ScopeReadOnly = raw.DevstorageReadOnlyScope
-
-	// ScopeReadWrite grants permissions to manage your
-	// data in Google Cloud Storage.
-	ScopeReadWrite = raw.DevstorageReadWriteScope
-)
-
-var xGoogHeader = fmt.Sprintf("gl-go/%s gccl/%s", version.Go(), version.Repo)
-
-func setClientHeader(headers http.Header) {
-	headers.Set("x-goog-api-client", xGoogHeader)
-}
-
-// Client is a client for interacting with Google Cloud Storage.
-//
-// Clients should be reused instead of created as needed.
-// The methods of Client are safe for concurrent use by multiple goroutines.
-type Client struct {
-	hc  *http.Client
-	raw *raw.Service
-}
-
-// NewClient creates a new Google Cloud Storage client.
-// The default scope is ScopeFullControl. To use a different scope, like ScopeReadOnly, use option.WithScopes.
-func NewClient(ctx context.Context, opts ...option.ClientOption) (*Client, error) {
-	o := []option.ClientOption{
-		option.WithScopes(ScopeFullControl),
-		option.WithUserAgent(userAgent),
-	}
-	opts = append(o, opts...)
-	hc, ep, err := htransport.NewClient(ctx, opts...)
-	if err != nil {
-		return nil, fmt.Errorf("dialing: %v", err)
-	}
-	rawService, err := raw.New(hc)
-	if err != nil {
-		return nil, fmt.Errorf("storage client: %v", err)
-	}
-	if ep != "" {
-		rawService.BasePath = ep
-	}
-	return &Client{
-		hc:  hc,
-		raw: rawService,
-	}, nil
-}
-
-// Close closes the Client.
-//
-// Close need not be called at program exit.
-func (c *Client) Close() error {
-	c.hc = nil
-	return nil
-}
-
-// SignedURLOptions allows you to restrict the access to the signed URL.
-type SignedURLOptions struct {
-	// GoogleAccessID represents the authorizer of the signed URL generation.
-	// It is typically the Google service account client email address from
-	// the Google Developers Console in the form of "xxx@developer.gserviceaccount.com".
-	// Required.
-	GoogleAccessID string
-
-	// PrivateKey is the Google service account private key. It is obtainable
-	// from the Google Developers Console.
-	// At https://console.developers.google.com/project/<your-project-id>/apiui/credential,
-	// create a service account client ID or reuse one of your existing service account
-	// credentials. Click on the "Generate new P12 key" to generate and download
-	// a new private key. Once you download the P12 file, use the following command
-	// to convert it into a PEM file.
-	//
-	//    $ openssl pkcs12 -in key.p12 -passin pass:notasecret -out key.pem -nodes
-	//
-	// Provide the contents of the PEM file as a byte slice.
-	// Exactly one of PrivateKey or SignBytes must be non-nil.
-	PrivateKey []byte
-
-	// SignBytes is a function for implementing custom signing.
-	// If your application is running on Google App Engine, you can use appengine's internal signing function:
-	//     ctx := appengine.NewContext(request)
-	//     acc, _ := appengine.ServiceAccount(ctx)
-	//     url, err := SignedURL("bucket", "object", &SignedURLOptions{
-	//     	GoogleAccessID: acc,
-	//     	SignBytes: func(b []byte) ([]byte, error) {
-	//     		_, signedBytes, err := appengine.SignBytes(ctx, b)
-	//     		return signedBytes, err
-	//     	},
-	//     	// etc.
-	//     })
-	//
-	// Exactly one of PrivateKey or SignBytes must be non-nil.
-	SignBytes func([]byte) ([]byte, error)
-
-	// Method is the HTTP method to be used with the signed URL.
-	// Signed URLs can be used with GET, HEAD, PUT, and DELETE requests.
-	// Required.
-	Method string
-
-	// Expires is the expiration time on the signed URL. It must be
-	// a datetime in the future.
-	// Required.
-	Expires time.Time
-
-	// ContentType is the content type header the client must provide
-	// to use the generated signed URL.
-	// Optional.
-	ContentType string
-
-	// Headers is a list of extention headers the client must provide
-	// in order to use the generated signed URL.
-	// Optional.
-	Headers []string
-
-	// MD5 is the base64 encoded MD5 checksum of the file.
-	// If provided, the client should provide the exact value on the request
-	// header in order to use the signed URL.
-	// Optional.
-	MD5 string
-}
-
-// SignedURL returns a URL for the specified object. Signed URLs allow
-// the users access to a restricted resource for a limited time without having a
-// Google account or signing in. For more information about the signed
-// URLs, see https://cloud.google.com/storage/docs/accesscontrol#Signed-URLs.
-func SignedURL(bucket, name string, opts *SignedURLOptions) (string, error) {
-	if opts == nil {
-		return "", errors.New("storage: missing required SignedURLOptions")
-	}
-	if opts.GoogleAccessID == "" {
-		return "", errors.New("storage: missing required GoogleAccessID")
-	}
-	if (opts.PrivateKey == nil) == (opts.SignBytes == nil) {
-		return "", errors.New("storage: exactly one of PrivateKey or SignedBytes must be set")
-	}
-	if opts.Method == "" {
-		return "", errors.New("storage: missing required method option")
-	}
-	if opts.Expires.IsZero() {
-		return "", errors.New("storage: missing required expires option")
-	}
-	if opts.MD5 != "" {
-		md5, err := base64.StdEncoding.DecodeString(opts.MD5)
-		if err != nil || len(md5) != 16 {
-			return "", errors.New("storage: invalid MD5 checksum")
-		}
-	}
-
-	signBytes := opts.SignBytes
-	if opts.PrivateKey != nil {
-		key, err := parseKey(opts.PrivateKey)
-		if err != nil {
-			return "", err
-		}
-		signBytes = func(b []byte) ([]byte, error) {
-			sum := sha256.Sum256(b)
-			return rsa.SignPKCS1v15(
-				rand.Reader,
-				key,
-				crypto.SHA256,
-				sum[:],
-			)
-		}
-	}
-
-	u := &url.URL{
-		Path: fmt.Sprintf("/%s/%s", bucket, name),
-	}
-
-	buf := &bytes.Buffer{}
-	fmt.Fprintf(buf, "%s\n", opts.Method)
-	fmt.Fprintf(buf, "%s\n", opts.MD5)
-	fmt.Fprintf(buf, "%s\n", opts.ContentType)
-	fmt.Fprintf(buf, "%d\n", opts.Expires.Unix())
-	if len(opts.Headers) > 0 {
-		fmt.Fprintf(buf, "%s\n", strings.Join(opts.Headers, "\n"))
-	}
-	fmt.Fprintf(buf, "%s", u.String())
-
-	b, err := signBytes(buf.Bytes())
-	if err != nil {
-		return "", err
-	}
-	encoded := base64.StdEncoding.EncodeToString(b)
-	u.Scheme = "https"
-	u.Host = "storage.googleapis.com"
-	q := u.Query()
-	q.Set("GoogleAccessId", opts.GoogleAccessID)
-	q.Set("Expires", fmt.Sprintf("%d", opts.Expires.Unix()))
-	q.Set("Signature", string(encoded))
-	u.RawQuery = q.Encode()
-	return u.String(), nil
-}
-
-// ObjectHandle provides operations on an object in a Google Cloud Storage bucket.
-// Use BucketHandle.Object to get a handle.
-type ObjectHandle struct {
-	c             *Client
-	bucket        string
-	object        string
-	acl           ACLHandle
-	gen           int64 // a negative value indicates latest
-	conds         *Conditions
-	encryptionKey []byte // AES-256 key
-	userProject   string // for requester-pays buckets
-}
-
-// ACL provides access to the object's access control list.
-// This controls who can read and write this object.
-// This call does not perform any network operations.
-func (o *ObjectHandle) ACL() *ACLHandle {
-	return &o.acl
-}
-
-// Generation returns a new ObjectHandle that operates on a specific generation
-// of the object.
-// By default, the handle operates on the latest generation. Not
-// all operations work when given a specific generation; check the API
-// endpoints at https://cloud.google.com/storage/docs/json_api/ for details.
-func (o *ObjectHandle) Generation(gen int64) *ObjectHandle {
-	o2 := *o
-	o2.gen = gen
-	return &o2
-}
-
-// If returns a new ObjectHandle that applies a set of preconditions.
-// Preconditions already set on the ObjectHandle are ignored.
-// Operations on the new handle will only occur if the preconditions are
-// satisfied. See https://cloud.google.com/storage/docs/generations-preconditions
-// for more details.
-func (o *ObjectHandle) If(conds Conditions) *ObjectHandle {
-	o2 := *o
-	o2.conds = &conds
-	return &o2
-}
-
-// Key returns a new ObjectHandle that uses the supplied encryption
-// key to encrypt and decrypt the object's contents.
-//
-// Encryption key must be a 32-byte AES-256 key.
-// See https://cloud.google.com/storage/docs/encryption for details.
-func (o *ObjectHandle) Key(encryptionKey []byte) *ObjectHandle {
-	o2 := *o
-	o2.encryptionKey = encryptionKey
-	return &o2
-}
-
-// Attrs returns meta information about the object.
-// ErrObjectNotExist will be returned if the object is not found.
-func (o *ObjectHandle) Attrs(ctx context.Context) (*ObjectAttrs, error) {
-	if err := o.validate(); err != nil {
-		return nil, err
-	}
-	call := o.c.raw.Objects.Get(o.bucket, o.object).Projection("full").Context(ctx)
-	if err := applyConds("Attrs", o.gen, o.conds, call); err != nil {
-		return nil, err
-	}
-	if o.userProject != "" {
-		call.UserProject(o.userProject)
-	}
-	if err := setEncryptionHeaders(call.Header(), o.encryptionKey, false); err != nil {
-		return nil, err
-	}
-	var obj *raw.Object
-	var err error
-	setClientHeader(call.Header())
-	err = runWithRetry(ctx, func() error { obj, err = call.Do(); return err })
-	if e, ok := err.(*googleapi.Error); ok && e.Code == http.StatusNotFound {
-		return nil, ErrObjectNotExist
-	}
-	if err != nil {
-		return nil, err
-	}
-	return newObject(obj), nil
-}
-
-// Update updates an object with the provided attributes.
-// All zero-value attributes are ignored.
-// ErrObjectNotExist will be returned if the object is not found.
-func (o *ObjectHandle) Update(ctx context.Context, uattrs ObjectAttrsToUpdate) (*ObjectAttrs, error) {
-	if err := o.validate(); err != nil {
-		return nil, err
-	}
-	var attrs ObjectAttrs
-	// Lists of fields to send, and set to null, in the JSON.
-	var forceSendFields, nullFields []string
-	if uattrs.ContentType != nil {
-		attrs.ContentType = optional.ToString(uattrs.ContentType)
-		forceSendFields = append(forceSendFields, "ContentType")
-	}
-	if uattrs.ContentLanguage != nil {
-		attrs.ContentLanguage = optional.ToString(uattrs.ContentLanguage)
-		// For ContentLanguage It's an error to send the empty string.
-		// Instead we send a null.
-		if attrs.ContentLanguage == "" {
-			nullFields = append(nullFields, "ContentLanguage")
-		} else {
-			forceSendFields = append(forceSendFields, "ContentLanguage")
-		}
-	}
-	if uattrs.ContentEncoding != nil {
-		attrs.ContentEncoding = optional.ToString(uattrs.ContentEncoding)
-		forceSendFields = append(forceSendFields, "ContentEncoding")
-	}
-	if uattrs.ContentDisposition != nil {
-		attrs.ContentDisposition = optional.ToString(uattrs.ContentDisposition)
-		forceSendFields = append(forceSendFields, "ContentDisposition")
-	}
-	if uattrs.CacheControl != nil {
-		attrs.CacheControl = optional.ToString(uattrs.CacheControl)
-		forceSendFields = append(forceSendFields, "CacheControl")
-	}
-	if uattrs.Metadata != nil {
-		attrs.Metadata = uattrs.Metadata
-		if len(attrs.Metadata) == 0 {
-			// Sending the empty map is a no-op. We send null instead.
-			nullFields = append(nullFields, "Metadata")
-		} else {
-			forceSendFields = append(forceSendFields, "Metadata")
-		}
-	}
-	if uattrs.ACL != nil {
-		attrs.ACL = uattrs.ACL
-		// It's an error to attempt to delete the ACL, so
-		// we don't append to nullFields here.
-		forceSendFields = append(forceSendFields, "Acl")
-	}
-	rawObj := attrs.toRawObject(o.bucket)
-	rawObj.ForceSendFields = forceSendFields
-	rawObj.NullFields = nullFields
-	call := o.c.raw.Objects.Patch(o.bucket, o.object, rawObj).Projection("full").Context(ctx)
-	if err := applyConds("Update", o.gen, o.conds, call); err != nil {
-		return nil, err
-	}
-	if o.userProject != "" {
-		call.UserProject(o.userProject)
-	}
-	if err := setEncryptionHeaders(call.Header(), o.encryptionKey, false); err != nil {
-		return nil, err
-	}
-	var obj *raw.Object
-	var err error
-	setClientHeader(call.Header())
-	err = runWithRetry(ctx, func() error { obj, err = call.Do(); return err })
-	if e, ok := err.(*googleapi.Error); ok && e.Code == http.StatusNotFound {
-		return nil, ErrObjectNotExist
-	}
-	if err != nil {
-		return nil, err
-	}
-	return newObject(obj), nil
-}
-
-// ObjectAttrsToUpdate is used to update the attributes of an object.
-// Only fields set to non-nil values will be updated.
-// Set a field to its zero value to delete it.
-//
-// For example, to change ContentType and delete ContentEncoding and
-// Metadata, use
-//    ObjectAttrsToUpdate{
-//        ContentType: "text/html",
-//        ContentEncoding: "",
-//        Metadata: map[string]string{},
-//    }
-type ObjectAttrsToUpdate struct {
-	ContentType        optional.String
-	ContentLanguage    optional.String
-	ContentEncoding    optional.String
-	ContentDisposition optional.String
-	CacheControl       optional.String
-	Metadata           map[string]string // set to map[string]string{} to delete
-	ACL                []ACLRule
-}
-
-// Delete deletes the single specified object.
-func (o *ObjectHandle) Delete(ctx context.Context) error {
-	if err := o.validate(); err != nil {
-		return err
-	}
-	call := o.c.raw.Objects.Delete(o.bucket, o.object).Context(ctx)
-	if err := applyConds("Delete", o.gen, o.conds, call); err != nil {
-		return err
-	}
-	if o.userProject != "" {
-		call.UserProject(o.userProject)
-	}
-	// Encryption doesn't apply to Delete.
-	setClientHeader(call.Header())
-	err := runWithRetry(ctx, func() error { return call.Do() })
-	switch e := err.(type) {
-	case nil:
-		return nil
-	case *googleapi.Error:
-		if e.Code == http.StatusNotFound {
-			return ErrObjectNotExist
-		}
-	}
-	return err
-}
-
-// NewReader creates a new Reader to read the contents of the
-// object.
-// ErrObjectNotExist will be returned if the object is not found.
-//
-// The caller must call Close on the returned Reader when done reading.
-func (o *ObjectHandle) NewReader(ctx context.Context) (*Reader, error) {
-	return o.NewRangeReader(ctx, 0, -1)
-}
-
-// NewRangeReader reads part of an object, reading at most length bytes
-// starting at the given offset. If length is negative, the object is read
-// until the end.
-func (o *ObjectHandle) NewRangeReader(ctx context.Context, offset, length int64) (*Reader, error) {
-	if err := o.validate(); err != nil {
-		return nil, err
-	}
-	if offset < 0 {
-		return nil, fmt.Errorf("storage: invalid offset %d < 0", offset)
-	}
-	if o.conds != nil {
-		if err := o.conds.validate("NewRangeReader"); err != nil {
-			return nil, err
-		}
-	}
-	u := &url.URL{
-		Scheme:   "https",
-		Host:     "storage.googleapis.com",
-		Path:     fmt.Sprintf("/%s/%s", o.bucket, o.object),
-		RawQuery: conditionsQuery(o.gen, o.conds),
-	}
-	verb := "GET"
-	if length == 0 {
-		verb = "HEAD"
-	}
-	req, err := http.NewRequest(verb, u.String(), nil)
-	if err != nil {
-		return nil, err
-	}
-	req = withContext(req, ctx)
-	if length < 0 && offset > 0 {
-		req.Header.Set("Range", fmt.Sprintf("bytes=%d-", offset))
-	} else if length > 0 {
-		req.Header.Set("Range", fmt.Sprintf("bytes=%d-%d", offset, offset+length-1))
-	}
-	if o.userProject != "" {
-		req.Header.Set("X-Goog-User-Project", o.userProject)
-	}
-	if err := setEncryptionHeaders(req.Header, o.encryptionKey, false); err != nil {
-		return nil, err
-	}
-	var res *http.Response
-	err = runWithRetry(ctx, func() error {
-		res, err = o.c.hc.Do(req)
-		if err != nil {
-			return err
-		}
-		if res.StatusCode == http.StatusNotFound {
-			res.Body.Close()
-			return ErrObjectNotExist
-		}
-		if res.StatusCode < 200 || res.StatusCode > 299 {
-			body, _ := ioutil.ReadAll(res.Body)
-			res.Body.Close()
-			return &googleapi.Error{
-				Code:   res.StatusCode,
-				Header: res.Header,
-				Body:   string(body),
-			}
-		}
-		if offset > 0 && length != 0 && res.StatusCode != http.StatusPartialContent {
-			res.Body.Close()
-			return errors.New("storage: partial request not satisfied")
-		}
-		return nil
-	})
-	if err != nil {
-		return nil, err
-	}
-
-	var size int64 // total size of object, even if a range was requested.
-	if res.StatusCode == http.StatusPartialContent {
-		cr := strings.TrimSpace(res.Header.Get("Content-Range"))
-		if !strings.HasPrefix(cr, "bytes ") || !strings.Contains(cr, "/") {
-			return nil, fmt.Errorf("storage: invalid Content-Range %q", cr)
-		}
-		size, err = strconv.ParseInt(cr[strings.LastIndex(cr, "/")+1:], 10, 64)
-		if err != nil {
-			return nil, fmt.Errorf("storage: invalid Content-Range %q", cr)
-		}
-	} else {
-		size = res.ContentLength
-	}
-
-	remain := res.ContentLength
-	body := res.Body
-	if length == 0 {
-		remain = 0
-		body.Close()
-		body = emptyBody
-	}
-	var (
-		checkCRC bool
-		crc      uint32
-	)
-	// Even if there is a CRC header, we can't compute the hash on partial data.
-	if remain == size {
-		crc, checkCRC = parseCRC32c(res)
-	}
-	return &Reader{
-		body:        body,
-		size:        size,
-		remain:      remain,
-		contentType: res.Header.Get("Content-Type"),
-		wantCRC:     crc,
-		checkCRC:    checkCRC,
-	}, nil
-}
-
-func parseCRC32c(res *http.Response) (uint32, bool) {
-	const prefix = "crc32c="
-	for _, spec := range res.Header["X-Goog-Hash"] {
-		if strings.HasPrefix(spec, prefix) {
-			c, err := decodeUint32(spec[len(prefix):])
-			if err == nil {
-				return c, true
-			}
-		}
-	}
-	return 0, false
-}
-
-var emptyBody = ioutil.NopCloser(strings.NewReader(""))
-
-// NewWriter returns a storage Writer that writes to the GCS object
-// associated with this ObjectHandle.
-//
-// A new object will be created unless an object with this name already exists.
-// Otherwise any previous object with the same name will be replaced.
-// The object will not be available (and any previous object will remain)
-// until Close has been called.
-//
-// Attributes can be set on the object by modifying the returned Writer's
-// ObjectAttrs field before the first call to Write. If no ContentType
-// attribute is specified, the content type will be automatically sniffed
-// using net/http.DetectContentType.
-//
-// It is the caller's responsibility to call Close when writing is done.
-func (o *ObjectHandle) NewWriter(ctx context.Context) *Writer {
-	return &Writer{
-		ctx:         ctx,
-		o:           o,
-		donec:       make(chan struct{}),
-		ObjectAttrs: ObjectAttrs{Name: o.object},
-		ChunkSize:   googleapi.DefaultUploadChunkSize,
-	}
-}
-
-func (o *ObjectHandle) validate() error {
-	if o.bucket == "" {
-		return errors.New("storage: bucket name is empty")
-	}
-	if o.object == "" {
-		return errors.New("storage: object name is empty")
-	}
-	if !utf8.ValidString(o.object) {
-		return fmt.Errorf("storage: object name %q is not valid UTF-8", o.object)
-	}
-	return nil
-}
-
-// parseKey converts the binary contents of a private key file
-// to an *rsa.PrivateKey. It detects whether the private key is in a
-// PEM container or not. If so, it extracts the the private key
-// from PEM container before conversion. It only supports PEM
-// containers with no passphrase.
-func parseKey(key []byte) (*rsa.PrivateKey, error) {
-	if block, _ := pem.Decode(key); block != nil {
-		key = block.Bytes
-	}
-	parsedKey, err := x509.ParsePKCS8PrivateKey(key)
-	if err != nil {
-		parsedKey, err = x509.ParsePKCS1PrivateKey(key)
-		if err != nil {
-			return nil, err
-		}
-	}
-	parsed, ok := parsedKey.(*rsa.PrivateKey)
-	if !ok {
-		return nil, errors.New("oauth2: private key is invalid")
-	}
-	return parsed, nil
-}
-
-func toRawObjectACL(oldACL []ACLRule) []*raw.ObjectAccessControl {
-	var acl []*raw.ObjectAccessControl
-	if len(oldACL) > 0 {
-		acl = make([]*raw.ObjectAccessControl, len(oldACL))
-		for i, rule := range oldACL {
-			acl[i] = &raw.ObjectAccessControl{
-				Entity: string(rule.Entity),
-				Role:   string(rule.Role),
-			}
-		}
-	}
-	return acl
-}
-
-// toRawObject copies the editable attributes from o to the raw library's Object type.
-func (o *ObjectAttrs) toRawObject(bucket string) *raw.Object {
-	acl := toRawObjectACL(o.ACL)
-	return &raw.Object{
-		Bucket:             bucket,
-		Name:               o.Name,
-		ContentType:        o.ContentType,
-		ContentEncoding:    o.ContentEncoding,
-		ContentLanguage:    o.ContentLanguage,
-		CacheControl:       o.CacheControl,
-		ContentDisposition: o.ContentDisposition,
-		StorageClass:       o.StorageClass,
-		Acl:                acl,
-		Metadata:           o.Metadata,
-	}
-}
-
-// ObjectAttrs represents the metadata for a Google Cloud Storage (GCS) object.
-type ObjectAttrs struct {
-	// Bucket is the name of the bucket containing this GCS object.
-	// This field is read-only.
-	Bucket string
-
-	// Name is the name of the object within the bucket.
-	// This field is read-only.
-	Name string
-
-	// ContentType is the MIME type of the object's content.
-	ContentType string
-
-	// ContentLanguage is the content language of the object's content.
-	ContentLanguage string
-
-	// CacheControl is the Cache-Control header to be sent in the response
-	// headers when serving the object data.
-	CacheControl string
-
-	// ACL is the list of access control rules for the object.
-	ACL []ACLRule
-
-	// Owner is the owner of the object. This field is read-only.
-	//
-	// If non-zero, it is in the form of "user-<userId>".
-	Owner string
-
-	// Size is the length of the object's content. This field is read-only.
-	Size int64
-
-	// ContentEncoding is the encoding of the object's content.
-	ContentEncoding string
-
-	// ContentDisposition is the optional Content-Disposition header of the object
-	// sent in the response headers.
-	ContentDisposition string
-
-	// MD5 is the MD5 hash of the object's content. This field is read-only.
-	MD5 []byte
-
-	// CRC32C is the CRC32 checksum of the object's content using
-	// the Castagnoli93 polynomial. This field is read-only.
-	CRC32C uint32
-
-	// MediaLink is an URL to the object's content. This field is read-only.
-	MediaLink string
-
-	// Metadata represents user-provided metadata, in key/value pairs.
-	// It can be nil if no metadata is provided.
-	Metadata map[string]string
-
-	// Generation is the generation number of the object's content.
-	// This field is read-only.
-	Generation int64
-
-	// Metageneration is the version of the metadata for this
-	// object at this generation. This field is used for preconditions
-	// and for detecting changes in metadata. A metageneration number
-	// is only meaningful in the context of a particular generation
-	// of a particular object. This field is read-only.
-	Metageneration int64
-
-	// StorageClass is the storage class of the object.
-	// This value defines how objects in the bucket are stored and
-	// determines the SLA and the cost of storage. Typical values are
-	// "MULTI_REGIONAL", "REGIONAL", "NEARLINE", "COLDLINE", "STANDARD"
-	// and "DURABLE_REDUCED_AVAILABILITY".
-	// It defaults to "STANDARD", which is equivalent to "MULTI_REGIONAL"
-	// or "REGIONAL" depending on the bucket's location settings.
-	StorageClass string
-
-	// Created is the time the object was created. This field is read-only.
-	Created time.Time
-
-	// Deleted is the time the object was deleted.
-	// If not deleted, it is the zero value. This field is read-only.
-	Deleted time.Time
-
-	// Updated is the creation or modification time of the object.
-	// For buckets with versioning enabled, changing an object's
-	// metadata does not change this property. This field is read-only.
-	Updated time.Time
-
-	// CustomerKeySHA256 is the base64-encoded SHA-256 hash of the
-	// customer-supplied encryption key for the object. It is empty if there is
-	// no customer-supplied encryption key.
-	// See // https://cloud.google.com/storage/docs/encryption for more about
-	// encryption in Google Cloud Storage.
-	CustomerKeySHA256 string
-
-	// Prefix is set only for ObjectAttrs which represent synthetic "directory
-	// entries" when iterating over buckets using Query.Delimiter. See
-	// ObjectIterator.Next. When set, no other fields in ObjectAttrs will be
-	// populated.
-	Prefix string
-}
-
-// convertTime converts a time in RFC3339 format to time.Time.
-// If any error occurs in parsing, the zero-value time.Time is silently returned.
-func convertTime(t string) time.Time {
-	var r time.Time
-	if t != "" {
-		r, _ = time.Parse(time.RFC3339, t)
-	}
-	return r
-}
-
-func newObject(o *raw.Object) *ObjectAttrs {
-	if o == nil {
-		return nil
-	}
-	acl := make([]ACLRule, len(o.Acl))
-	for i, rule := range o.Acl {
-		acl[i] = ACLRule{
-			Entity: ACLEntity(rule.Entity),
-			Role:   ACLRole(rule.Role),
-		}
-	}
-	owner := ""
-	if o.Owner != nil {
-		owner = o.Owner.Entity
-	}
-	md5, _ := base64.StdEncoding.DecodeString(o.Md5Hash)
-	crc32c, _ := decodeUint32(o.Crc32c)
-	var sha256 string
-	if o.CustomerEncryption != nil {
-		sha256 = o.CustomerEncryption.KeySha256
-	}
-	return &ObjectAttrs{
-		Bucket:            o.Bucket,
-		Name:              o.Name,
-		ContentType:       o.ContentType,
-		ContentLanguage:   o.ContentLanguage,
-		CacheControl:      o.CacheControl,
-		ACL:               acl,
-		Owner:             owner,
-		ContentEncoding:   o.ContentEncoding,
-		Size:              int64(o.Size),
-		MD5:               md5,
-		CRC32C:            crc32c,
-		MediaLink:         o.MediaLink,
-		Metadata:          o.Metadata,
-		Generation:        o.Generation,
-		Metageneration:    o.Metageneration,
-		StorageClass:      o.StorageClass,
-		CustomerKeySHA256: sha256,
-		Created:           convertTime(o.TimeCreated),
-		Deleted:           convertTime(o.TimeDeleted),
-		Updated:           convertTime(o.Updated),
-	}
-}
-
-// Decode a uint32 encoded in Base64 in big-endian byte order.
-func decodeUint32(b64 string) (uint32, error) {
-	d, err := base64.StdEncoding.DecodeString(b64)
-	if err != nil {
-		return 0, err
-	}
-	if len(d) != 4 {
-		return 0, fmt.Errorf("storage: %q does not encode a 32-bit value", d)
-	}
-	return uint32(d[0])<<24 + uint32(d[1])<<16 + uint32(d[2])<<8 + uint32(d[3]), nil
-}
-
-// Encode a uint32 as Base64 in big-endian byte order.
-func encodeUint32(u uint32) string {
-	b := []byte{byte(u >> 24), byte(u >> 16), byte(u >> 8), byte(u)}
-	return base64.StdEncoding.EncodeToString(b)
-}
-
-// Query represents a query to filter objects from a bucket.
-type Query struct {
-	// Delimiter returns results in a directory-like fashion.
-	// Results will contain only objects whose names, aside from the
-	// prefix, do not contain delimiter. Objects whose names,
-	// aside from the prefix, contain delimiter will have their name,
-	// truncated after the delimiter, returned in prefixes.
-	// Duplicate prefixes are omitted.
-	// Optional.
-	Delimiter string
-
-	// Prefix is the prefix filter to query objects
-	// whose names begin with this prefix.
-	// Optional.
-	Prefix string
-
-	// Versions indicates whether multiple versions of the same
-	// object will be included in the results.
-	Versions bool
-}
-
-// contentTyper implements ContentTyper to enable an
-// io.ReadCloser to specify its MIME type.
-type contentTyper struct {
-	io.Reader
-	t string
-}
-
-func (c *contentTyper) ContentType() string {
-	return c.t
-}
-
-// Conditions constrain methods to act on specific generations of
-// objects.
-//
-// The zero value is an empty set of constraints. Not all conditions or
-// combinations of conditions are applicable to all methods.
-// See https://cloud.google.com/storage/docs/generations-preconditions
-// for details on how these operate.
-type Conditions struct {
-	// Generation constraints.
-	// At most one of the following can be set to a non-zero value.
-
-	// GenerationMatch specifies that the object must have the given generation
-	// for the operation to occur.
-	// If GenerationMatch is zero, it has no effect.
-	// Use DoesNotExist to specify that the object does not exist in the bucket.
-	GenerationMatch int64
-
-	// GenerationNotMatch specifies that the object must not have the given
-	// generation for the operation to occur.
-	// If GenerationNotMatch is zero, it has no effect.
-	GenerationNotMatch int64
-
-	// DoesNotExist specifies that the object must not exist in the bucket for
-	// the operation to occur.
-	// If DoesNotExist is false, it has no effect.
-	DoesNotExist bool
-
-	// Metadata generation constraints.
-	// At most one of the following can be set to a non-zero value.
-
-	// MetagenerationMatch specifies that the object must have the given
-	// metageneration for the operation to occur.
-	// If MetagenerationMatch is zero, it has no effect.
-	MetagenerationMatch int64
-
-	// MetagenerationNotMatch specifies that the object must not have the given
-	// metageneration for the operation to occur.
-	// If MetagenerationNotMatch is zero, it has no effect.
-	MetagenerationNotMatch int64
-}
-
-func (c *Conditions) validate(method string) error {
-	if *c == (Conditions{}) {
-		return fmt.Errorf("storage: %s: empty conditions", method)
-	}
-	if !c.isGenerationValid() {
-		return fmt.Errorf("storage: %s: multiple conditions specified for generation", method)
-	}
-	if !c.isMetagenerationValid() {
-		return fmt.Errorf("storage: %s: multiple conditions specified for metageneration", method)
-	}
-	return nil
-}
-
-func (c *Conditions) isGenerationValid() bool {
-	n := 0
-	if c.GenerationMatch != 0 {
-		n++
-	}
-	if c.GenerationNotMatch != 0 {
-		n++
-	}
-	if c.DoesNotExist {
-		n++
-	}
-	return n <= 1
-}
-
-func (c *Conditions) isMetagenerationValid() bool {
-	return c.MetagenerationMatch == 0 || c.MetagenerationNotMatch == 0
-}
-
-// applyConds modifies the provided call using the conditions in conds.
-// call is something that quacks like a *raw.WhateverCall.
-func applyConds(method string, gen int64, conds *Conditions, call interface{}) error {
-	cval := reflect.ValueOf(call)
-	if gen >= 0 {
-		if !setConditionField(cval, "Generation", gen) {
-			return fmt.Errorf("storage: %s: generation not supported", method)
-		}
-	}
-	if conds == nil {
-		return nil
-	}
-	if err := conds.validate(method); err != nil {
-		return err
-	}
-	switch {
-	case conds.GenerationMatch != 0:
-		if !setConditionField(cval, "IfGenerationMatch", conds.GenerationMatch) {
-			return fmt.Errorf("storage: %s: ifGenerationMatch not supported", method)
-		}
-	case conds.GenerationNotMatch != 0:
-		if !setConditionField(cval, "IfGenerationNotMatch", conds.GenerationNotMatch) {
-			return fmt.Errorf("storage: %s: ifGenerationNotMatch not supported", method)
-		}
-	case conds.DoesNotExist:
-		if !setConditionField(cval, "IfGenerationMatch", int64(0)) {
-			return fmt.Errorf("storage: %s: DoesNotExist not supported", method)
-		}
-	}
-	switch {
-	case conds.MetagenerationMatch != 0:
-		if !setConditionField(cval, "IfMetagenerationMatch", conds.MetagenerationMatch) {
-			return fmt.Errorf("storage: %s: ifMetagenerationMatch not supported", method)
-		}
-	case conds.MetagenerationNotMatch != 0:
-		if !setConditionField(cval, "IfMetagenerationNotMatch", conds.MetagenerationNotMatch) {
-			return fmt.Errorf("storage: %s: ifMetagenerationNotMatch not supported", method)
-		}
-	}
-	return nil
-}
-
-func applySourceConds(gen int64, conds *Conditions, call *raw.ObjectsRewriteCall) error {
-	if gen >= 0 {
-		call.SourceGeneration(gen)
-	}
-	if conds == nil {
-		return nil
-	}
-	if err := conds.validate("CopyTo source"); err != nil {
-		return err
-	}
-	switch {
-	case conds.GenerationMatch != 0:
-		call.IfSourceGenerationMatch(conds.GenerationMatch)
-	case conds.GenerationNotMatch != 0:
-		call.IfSourceGenerationNotMatch(conds.GenerationNotMatch)
-	case conds.DoesNotExist:
-		call.IfSourceGenerationMatch(0)
-	}
-	switch {
-	case conds.MetagenerationMatch != 0:
-		call.IfSourceMetagenerationMatch(conds.MetagenerationMatch)
-	case conds.MetagenerationNotMatch != 0:
-		call.IfSourceMetagenerationNotMatch(conds.MetagenerationNotMatch)
-	}
-	return nil
-}
-
-// setConditionField sets a field on a *raw.WhateverCall.
-// We can't use anonymous interfaces because the return type is
-// different, since the field setters are builders.
-func setConditionField(call reflect.Value, name string, value interface{}) bool {
-	m := call.MethodByName(name)
-	if !m.IsValid() {
-		return false
-	}
-	m.Call([]reflect.Value{reflect.ValueOf(value)})
-	return true
-}
-
-// conditionsQuery returns the generation and conditions as a URL query
-// string suitable for URL.RawQuery.  It assumes that the conditions
-// have been validated.
-func conditionsQuery(gen int64, conds *Conditions) string {
-	// URL escapes are elided because integer strings are URL-safe.
-	var buf []byte
-
-	appendParam := func(s string, n int64) {
-		if len(buf) > 0 {
-			buf = append(buf, '&')
-		}
-		buf = append(buf, s...)
-		buf = strconv.AppendInt(buf, n, 10)
-	}
-
-	if gen >= 0 {
-		appendParam("generation=", gen)
-	}
-	if conds == nil {
-		return string(buf)
-	}
-	switch {
-	case conds.GenerationMatch != 0:
-		appendParam("ifGenerationMatch=", conds.GenerationMatch)
-	case conds.GenerationNotMatch != 0:
-		appendParam("ifGenerationNotMatch=", conds.GenerationNotMatch)
-	case conds.DoesNotExist:
-		appendParam("ifGenerationMatch=", 0)
-	}
-	switch {
-	case conds.MetagenerationMatch != 0:
-		appendParam("ifMetagenerationMatch=", conds.MetagenerationMatch)
-	case conds.MetagenerationNotMatch != 0:
-		appendParam("ifMetagenerationNotMatch=", conds.MetagenerationNotMatch)
-	}
-	return string(buf)
-}
-
-// composeSourceObj wraps a *raw.ComposeRequestSourceObjects, but adds the methods
-// that modifyCall searches for by name.
-type composeSourceObj struct {
-	src *raw.ComposeRequestSourceObjects
-}
-
-func (c composeSourceObj) Generation(gen int64) {
-	c.src.Generation = gen
-}
-
-func (c composeSourceObj) IfGenerationMatch(gen int64) {
-	// It's safe to overwrite ObjectPreconditions, since its only field is
-	// IfGenerationMatch.
-	c.src.ObjectPreconditions = &raw.ComposeRequestSourceObjectsObjectPreconditions{
-		IfGenerationMatch: gen,
-	}
-}
-
-func setEncryptionHeaders(headers http.Header, key []byte, copySource bool) error {
-	if key == nil {
-		return nil
-	}
-	// TODO(jbd): Ask the API team to return a more user-friendly error
-	// and avoid doing this check at the client level.
-	if len(key) != 32 {
-		return errors.New("storage: not a 32-byte AES-256 key")
-	}
-	var cs string
-	if copySource {
-		cs = "copy-source-"
-	}
-	headers.Set("x-goog-"+cs+"encryption-algorithm", "AES256")
-	headers.Set("x-goog-"+cs+"encryption-key", base64.StdEncoding.EncodeToString(key))
-	keyHash := sha256.Sum256(key)
-	headers.Set("x-goog-"+cs+"encryption-key-sha256", base64.StdEncoding.EncodeToString(keyHash[:]))
-	return nil
-}
-
-// TODO(jbd): Add storage.objects.watch.

+ 0 - 192
vendor/cloud.google.com/go/storage/writer.go

@@ -1,192 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// 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.
-
-package storage
-
-import (
-	"encoding/base64"
-	"errors"
-	"fmt"
-	"io"
-	"unicode/utf8"
-
-	"golang.org/x/net/context"
-	"google.golang.org/api/googleapi"
-	raw "google.golang.org/api/storage/v1"
-)
-
-// A Writer writes a Cloud Storage object.
-type Writer struct {
-	// ObjectAttrs are optional attributes to set on the object. Any attributes
-	// must be initialized before the first Write call. Nil or zero-valued
-	// attributes are ignored.
-	ObjectAttrs
-
-	// SendCRC specifies whether to transmit a CRC32C field. It should be set
-	// to true in addition to setting the Writer's CRC32C field, because zero
-	// is a valid CRC and normally a zero would not be transmitted.
-	SendCRC32C bool
-
-	// ChunkSize controls the maximum number of bytes of the object that the
-	// Writer will attempt to send to the server in a single request. Objects
-	// smaller than the size will be sent in a single request, while larger
-	// objects will be split over multiple requests. The size will be rounded up
-	// to the nearest multiple of 256K. If zero, chunking will be disabled and
-	// the object will be uploaded in a single request.
-	//
-	// ChunkSize will default to a reasonable value. Any custom configuration
-	// must be done before the first Write call.
-	ChunkSize int
-
-	// ProgressFunc can be used to monitor the progress of a large write.
-	// operation. If ProgressFunc is not nil and writing requires multiple
-	// calls to the underlying service (see
-	// https://cloud.google.com/storage/docs/json_api/v1/how-tos/resumable-upload),
-	// then ProgressFunc will be invoked after each call with the number of bytes of
-	// content copied so far.
-	//
-	// ProgressFunc should return quickly without blocking.
-	ProgressFunc func(int64)
-
-	ctx context.Context
-	o   *ObjectHandle
-
-	opened bool
-	pw     *io.PipeWriter
-
-	donec chan struct{} // closed after err and obj are set.
-	err   error
-	obj   *ObjectAttrs
-}
-
-func (w *Writer) open() error {
-	attrs := w.ObjectAttrs
-	// Check the developer didn't change the object Name (this is unfortunate, but
-	// we don't want to store an object under the wrong name).
-	if attrs.Name != w.o.object {
-		return fmt.Errorf("storage: Writer.Name %q does not match object name %q", attrs.Name, w.o.object)
-	}
-	if !utf8.ValidString(attrs.Name) {
-		return fmt.Errorf("storage: object name %q is not valid UTF-8", attrs.Name)
-	}
-	pr, pw := io.Pipe()
-	w.pw = pw
-	w.opened = true
-
-	if w.ChunkSize < 0 {
-		return errors.New("storage: Writer.ChunkSize must non-negative")
-	}
-	mediaOpts := []googleapi.MediaOption{
-		googleapi.ChunkSize(w.ChunkSize),
-	}
-	if c := attrs.ContentType; c != "" {
-		mediaOpts = append(mediaOpts, googleapi.ContentType(c))
-	}
-
-	go func() {
-		defer close(w.donec)
-
-		rawObj := attrs.toRawObject(w.o.bucket)
-		if w.SendCRC32C {
-			rawObj.Crc32c = encodeUint32(attrs.CRC32C)
-		}
-		if w.MD5 != nil {
-			rawObj.Md5Hash = base64.StdEncoding.EncodeToString(w.MD5)
-		}
-		call := w.o.c.raw.Objects.Insert(w.o.bucket, rawObj).
-			Media(pr, mediaOpts...).
-			Projection("full").
-			Context(w.ctx)
-		if w.ProgressFunc != nil {
-			call.ProgressUpdater(func(n, _ int64) { w.ProgressFunc(n) })
-		}
-		if err := setEncryptionHeaders(call.Header(), w.o.encryptionKey, false); err != nil {
-			w.err = err
-			pr.CloseWithError(w.err)
-			return
-		}
-		var resp *raw.Object
-		err := applyConds("NewWriter", w.o.gen, w.o.conds, call)
-		if err == nil {
-			if w.o.userProject != "" {
-				call.UserProject(w.o.userProject)
-			}
-			setClientHeader(call.Header())
-			// We will only retry here if the initial POST, which obtains a URI for
-			// the resumable upload, fails with a retryable error. The upload itself
-			// has its own retry logic.
-			err = runWithRetry(w.ctx, func() error {
-				var err2 error
-				resp, err2 = call.Do()
-				return err2
-			})
-		}
-		if err != nil {
-			w.err = err
-			pr.CloseWithError(w.err)
-			return
-		}
-		w.obj = newObject(resp)
-	}()
-	return nil
-}
-
-// Write appends to w. It implements the io.Writer interface.
-//
-// Since writes happen asynchronously, Write may return a nil
-// error even though the write failed (or will fail). Always
-// use the error returned from Writer.Close to determine if
-// the upload was successful.
-func (w *Writer) Write(p []byte) (n int, err error) {
-	if w.err != nil {
-		return 0, w.err
-	}
-	if !w.opened {
-		if err := w.open(); err != nil {
-			return 0, err
-		}
-	}
-	return w.pw.Write(p)
-}
-
-// Close completes the write operation and flushes any buffered data.
-// If Close doesn't return an error, metadata about the written object
-// can be retrieved by calling Attrs.
-func (w *Writer) Close() error {
-	if !w.opened {
-		if err := w.open(); err != nil {
-			return err
-		}
-	}
-	if err := w.pw.Close(); err != nil {
-		return err
-	}
-	<-w.donec
-	return w.err
-}
-
-// CloseWithError aborts the write operation with the provided error.
-// CloseWithError always returns nil.
-func (w *Writer) CloseWithError(err error) error {
-	if !w.opened {
-		return nil
-	}
-	return w.pw.CloseWithError(err)
-}
-
-// Attrs returns metadata about a successfully-written object.
-// It's only valid to call it after Close returns nil.
-func (w *Writer) Attrs() *ObjectAttrs {
-	return w.obj
-}

+ 4 - 1
vendor/github.com/BurntSushi/toml/.travis.yml

@@ -2,6 +2,10 @@ language: go
 go:
   - 1.1
   - 1.2
+  - 1.3
+  - 1.4
+  - 1.5
+  - 1.6
   - tip
 install:
   - go install ./...
@@ -9,4 +13,3 @@ install:
 script:
   - export PATH="$PATH:$HOME/gopath/bin"
   - make test
-

+ 1 - 1
vendor/github.com/BurntSushi/toml/COMPATIBLE

@@ -1,3 +1,3 @@
 Compatible with TOML version
-[v0.2.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.2.0.md)
+[v0.4.0](https://github.com/toml-lang/toml/blob/v0.4.0/versions/en/toml-v0.4.0.md)
 

+ 8 - 10
vendor/github.com/BurntSushi/toml/README.md

@@ -1,17 +1,17 @@
 ## TOML parser and encoder for Go with reflection
 
 TOML stands for Tom's Obvious, Minimal Language. This Go package provides a
-reflection interface similar to Go's standard library `json` and `xml` 
+reflection interface similar to Go's standard library `json` and `xml`
 packages. This package also supports the `encoding.TextUnmarshaler` and
-`encoding.TextMarshaler` interfaces so that you can define custom data 
+`encoding.TextMarshaler` interfaces so that you can define custom data
 representations. (There is an example of this below.)
 
-Spec: https://github.com/mojombo/toml
+Spec: https://github.com/toml-lang/toml
 
 Compatible with TOML version
-[v0.2.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.2.0.md)
+[v0.4.0](https://github.com/toml-lang/toml/blob/master/versions/en/toml-v0.4.0.md)
 
-Documentation: http://godoc.org/github.com/BurntSushi/toml
+Documentation: https://godoc.org/github.com/BurntSushi/toml
 
 Installation:
 
@@ -26,8 +26,7 @@ go get github.com/BurntSushi/toml/cmd/tomlv
 tomlv some-toml-file.toml
 ```
 
-[![Build status](https://api.travis-ci.org/BurntSushi/toml.png)](https://travis-ci.org/BurntSushi/toml)
-
+[![Build Status](https://travis-ci.org/BurntSushi/toml.svg?branch=master)](https://travis-ci.org/BurntSushi/toml) [![GoDoc](https://godoc.org/github.com/BurntSushi/toml?status.svg)](https://godoc.org/github.com/BurntSushi/toml)
 
 ### Testing
 
@@ -87,7 +86,7 @@ type TOML struct {
 
 ### Using the `encoding.TextUnmarshaler` interface
 
-Here's an example that automatically parses duration strings into 
+Here's an example that automatically parses duration strings into
 `time.Duration` values:
 
 ```toml
@@ -120,7 +119,7 @@ for _, s := range favorites.Song {
 }
 ```
 
-And you'll also need a `duration` type that satisfies the 
+And you'll also need a `duration` type that satisfies the
 `encoding.TextUnmarshaler` interface:
 
 ```go
@@ -217,4 +216,3 @@ Note that a case insensitive match will be tried if an exact match can't be
 found.
 
 A working example of the above can be found in `_examples/example.{go,toml}`.
-

+ 0 - 14
vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/COPYING

@@ -1,14 +0,0 @@
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-                    Version 2, December 2004
-
- Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
-
- Everyone is permitted to copy and distribute verbatim or modified
- copies of this license document, and changing it is allowed as long
- as the name is changed.
-
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. You just DO WHAT THE FUCK YOU WANT TO.
-

+ 0 - 14
vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/README.md

@@ -1,14 +0,0 @@
-# Implements the TOML test suite interface
-
-This is an implementation of the interface expected by
-[toml-test](https://github.com/BurntSushi/toml-test) for my
-[toml parser written in Go](https://github.com/BurntSushi/toml).
-In particular, it maps TOML data on `stdin` to a JSON format on `stdout`.
-
-
-Compatible with TOML version
-[v0.2.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.2.0.md)
-
-Compatible with `toml-test` version
-[v0.2.0](https://github.com/BurntSushi/toml-test/tree/v0.2.0)
-

+ 0 - 90
vendor/github.com/BurntSushi/toml/cmd/toml-test-decoder/main.go

@@ -1,90 +0,0 @@
-// Command toml-test-decoder satisfies the toml-test interface for testing
-// TOML decoders. Namely, it accepts TOML on stdin and outputs JSON on stdout.
-package main
-
-import (
-	"encoding/json"
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"path"
-	"time"
-
-	"github.com/BurntSushi/toml"
-)
-
-func init() {
-	log.SetFlags(0)
-
-	flag.Usage = usage
-	flag.Parse()
-}
-
-func usage() {
-	log.Printf("Usage: %s < toml-file\n", path.Base(os.Args[0]))
-	flag.PrintDefaults()
-
-	os.Exit(1)
-}
-
-func main() {
-	if flag.NArg() != 0 {
-		flag.Usage()
-	}
-
-	var tmp interface{}
-	if _, err := toml.DecodeReader(os.Stdin, &tmp); err != nil {
-		log.Fatalf("Error decoding TOML: %s", err)
-	}
-
-	typedTmp := translate(tmp)
-	if err := json.NewEncoder(os.Stdout).Encode(typedTmp); err != nil {
-		log.Fatalf("Error encoding JSON: %s", err)
-	}
-}
-
-func translate(tomlData interface{}) interface{} {
-	switch orig := tomlData.(type) {
-	case map[string]interface{}:
-		typed := make(map[string]interface{}, len(orig))
-		for k, v := range orig {
-			typed[k] = translate(v)
-		}
-		return typed
-	case []map[string]interface{}:
-		typed := make([]map[string]interface{}, len(orig))
-		for i, v := range orig {
-			typed[i] = translate(v).(map[string]interface{})
-		}
-		return typed
-	case []interface{}:
-		typed := make([]interface{}, len(orig))
-		for i, v := range orig {
-			typed[i] = translate(v)
-		}
-
-		// We don't really need to tag arrays, but let's be future proof.
-		// (If TOML ever supports tuples, we'll need this.)
-		return tag("array", typed)
-	case time.Time:
-		return tag("datetime", orig.Format("2006-01-02T15:04:05Z"))
-	case bool:
-		return tag("bool", fmt.Sprintf("%v", orig))
-	case int64:
-		return tag("integer", fmt.Sprintf("%d", orig))
-	case float64:
-		return tag("float", fmt.Sprintf("%v", orig))
-	case string:
-		return tag("string", orig)
-	}
-
-	panic(fmt.Sprintf("Unknown type: %T", tomlData))
-}
-
-func tag(typeName string, data interface{}) map[string]interface{} {
-	return map[string]interface{}{
-		"type":  typeName,
-		"value": data,
-	}
-}

+ 0 - 14
vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/COPYING

@@ -1,14 +0,0 @@
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-                    Version 2, December 2004
-
- Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
-
- Everyone is permitted to copy and distribute verbatim or modified
- copies of this license document, and changing it is allowed as long
- as the name is changed.
-
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. You just DO WHAT THE FUCK YOU WANT TO.
-

+ 0 - 14
vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/README.md

@@ -1,14 +0,0 @@
-# Implements the TOML test suite interface for TOML encoders
-
-This is an implementation of the interface expected by
-[toml-test](https://github.com/BurntSushi/toml-test) for the
-[TOML encoder](https://github.com/BurntSushi/toml).
-In particular, it maps JSON data on `stdin` to a TOML format on `stdout`.
-
-
-Compatible with TOML version
-[v0.2.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.2.0.md)
-
-Compatible with `toml-test` version
-[v0.2.0](https://github.com/BurntSushi/toml-test/tree/v0.2.0)
-

+ 0 - 131
vendor/github.com/BurntSushi/toml/cmd/toml-test-encoder/main.go

@@ -1,131 +0,0 @@
-// Command toml-test-encoder satisfies the toml-test interface for testing
-// TOML encoders. Namely, it accepts JSON on stdin and outputs TOML on stdout.
-package main
-
-import (
-	"encoding/json"
-	"flag"
-	"log"
-	"os"
-	"path"
-	"strconv"
-	"time"
-
-	"github.com/BurntSushi/toml"
-)
-
-func init() {
-	log.SetFlags(0)
-
-	flag.Usage = usage
-	flag.Parse()
-}
-
-func usage() {
-	log.Printf("Usage: %s < json-file\n", path.Base(os.Args[0]))
-	flag.PrintDefaults()
-
-	os.Exit(1)
-}
-
-func main() {
-	if flag.NArg() != 0 {
-		flag.Usage()
-	}
-
-	var tmp interface{}
-	if err := json.NewDecoder(os.Stdin).Decode(&tmp); err != nil {
-		log.Fatalf("Error decoding JSON: %s", err)
-	}
-
-	tomlData := translate(tmp)
-	if err := toml.NewEncoder(os.Stdout).Encode(tomlData); err != nil {
-		log.Fatalf("Error encoding TOML: %s", err)
-	}
-}
-
-func translate(typedJson interface{}) interface{} {
-	switch v := typedJson.(type) {
-	case map[string]interface{}:
-		if len(v) == 2 && in("type", v) && in("value", v) {
-			return untag(v)
-		}
-		m := make(map[string]interface{}, len(v))
-		for k, v2 := range v {
-			m[k] = translate(v2)
-		}
-		return m
-	case []interface{}:
-		tabArray := make([]map[string]interface{}, len(v))
-		for i := range v {
-			if m, ok := translate(v[i]).(map[string]interface{}); ok {
-				tabArray[i] = m
-			} else {
-				log.Fatalf("JSON arrays may only contain objects. This " +
-					"corresponds to only tables being allowed in " +
-					"TOML table arrays.")
-			}
-		}
-		return tabArray
-	}
-	log.Fatalf("Unrecognized JSON format '%T'.", typedJson)
-	panic("unreachable")
-}
-
-func untag(typed map[string]interface{}) interface{} {
-	t := typed["type"].(string)
-	v := typed["value"]
-	switch t {
-	case "string":
-		return v.(string)
-	case "integer":
-		v := v.(string)
-		n, err := strconv.Atoi(v)
-		if err != nil {
-			log.Fatalf("Could not parse '%s' as integer: %s", v, err)
-		}
-		return n
-	case "float":
-		v := v.(string)
-		f, err := strconv.ParseFloat(v, 64)
-		if err != nil {
-			log.Fatalf("Could not parse '%s' as float64: %s", v, err)
-		}
-		return f
-	case "datetime":
-		v := v.(string)
-		t, err := time.Parse("2006-01-02T15:04:05Z", v)
-		if err != nil {
-			log.Fatalf("Could not parse '%s' as a datetime: %s", v, err)
-		}
-		return t
-	case "bool":
-		v := v.(string)
-		switch v {
-		case "true":
-			return true
-		case "false":
-			return false
-		}
-		log.Fatalf("Could not parse '%s' as a boolean.", v)
-	case "array":
-		v := v.([]interface{})
-		array := make([]interface{}, len(v))
-		for i := range v {
-			if m, ok := v[i].(map[string]interface{}); ok {
-				array[i] = untag(m)
-			} else {
-				log.Fatalf("Arrays may only contain other arrays or "+
-					"primitive values, but found a '%T'.", m)
-			}
-		}
-		return array
-	}
-	log.Fatalf("Unrecognized tag type '%s'.", t)
-	panic("unreachable")
-}
-
-func in(key string, m map[string]interface{}) bool {
-	_, ok := m[key]
-	return ok
-}

+ 0 - 14
vendor/github.com/BurntSushi/toml/cmd/tomlv/COPYING

@@ -1,14 +0,0 @@
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-                    Version 2, December 2004
-
- Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
-
- Everyone is permitted to copy and distribute verbatim or modified
- copies of this license document, and changing it is allowed as long
- as the name is changed.
-
-            DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. You just DO WHAT THE FUCK YOU WANT TO.
-

+ 0 - 22
vendor/github.com/BurntSushi/toml/cmd/tomlv/README.md

@@ -1,22 +0,0 @@
-# TOML Validator
-
-If Go is installed, it's simple to try it out:
-
-```bash
-go get github.com/BurntSushi/toml/cmd/tomlv
-tomlv some-toml-file.toml
-```
-
-You can see the types of every key in a TOML file with:
-
-```bash
-tomlv -types some-toml-file.toml
-```
-
-At the moment, only one error message is reported at a time. Error messages
-include line numbers. No output means that the files given are valid TOML, or 
-there is a bug in `tomlv`.
-
-Compatible with TOML version
-[v0.1.0](https://github.com/mojombo/toml/blob/master/versions/toml-v0.1.0.md)
-

+ 0 - 61
vendor/github.com/BurntSushi/toml/cmd/tomlv/main.go

@@ -1,61 +0,0 @@
-// Command tomlv validates TOML documents and prints each key's type.
-package main
-
-import (
-	"flag"
-	"fmt"
-	"log"
-	"os"
-	"path"
-	"strings"
-	"text/tabwriter"
-
-	"github.com/BurntSushi/toml"
-)
-
-var (
-	flagTypes = false
-)
-
-func init() {
-	log.SetFlags(0)
-
-	flag.BoolVar(&flagTypes, "types", flagTypes,
-		"When set, the types of every defined key will be shown.")
-
-	flag.Usage = usage
-	flag.Parse()
-}
-
-func usage() {
-	log.Printf("Usage: %s toml-file [ toml-file ... ]\n",
-		path.Base(os.Args[0]))
-	flag.PrintDefaults()
-
-	os.Exit(1)
-}
-
-func main() {
-	if flag.NArg() < 1 {
-		flag.Usage()
-	}
-	for _, f := range flag.Args() {
-		var tmp interface{}
-		md, err := toml.DecodeFile(f, &tmp)
-		if err != nil {
-			log.Fatalf("Error in '%s': %s", f, err)
-		}
-		if flagTypes {
-			printTypes(md)
-		}
-	}
-}
-
-func printTypes(md toml.MetaData) {
-	tabw := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
-	for _, key := range md.Keys() {
-		fmt.Fprintf(tabw, "%s%s\t%s\n",
-			strings.Repeat("    ", len(key)-1), key, md.Type(key...))
-	}
-	tabw.Flush()
-}

+ 42 - 25
vendor/github.com/BurntSushi/toml/decode.go

@@ -10,7 +10,9 @@ import (
 	"time"
 )
 
-var e = fmt.Errorf
+func e(format string, args ...interface{}) error {
+	return fmt.Errorf("toml: "+format, args...)
+}
 
 // Unmarshaler is the interface implemented by objects that can unmarshal a
 // TOML description of themselves.
@@ -103,6 +105,13 @@ func (md *MetaData) PrimitiveDecode(primValue Primitive, v interface{}) error {
 // This decoder will not handle cyclic types. If a cyclic type is passed,
 // `Decode` will not terminate.
 func Decode(data string, v interface{}) (MetaData, error) {
+	rv := reflect.ValueOf(v)
+	if rv.Kind() != reflect.Ptr {
+		return MetaData{}, e("Decode of non-pointer %s", reflect.TypeOf(v))
+	}
+	if rv.IsNil() {
+		return MetaData{}, e("Decode of nil %s", reflect.TypeOf(v))
+	}
 	p, err := parse(data)
 	if err != nil {
 		return MetaData{}, err
@@ -111,7 +120,7 @@ func Decode(data string, v interface{}) (MetaData, error) {
 		p.mapping, p.types, p.ordered,
 		make(map[string]bool, len(p.ordered)), nil,
 	}
-	return md, md.unify(p.mapping, rvalue(v))
+	return md, md.unify(p.mapping, indirect(rv))
 }
 
 // DecodeFile is just like Decode, except it will automatically read the
@@ -211,7 +220,7 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
 	case reflect.Interface:
 		// we only support empty interfaces.
 		if rv.NumMethod() > 0 {
-			return e("Unsupported type '%s'.", rv.Kind())
+			return e("unsupported type %s", rv.Type())
 		}
 		return md.unifyAnything(data, rv)
 	case reflect.Float32:
@@ -219,13 +228,17 @@ func (md *MetaData) unify(data interface{}, rv reflect.Value) error {
 	case reflect.Float64:
 		return md.unifyFloat64(data, rv)
 	}
-	return e("Unsupported type '%s'.", rv.Kind())
+	return e("unsupported type %s", rv.Kind())
 }
 
 func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
 	tmap, ok := mapping.(map[string]interface{})
 	if !ok {
-		return mismatch(rv, "map", mapping)
+		if mapping == nil {
+			return nil
+		}
+		return e("type mismatch for %s: expected table but found %T",
+			rv.Type().String(), mapping)
 	}
 
 	for key, datum := range tmap {
@@ -250,14 +263,13 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
 				md.decoded[md.context.add(key).String()] = true
 				md.context = append(md.context, key)
 				if err := md.unify(datum, subv); err != nil {
-					return e("Type mismatch for '%s.%s': %s",
-						rv.Type().String(), f.name, err)
+					return err
 				}
 				md.context = md.context[0 : len(md.context)-1]
 			} else if f.name != "" {
 				// Bad user! No soup for you!
-				return e("Field '%s.%s' is unexported, and therefore cannot "+
-					"be loaded with reflection.", rv.Type().String(), f.name)
+				return e("cannot write unexported field %s.%s",
+					rv.Type().String(), f.name)
 			}
 		}
 	}
@@ -267,6 +279,9 @@ func (md *MetaData) unifyStruct(mapping interface{}, rv reflect.Value) error {
 func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
 	tmap, ok := mapping.(map[string]interface{})
 	if !ok {
+		if tmap == nil {
+			return nil
+		}
 		return badtype("map", mapping)
 	}
 	if rv.IsNil() {
@@ -292,6 +307,9 @@ func (md *MetaData) unifyMap(mapping interface{}, rv reflect.Value) error {
 func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error {
 	datav := reflect.ValueOf(data)
 	if datav.Kind() != reflect.Slice {
+		if !datav.IsValid() {
+			return nil
+		}
 		return badtype("slice", data)
 	}
 	sliceLen := datav.Len()
@@ -305,12 +323,16 @@ func (md *MetaData) unifyArray(data interface{}, rv reflect.Value) error {
 func (md *MetaData) unifySlice(data interface{}, rv reflect.Value) error {
 	datav := reflect.ValueOf(data)
 	if datav.Kind() != reflect.Slice {
+		if !datav.IsValid() {
+			return nil
+		}
 		return badtype("slice", data)
 	}
-	sliceLen := datav.Len()
-	if rv.IsNil() {
-		rv.Set(reflect.MakeSlice(rv.Type(), sliceLen, sliceLen))
+	n := datav.Len()
+	if rv.IsNil() || rv.Cap() < n {
+		rv.Set(reflect.MakeSlice(rv.Type(), n, n))
 	}
+	rv.SetLen(n)
 	return md.unifySliceArray(datav, rv)
 }
 
@@ -365,15 +387,15 @@ func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
 				// No bounds checking necessary.
 			case reflect.Int8:
 				if num < math.MinInt8 || num > math.MaxInt8 {
-					return e("Value '%d' is out of range for int8.", num)
+					return e("value %d is out of range for int8", num)
 				}
 			case reflect.Int16:
 				if num < math.MinInt16 || num > math.MaxInt16 {
-					return e("Value '%d' is out of range for int16.", num)
+					return e("value %d is out of range for int16", num)
 				}
 			case reflect.Int32:
 				if num < math.MinInt32 || num > math.MaxInt32 {
-					return e("Value '%d' is out of range for int32.", num)
+					return e("value %d is out of range for int32", num)
 				}
 			}
 			rv.SetInt(num)
@@ -384,15 +406,15 @@ func (md *MetaData) unifyInt(data interface{}, rv reflect.Value) error {
 				// No bounds checking necessary.
 			case reflect.Uint8:
 				if num < 0 || unum > math.MaxUint8 {
-					return e("Value '%d' is out of range for uint8.", num)
+					return e("value %d is out of range for uint8", num)
 				}
 			case reflect.Uint16:
 				if num < 0 || unum > math.MaxUint16 {
-					return e("Value '%d' is out of range for uint16.", num)
+					return e("value %d is out of range for uint16", num)
 				}
 			case reflect.Uint32:
 				if num < 0 || unum > math.MaxUint32 {
-					return e("Value '%d' is out of range for uint32.", num)
+					return e("value %d is out of range for uint32", num)
 				}
 			}
 			rv.SetUint(unum)
@@ -458,7 +480,7 @@ func rvalue(v interface{}) reflect.Value {
 // interest to us (like encoding.TextUnmarshaler).
 func indirect(v reflect.Value) reflect.Value {
 	if v.Kind() != reflect.Ptr {
-		if v.CanAddr() {
+		if v.CanSet() {
 			pv := v.Addr()
 			if _, ok := pv.Interface().(TextUnmarshaler); ok {
 				return pv
@@ -483,10 +505,5 @@ func isUnifiable(rv reflect.Value) bool {
 }
 
 func badtype(expected string, data interface{}) error {
-	return e("Expected %s but found '%T'.", expected, data)
-}
-
-func mismatch(user reflect.Value, expected string, data interface{}) error {
-	return e("Type mismatch for %s. Expected %s but found '%T'.",
-		user.Type().String(), expected, data)
+	return e("cannot load TOML value of type %T into a Go %s", data, expected)
 }

+ 1 - 2
vendor/github.com/BurntSushi/toml/decode_meta.go

@@ -77,9 +77,8 @@ func (k Key) maybeQuoted(i int) string {
 	}
 	if quote {
 		return "\"" + strings.Replace(k[i], "\"", "\\\"", -1) + "\""
-	} else {
-		return k[i]
 	}
+	return k[i]
 }
 
 func (k Key) add(piece string) Key {

+ 516 - 19
vendor/github.com/BurntSushi/toml/decode_test.go

@@ -3,15 +3,13 @@ package toml
 import (
 	"fmt"
 	"log"
+	"math"
 	"reflect"
+	"strings"
 	"testing"
 	"time"
 )
 
-func init() {
-	log.SetFlags(0)
-}
-
 func TestDecodeSimple(t *testing.T) {
 	var testSimple = `
 age = 250
@@ -67,7 +65,7 @@ cauchy = "cat 2"
 			{"cyan", "magenta", "yellow", "black"},
 		},
 		My: map[string]cats{
-			"Cats": cats{Plato: "cat 1", Cauchy: "cat 2"},
+			"Cats": {Plato: "cat 1", Cauchy: "cat 2"},
 		},
 	}
 	if !reflect.DeepEqual(val, answer) {
@@ -79,46 +77,73 @@ cauchy = "cat 2"
 func TestDecodeEmbedded(t *testing.T) {
 	type Dog struct{ Name string }
 	type Age int
+	type cat struct{ Name string }
 
-	tests := map[string]struct {
+	for _, test := range []struct {
+		label       string
 		input       string
 		decodeInto  interface{}
 		wantDecoded interface{}
 	}{
-		"embedded struct": {
+		{
+			label:       "embedded struct",
 			input:       `Name = "milton"`,
 			decodeInto:  &struct{ Dog }{},
 			wantDecoded: &struct{ Dog }{Dog{"milton"}},
 		},
-		"embedded non-nil pointer to struct": {
+		{
+			label:       "embedded non-nil pointer to struct",
 			input:       `Name = "milton"`,
 			decodeInto:  &struct{ *Dog }{},
 			wantDecoded: &struct{ *Dog }{&Dog{"milton"}},
 		},
-		"embedded nil pointer to struct": {
+		{
+			label:       "embedded nil pointer to struct",
 			input:       ``,
 			decodeInto:  &struct{ *Dog }{},
 			wantDecoded: &struct{ *Dog }{nil},
 		},
-		"embedded int": {
+		{
+			label:       "unexported embedded struct",
+			input:       `Name = "socks"`,
+			decodeInto:  &struct{ cat }{},
+			wantDecoded: &struct{ cat }{cat{"socks"}},
+		},
+		{
+			label:       "embedded int",
 			input:       `Age = -5`,
 			decodeInto:  &struct{ Age }{},
 			wantDecoded: &struct{ Age }{-5},
 		},
-	}
-
-	for label, test := range tests {
+	} {
 		_, err := Decode(test.input, test.decodeInto)
 		if err != nil {
 			t.Fatal(err)
 		}
 		if !reflect.DeepEqual(test.wantDecoded, test.decodeInto) {
 			t.Errorf("%s: want decoded == %+v, got %+v",
-				label, test.wantDecoded, test.decodeInto)
+				test.label, test.wantDecoded, test.decodeInto)
 		}
 	}
 }
 
+func TestDecodeIgnoredFields(t *testing.T) {
+	type simple struct {
+		Number int `toml:"-"`
+	}
+	const input = `
+Number = 123
+- = 234
+`
+	var s simple
+	if _, err := Decode(input, &s); err != nil {
+		t.Fatal(err)
+	}
+	if s.Number != 0 {
+		t.Errorf("got: %d; want 0", s.Number)
+	}
+}
+
 func TestTableArrays(t *testing.T) {
 	var tomlTableArrays = `
 [[albums]]
@@ -166,6 +191,49 @@ name = "Born in the USA"
 	}
 }
 
+func TestTableNesting(t *testing.T) {
+	for _, tt := range []struct {
+		t    string
+		want []string
+	}{
+		{"[a.b.c]", []string{"a", "b", "c"}},
+		{`[a."b.c"]`, []string{"a", "b.c"}},
+		{`[a.'b.c']`, []string{"a", "b.c"}},
+		{`[a.' b ']`, []string{"a", " b "}},
+		{"[ d.e.f ]", []string{"d", "e", "f"}},
+		{"[ g . h . i ]", []string{"g", "h", "i"}},
+		{`[ j . "ʞ" . 'l' ]`, []string{"j", "ʞ", "l"}},
+	} {
+		var m map[string]interface{}
+		if _, err := Decode(tt.t, &m); err != nil {
+			t.Errorf("Decode(%q): got error: %s", tt.t, err)
+			continue
+		}
+		if keys := extractNestedKeys(m); !reflect.DeepEqual(keys, tt.want) {
+			t.Errorf("Decode(%q): got nested keys %#v; want %#v",
+				tt.t, keys, tt.want)
+		}
+	}
+}
+
+func extractNestedKeys(v map[string]interface{}) []string {
+	var result []string
+	for {
+		if len(v) != 1 {
+			return result
+		}
+		for k, m := range v {
+			result = append(result, k)
+			var ok bool
+			v, ok = m.(map[string]interface{})
+			if !ok {
+				return result
+			}
+		}
+
+	}
+}
+
 // Case insensitive matching tests.
 // A bit more comprehensive than needed given the current implementation,
 // but implementations change.
@@ -285,6 +353,83 @@ Description = "da base"
 	}
 }
 
+func TestDecodeDatetime(t *testing.T) {
+	const noTimestamp = "2006-01-02T15:04:05"
+	for _, tt := range []struct {
+		s      string
+		t      string
+		format string
+	}{
+		{"1979-05-27T07:32:00Z", "1979-05-27T07:32:00Z", time.RFC3339},
+		{"1979-05-27T00:32:00-07:00", "1979-05-27T00:32:00-07:00", time.RFC3339},
+		{
+			"1979-05-27T00:32:00.999999-07:00",
+			"1979-05-27T00:32:00.999999-07:00",
+			time.RFC3339,
+		},
+		{"1979-05-27T07:32:00", "1979-05-27T07:32:00", noTimestamp},
+		{
+			"1979-05-27T00:32:00.999999",
+			"1979-05-27T00:32:00.999999",
+			noTimestamp,
+		},
+		{"1979-05-27", "1979-05-27T00:00:00", noTimestamp},
+	} {
+		var x struct{ D time.Time }
+		input := "d = " + tt.s
+		if _, err := Decode(input, &x); err != nil {
+			t.Errorf("Decode(%q): got error: %s", input, err)
+			continue
+		}
+		want, err := time.ParseInLocation(tt.format, tt.t, time.Local)
+		if err != nil {
+			panic(err)
+		}
+		if !x.D.Equal(want) {
+			t.Errorf("Decode(%q): got %s; want %s", input, x.D, want)
+		}
+	}
+}
+
+func TestDecodeBadDatetime(t *testing.T) {
+	var x struct{ T time.Time }
+	for _, s := range []string{
+		"123",
+		"2006-01-50T00:00:00Z",
+		"2006-01-30T00:00",
+		"2006-01-30T",
+	} {
+		input := "T = " + s
+		if _, err := Decode(input, &x); err == nil {
+			t.Errorf("Expected invalid DateTime error for %q", s)
+		}
+	}
+}
+
+func TestDecodeMultilineStrings(t *testing.T) {
+	var x struct {
+		S string
+	}
+	const s0 = `s = """
+a b \n c
+d e f
+"""`
+	if _, err := Decode(s0, &x); err != nil {
+		t.Fatal(err)
+	}
+	if want := "a b \n c\nd e f\n"; x.S != want {
+		t.Errorf("got: %q; want: %q", x.S, want)
+	}
+	const s1 = `s = """a b c\
+"""`
+	if _, err := Decode(s1, &x); err != nil {
+		t.Fatal(err)
+	}
+	if want := "a b c"; x.S != want {
+		t.Errorf("got: %q; want: %q", x.S, want)
+	}
+}
+
 type sphere struct {
 	Center [3]float64
 	Radius float64
@@ -349,6 +494,111 @@ func TestDecodeSizedInts(t *testing.T) {
 	}
 }
 
+func TestDecodeInts(t *testing.T) {
+	for _, tt := range []struct {
+		s    string
+		want int64
+	}{
+		{"0", 0},
+		{"+99", 99},
+		{"-10", -10},
+		{"1_234_567", 1234567},
+		{"1_2_3_4", 1234},
+		{"-9_223_372_036_854_775_808", math.MinInt64},
+		{"9_223_372_036_854_775_807", math.MaxInt64},
+	} {
+		var x struct{ N int64 }
+		input := "n = " + tt.s
+		if _, err := Decode(input, &x); err != nil {
+			t.Errorf("Decode(%q): got error: %s", input, err)
+			continue
+		}
+		if x.N != tt.want {
+			t.Errorf("Decode(%q): got %d; want %d", input, x.N, tt.want)
+		}
+	}
+}
+
+func TestDecodeFloats(t *testing.T) {
+	for _, tt := range []struct {
+		s    string
+		want float64
+	}{
+		{"+1.0", 1},
+		{"3.1415", 3.1415},
+		{"-0.01", -0.01},
+		{"5e+22", 5e22},
+		{"1e6", 1e6},
+		{"-2E-2", -2e-2},
+		{"6.626e-34", 6.626e-34},
+		{"9_224_617.445_991_228_313", 9224617.445991228313},
+		{"9_876.54_32e1_0", 9876.5432e10},
+	} {
+		var x struct{ N float64 }
+		input := "n = " + tt.s
+		if _, err := Decode(input, &x); err != nil {
+			t.Errorf("Decode(%q): got error: %s", input, err)
+			continue
+		}
+		if x.N != tt.want {
+			t.Errorf("Decode(%q): got %f; want %f", input, x.N, tt.want)
+		}
+	}
+}
+
+func TestDecodeMalformedNumbers(t *testing.T) {
+	for _, tt := range []struct {
+		s    string
+		want string
+	}{
+		{"++99", "expected a digit"},
+		{"0..1", "must be followed by one or more digits"},
+		{"0.1.2", "Invalid float value"},
+		{"1e2.3", "Invalid float value"},
+		{"1e2e3", "Invalid float value"},
+		{"_123", "expected value"},
+		{"123_", "surrounded by digits"},
+		{"1._23", "surrounded by digits"},
+		{"1e__23", "surrounded by digits"},
+		{"123.", "must be followed by one or more digits"},
+		{"1.e2", "must be followed by one or more digits"},
+	} {
+		var x struct{ N interface{} }
+		input := "n = " + tt.s
+		_, err := Decode(input, &x)
+		if err == nil {
+			t.Errorf("Decode(%q): got nil, want error containing %q",
+				input, tt.want)
+			continue
+		}
+		if !strings.Contains(err.Error(), tt.want) {
+			t.Errorf("Decode(%q): got %q, want error containing %q",
+				input, err, tt.want)
+		}
+	}
+}
+
+func TestDecodeBadValues(t *testing.T) {
+	for _, tt := range []struct {
+		v    interface{}
+		want string
+	}{
+		{3, "non-pointer int"},
+		{(*int)(nil), "nil"},
+	} {
+		_, err := Decode(`x = 3`, tt.v)
+		if err == nil {
+			t.Errorf("Decode(%v): got nil; want error containing %q",
+				tt.v, tt.want)
+			continue
+		}
+		if !strings.Contains(err.Error(), tt.want) {
+			t.Errorf("Decode(%v): got %q; want error containing %q",
+				tt.v, err, tt.want)
+		}
+	}
+}
+
 func TestUnmarshaler(t *testing.T) {
 
 	var tomlBlob = `
@@ -383,7 +633,7 @@ name = "Rice"
 `
 	m := &menu{}
 	if _, err := Decode(tomlBlob, m); err != nil {
-		log.Fatal(err)
+		t.Fatal(err)
 	}
 
 	if len(m.Dishes) != 2 {
@@ -419,9 +669,121 @@ name = "Rice"
 	// test on a value - must be passed as *
 	o := menu{}
 	if _, err := Decode(tomlBlob, &o); err != nil {
-		log.Fatal(err)
+		t.Fatal(err)
+	}
+
+}
+
+func TestDecodeInlineTable(t *testing.T) {
+	input := `
+[CookieJar]
+Types = {Chocolate = "yummy", Oatmeal = "best ever"}
+
+[Seasons]
+Locations = {NY = {Temp = "not cold", Rating = 4}, MI = {Temp = "freezing", Rating = 9}}
+`
+	type cookieJar struct {
+		Types map[string]string
+	}
+	type properties struct {
+		Temp   string
+		Rating int
+	}
+	type seasons struct {
+		Locations map[string]properties
+	}
+	type wrapper struct {
+		CookieJar cookieJar
+		Seasons   seasons
+	}
+	var got wrapper
+
+	meta, err := Decode(input, &got)
+	if err != nil {
+		t.Fatal(err)
+	}
+	want := wrapper{
+		CookieJar: cookieJar{
+			Types: map[string]string{
+				"Chocolate": "yummy",
+				"Oatmeal":   "best ever",
+			},
+		},
+		Seasons: seasons{
+			Locations: map[string]properties{
+				"NY": {
+					Temp:   "not cold",
+					Rating: 4,
+				},
+				"MI": {
+					Temp:   "freezing",
+					Rating: 9,
+				},
+			},
+		},
+	}
+	if !reflect.DeepEqual(got, want) {
+		t.Fatalf("after decode, got:\n\n%#v\n\nwant:\n\n%#v", got, want)
+	}
+	if len(meta.keys) != 12 {
+		t.Errorf("after decode, got %d meta keys; want 12", len(meta.keys))
+	}
+	if len(meta.types) != 12 {
+		t.Errorf("after decode, got %d meta types; want 12", len(meta.types))
+	}
+}
+
+func TestDecodeInlineTableArray(t *testing.T) {
+	type point struct {
+		X, Y, Z int
+	}
+	var got struct {
+		Points []point
+	}
+	// Example inline table array from the spec.
+	const in = `
+points = [ { x = 1, y = 2, z = 3 },
+           { x = 7, y = 8, z = 9 },
+           { x = 2, y = 4, z = 8 } ]
+
+`
+	if _, err := Decode(in, &got); err != nil {
+		t.Fatal(err)
+	}
+	want := []point{
+		{X: 1, Y: 2, Z: 3},
+		{X: 7, Y: 8, Z: 9},
+		{X: 2, Y: 4, Z: 8},
 	}
+	if !reflect.DeepEqual(got.Points, want) {
+		t.Errorf("got %#v; want %#v", got.Points, want)
+	}
+}
 
+func TestDecodeMalformedInlineTable(t *testing.T) {
+	for _, tt := range []struct {
+		s    string
+		want string
+	}{
+		{"{,}", "unexpected comma"},
+		{"{x = 3 y = 4}", "expected a comma or an inline table terminator"},
+		{"{x=3,,y=4}", "unexpected comma"},
+		{"{x=3,\ny=4}", "newlines not allowed"},
+		{"{x=3\n,y=4}", "newlines not allowed"},
+	} {
+		var x struct{ A map[string]int }
+		input := "a = " + tt.s
+		_, err := Decode(input, &x)
+		if err == nil {
+			t.Errorf("Decode(%q): got nil, want error containing %q",
+				input, tt.want)
+			continue
+		}
+		if !strings.Contains(err.Error(), tt.want) {
+			t.Errorf("Decode(%q): got %q, want error containing %q",
+				input, err, tt.want)
+		}
+	}
 }
 
 type menu struct {
@@ -468,6 +830,141 @@ type ingredient struct {
 	Name string
 }
 
+func TestDecodeSlices(t *testing.T) {
+	type T struct {
+		S []string
+	}
+	for i, tt := range []struct {
+		v     T
+		input string
+		want  T
+	}{
+		{T{}, "", T{}},
+		{T{[]string{}}, "", T{[]string{}}},
+		{T{[]string{"a", "b"}}, "", T{[]string{"a", "b"}}},
+		{T{}, "S = []", T{[]string{}}},
+		{T{[]string{}}, "S = []", T{[]string{}}},
+		{T{[]string{"a", "b"}}, "S = []", T{[]string{}}},
+		{T{}, `S = ["x"]`, T{[]string{"x"}}},
+		{T{[]string{}}, `S = ["x"]`, T{[]string{"x"}}},
+		{T{[]string{"a", "b"}}, `S = ["x"]`, T{[]string{"x"}}},
+	} {
+		if _, err := Decode(tt.input, &tt.v); err != nil {
+			t.Errorf("[%d] %s", i, err)
+			continue
+		}
+		if !reflect.DeepEqual(tt.v, tt.want) {
+			t.Errorf("[%d] got %#v; want %#v", i, tt.v, tt.want)
+		}
+	}
+}
+
+func TestDecodePrimitive(t *testing.T) {
+	type S struct {
+		P Primitive
+	}
+	type T struct {
+		S []int
+	}
+	slicep := func(s []int) *[]int { return &s }
+	arrayp := func(a [2]int) *[2]int { return &a }
+	mapp := func(m map[string]int) *map[string]int { return &m }
+	for i, tt := range []struct {
+		v     interface{}
+		input string
+		want  interface{}
+	}{
+		// slices
+		{slicep(nil), "", slicep(nil)},
+		{slicep([]int{}), "", slicep([]int{})},
+		{slicep([]int{1, 2, 3}), "", slicep([]int{1, 2, 3})},
+		{slicep(nil), "P = [1,2]", slicep([]int{1, 2})},
+		{slicep([]int{}), "P = [1,2]", slicep([]int{1, 2})},
+		{slicep([]int{1, 2, 3}), "P = [1,2]", slicep([]int{1, 2})},
+
+		// arrays
+		{arrayp([2]int{2, 3}), "", arrayp([2]int{2, 3})},
+		{arrayp([2]int{2, 3}), "P = [3,4]", arrayp([2]int{3, 4})},
+
+		// maps
+		{mapp(nil), "", mapp(nil)},
+		{mapp(map[string]int{}), "", mapp(map[string]int{})},
+		{mapp(map[string]int{"a": 1}), "", mapp(map[string]int{"a": 1})},
+		{mapp(nil), "[P]\na = 2", mapp(map[string]int{"a": 2})},
+		{mapp(map[string]int{}), "[P]\na = 2", mapp(map[string]int{"a": 2})},
+		{mapp(map[string]int{"a": 1, "b": 3}), "[P]\na = 2", mapp(map[string]int{"a": 2, "b": 3})},
+
+		// structs
+		{&T{nil}, "[P]", &T{nil}},
+		{&T{[]int{}}, "[P]", &T{[]int{}}},
+		{&T{[]int{1, 2, 3}}, "[P]", &T{[]int{1, 2, 3}}},
+		{&T{nil}, "[P]\nS = [1,2]", &T{[]int{1, 2}}},
+		{&T{[]int{}}, "[P]\nS = [1,2]", &T{[]int{1, 2}}},
+		{&T{[]int{1, 2, 3}}, "[P]\nS = [1,2]", &T{[]int{1, 2}}},
+	} {
+		var s S
+		md, err := Decode(tt.input, &s)
+		if err != nil {
+			t.Errorf("[%d] Decode error: %s", i, err)
+			continue
+		}
+		if err := md.PrimitiveDecode(s.P, tt.v); err != nil {
+			t.Errorf("[%d] PrimitiveDecode error: %s", i, err)
+			continue
+		}
+		if !reflect.DeepEqual(tt.v, tt.want) {
+			t.Errorf("[%d] got %#v; want %#v", i, tt.v, tt.want)
+		}
+	}
+}
+
+func TestDecodeErrors(t *testing.T) {
+	for _, s := range []string{
+		`x="`,
+		`x='`,
+		`x='''`,
+
+		// Cases found by fuzzing in
+		// https://github.com/BurntSushi/toml/issues/155.
+		`""�`,   // used to panic with index out of range
+		`e="""`, // used to hang
+	} {
+		var x struct{}
+		_, err := Decode(s, &x)
+		if err == nil {
+			t.Errorf("Decode(%q): got nil error", s)
+		}
+	}
+}
+
+// Test for https://github.com/BurntSushi/toml/pull/166.
+func TestDecodeBoolArray(t *testing.T) {
+	for _, tt := range []struct {
+		s    string
+		got  interface{}
+		want interface{}
+	}{
+		{
+			"a = [true, false]",
+			&struct{ A []bool }{},
+			&struct{ A []bool }{[]bool{true, false}},
+		},
+		{
+			"a = {a = true, b = false}",
+			&struct{ A map[string]bool }{},
+			&struct{ A map[string]bool }{map[string]bool{"a": true, "b": false}},
+		},
+	} {
+		if _, err := Decode(tt.s, tt.got); err != nil {
+			t.Errorf("Decode(%q): %s", tt.s, err)
+			continue
+		}
+		if !reflect.DeepEqual(tt.got, tt.want) {
+			t.Errorf("Decode(%q): got %#v; want %#v", tt.s, tt.got, tt.want)
+		}
+	}
+}
+
 func ExampleMetaData_PrimitiveDecode() {
 	var md MetaData
 	var err error
@@ -553,7 +1050,7 @@ ip = "10.0.0.2"
 	}
 
 	type server struct {
-		IP     string       `toml:"ip"`
+		IP     string       `toml:"ip,omitempty"`
 		Config serverConfig `toml:"config"`
 	}
 
@@ -715,7 +1212,7 @@ rating = 3.1
 
 	// 	// NOTE the example below contains detailed type casting to show how
 	// 	// the 'data' is retrieved. In operational use, a type cast wrapper
-	// 	// may be prefered e.g.
+	// 	// may be preferred e.g.
 	// 	//
 	// 	// func AsMap(v interface{}) (map[string]interface{}, error) {
 	// 	// 		return v.(map[string]interface{})
@@ -842,7 +1339,7 @@ func (o *order) UnmarshalTOML(data interface{}) error {
 
 	// NOTE the example below contains detailed type casting to show how
 	// the 'data' is retrieved. In operational use, a type cast wrapper
-	// may be prefered e.g.
+	// may be preferred e.g.
 	//
 	// func AsMap(v interface{}) (map[string]interface{}, error) {
 	// 		return v.(map[string]interface{})

+ 1 - 1
vendor/github.com/BurntSushi/toml/doc.go

@@ -4,7 +4,7 @@ files via reflection. There is also support for delaying decoding with
 the Primitive type, and querying the set of keys in a TOML document with the
 MetaData type.
 
-The specification implemented: https://github.com/mojombo/toml
+The specification implemented: https://github.com/toml-lang/toml
 
 The sub-command github.com/BurntSushi/toml/cmd/tomlv can be used to verify
 whether a file is a valid TOML document. It can also be used to print the

+ 73 - 56
vendor/github.com/BurntSushi/toml/encode.go

@@ -16,17 +16,17 @@ type tomlEncodeError struct{ error }
 
 var (
 	errArrayMixedElementTypes = errors.New(
-		"can't encode array with mixed element types")
+		"toml: cannot encode array with mixed element types")
 	errArrayNilElement = errors.New(
-		"can't encode array with nil element")
+		"toml: cannot encode array with nil element")
 	errNonString = errors.New(
-		"can't encode a map with non-string key type")
+		"toml: cannot encode a map with non-string key type")
 	errAnonNonStruct = errors.New(
-		"can't encode an anonymous field that is not a struct")
+		"toml: cannot encode an anonymous field that is not a struct")
 	errArrayNoTable = errors.New(
-		"TOML array element can't contain a table")
+		"toml: TOML array element cannot contain a table")
 	errNoKey = errors.New(
-		"top-level values must be a Go map or struct")
+		"toml: top-level values must be Go maps or structs")
 	errAnything = errors.New("") // used in testing
 )
 
@@ -148,7 +148,7 @@ func (enc *Encoder) encode(key Key, rv reflect.Value) {
 	case reflect.Struct:
 		enc.eTable(key, rv)
 	default:
-		panic(e("Unsupported type for key '%s': %s", key, k))
+		panic(e("unsupported type for key '%s': %s", key, k))
 	}
 }
 
@@ -160,7 +160,7 @@ func (enc *Encoder) eElement(rv reflect.Value) {
 		// Special case time.Time as a primitive. Has to come before
 		// TextMarshaler below because time.Time implements
 		// encoding.TextMarshaler, but we need to always use UTC.
-		enc.wf(v.In(time.FixedZone("UTC", 0)).Format("2006-01-02T15:04:05Z"))
+		enc.wf(v.UTC().Format("2006-01-02T15:04:05Z"))
 		return
 	case TextMarshaler:
 		// Special case. Use text marshaler if it's available for this value.
@@ -191,7 +191,7 @@ func (enc *Encoder) eElement(rv reflect.Value) {
 	case reflect.String:
 		enc.writeQuoted(rv.String())
 	default:
-		panic(e("Unexpected primitive type: %s", rv.Kind()))
+		panic(e("unexpected primitive type: %s", rv.Kind()))
 	}
 }
 
@@ -241,7 +241,7 @@ func (enc *Encoder) eArrayOfTables(key Key, rv reflect.Value) {
 func (enc *Encoder) eTable(key Key, rv reflect.Value) {
 	panicIfInvalidKey(key)
 	if len(key) == 1 {
-		// Output an extra new line between top-level tables.
+		// Output an extra newline between top-level tables.
 		// (The newline isn't written if nothing else has been written though.)
 		enc.newline()
 	}
@@ -306,19 +306,36 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value) {
 	addFields = func(rt reflect.Type, rv reflect.Value, start []int) {
 		for i := 0; i < rt.NumField(); i++ {
 			f := rt.Field(i)
-			// skip unexporded fields
-			if f.PkgPath != "" {
+			// skip unexported fields
+			if f.PkgPath != "" && !f.Anonymous {
 				continue
 			}
 			frv := rv.Field(i)
 			if f.Anonymous {
-				frv := eindirect(frv)
-				t := frv.Type()
-				if t.Kind() != reflect.Struct {
-					encPanic(errAnonNonStruct)
+				t := f.Type
+				switch t.Kind() {
+				case reflect.Struct:
+					// Treat anonymous struct fields with
+					// tag names as though they are not
+					// anonymous, like encoding/json does.
+					if getOptions(f.Tag).name == "" {
+						addFields(t, frv, f.Index)
+						continue
+					}
+				case reflect.Ptr:
+					if t.Elem().Kind() == reflect.Struct &&
+						getOptions(f.Tag).name == "" {
+						if !frv.IsNil() {
+							addFields(t.Elem(), frv.Elem(), f.Index)
+						}
+						continue
+					}
+					// Fall through to the normal field encoding logic below
+					// for non-struct anonymous fields.
 				}
-				addFields(t, frv, f.Index)
-			} else if typeIsHash(tomlTypeOfGo(frv)) {
+			}
+
+			if typeIsHash(tomlTypeOfGo(frv)) {
 				fieldsSub = append(fieldsSub, append(start, f.Index...))
 			} else {
 				fieldsDirect = append(fieldsDirect, append(start, f.Index...))
@@ -336,18 +353,18 @@ func (enc *Encoder) eStruct(key Key, rv reflect.Value) {
 				continue
 			}
 
-			keyName := sft.Tag.Get("toml")
-			if keyName == "-" {
+			opts := getOptions(sft.Tag)
+			if opts.skip {
 				continue
 			}
-			if keyName == "" {
-				keyName = sft.Name
+			keyName := sft.Name
+			if opts.name != "" {
+				keyName = opts.name
 			}
-
-			keyName, opts := getOptions(keyName)
-			if _, ok := opts["omitempty"]; ok && isEmpty(sf) {
+			if opts.omitempty && isEmpty(sf) {
 				continue
-			} else if _, ok := opts["omitzero"]; ok && isZero(sf) {
+			}
+			if opts.omitzero && isZero(sf) {
 				continue
 			}
 
@@ -382,9 +399,8 @@ func tomlTypeOfGo(rv reflect.Value) tomlType {
 	case reflect.Array, reflect.Slice:
 		if typeEqual(tomlHash, tomlArrayType(rv)) {
 			return tomlArrayHash
-		} else {
-			return tomlArray
 		}
+		return tomlArray
 	case reflect.Ptr, reflect.Interface:
 		return tomlTypeOfGo(rv.Elem())
 	case reflect.String:
@@ -441,50 +457,51 @@ func tomlArrayType(rv reflect.Value) tomlType {
 	return firstType
 }
 
-func getOptions(keyName string) (string, map[string]struct{}) {
-	opts := make(map[string]struct{})
-	ss := strings.Split(keyName, ",")
-	name := ss[0]
-	if len(ss) > 1 {
-		for _, opt := range ss {
-			opts[opt] = struct{}{}
+type tagOptions struct {
+	skip      bool // "-"
+	name      string
+	omitempty bool
+	omitzero  bool
+}
+
+func getOptions(tag reflect.StructTag) tagOptions {
+	t := tag.Get("toml")
+	if t == "-" {
+		return tagOptions{skip: true}
+	}
+	var opts tagOptions
+	parts := strings.Split(t, ",")
+	opts.name = parts[0]
+	for _, s := range parts[1:] {
+		switch s {
+		case "omitempty":
+			opts.omitempty = true
+		case "omitzero":
+			opts.omitzero = true
 		}
 	}
-
-	return name, opts
+	return opts
 }
 
 func isZero(rv reflect.Value) bool {
 	switch rv.Kind() {
 	case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
-		if rv.Int() == 0 {
-			return true
-		}
+		return rv.Int() == 0
 	case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
-		if rv.Uint() == 0 {
-			return true
-		}
+		return rv.Uint() == 0
 	case reflect.Float32, reflect.Float64:
-		if rv.Float() == 0.0 {
-			return true
-		}
+		return rv.Float() == 0.0
 	}
-
 	return false
 }
 
 func isEmpty(rv reflect.Value) bool {
 	switch rv.Kind() {
-	case reflect.String:
-		if len(strings.TrimSpace(rv.String())) == 0 {
-			return true
-		}
-	case reflect.Array, reflect.Slice, reflect.Map:
-		if rv.Len() == 0 {
-			return true
-		}
+	case reflect.Array, reflect.Slice, reflect.Map, reflect.String:
+		return rv.Len() == 0
+	case reflect.Bool:
+		return !rv.Bool()
 	}
-
 	return false
 }
 

+ 87 - 14
vendor/github.com/BurntSushi/toml/encode_test.go

@@ -36,7 +36,7 @@ func TestEncodeRoundTrip(t *testing.T) {
 	}
 	var outputs Config
 	if _, err := Decode(firstBuffer.String(), &outputs); err != nil {
-		log.Printf("Could not decode:\n-----\n%s\n-----\n",
+		t.Logf("Could not decode:\n-----\n%s\n-----\n",
 			firstBuffer.String())
 		t.Fatal(err)
 	}
@@ -336,6 +336,10 @@ ArrayOfMixedSlices = [[1, 2], ["a", "b"]]
 			}{struct{ *Embedded }{&Embedded{1}}},
 			wantOutput: "[_struct]\n  _int = 1\n",
 		},
+		"embedded non-struct": {
+			input:      struct{ NonStruct }{5},
+			wantOutput: "NonStruct = 5\n",
+		},
 		"array of tables": {
 			input: struct {
 				Structs []*struct{ Int int } `toml:"struct"`
@@ -349,7 +353,7 @@ ArrayOfMixedSlices = [[1, 2], ["a", "b"]]
 				"map": map[string]interface{}{
 					"zero": 5,
 					"arr": []map[string]int{
-						map[string]int{
+						{
 							"friend": 5,
 						},
 					},
@@ -373,10 +377,6 @@ ArrayOfMixedSlices = [[1, 2], ["a", "b"]]
 			input:     map[int]string{1: ""},
 			wantError: errNonString,
 		},
-		"(error) anonymous non-struct": {
-			input:     struct{ NonStruct }{5},
-			wantError: errAnonNonStruct,
-		},
 		"(error) empty key name": {
 			input:     map[string]int{"": 1},
 			wantError: errAnything,
@@ -457,16 +457,30 @@ func TestEncodeArrayHashWithNormalHashOrder(t *testing.T) {
 
 func TestEncodeWithOmitEmpty(t *testing.T) {
 	type simple struct {
-		User string `toml:"user"`
-		Pass string `toml:"password,omitempty"`
+		Bool   bool              `toml:"bool,omitempty"`
+		String string            `toml:"string,omitempty"`
+		Array  [0]byte           `toml:"array,omitempty"`
+		Slice  []int             `toml:"slice,omitempty"`
+		Map    map[string]string `toml:"map,omitempty"`
+	}
+
+	var v simple
+	encodeExpected(t, "fields with omitempty are omitted when empty", v, "", nil)
+	v = simple{
+		Bool:   true,
+		String: " ",
+		Slice:  []int{2, 3, 4},
+		Map:    map[string]string{"foo": "bar"},
 	}
+	expected := `bool = true
+string = " "
+slice = [2, 3, 4]
 
-	value := simple{"Testing", ""}
-	expected := fmt.Sprintf("user = %q\n", value.User)
-	encodeExpected(t, "simple with omitempty, is empty", value, expected, nil)
-	value.Pass = "some password"
-	expected = fmt.Sprintf("user = %q\npassword = %q\n", value.User, value.Pass)
-	encodeExpected(t, "simple with omitempty, not empty", value, expected, nil)
+[map]
+  foo = "bar"
+`
+	encodeExpected(t, "fields with omitempty are not omitted when non-empty",
+		v, expected, nil)
 }
 
 func TestEncodeWithOmitZero(t *testing.T) {
@@ -491,6 +505,65 @@ unsigned = 5
 	encodeExpected(t, "simple with omitzero, non-zero", value, expected, nil)
 }
 
+func TestEncodeOmitemptyWithEmptyName(t *testing.T) {
+	type simple struct {
+		S []int `toml:",omitempty"`
+	}
+	v := simple{[]int{1, 2, 3}}
+	expected := "S = [1, 2, 3]\n"
+	encodeExpected(t, "simple with omitempty, no name, non-empty field",
+		v, expected, nil)
+}
+
+func TestEncodeAnonymousStruct(t *testing.T) {
+	type Inner struct{ N int }
+	type Outer0 struct{ Inner }
+	type Outer1 struct {
+		Inner `toml:"inner"`
+	}
+
+	v0 := Outer0{Inner{3}}
+	expected := "N = 3\n"
+	encodeExpected(t, "embedded anonymous untagged struct", v0, expected, nil)
+
+	v1 := Outer1{Inner{3}}
+	expected = "[inner]\n  N = 3\n"
+	encodeExpected(t, "embedded anonymous tagged struct", v1, expected, nil)
+}
+
+func TestEncodeAnonymousStructPointerField(t *testing.T) {
+	type Inner struct{ N int }
+	type Outer0 struct{ *Inner }
+	type Outer1 struct {
+		*Inner `toml:"inner"`
+	}
+
+	v0 := Outer0{}
+	expected := ""
+	encodeExpected(t, "nil anonymous untagged struct pointer field", v0, expected, nil)
+
+	v0 = Outer0{&Inner{3}}
+	expected = "N = 3\n"
+	encodeExpected(t, "non-nil anonymous untagged struct pointer field", v0, expected, nil)
+
+	v1 := Outer1{}
+	expected = ""
+	encodeExpected(t, "nil anonymous tagged struct pointer field", v1, expected, nil)
+
+	v1 = Outer1{&Inner{3}}
+	expected = "[inner]\n  N = 3\n"
+	encodeExpected(t, "non-nil anonymous tagged struct pointer field", v1, expected, nil)
+}
+
+func TestEncodeIgnoredFields(t *testing.T) {
+	type simple struct {
+		Number int `toml:"-"`
+	}
+	value := simple{}
+	expected := ""
+	encodeExpected(t, "ignored field", value, expected, nil)
+}
+
 func encodeExpected(
 	t *testing.T, label string, val interface{}, wantStr string, wantErr error,
 ) {

+ 288 - 209
vendor/github.com/BurntSushi/toml/lex.go

@@ -3,6 +3,7 @@ package toml
 import (
 	"fmt"
 	"strings"
+	"unicode"
 	"unicode/utf8"
 )
 
@@ -29,24 +30,28 @@ const (
 	itemArrayTableEnd
 	itemKeyStart
 	itemCommentStart
+	itemInlineTableStart
+	itemInlineTableEnd
 )
 
 const (
-	eof             = 0
-	tableStart      = '['
-	tableEnd        = ']'
-	arrayTableStart = '['
-	arrayTableEnd   = ']'
-	tableSep        = '.'
-	keySep          = '='
-	arrayStart      = '['
-	arrayEnd        = ']'
-	arrayValTerm    = ','
-	commentStart    = '#'
-	stringStart     = '"'
-	stringEnd       = '"'
-	rawStringStart  = '\''
-	rawStringEnd    = '\''
+	eof              = 0
+	comma            = ','
+	tableStart       = '['
+	tableEnd         = ']'
+	arrayTableStart  = '['
+	arrayTableEnd    = ']'
+	tableSep         = '.'
+	keySep           = '='
+	arrayStart       = '['
+	arrayEnd         = ']'
+	commentStart     = '#'
+	stringStart      = '"'
+	stringEnd        = '"'
+	rawStringStart   = '\''
+	rawStringEnd     = '\''
+	inlineTableStart = '{'
+	inlineTableEnd   = '}'
 )
 
 type stateFn func(lx *lexer) stateFn
@@ -55,11 +60,18 @@ type lexer struct {
 	input string
 	start int
 	pos   int
-	width int
 	line  int
 	state stateFn
 	items chan item
 
+	// Allow for backing up up to three runes.
+	// This is necessary because TOML contains 3-rune tokens (""" and ''').
+	prevWidths [3]int
+	nprev      int // how many of prevWidths are in use
+	// If we emit an eof, we can still back up, but it is not OK to call
+	// next again.
+	atEOF bool
+
 	// A stack of state functions used to maintain context.
 	// The idea is to reuse parts of the state machine in various places.
 	// For example, values can appear at the top level or within arbitrarily
@@ -87,7 +99,7 @@ func (lx *lexer) nextItem() item {
 
 func lex(input string) *lexer {
 	lx := &lexer{
-		input: input + "\n",
+		input: input,
 		state: lexTop,
 		line:  1,
 		items: make(chan item, 10),
@@ -102,7 +114,7 @@ func (lx *lexer) push(state stateFn) {
 
 func (lx *lexer) pop() stateFn {
 	if len(lx.stack) == 0 {
-		return lx.errorf("BUG in lexer: no states to pop.")
+		return lx.errorf("BUG in lexer: no states to pop")
 	}
 	last := lx.stack[len(lx.stack)-1]
 	lx.stack = lx.stack[0 : len(lx.stack)-1]
@@ -124,16 +136,25 @@ func (lx *lexer) emitTrim(typ itemType) {
 }
 
 func (lx *lexer) next() (r rune) {
+	if lx.atEOF {
+		panic("next called after EOF")
+	}
 	if lx.pos >= len(lx.input) {
-		lx.width = 0
+		lx.atEOF = true
 		return eof
 	}
 
 	if lx.input[lx.pos] == '\n' {
 		lx.line++
 	}
-	r, lx.width = utf8.DecodeRuneInString(lx.input[lx.pos:])
-	lx.pos += lx.width
+	lx.prevWidths[2] = lx.prevWidths[1]
+	lx.prevWidths[1] = lx.prevWidths[0]
+	if lx.nprev < 3 {
+		lx.nprev++
+	}
+	r, w := utf8.DecodeRuneInString(lx.input[lx.pos:])
+	lx.prevWidths[0] = w
+	lx.pos += w
 	return r
 }
 
@@ -142,9 +163,20 @@ func (lx *lexer) ignore() {
 	lx.start = lx.pos
 }
 
-// backup steps back one rune. Can be called only once per call of next.
+// backup steps back one rune. Can be called only twice between calls to next.
 func (lx *lexer) backup() {
-	lx.pos -= lx.width
+	if lx.atEOF {
+		lx.atEOF = false
+		return
+	}
+	if lx.nprev < 1 {
+		panic("backed up too far")
+	}
+	w := lx.prevWidths[0]
+	lx.prevWidths[0] = lx.prevWidths[1]
+	lx.prevWidths[1] = lx.prevWidths[2]
+	lx.nprev--
+	lx.pos -= w
 	if lx.pos < len(lx.input) && lx.input[lx.pos] == '\n' {
 		lx.line--
 	}
@@ -166,9 +198,22 @@ func (lx *lexer) peek() rune {
 	return r
 }
 
+// skip ignores all input that matches the given predicate.
+func (lx *lexer) skip(pred func(rune) bool) {
+	for {
+		r := lx.next()
+		if pred(r) {
+			continue
+		}
+		lx.backup()
+		lx.ignore()
+		return
+	}
+}
+
 // errorf stops all lexing by emitting an error and returning `nil`.
 // Note that any value that is a character is escaped if it's a special
-// character (new lines, tabs, etc.).
+// character (newlines, tabs, etc.).
 func (lx *lexer) errorf(format string, values ...interface{}) stateFn {
 	lx.items <- item{
 		itemError,
@@ -184,7 +229,6 @@ func lexTop(lx *lexer) stateFn {
 	if isWhitespace(r) || isNL(r) {
 		return lexSkip(lx, lexTop)
 	}
-
 	switch r {
 	case commentStart:
 		lx.push(lexTop)
@@ -193,7 +237,7 @@ func lexTop(lx *lexer) stateFn {
 		return lexTableStart
 	case eof:
 		if lx.pos > lx.start {
-			return lx.errorf("Unexpected EOF.")
+			return lx.errorf("unexpected EOF")
 		}
 		lx.emit(itemEOF)
 		return nil
@@ -208,12 +252,12 @@ func lexTop(lx *lexer) stateFn {
 
 // lexTopEnd is entered whenever a top-level item has been consumed. (A value
 // or a table.) It must see only whitespace, and will turn back to lexTop
-// upon a new line. If it sees EOF, it will quit the lexer successfully.
+// upon a newline. If it sees EOF, it will quit the lexer successfully.
 func lexTopEnd(lx *lexer) stateFn {
 	r := lx.next()
 	switch {
 	case r == commentStart:
-		// a comment will read to a new line for us.
+		// a comment will read to a newline for us.
 		lx.push(lexTop)
 		return lexCommentStart
 	case isWhitespace(r):
@@ -222,11 +266,11 @@ func lexTopEnd(lx *lexer) stateFn {
 		lx.ignore()
 		return lexTop
 	case r == eof:
-		lx.ignore()
-		return lexTop
+		lx.emit(itemEOF)
+		return nil
 	}
-	return lx.errorf("Expected a top-level item to end with a new line, "+
-		"comment or EOF, but got %q instead.", r)
+	return lx.errorf("expected a top-level item to end with a newline, "+
+		"comment, or EOF, but got %q instead", r)
 }
 
 // lexTable lexes the beginning of a table. Namely, it makes sure that
@@ -253,50 +297,47 @@ func lexTableEnd(lx *lexer) stateFn {
 
 func lexArrayTableEnd(lx *lexer) stateFn {
 	if r := lx.next(); r != arrayTableEnd {
-		return lx.errorf("Expected end of table array name delimiter %q, "+
-			"but got %q instead.", arrayTableEnd, r)
+		return lx.errorf("expected end of table array name delimiter %q, "+
+			"but got %q instead", arrayTableEnd, r)
 	}
 	lx.emit(itemArrayTableEnd)
 	return lexTopEnd
 }
 
 func lexTableNameStart(lx *lexer) stateFn {
+	lx.skip(isWhitespace)
 	switch r := lx.peek(); {
 	case r == tableEnd || r == eof:
-		return lx.errorf("Unexpected end of table name. (Table names cannot " +
-			"be empty.)")
+		return lx.errorf("unexpected end of table name " +
+			"(table names cannot be empty)")
 	case r == tableSep:
-		return lx.errorf("Unexpected table separator. (Table names cannot " +
-			"be empty.)")
+		return lx.errorf("unexpected table separator " +
+			"(table names cannot be empty)")
 	case r == stringStart || r == rawStringStart:
 		lx.ignore()
 		lx.push(lexTableNameEnd)
 		return lexValue // reuse string lexing
-	case isWhitespace(r):
-		return lexTableNameStart
 	default:
 		return lexBareTableName
 	}
 }
 
-// lexTableName lexes the name of a table. It assumes that at least one
+// lexBareTableName lexes the name of a table. It assumes that at least one
 // valid character for the table has already been read.
 func lexBareTableName(lx *lexer) stateFn {
-	switch r := lx.next(); {
-	case isBareKeyChar(r):
+	r := lx.next()
+	if isBareKeyChar(r) {
 		return lexBareTableName
-	case r == tableSep || r == tableEnd:
-		lx.backup()
-		lx.emitTrim(itemText)
-		return lexTableNameEnd
-	default:
-		return lx.errorf("Bare keys cannot contain %q.", r)
 	}
+	lx.backup()
+	lx.emit(itemText)
+	return lexTableNameEnd
 }
 
 // lexTableNameEnd reads the end of a piece of a table name, optionally
 // consuming whitespace.
 func lexTableNameEnd(lx *lexer) stateFn {
+	lx.skip(isWhitespace)
 	switch r := lx.next(); {
 	case isWhitespace(r):
 		return lexTableNameEnd
@@ -306,8 +347,8 @@ func lexTableNameEnd(lx *lexer) stateFn {
 	case r == tableEnd:
 		return lx.pop()
 	default:
-		return lx.errorf("Expected '.' or ']' to end table name, but got %q "+
-			"instead.", r)
+		return lx.errorf("expected '.' or ']' to end table name, "+
+			"but got %q instead", r)
 	}
 }
 
@@ -317,7 +358,7 @@ func lexKeyStart(lx *lexer) stateFn {
 	r := lx.peek()
 	switch {
 	case r == keySep:
-		return lx.errorf("Unexpected key separator %q.", keySep)
+		return lx.errorf("unexpected key separator %q", keySep)
 	case isWhitespace(r) || isNL(r):
 		lx.next()
 		return lexSkip(lx, lexKeyStart)
@@ -340,14 +381,15 @@ func lexBareKey(lx *lexer) stateFn {
 	case isBareKeyChar(r):
 		return lexBareKey
 	case isWhitespace(r):
-		lx.emitTrim(itemText)
+		lx.backup()
+		lx.emit(itemText)
 		return lexKeyEnd
 	case r == keySep:
 		lx.backup()
-		lx.emitTrim(itemText)
+		lx.emit(itemText)
 		return lexKeyEnd
 	default:
-		return lx.errorf("Bare keys cannot contain %q.", r)
+		return lx.errorf("bare keys cannot contain %q", r)
 	}
 }
 
@@ -360,7 +402,7 @@ func lexKeyEnd(lx *lexer) stateFn {
 	case isWhitespace(r):
 		return lexSkip(lx, lexKeyEnd)
 	default:
-		return lx.errorf("Expected key separator %q, but got %q instead.",
+		return lx.errorf("expected key separator %q, but got %q instead",
 			keySep, r)
 	}
 }
@@ -369,20 +411,26 @@ func lexKeyEnd(lx *lexer) stateFn {
 // lexValue will ignore whitespace.
 // After a value is lexed, the last state on the next is popped and returned.
 func lexValue(lx *lexer) stateFn {
-	// We allow whitespace to precede a value, but NOT new lines.
-	// In array syntax, the array states are responsible for ignoring new
-	// lines.
+	// We allow whitespace to precede a value, but NOT newlines.
+	// In array syntax, the array states are responsible for ignoring newlines.
 	r := lx.next()
-	if isWhitespace(r) {
+	switch {
+	case isWhitespace(r):
 		return lexSkip(lx, lexValue)
+	case isDigit(r):
+		lx.backup() // avoid an extra state and use the same as above
+		return lexNumberOrDateStart
 	}
-
-	switch {
-	case r == arrayStart:
+	switch r {
+	case arrayStart:
 		lx.ignore()
 		lx.emit(itemArray)
 		return lexArrayValue
-	case r == stringStart:
+	case inlineTableStart:
+		lx.ignore()
+		lx.emit(itemInlineTableStart)
+		return lexInlineTableValue
+	case stringStart:
 		if lx.accept(stringStart) {
 			if lx.accept(stringStart) {
 				lx.ignore() // Ignore """
@@ -392,7 +440,7 @@ func lexValue(lx *lexer) stateFn {
 		}
 		lx.ignore() // ignore the '"'
 		return lexString
-	case r == rawStringStart:
+	case rawStringStart:
 		if lx.accept(rawStringStart) {
 			if lx.accept(rawStringStart) {
 				lx.ignore() // Ignore """
@@ -402,23 +450,24 @@ func lexValue(lx *lexer) stateFn {
 		}
 		lx.ignore() // ignore the "'"
 		return lexRawString
-	case r == 't':
-		return lexTrue
-	case r == 'f':
-		return lexFalse
-	case r == '-':
+	case '+', '-':
 		return lexNumberStart
-	case isDigit(r):
-		lx.backup() // avoid an extra state and use the same as above
-		return lexNumberOrDateStart
-	case r == '.': // special error case, be kind to users
-		return lx.errorf("Floats must start with a digit, not '.'.")
+	case '.': // special error case, be kind to users
+		return lx.errorf("floats must start with a digit, not '.'")
+	}
+	if unicode.IsLetter(r) {
+		// Be permissive here; lexBool will give a nice error if the
+		// user wrote something like
+		//   x = foo
+		// (i.e. not 'true' or 'false' but is something else word-like.)
+		lx.backup()
+		return lexBool
 	}
-	return lx.errorf("Expected value but found %q instead.", r)
+	return lx.errorf("expected value but found %q instead", r)
 }
 
 // lexArrayValue consumes one value in an array. It assumes that '[' or ','
-// have already been consumed. All whitespace and new lines are ignored.
+// have already been consumed. All whitespace and newlines are ignored.
 func lexArrayValue(lx *lexer) stateFn {
 	r := lx.next()
 	switch {
@@ -427,10 +476,11 @@ func lexArrayValue(lx *lexer) stateFn {
 	case r == commentStart:
 		lx.push(lexArrayValue)
 		return lexCommentStart
-	case r == arrayValTerm:
-		return lx.errorf("Unexpected array value terminator %q.",
-			arrayValTerm)
+	case r == comma:
+		return lx.errorf("unexpected comma")
 	case r == arrayEnd:
+		// NOTE(caleb): The spec isn't clear about whether you can have
+		// a trailing comma or not, so we'll allow it.
 		return lexArrayEnd
 	}
 
@@ -439,8 +489,9 @@ func lexArrayValue(lx *lexer) stateFn {
 	return lexValue
 }
 
-// lexArrayValueEnd consumes the cruft between values of an array. Namely,
-// it ignores whitespace and expects either a ',' or a ']'.
+// lexArrayValueEnd consumes everything between the end of an array value and
+// the next value (or the end of the array): it ignores whitespace and newlines
+// and expects either a ',' or a ']'.
 func lexArrayValueEnd(lx *lexer) stateFn {
 	r := lx.next()
 	switch {
@@ -449,31 +500,88 @@ func lexArrayValueEnd(lx *lexer) stateFn {
 	case r == commentStart:
 		lx.push(lexArrayValueEnd)
 		return lexCommentStart
-	case r == arrayValTerm:
+	case r == comma:
 		lx.ignore()
 		return lexArrayValue // move on to the next value
 	case r == arrayEnd:
 		return lexArrayEnd
 	}
-	return lx.errorf("Expected an array value terminator %q or an array "+
-		"terminator %q, but got %q instead.", arrayValTerm, arrayEnd, r)
+	return lx.errorf(
+		"expected a comma or array terminator %q, but got %q instead",
+		arrayEnd, r,
+	)
 }
 
-// lexArrayEnd finishes the lexing of an array. It assumes that a ']' has
-// just been consumed.
+// lexArrayEnd finishes the lexing of an array.
+// It assumes that a ']' has just been consumed.
 func lexArrayEnd(lx *lexer) stateFn {
 	lx.ignore()
 	lx.emit(itemArrayEnd)
 	return lx.pop()
 }
 
+// lexInlineTableValue consumes one key/value pair in an inline table.
+// It assumes that '{' or ',' have already been consumed. Whitespace is ignored.
+func lexInlineTableValue(lx *lexer) stateFn {
+	r := lx.next()
+	switch {
+	case isWhitespace(r):
+		return lexSkip(lx, lexInlineTableValue)
+	case isNL(r):
+		return lx.errorf("newlines not allowed within inline tables")
+	case r == commentStart:
+		lx.push(lexInlineTableValue)
+		return lexCommentStart
+	case r == comma:
+		return lx.errorf("unexpected comma")
+	case r == inlineTableEnd:
+		return lexInlineTableEnd
+	}
+	lx.backup()
+	lx.push(lexInlineTableValueEnd)
+	return lexKeyStart
+}
+
+// lexInlineTableValueEnd consumes everything between the end of an inline table
+// key/value pair and the next pair (or the end of the table):
+// it ignores whitespace and expects either a ',' or a '}'.
+func lexInlineTableValueEnd(lx *lexer) stateFn {
+	r := lx.next()
+	switch {
+	case isWhitespace(r):
+		return lexSkip(lx, lexInlineTableValueEnd)
+	case isNL(r):
+		return lx.errorf("newlines not allowed within inline tables")
+	case r == commentStart:
+		lx.push(lexInlineTableValueEnd)
+		return lexCommentStart
+	case r == comma:
+		lx.ignore()
+		return lexInlineTableValue
+	case r == inlineTableEnd:
+		return lexInlineTableEnd
+	}
+	return lx.errorf("expected a comma or an inline table terminator %q, "+
+		"but got %q instead", inlineTableEnd, r)
+}
+
+// lexInlineTableEnd finishes the lexing of an inline table.
+// It assumes that a '}' has just been consumed.
+func lexInlineTableEnd(lx *lexer) stateFn {
+	lx.ignore()
+	lx.emit(itemInlineTableEnd)
+	return lx.pop()
+}
+
 // lexString consumes the inner contents of a string. It assumes that the
 // beginning '"' has already been consumed and ignored.
 func lexString(lx *lexer) stateFn {
 	r := lx.next()
 	switch {
+	case r == eof:
+		return lx.errorf("unexpected EOF")
 	case isNL(r):
-		return lx.errorf("Strings cannot contain new lines.")
+		return lx.errorf("strings cannot contain newlines")
 	case r == '\\':
 		lx.push(lexString)
 		return lexStringEscape
@@ -490,11 +598,12 @@ func lexString(lx *lexer) stateFn {
 // lexMultilineString consumes the inner contents of a string. It assumes that
 // the beginning '"""' has already been consumed and ignored.
 func lexMultilineString(lx *lexer) stateFn {
-	r := lx.next()
-	switch {
-	case r == '\\':
+	switch lx.next() {
+	case eof:
+		return lx.errorf("unexpected EOF")
+	case '\\':
 		return lexMultilineStringEscape
-	case r == stringEnd:
+	case stringEnd:
 		if lx.accept(stringEnd) {
 			if lx.accept(stringEnd) {
 				lx.backup()
@@ -518,8 +627,10 @@ func lexMultilineString(lx *lexer) stateFn {
 func lexRawString(lx *lexer) stateFn {
 	r := lx.next()
 	switch {
+	case r == eof:
+		return lx.errorf("unexpected EOF")
 	case isNL(r):
-		return lx.errorf("Strings cannot contain new lines.")
+		return lx.errorf("strings cannot contain newlines")
 	case r == rawStringEnd:
 		lx.backup()
 		lx.emit(itemRawString)
@@ -531,12 +642,13 @@ func lexRawString(lx *lexer) stateFn {
 }
 
 // lexMultilineRawString consumes a raw string. Nothing can be escaped in such
-// a string. It assumes that the beginning "'" has already been consumed and
+// a string. It assumes that the beginning "'''" has already been consumed and
 // ignored.
 func lexMultilineRawString(lx *lexer) stateFn {
-	r := lx.next()
-	switch {
-	case r == rawStringEnd:
+	switch lx.next() {
+	case eof:
+		return lx.errorf("unexpected EOF")
+	case rawStringEnd:
 		if lx.accept(rawStringEnd) {
 			if lx.accept(rawStringEnd) {
 				lx.backup()
@@ -560,13 +672,11 @@ func lexMultilineRawString(lx *lexer) stateFn {
 func lexMultilineStringEscape(lx *lexer) stateFn {
 	// Handle the special case first:
 	if isNL(lx.next()) {
-		lx.next()
 		return lexMultilineString
-	} else {
-		lx.backup()
-		lx.push(lexMultilineString)
-		return lexStringEscape(lx)
 	}
+	lx.backup()
+	lx.push(lexMultilineString)
+	return lexStringEscape(lx)
 }
 
 func lexStringEscape(lx *lexer) stateFn {
@@ -591,10 +701,9 @@ func lexStringEscape(lx *lexer) stateFn {
 	case 'U':
 		return lexLongUnicodeEscape
 	}
-	return lx.errorf("Invalid escape character %q. Only the following "+
+	return lx.errorf("invalid escape character %q; only the following "+
 		"escape characters are allowed: "+
-		"\\b, \\t, \\n, \\f, \\r, \\\", \\/, \\\\, "+
-		"\\uXXXX and \\UXXXXXXXX.", r)
+		`\b, \t, \n, \f, \r, \", \\, \uXXXX, and \UXXXXXXXX`, r)
 }
 
 func lexShortUnicodeEscape(lx *lexer) stateFn {
@@ -602,8 +711,8 @@ func lexShortUnicodeEscape(lx *lexer) stateFn {
 	for i := 0; i < 4; i++ {
 		r = lx.next()
 		if !isHexadecimal(r) {
-			return lx.errorf("Expected four hexadecimal digits after '\\u', "+
-				"but got '%s' instead.", lx.current())
+			return lx.errorf(`expected four hexadecimal digits after '\u', `+
+				"but got %q instead", lx.current())
 		}
 	}
 	return lx.pop()
@@ -614,40 +723,43 @@ func lexLongUnicodeEscape(lx *lexer) stateFn {
 	for i := 0; i < 8; i++ {
 		r = lx.next()
 		if !isHexadecimal(r) {
-			return lx.errorf("Expected eight hexadecimal digits after '\\U', "+
-				"but got '%s' instead.", lx.current())
+			return lx.errorf(`expected eight hexadecimal digits after '\U', `+
+				"but got %q instead", lx.current())
 		}
 	}
 	return lx.pop()
 }
 
-// lexNumberOrDateStart consumes either a (positive) integer, float or
-// datetime. It assumes that NO negative sign has been consumed.
+// lexNumberOrDateStart consumes either an integer, a float, or datetime.
 func lexNumberOrDateStart(lx *lexer) stateFn {
 	r := lx.next()
-	if !isDigit(r) {
-		if r == '.' {
-			return lx.errorf("Floats must start with a digit, not '.'.")
-		} else {
-			return lx.errorf("Expected a digit but got %q.", r)
-		}
+	if isDigit(r) {
+		return lexNumberOrDate
+	}
+	switch r {
+	case '_':
+		return lexNumber
+	case 'e', 'E':
+		return lexFloat
+	case '.':
+		return lx.errorf("floats must start with a digit, not '.'")
 	}
-	return lexNumberOrDate
+	return lx.errorf("expected a digit but got %q", r)
 }
 
-// lexNumberOrDate consumes either a (positive) integer, float or datetime.
+// lexNumberOrDate consumes either an integer, float or datetime.
 func lexNumberOrDate(lx *lexer) stateFn {
 	r := lx.next()
-	switch {
-	case r == '-':
-		if lx.pos-lx.start != 5 {
-			return lx.errorf("All ISO8601 dates must be in full Zulu form.")
-		}
-		return lexDateAfterYear
-	case isDigit(r):
+	if isDigit(r) {
 		return lexNumberOrDate
-	case r == '.':
-		return lexFloatStart
+	}
+	switch r {
+	case '-':
+		return lexDatetime
+	case '_':
+		return lexNumber
+	case '.', 'e', 'E':
+		return lexFloat
 	}
 
 	lx.backup()
@@ -655,46 +767,34 @@ func lexNumberOrDate(lx *lexer) stateFn {
 	return lx.pop()
 }
 
-// lexDateAfterYear consumes a full Zulu Datetime in ISO8601 format.
-// It assumes that "YYYY-" has already been consumed.
-func lexDateAfterYear(lx *lexer) stateFn {
-	formats := []rune{
-		// digits are '0'.
-		// everything else is direct equality.
-		'0', '0', '-', '0', '0',
-		'T',
-		'0', '0', ':', '0', '0', ':', '0', '0',
-		'Z',
+// lexDatetime consumes a Datetime, to a first approximation.
+// The parser validates that it matches one of the accepted formats.
+func lexDatetime(lx *lexer) stateFn {
+	r := lx.next()
+	if isDigit(r) {
+		return lexDatetime
 	}
-	for _, f := range formats {
-		r := lx.next()
-		if f == '0' {
-			if !isDigit(r) {
-				return lx.errorf("Expected digit in ISO8601 datetime, "+
-					"but found %q instead.", r)
-			}
-		} else if f != r {
-			return lx.errorf("Expected %q in ISO8601 datetime, "+
-				"but found %q instead.", f, r)
-		}
+	switch r {
+	case '-', 'T', ':', '.', 'Z':
+		return lexDatetime
 	}
+
+	lx.backup()
 	lx.emit(itemDatetime)
 	return lx.pop()
 }
 
-// lexNumberStart consumes either an integer or a float. It assumes that
-// a negative sign has already been read, but that *no* digits have been
-// consumed. lexNumberStart will move to the appropriate integer or float
-// states.
+// lexNumberStart consumes either an integer or a float. It assumes that a sign
+// has already been read, but that *no* digits have been consumed.
+// lexNumberStart will move to the appropriate integer or float states.
 func lexNumberStart(lx *lexer) stateFn {
-	// we MUST see a digit. Even floats have to start with a digit.
+	// We MUST see a digit. Even floats have to start with a digit.
 	r := lx.next()
 	if !isDigit(r) {
 		if r == '.' {
-			return lx.errorf("Floats must start with a digit, not '.'.")
-		} else {
-			return lx.errorf("Expected a digit but got %q.", r)
+			return lx.errorf("floats must start with a digit, not '.'")
 		}
+		return lx.errorf("expected a digit but got %q", r)
 	}
 	return lexNumber
 }
@@ -702,11 +802,14 @@ func lexNumberStart(lx *lexer) stateFn {
 // lexNumber consumes an integer or a float after seeing the first digit.
 func lexNumber(lx *lexer) stateFn {
 	r := lx.next()
-	switch {
-	case isDigit(r):
+	if isDigit(r) {
 		return lexNumber
-	case r == '.':
-		return lexFloatStart
+	}
+	switch r {
+	case '_':
+		return lexNumber
+	case '.', 'e', 'E':
+		return lexFloat
 	}
 
 	lx.backup()
@@ -714,60 +817,42 @@ func lexNumber(lx *lexer) stateFn {
 	return lx.pop()
 }
 
-// lexFloatStart starts the consumption of digits of a float after a '.'.
-// Namely, at least one digit is required.
-func lexFloatStart(lx *lexer) stateFn {
-	r := lx.next()
-	if !isDigit(r) {
-		return lx.errorf("Floats must have a digit after the '.', but got "+
-			"%q instead.", r)
-	}
-	return lexFloat
-}
-
-// lexFloat consumes the digits of a float after a '.'.
-// Assumes that one digit has been consumed after a '.' already.
+// lexFloat consumes the elements of a float. It allows any sequence of
+// float-like characters, so floats emitted by the lexer are only a first
+// approximation and must be validated by the parser.
 func lexFloat(lx *lexer) stateFn {
 	r := lx.next()
 	if isDigit(r) {
 		return lexFloat
 	}
+	switch r {
+	case '_', '.', '-', '+', 'e', 'E':
+		return lexFloat
+	}
 
 	lx.backup()
 	lx.emit(itemFloat)
 	return lx.pop()
 }
 
-// lexConst consumes the s[1:] in s. It assumes that s[0] has already been
-// consumed.
-func lexConst(lx *lexer, s string) stateFn {
-	for i := range s[1:] {
-		if r := lx.next(); r != rune(s[i+1]) {
-			return lx.errorf("Expected %q, but found %q instead.", s[:i+1],
-				s[:i]+string(r))
+// lexBool consumes a bool string: 'true' or 'false.
+func lexBool(lx *lexer) stateFn {
+	var rs []rune
+	for {
+		r := lx.next()
+		if !unicode.IsLetter(r) {
+			lx.backup()
+			break
 		}
+		rs = append(rs, r)
 	}
-	return nil
-}
-
-// lexTrue consumes the "rue" in "true". It assumes that 't' has already
-// been consumed.
-func lexTrue(lx *lexer) stateFn {
-	if fn := lexConst(lx, "true"); fn != nil {
-		return fn
-	}
-	lx.emit(itemBool)
-	return lx.pop()
-}
-
-// lexFalse consumes the "alse" in "false". It assumes that 'f' has already
-// been consumed.
-func lexFalse(lx *lexer) stateFn {
-	if fn := lexConst(lx, "false"); fn != nil {
-		return fn
+	s := string(rs)
+	switch s {
+	case "true", "false":
+		lx.emit(itemBool)
+		return lx.pop()
 	}
-	lx.emit(itemBool)
-	return lx.pop()
+	return lx.errorf("expected value but found %q instead", s)
 }
 
 // lexCommentStart begins the lexing of a comment. It will emit
@@ -779,7 +864,7 @@ func lexCommentStart(lx *lexer) stateFn {
 }
 
 // lexComment lexes an entire comment. It assumes that '#' has been consumed.
-// It will consume *up to* the first new line character, and pass control
+// It will consume *up to* the first newline character, and pass control
 // back to the last state on the stack.
 func lexComment(lx *lexer) stateFn {
 	r := lx.peek()
@@ -837,13 +922,7 @@ func (itype itemType) String() string {
 		return "EOF"
 	case itemText:
 		return "Text"
-	case itemString:
-		return "String"
-	case itemRawString:
-		return "String"
-	case itemMultilineString:
-		return "String"
-	case itemRawMultilineString:
+	case itemString, itemRawString, itemMultilineString, itemRawMultilineString:
 		return "String"
 	case itemBool:
 		return "Bool"

+ 118 - 24
vendor/github.com/BurntSushi/toml/parse.go

@@ -2,7 +2,6 @@ package toml
 
 import (
 	"fmt"
-	"log"
 	"strconv"
 	"strings"
 	"time"
@@ -81,7 +80,7 @@ func (p *parser) next() item {
 }
 
 func (p *parser) bug(format string, v ...interface{}) {
-	log.Fatalf("BUG: %s\n\n", fmt.Sprintf(format, v...))
+	panic(fmt.Sprintf("BUG: "+format+"\n\n", v...))
 }
 
 func (p *parser) expect(typ itemType) item {
@@ -179,10 +178,18 @@ func (p *parser) value(it item) (interface{}, tomlType) {
 		}
 		p.bug("Expected boolean value, but got '%s'.", it.val)
 	case itemInteger:
-		num, err := strconv.ParseInt(it.val, 10, 64)
+		if !numUnderscoresOK(it.val) {
+			p.panicf("Invalid integer %q: underscores must be surrounded by digits",
+				it.val)
+		}
+		val := strings.Replace(it.val, "_", "", -1)
+		num, err := strconv.ParseInt(val, 10, 64)
 		if err != nil {
-			// See comment below for floats describing why we make a
-			// distinction between a bug and a user error.
+			// Distinguish integer values. Normally, it'd be a bug if the lexer
+			// provides an invalid integer, but it's possible that the number is
+			// out of range of valid values (which the lexer cannot determine).
+			// So mark the former as a bug but the latter as a legitimate user
+			// error.
 			if e, ok := err.(*strconv.NumError); ok &&
 				e.Err == strconv.ErrRange {
 
@@ -194,29 +201,57 @@ func (p *parser) value(it item) (interface{}, tomlType) {
 		}
 		return num, p.typeOfPrimitive(it)
 	case itemFloat:
-		num, err := strconv.ParseFloat(it.val, 64)
+		parts := strings.FieldsFunc(it.val, func(r rune) bool {
+			switch r {
+			case '.', 'e', 'E':
+				return true
+			}
+			return false
+		})
+		for _, part := range parts {
+			if !numUnderscoresOK(part) {
+				p.panicf("Invalid float %q: underscores must be "+
+					"surrounded by digits", it.val)
+			}
+		}
+		if !numPeriodsOK(it.val) {
+			// As a special case, numbers like '123.' or '1.e2',
+			// which are valid as far as Go/strconv are concerned,
+			// must be rejected because TOML says that a fractional
+			// part consists of '.' followed by 1+ digits.
+			p.panicf("Invalid float %q: '.' must be followed "+
+				"by one or more digits", it.val)
+		}
+		val := strings.Replace(it.val, "_", "", -1)
+		num, err := strconv.ParseFloat(val, 64)
 		if err != nil {
-			// Distinguish float values. Normally, it'd be a bug if the lexer
-			// provides an invalid float, but it's possible that the float is
-			// out of range of valid values (which the lexer cannot determine).
-			// So mark the former as a bug but the latter as a legitimate user
-			// error.
-			//
-			// This is also true for integers.
 			if e, ok := err.(*strconv.NumError); ok &&
 				e.Err == strconv.ErrRange {
 
 				p.panicf("Float '%s' is out of the range of 64-bit "+
 					"IEEE-754 floating-point numbers.", it.val)
 			} else {
-				p.bug("Expected float value, but got '%s'.", it.val)
+				p.panicf("Invalid float value: %q", it.val)
 			}
 		}
 		return num, p.typeOfPrimitive(it)
 	case itemDatetime:
-		t, err := time.Parse("2006-01-02T15:04:05Z", it.val)
-		if err != nil {
-			p.bug("Expected Zulu formatted DateTime, but got '%s'.", it.val)
+		var t time.Time
+		var ok bool
+		var err error
+		for _, format := range []string{
+			"2006-01-02T15:04:05Z07:00",
+			"2006-01-02T15:04:05",
+			"2006-01-02",
+		} {
+			t, err = time.ParseInLocation(format, it.val, time.Local)
+			if err == nil {
+				ok = true
+				break
+			}
+		}
+		if !ok {
+			p.panicf("Invalid TOML Datetime: %q.", it.val)
 		}
 		return t, p.typeOfPrimitive(it)
 	case itemArray:
@@ -234,11 +269,75 @@ func (p *parser) value(it item) (interface{}, tomlType) {
 			types = append(types, typ)
 		}
 		return array, p.typeOfArray(types)
+	case itemInlineTableStart:
+		var (
+			hash         = make(map[string]interface{})
+			outerContext = p.context
+			outerKey     = p.currentKey
+		)
+
+		p.context = append(p.context, p.currentKey)
+		p.currentKey = ""
+		for it := p.next(); it.typ != itemInlineTableEnd; it = p.next() {
+			if it.typ != itemKeyStart {
+				p.bug("Expected key start but instead found %q, around line %d",
+					it.val, p.approxLine)
+			}
+			if it.typ == itemCommentStart {
+				p.expect(itemText)
+				continue
+			}
+
+			// retrieve key
+			k := p.next()
+			p.approxLine = k.line
+			kname := p.keyString(k)
+
+			// retrieve value
+			p.currentKey = kname
+			val, typ := p.value(p.next())
+			// make sure we keep metadata up to date
+			p.setType(kname, typ)
+			p.ordered = append(p.ordered, p.context.add(p.currentKey))
+			hash[kname] = val
+		}
+		p.context = outerContext
+		p.currentKey = outerKey
+		return hash, tomlHash
 	}
 	p.bug("Unexpected value type: %s", it.typ)
 	panic("unreachable")
 }
 
+// numUnderscoresOK checks whether each underscore in s is surrounded by
+// characters that are not underscores.
+func numUnderscoresOK(s string) bool {
+	accept := false
+	for _, r := range s {
+		if r == '_' {
+			if !accept {
+				return false
+			}
+			accept = false
+			continue
+		}
+		accept = true
+	}
+	return accept
+}
+
+// numPeriodsOK checks whether every period in s is followed by a digit.
+func numPeriodsOK(s string) bool {
+	period := false
+	for _, r := range s {
+		if period && !isDigit(r) {
+			return false
+		}
+		period = r == '.'
+	}
+	return !period
+}
+
 // establishContext sets the current context of the parser,
 // where the context is either a hash or an array of hashes. Which one is
 // set depends on the value of the `array` parameter.
@@ -401,7 +500,7 @@ func stripFirstNewline(s string) string {
 	if len(s) == 0 || s[0] != '\n' {
 		return s
 	}
-	return s[1:len(s)]
+	return s[1:]
 }
 
 func stripEscapedWhitespace(s string) string {
@@ -481,12 +580,7 @@ func (p *parser) asciiEscapeToUnicode(bs []byte) rune {
 		p.bug("Could not parse '%s' as a hexadecimal number, but the "+
 			"lexer claims it's OK: %s", s, err)
 	}
-
-	// BUG(burntsushi)
-	// I honestly don't understand how this works. I can't seem
-	// to find a way to make this fail. I figured this would fail on invalid
-	// UTF-8 characters like U+DCFF, but it doesn't.
-	if !utf8.ValidString(string(rune(hex))) {
+	if !utf8.ValidRune(rune(hex)) {
 		p.panicf("Escaped character '\\u%s' is not valid UTF-8.", s)
 	}
 	return rune(hex)

+ 6 - 5
vendor/github.com/BurntSushi/toml/type_fields.go

@@ -92,11 +92,11 @@ func typeFields(t reflect.Type) []field {
 			// Scan f.typ for fields to include.
 			for i := 0; i < f.typ.NumField(); i++ {
 				sf := f.typ.Field(i)
-				if sf.PkgPath != "" { // unexported
+				if sf.PkgPath != "" && !sf.Anonymous { // unexported
 					continue
 				}
-				name := sf.Tag.Get("toml")
-				if name == "-" {
+				opts := getOptions(sf.Tag)
+				if opts.skip {
 					continue
 				}
 				index := make([]int, len(f.index)+1)
@@ -110,8 +110,9 @@ func typeFields(t reflect.Type) []field {
 				}
 
 				// Record found field and index sequence.
-				if name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct {
-					tagged := name != ""
+				if opts.name != "" || !sf.Anonymous || ft.Kind() != reflect.Struct {
+					tagged := opts.name != ""
+					name := opts.name
 					if name == "" {
 						name = sf.Name
 					}

+ 24 - 0
vendor/github.com/Unknwon/com/.gitignore

@@ -0,0 +1,24 @@
+# Compiled Object files, Static and Dynamic libs (Shared Objects)
+*.o
+*.a
+*.so
+
+# Folders
+_obj
+_test
+.idea
+
+# Architecture specific extensions/prefixes
+*.[568vq]
+[568vq].out
+
+*.cgo1.go
+*.cgo2.c
+_cgo_defun.c
+_cgo_gotypes.go
+_cgo_export.*
+
+_testmain.go
+
+*.exe
+*.iml

+ 10 - 0
vendor/github.com/Unknwon/com/convert.go

@@ -41,6 +41,11 @@ func (f StrTo) Int64() (int64, error) {
 	return int64(v), err
 }
 
+func (f StrTo) Float64() (float64, error) {
+	v, err := strconv.ParseFloat(f.String(), 64)
+	return float64(v), err
+}
+
 func (f StrTo) MustUint8() uint8 {
 	v, _ := f.Uint8()
 	return v
@@ -56,6 +61,11 @@ func (f StrTo) MustInt64() int64 {
 	return v
 }
 
+func (f StrTo) MustFloat64() float64 {
+	v, _ := f.Float64()
+	return v
+}
+
 func (f StrTo) String() string {
 	if f.Exist() {
 		return string(f)

+ 0 - 1
vendor/github.com/Unknwon/com/testdata/SaveFile.txt

@@ -1 +0,0 @@
-TestSaveFile

+ 0 - 1
vendor/github.com/Unknwon/com/testdata/SaveFileS.txt

@@ -1 +0,0 @@
-TestSaveFileS

+ 0 - 1
vendor/github.com/Unknwon/com/testdata/statDir/SaveFile.txt

@@ -1 +0,0 @@
-TestSaveFile

+ 0 - 1
vendor/github.com/Unknwon/com/testdata/statDir/SaveFileS.txt

@@ -1 +0,0 @@
-TestSaveFileS

+ 0 - 1
vendor/github.com/Unknwon/com/testdata/statDir/secondLevel/SaveFile.txt

@@ -1 +0,0 @@
-TestSaveFile

+ 0 - 1
vendor/github.com/Unknwon/com/testdata/statDir/secondLevel/SaveFileS.txt

@@ -1 +0,0 @@
-TestSaveFileS

+ 0 - 0
vendor/github.com/Unknwon/com/testdata/statDir/secondLevel/sample_file.txt


+ 56 - 0
vendor/github.com/apache/thrift/.clang-format

@@ -0,0 +1,56 @@
+---
+Language:        Cpp
+# BasedOnStyle:  LLVM
+AccessModifierOffset: -2
+ConstructorInitializerIndentWidth: 2
+AlignEscapedNewlinesLeft: false
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: false
+AllowShortBlocksOnASingleLine: false
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Inline
+AlwaysBreakTemplateDeclarations: true
+AlwaysBreakBeforeMultilineStrings: true
+BreakBeforeBinaryOperators: true
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializersBeforeComma: false
+BinPackParameters: false
+ColumnLimit:     100
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+DerivePointerAlignment: false
+IndentCaseLabels: false
+IndentWrappedFunctionNames: false
+IndentFunctionDeclarationAfterType: false
+MaxEmptyLinesToKeep: 1
+KeepEmptyLinesAtTheStartOfBlocks: true
+NamespaceIndentation: None
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: true
+PenaltyBreakBeforeFirstCallParameter: 190
+PenaltyBreakComment: 300
+PenaltyBreakString: 10000
+PenaltyBreakFirstLessLess: 120
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 1200
+PointerAlignment: Left
+SpacesBeforeTrailingComments: 1
+Cpp11BracedListStyle: true
+Standard:        Auto
+IndentWidth:     2
+TabWidth:        4
+UseTab:          Never
+BreakBeforeBraces: Attach
+SpacesInParentheses: false
+SpacesInAngles:  false
+SpaceInEmptyParentheses: false
+SpacesInCStyleCastParentheses: false
+SpacesInContainerLiterals: true
+SpaceBeforeAssignmentOperators: true
+ContinuationIndentWidth: 4
+CommentPragmas:  '^ IWYU pragma:'
+ForEachMacros:   [ foreach, Q_FOREACH, BOOST_FOREACH ]
+SpaceBeforeParens: ControlStatements
+DisableFormat:   false
+...
+

+ 1 - 0
vendor/github.com/apache/thrift/.dockerignore

@@ -0,0 +1 @@
+.git/

+ 1 - 0
vendor/github.com/apache/thrift/.gitattributes

@@ -0,0 +1 @@
+* text=auto

+ 326 - 0
vendor/github.com/apache/thrift/.gitignore

@@ -0,0 +1,326 @@
+# generic ignores
+*.la
+*.lo
+*.o
+*.deps
+*.dirstamp
+*.libs
+*.log
+*.trs
+*.suo
+*.pyc
+*.cache
+*.user
+*.ipch
+*.sdf
+*.jar
+*.exe
+*.dll
+*_ReSharper*
+*.opensdf
+*.swp
+*.hi
+*~
+
+.*project
+junit*.properties
+.idea
+gen-*
+Makefile
+Makefile.in
+aclocal.m4
+acinclude.m4
+autom4te.cache
+cmake-*
+node_modules
+compile
+test-driver
+erl_crash.dump
+
+.sonar
+.DS_Store
+.svn
+.vagrant
+
+/contrib/.vagrant/
+/aclocal/libtool.m4
+/aclocal/lt*.m4
+/autoscan.log
+/autoscan-*.log
+/cmake_*
+/compiler/cpp/compiler.VC.db
+/compiler/cpp/compiler.VC.VC.opendb
+/compiler/cpp/test/plugin/t_cpp_generator.cc
+/compiler/cpp/src/thrift/plugin/plugin_constants.cpp
+/compiler/cpp/src/thrift/plugin/plugin_constants.h
+/compiler/cpp/src/thrift/plugin/plugin_types.cpp
+/compiler/cpp/src/thrift/plugin/plugin_types.h
+/compiler/cpp/test/*test
+/compiler/cpp/test/thrift-gen-*
+/compiler/cpp/src/thrift/thrift-bootstrap
+/compiler/cpp/src/thrift/plugin/gen.stamp
+/compiler/cpp/Debug
+/compiler/cpp/Release
+/compiler/cpp/src/thrift/libparse.a
+/compiler/cpp/src/thrift/thriftl.cc
+/compiler/cpp/src/thrift/thrifty.cc
+/compiler/cpp/src/thrift/thrifty.hh
+/compiler/cpp/src/thrift/windows/version.h
+/compiler/cpp/thrift
+/compiler/cpp/thriftl.cc
+/compiler/cpp/thrifty.cc
+/compiler/cpp/lex.yythriftl.cc
+/compiler/cpp/thrifty.h
+/compiler/cpp/thrifty.hh
+/compiler/cpp/src/thrift/version.h
+/config.*
+/configure
+/configure.lineno
+/configure.scan
+/contrib/fb303/config.cache
+/contrib/fb303/config.log
+/contrib/fb303/config.status
+/contrib/fb303/configure
+/contrib/fb303/cpp/libfb303.a
+/contrib/fb303/java/build/
+/contrib/fb303/py/build/
+/contrib/fb303/py/fb303/FacebookService-remote
+/contrib/fb303/py/fb303/FacebookService.py
+/contrib/fb303/py/fb303/__init__.py
+/contrib/fb303/py/fb303/constants.py
+/contrib/fb303/py/fb303/ttypes.py
+/depcomp
+/install-sh
+/lib/cpp/Debug/
+/lib/cpp/Debug-mt/
+/lib/cpp/Release/
+/lib/cpp/Release-mt/
+/lib/cpp/src/thrift/qt/moc_TQTcpServer.cpp
+/lib/cpp/src/thrift/qt/moc__TQTcpServer.cpp
+/lib/cpp/src/thrift/config.h
+/lib/cpp/src/thrift/stamp-h2
+/lib/cpp/test/Benchmark
+/lib/cpp/test/AllProtocolsTest
+/lib/cpp/test/DebugProtoTest
+/lib/cpp/test/DenseProtoTest
+/lib/cpp/test/EnumTest
+/lib/cpp/test/JSONProtoTest
+/lib/cpp/test/OptionalRequiredTest
+/lib/cpp/test/SecurityTest
+/lib/cpp/test/SpecializationTest
+/lib/cpp/test/ReflectionTest
+/lib/cpp/test/RecursiveTest
+/lib/cpp/test/TFDTransportTest
+/lib/cpp/test/TFileTransportTest
+/lib/cpp/test/TInterruptTest
+/lib/cpp/test/TNonblockingServerTest
+/lib/cpp/test/TPipedTransportTest
+/lib/cpp/test/TServerIntegrationTest
+/lib/cpp/test/TSocketInterruptTest
+/lib/cpp/test/TransportTest
+/lib/cpp/test/UnitTests
+/lib/cpp/test/ZlibTest
+/lib/cpp/test/OpenSSLManualInitTest
+/lib/cpp/test/concurrency_test
+/lib/cpp/test/link_test
+/lib/cpp/test/processor_test
+/lib/cpp/test/tests.xml
+/lib/cpp/concurrency_test
+/lib/cpp/*.pc
+/lib/cpp/x64/Debug/
+/lib/cpp/x64/Debug-mt/
+/lib/cpp/x64/Release
+/lib/cpp/x64/Release-mt
+/lib/c_glib/*.gcda
+/lib/c_glib/*.gcno
+/lib/c_glib/*.loT
+/lib/c_glib/src/thrift/config.h
+/lib/c_glib/src/thrift/stamp-h3
+/lib/c_glib/test/*.gcno
+/lib/c_glib/test/testwrapper.sh
+/lib/c_glib/test/testwrapper-test*
+/lib/c_glib/test/testapplicationexception
+/lib/c_glib/test/testbinaryprotocol
+/lib/c_glib/test/testcompactprotocol
+/lib/c_glib/test/testbufferedtransport
+/lib/c_glib/test/testcontainertest
+/lib/c_glib/test/testdebugproto
+/lib/c_glib/test/testfdtransport
+/lib/c_glib/test/testframedtransport
+/lib/c_glib/test/testmemorybuffer
+/lib/c_glib/test/testoptionalrequired
+/lib/c_glib/test/testsimpleserver
+/lib/c_glib/test/teststruct
+/lib/c_glib/test/testthrifttest
+/lib/c_glib/test/testthrifttestclient
+/lib/c_glib/test/testtransportsocket
+/lib/c_glib/test/testserialization
+/lib/c_glib/thriftc.pc
+/lib/c_glib/thrift_c_glib.pc
+/lib/csharp/**/bin/
+/lib/csharp/**/obj/
+/lib/csharp/src/packages
+/lib/d/test/*.pem
+/lib/d/libthriftd*.a
+/lib/d/test/async_test
+/lib/d/test/client_pool_test
+/lib/d/test/serialization_benchmark
+/lib/d/test/stress_test_server
+/lib/d/test/thrift_test_client
+/lib/d/test/thrift_test_server
+/lib/d/test/transport_test
+/lib/d/unittest/
+/lib/dart/coverage
+/lib/dart/**/.packages
+/lib/dart/**/packages
+/lib/dart/**/.pub/
+/lib/dart/**/pubspec.lock
+/lib/delphi/src/*.dcu
+/lib/delphi/test/*.identcache
+/lib/delphi/test/*.local
+/lib/delphi/test/*.dcu
+/lib/delphi/test/*.2007
+/lib/delphi/test/*.dproj
+/lib/delphi/test/*.dproj
+/lib/delphi/test/codegen/*.bat
+/lib/delphi/test/skip/*.local
+/lib/delphi/test/skip/*.identcache
+/lib/delphi/test/skip/*.identcache
+/lib/delphi/test/skip/*.dproj
+/lib/delphi/test/skip/*.dproj
+/lib/delphi/test/skip/*.2007
+/lib/delphi/test/serializer/*.identcache
+/lib/delphi/test/serializer/*.dproj
+/lib/delphi/test/serializer/*.local
+/lib/delphi/test/serializer/*.2007
+/lib/delphi/test/serializer/*.dcu
+/lib/delphi/test/multiplexed/*.dproj
+/lib/delphi/test/multiplexed/*.2007
+/lib/delphi/test/multiplexed/*.local
+/lib/delphi/test/multiplexed/*.identcache
+/lib/delphi/test/multiplexed/*.dcu
+/lib/delphi/test/typeregistry/*.2007
+/lib/delphi/test/typeregistry/*.dproj
+/lib/delphi/test/typeregistry/*.identcache
+/lib/delphi/test/typeregistry/*.local
+/lib/delphi/test/typeregistry/*.dcu
+/lib/erl/.generated
+/lib/erl/.eunit
+/lib/erl/ebin
+/lib/erl/deps/
+/lib/erl/src/thrift.app.src
+/lib/erl/test/*.hrl
+/lib/erl/test/*.beam
+/lib/haxe/test/bin
+/lib/hs/dist
+/lib/java/build
+/lib/js/test/build
+/lib/nodejs/coverage
+/lib/nodejs/node_modules/
+/lib/perl/MANIFEST
+/lib/perl/MYMETA.json
+/lib/perl/MYMETA.yml
+/lib/perl/Makefile-perl.mk
+/lib/perl/blib
+/lib/perl/pm_to_blib
+/lib/py/build
+/lib/py/thrift.egg-info/
+/lib/rb/Gemfile.lock
+/lib/rb/debug_proto_test
+/lib/rb/.config
+/lib/rb/ext/conftest.dSYM/
+/lib/rb/ext/mkmf.log
+/lib/rb/ext/thrift_native.bundle
+/lib/rb/ext/thrift_native.so
+/lib/rb/test/
+/lib/rb/thrift-*.gem
+/lib/php/src/ext/thrift_protocol/Makefile.*
+/lib/php/src/ext/thrift_protocol/build/
+/lib/php/src/ext/thrift_protocol/config.*
+/lib/php/src/ext/thrift_protocol/configure
+/lib/php/src/ext/thrift_protocol/configure.in
+/lib/php/src/ext/thrift_protocol/install-sh
+/lib/php/src/ext/thrift_protocol/libtool
+/lib/php/src/ext/thrift_protocol/ltmain.sh
+/lib/php/src/ext/thrift_protocol/missing
+/lib/php/src/ext/thrift_protocol/mkinstalldirs
+/lib/php/src/ext/thrift_protocol/modules/
+/lib/php/src/ext/thrift_protocol/php_thrift_protocol.lo
+/lib/php/src/ext/thrift_protocol/run-tests.php
+/lib/php/src/ext/thrift_protocol/thrift_protocol.la
+/lib/php/src/ext/thrift_protocol/tmp-php.ini
+/lib/php/src/packages/
+/lib/php/test/TEST-*.xml
+/lib/php/test/packages/
+/lib/py/dist/
+/lib/erl/logs/
+/lib/go/test/gopath/
+/lib/go/test/ThriftTest.thrift
+/libtool
+/ltmain.sh
+/missing
+/node_modules/
+/stamp-h1
+/test/features/results.json
+/test/results.json
+/test/c_glib/test_client
+/test/c_glib/test_server
+/test/cpp/StressTest
+/test/cpp/StressTestNonBlocking
+/test/cpp/TestClient
+/test/cpp/TestServer
+/test/dart/**/.packages
+/test/dart/**/packages
+/test/dart/**/.pub/
+/test/dart/**/pubspec.lock
+/test/log/
+/test/test.log
+/test/erl/.generated
+/test/erl/ebin
+/test/go/bin/
+/test/go/ThriftTest.thrift
+/test/go/gopath
+/test/go/pkg/
+/test/go/src/code.google.com/
+/test/go/src/github.com/golang/
+/test/go/src/gen/
+/test/go/src/thrift
+/test/haxe/bin
+/test/hs/TestClient
+/test/hs/TestServer
+/test/py.twisted/_trial_temp/
+/test/rb/Gemfile.lock
+/tutorial/cpp/TutorialClient
+/tutorial/cpp/TutorialServer
+/tutorial/c_glib/tutorial_client
+/tutorial/c_glib/tutorial_server
+/tutorial/csharp/CsharpServer/obj
+/tutorial/csharp/CsharpServer/bin
+/tutorial/csharp/CsharpClient/obj
+/tutorial/csharp/CsharpClient/bin
+/tutorial/d/async_client
+/tutorial/d/client
+/tutorial/d/server
+/tutorial/dart/**/.packages
+/tutorial/dart/**/packages
+/tutorial/dart/**/.pub/
+/tutorial/dart/**/pubspec.lock
+/tutorial/delphi/*.dsk
+/tutorial/delphi/*.local
+/tutorial/delphi/*.tvsconfig
+/tutorial/delphi/DelphiClient/dcu
+/tutorial/delphi/DelphiServer/dcu
+/tutorial/delphi/DelphiClient/*.local
+/tutorial/delphi/DelphiClient/*.identcache
+/tutorial/delphi/DelphiServer/*.identcache
+/tutorial/delphi/DelphiServer/*.local
+/tutorial/go/go-tutorial
+/tutorial/go/calculator-remote
+/tutorial/go/src/shared
+/tutorial/go/src/tutorial
+/tutorial/go/src/git.apache.org
+/tutorial/haxe/bin
+/tutorial/hs/dist/
+/tutorial/java/build/
+/tutorial/js/build/
+/ylwrap

+ 2366 - 0
vendor/github.com/apache/thrift/CHANGES

@@ -0,0 +1,2366 @@
+Apache Thrift Changelog
+
+Thrift 0.10.0
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1840] - Thrift Generated Code Causes Global Variable Leaks
+    * [THRIFT-1828] - moc_TQTcpServer.cpp was removed from source tree but is in thrift-0.9.0.tar.gz
+    * [THRIFT-1790] - cocoa: Duplicate interface definition error
+    * [THRIFT-1776] - TPipeServer should implement "listen", so that TServerEventHandler preServe will work right
+    * [THRIFT-1351] - Compiler does not care about binary strings
+    * [THRIFT-1229] - Python fastbinary.c can not handle unicode as generated python code
+    * [THRIFT-749] - C++ TBufferedTransports do not flush their buffers on delete
+    * [THRIFT-747] - C++ TSocket->close calls shutdown breaking forked parent process
+    * [THRIFT-732] - server exits abnormally when client calls send_xxx function without calling recv_xxx function
+    * [THRIFT-3942] - TSSLSocket does not honor send and receive timeouts
+    * [THRIFT-3941] - WinXP version of thrift_poll() relies on undefined behavior by passing a destructed variable to select()
+    * [THRIFT-3940] - Visual Studio project file for compiler is broken
+    * [THRIFT-3943] - Coverity Scan identified some high severity defects
+    * [THRIFT-3929] - PHP "nsglobal" Option Results in Syntax Error in Generated Code (Trailing Backslash)
+    * [THRIFT-3936] - Cannot compile 0.10.0 development tip with VS2013 and earlier (snprintf, uint32_t)
+    * [THRIFT-3935] - Incorrect skipping of map and set
+    * [THRIFT-3920] - Ruby: Ensuring that HTTP failures will clear the http transport outbuf var
+    * [THRIFT-3919] - C# TTLSServerSocket does not use clientTimeout
+    * [THRIFT-3917] - Check backports.ssl_match_hostname module version
+    * [THRIFT-3909] - Fix c_glib static lib CMake build
+    * [THRIFT-3904] - Typo in node tutorial leads to wrong transport being used
+    * [THRIFT-3848] - As an implementer of a perl socket server, I do not want to have to remember to ignore SIGCHLD for it to work properly
+    * [THRIFT-3844] - thrift_protocol cannot compile in 7.0.7
+    * [THRIFT-3843] - integer issues with Haxe PHP targets cause ZigZag encoding to fail
+    * [THRIFT-3842] - Dart generates incorrect code for a const struct
+    * [THRIFT-3841] - dart compact protocol incorrectly serializes/deserialized doubles
+    * [THRIFT-3708] - NameError: global name 'TProtocol' is not defined
+    * [THRIFT-3704] - "TConnectedClient died: Could not refill buffer" message shown when using HTTP Server
+    * [THRIFT-3678] - Fix javadoc errors on JDK 8
+    * [THRIFT-3014] - AppVeyor support
+    * [THRIFT-2994] - Node.js TJSONProtocol cannot be used for object serialization.
+    * [THRIFT-2974] - writeToParcel throws NPE for optional enum fields
+    * [THRIFT-2948] - Python TJSONProtocol doesn't handle structs with binary fields containing invalid unicode.
+    * [THRIFT-2845] - ChildService.Plo: No such file or directory
+    * [THRIFT-3276] - Binary data does not decode correctly using the TJSONProtocol when the base64 encoded data is padded.
+    * [THRIFT-3253] - Using latest version of D gives deprecation notices
+    * [THRIFT-2883] - TTwisted.py, during ConnectionLost processing: exceptions.RuntimeError: dictionary changed size during iteration
+    * [THRIFT-2019] - Writing on a disconnected socket on Mac causes SIG PIPE
+    * [THRIFT-2020] - Thrift library has some empty files that haven't really been deleted
+    * [THRIFT-2049] - Go compiler doesn't build on native Windows
+    * [THRIFT-2024] - TServer.cpp warns on 64-bit platforms about truncating an rlim_t into an int
+    * [THRIFT-2023] - gettimeofday implementation on Windows errors when no time zone is passed in.
+    * [THRIFT-2022] - CoB and dense code generation still uses TR1 bind, even though that doesn't work with clang
+    * [THRIFT-2027] - Minor 64-bit and NOMINMAX issues in C++ library
+    * [THRIFT-2156] - TServerSocket::listen() is throwing exceptions with misleading information
+    * [THRIFT-2154] - Missing <operator body
+    * [THRIFT-2148] - TNonblockingMultiFetchClient imports log4j
+    * [THRIFT-2103] - [python] Support for SSL certificates with Subject Alternative Names
+    * [THRIFT-1931] - Sending a frame size of zero to a TNonblockingServer causes an assertion failure
+    * [THRIFT-1751] - definition of increase_max_fds doesn't compile when HAVE_SYS_RESOURCE_H is not defined
+    * [THRIFT-1522] - TServerSocket potential memory leak with addrinfo *res0
+    * [THRIFT-1547] - Problems building against static libevent
+    * [THRIFT-1545] - Generated javascript code uses "for in" for looping over arrays
+    * [THRIFT-1487] - Namespace problem, compile fails on generated code
+    * [THRIFT-1472] - Configuration conflicts with boost platform include header
+    * [THRIFT-6] - Thrift libraries and compiler lack version number
+    * [THRIFT-1680] - make install requires GNU make
+    * [THRIFT-3869] - Dart Tutorial build fails with Error 65 at "pub get"
+    * [THRIFT-3861] - Travis CI builds are timing out - C++TServerIntegrationTest appears to be hanging
+    * [THRIFT-3855] - In the go simple server, if Stop() is called multiple times it hangs
+    * [THRIFT-3885] - PHP: Error when readI64 in TCompactProtocol
+    * [THRIFT-3883] - Go TestAllConnection can fail with port 9090 collision
+    * [THRIFT-3884] - Fix Erlang compact protocol double endianess and boolean list
+    * [THRIFT-3880] - Erlang Compact protocol - boolean values inverted
+    * [THRIFT-3879] - Undefined evaluation order causes incorrect processing in the C++ library JSON protocol
+    * [THRIFT-3851] - Golang thrift continually adds the x/thrift content type 
+    * [THRIFT-3850] - All apache builds are failing when initiated from a github pull request
+    * [THRIFT-3837] - Thift 0.9.3 can't be build with QuickCheck 2.8.2 and unordered-containers 0.2.6
+    * [THRIFT-3831] - build of test/cpp/src/TestClient.cpp fails with newer gcc on platforms with unsigned char due to narrowing conversions
+    * [THRIFT-3827] - php CompactProtocol readI64 function has bug, when value has 32bit ~64bit, Example:value=1461563457000 
+    * [THRIFT-3825] - Javascript test dependency is no longer available
+    * [THRIFT-3814] - Fix contention in TNonblockingServerTest
+    * [THRIFT-3793] - Appveyor builds reference an ant version that is no longer there
+    * [THRIFT-3786] - Node.js TLS emits 'connect' before connection is ready
+    * [THRIFT-3780] - Fix dart int64 usage when compiled to js
+    * [THRIFT-3789] - Node.js lacks ability to destroy connection
+    * [THRIFT-3796] - There's no --dbg for dh_strip, maybe someone has mistaken this for --dbg-package.
+    * [THRIFT-3795] - Generated hashValue method in Swift will overflow
+    * [THRIFT-3790] - Fix Delphi named pipe client to use timeout even when pipe doesn't yet exist
+    * [THRIFT-3787] - Node.js Connection object doesn't handle errors correctly
+    * [THRIFT-3791] - Delphi pipe client may fail even in a non-error condition
+    * [THRIFT-3771] - TBufferedTransport gets in invalid state on read/write errors
+    * [THRIFT-3764] - PHP "make install" does not install TMultiplexedProtocol.php nor TSimpleJSONProtocol.php
+    * [THRIFT-3768] - TThreadedServer may crash if it is destroyed immediately after it returns from serve(); TThreadedServer disconnects clients
+    * [THRIFT-3765] - memory leak in python compact protocol extension
+    * [THRIFT-3758] - TApplicationException::getType and TProtocolException::getType should be const
+    * [THRIFT-3763] - Fix serialization of i64 larger than 2^53 for browserify
+    * [THRIFT-3759] - required fields that are nil are silently ignored on write
+    * [THRIFT-3753] - TServerFramework::stop may fail to interrupt connected clients
+    * [THRIFT-3755] - TDebugProtocol::writeString hits assert in isprint on Windows with debug CRT
+    * [THRIFT-3751] - Compiler allows field ids that are too large for generated code
+    * [THRIFT-3748] - Node.js Deserialization of lists of lists is broken
+    * [THRIFT-3760] - Fix install paths etc of debian packages for py and perl
+    * [THRIFT-3757] - Fix various build warnings on Windows with VS2015 compiler
+    * [THRIFT-3750] - NSCopying copyWithZone: implementation does not check isSet
+    * [THRIFT-3747] - Duplicate node.js build on Travis-CI
+    * [THRIFT-3744] - The precision should be 17 (16 bits need after dot) after dot for double type.
+    * [THRIFT-3741] - haxe test is broken
+    * [THRIFT-3739] - Deprecation warning in codegen/base.d
+    * [THRIFT-3735] - JSON protocol left in incorrect state when an exception is thrown during read or write operations
+    * [THRIFT-3734] - To compare two string as lowercase.
+    * [THRIFT-3743] - Java JSON protocol left in incorrect state when an exception is thrown during read or write operations
+    * [THRIFT-3731] - Perl multiplex test is flaky
+    * [THRIFT-3729] - Restrict rake version
+    * [THRIFT-3727] - Incorrect require paths in Node.js tutorial
+    * [THRIFT-3723] - Fix Lua include path
+    * [THRIFT-3722] - Fix cert path in C++ cross tests for non-Linux platform
+    * [THRIFT-3726] - Fix incorrect conditional in TMultiplexedProcessor.py
+    * [THRIFT-3725] - Skip a flaky cross test entry (d-dart compact framed-ip)
+    * [THRIFT-3724] - Fix incorrect timeval conversion in libevent.d
+    * [THRIFT-3721] - CLONE - why not add unicode strings support to python directly?
+    * [THRIFT-3720] - TTcpSocketStreamImpl.Read() returns 0 if not all requested bytes could be read
+    * [THRIFT-3719] - Dart generator should use lowerCamelCase for service names
+    * [THRIFT-3902] - TSocket.open throws NullPointerException
+    * [THRIFT-3901] - TFramedTransport.open throws NullPointerException
+    * [THRIFT-3893] - Command injection in format_go_output
+    * [THRIFT-3807] - Swift compiler does not escape reserved words
+    * [THRIFT-3798] - THttpClient does not use proxy from http_proxy, https_proxy environment variables
+    * [THRIFT-3809] - wrong/unused BINARY type code
+    * [THRIFT-3806] - Swift generator does not handle self-referring structs
+    * [THRIFT-3805] - Golang server susceptible to memory spike from malformed message
+    * [THRIFT-3797] - Generated Delphi processor shouldn't error out on timed out exceptions
+    * [THRIFT-3813] - Appveyor builds reference an openssl version that is no longer there
+    * [THRIFT-3658] - Missing file in THRIFT-3599
+    * [THRIFT-3649] - Python TSaslClientTransport initializes TTransportException incorrectly
+    * [THRIFT-3650] - incorrect union serialization 
+    * [THRIFT-3713] - lib/d/test/thrift_test_runner.sh is flaky on Jenkins
+    * [THRIFT-3668] - range check error in compact protocol
+    * [THRIFT-3663] - CMake cpp test fails to build on system without zlib
+    * [THRIFT-3712] - TTornadoServer cannot handle IPv6 address
+    * [THRIFT-3710] - Dart generator does not camel case Constants class names
+    * [THRIFT-3697] - Dart generator does not name imports
+    * [THRIFT-3690] - Work around docker image build failures on Travis-CI
+    * [THRIFT-3689] - thrift_reconnecting_client start failed when server is not available
+    * [THRIFT-3695] - Fix D test scripts
+    * [THRIFT-3675] - Union is not serialized correctly by Thrift C Glib
+    * [THRIFT-3673] - API fails with std::exception after a timeout occured in earlier any API call
+    * [THRIFT-3709] - Comment syntax can produce broken code
+    * [THRIFT-3705] - Go map has incorrect types when used with forward-defined types
+    * [THRIFT-3702] - Fix cross tests for Dart compact protocol (3 failing)
+    * [THRIFT-3683] - BadYieldError in thrift py:tornado server
+    * [THRIFT-3682] - Do not reuse refused sockets in test scripts
+    * [THRIFT-3681] - Fix Dart tutorial build
+    * [THRIFT-3680] - Java async processor fails to notify errors to clients
+    * [THRIFT-3714] - Thrift.TProtocolException is not defined in js/src/thrift.js
+    * [THRIFT-3688] - Fix socket bind failure detection of cross test
+    * [THRIFT-3641] - Ruby client should try to connect to every result of getaddrinfo
+    * [THRIFT-3635] - D transport_test is flaky on Jenkins and Travis
+    * [THRIFT-3618] - Python TSSLSocket deprecation message should print caller's location
+    * [THRIFT-3145] - JSON protocol does not handle bool and empty containers correctly
+    * [THRIFT-3158] - TBase<T,F>#deepCopy should return T
+    * [THRIFT-3157] - TBase signature should be TBase<T extends TBase<T,F>, F extends TFieldIdEnum>
+    * [THRIFT-3156] - Node TLS: server executes processing logic two full times
+    * [THRIFT-3154] - tutorial/py.tornado throw EOF exception
+    * [THRIFT-3063] - C++ build -Wunused-parameter warnings on processor_test, TransportTest
+    * [THRIFT-3056] - Add string/collection length limits for Python protocol readers
+    * [THRIFT-3237] - Fix TNamedPipeServer::createNamedPipe memory leak
+    * [THRIFT-3233] - Fix C++ ThreadManager::Impl::removeWorker worker join
+    * [THRIFT-3232] - Cannot deserialize json messages created with fieldNamesAsString 
+    * [THRIFT-3206] - Fix Visual Studio build failure due 'pthread_self': identifier not found
+    * [THRIFT-3200] - JS and nodejs do not encode JSON protocol binary fields as base64
+    * [THRIFT-3199] - Exception field has basic metadata
+    * [THRIFT-3182] - TFramedTransport is in an invalid state after frame size exception
+    * [THRIFT-2536] - new TSocket, uninitialised value reported by valgrind
+    * [THRIFT-2527] - Apache Thrift IDL Compiler code generated for Node.js should be jshint clean
+    * [THRIFT-2519] - "processor" class is not being generated
+    * [THRIFT-2431] - TFileTransportTest fails with "check delta < XXX failed"
+    * [THRIFT-2708] - Erlang library does not support "oneway" message type
+    * [THRIFT-3377] - Deep copy is actually shallow when using typedef members
+    * [THRIFT-3376] - C# and Python JSON protocol double values lose precision
+    * [THRIFT-3373] - Various fixes for cross test servers and clients
+    * [THRIFT-3370] - errno extern variable redefined. Not compiling for Android
+    * [THRIFT-3379] -  Potential out of range panic in Go JSON protocols
+    * [THRIFT-3371] - Abstract namespace Unix domain sockets broken in C++
+    * [THRIFT-3380] - nodejs: 0.9.2 -> 0.9.3 upgrade breaks Protocol and Transport requires
+    * [THRIFT-3367] - Fix bad links to coding_standards.md #634 
+    * [THRIFT-3401] - Nested collections emit Objective-C code that cannot compile
+    * [THRIFT-3403] - JSON String reader doesn't recognize UTF-16 surrogate pairs
+    * [THRIFT-3362] - make check fails for C++ at the SecurityTest
+    * [THRIFT-3395] - Cocoa compiler produces corrupt code when boxing enums inside map.
+    * [THRIFT-3394] - compiler generates uncompilable code
+    * [THRIFT-3388] - hash doesn't work on set/list
+    * [THRIFT-3391] - Wrong bool formatting in test server
+    * [THRIFT-3390] - TTornado server doesn't handle closed connections properly
+    * [THRIFT-3382] - TBase class for C++ Library
+    * [THRIFT-3392] - Java TZlibTransport does not close its wrapper streams upon close()
+    * [THRIFT-3383] - i64 related warnings 
+    * [THRIFT-3386] - misc. warnings with make check
+    * [THRIFT-3385] - warning: format ‘%lu’ expects ‘long unsigned int’, but has type ‘std::basic_string<char>::size_type {aka unsigned int}
+    * [THRIFT-3355] - npm WARN package.json thrift@1.0.0-dev No license field.
+    * [THRIFT-3360] - Improve cross test servers and clients further
+    * [THRIFT-3359] - Binary field incompatibilities
+    * [THRIFT-3354] - Fix word-extraction substr bug in initialism code
+    * [THRIFT-3350] - Python JSON protocol does not encode binary as Base64
+    * [THRIFT-3577] - assertion failed at line 512 of testcontainertest.c
+    * [THRIFT-3576] - Boost test --log_format arg does not accept lowercase
+    * [THRIFT-3575] - Go compiler tries to use unexported library methods when using read_write_private
+    * [THRIFT-3574] - Cocoa generator makes uncompilable imports
+    * [THRIFT-3570] - Remove duplicate instances that are added by upstream
+    * [THRIFT-3571] - Make feature test result browsable
+    * [THRIFT-3569] - c_glib protocols do not check number of bytes read by transport
+    * [THRIFT-3568] - THeader server crashes on readSlow
+    * [THRIFT-3567] - GLib-GObject-CRITICAL **: g_object_unref: assertion 'G_IS_OBJECT (object)' failed
+    * [THRIFT-3566] - C++/Qt: TQTcpServerTest::test_communicate() is never executed
+    * [THRIFT-3564] - C++/Qt: potential core dump in TQTcpServer in case an exception occurs in TAsyncProcessor::process()
+    * [THRIFT-3558] - typos in c_glib tests
+    * [THRIFT-3559] - Fix awkward extra semi-colons with Cocoa container literals
+    * [THRIFT-3555] - 'configure' script does not honor --with-openssl=<path> for libcrypto for BN_init
+    * [THRIFT-3554] - Constant decls may lead to "Error: internal error: prepare_member_name_mapping() already active for different struct"
+    * [THRIFT-3552] - glib_c Memory Leak
+    * [THRIFT-3551] - Thrift perl library missing package declaration
+    * [THRIFT-3549] - Exceptions are not properly stringified in Perl library
+    * [THRIFT-3546] - NodeJS code should not be namespaced (and is currently not strict-mode compliant)
+    * [THRIFT-3545] - Container type literals do not compile
+    * [THRIFT-3538] - Remove UnboundMethodType in TProtocolDecorator
+    * [THRIFT-3536] - Error 'char' does not contain a definition for 'IsLowSurrogate' for WP7 target
+    * [THRIFT-3534] - Link error when building with Qt5
+    * [THRIFT-3533] - Can not send nil pointer as service method argument
+    * [THRIFT-3507] - THttpClient does not use proxy from http_proxy, https_proxy environment variables
+    * [THRIFT-3502] - C++ TServerSocket passes small buffer to getsockname
+    * [THRIFT-3501] - Forward slash in comment causes compiler error
+    * [THRIFT-3498] - C++ library assumes optional function pthread_attr_setschedpolicy is available
+    * [THRIFT-3497] - Build fails with "invalid use of incomplete type"
+    * [THRIFT-3496] - C++: Cob style client fails when sending a consecutive request
+    * [THRIFT-3493] - libthrift does not compile on windows using visual studio
+    * [THRIFT-3488] - warning: unused variable 'program'
+    * [THRIFT-3489] - warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]
+    * [THRIFT-3487] - Full support for newer Delphi versions
+    * [THRIFT-3528] - Fix warnings in thrift.ll
+    * [THRIFT-3527] - -gen py:dynamic,utf8strings ignores utf8strings option
+    * [THRIFT-3526] - Code generated by py:utf8strings does not work for Python3
+    * [THRIFT-3524] - dcc32 warning "W1000 Symbol 'IsLowSurrogate' is deprecated: 'Use TCharHelper'" in Thrift.Protocol.JSON.pas
+    * [THRIFT-3525] - py:dynamic fails to handle binary list/set/map element
+    * [THRIFT-3521] - TSimpleJSONProtocolTest is not deterministic (fails when run on JDK 8)
+    * [THRIFT-3520] - Dart TSocket onError stream should be typed as Object
+    * [THRIFT-3519] - fastbinary does not work with -gen py:utf8strings
+    * [THRIFT-3518] - TConcurrentClientSyncInfo files were missing for Visual Studio
+    * [THRIFT-3512] - c_glib: Build fails due to missing features.h
+    * [THRIFT-3483] - Incorrect empty binary handling introduced by THRIFT-3359
+    * [THRIFT-3479] - Oneway calls should not return exceptions to clients
+    * [THRIFT-3478] - Restore dropped method to THsHaServer.java
+    * [THRIFT-3477] - Parser fails on enum item that starts with 'E' letter and continues with number 
+    * [THRIFT-3476] - Missing include in ./src/thrift/protocol/TJSONProtocol.cpp
+    * [THRIFT-3474] - Docker: thrift-compiler
+    * [THRIFT-3473] - When "optional' is used with a struct member, C++ server seems to not return it correctly
+    * [THRIFT-3468] - Dart TSocketTransport onError handler is too restrictive
+    * [THRIFT-3451] - thrift_protocol PHP extension missing config.m4 file
+    * [THRIFT-3456] - rounding issue in static assert
+    * [THRIFT-3455] - struct write method's return value is incorrect
+    * [THRIFT-3454] - Python Tornado tutorial is broken
+    * [THRIFT-3463] - Java can't be disabled in CMake build
+    * [THRIFT-3450] - NPE when using SSL
+    * [THRIFT-3449] - TBaseAsyncProcessor fb.responseReady() never called for oneway functions
+    * [THRIFT-3471] - Dart generator does not handle uppercase argument names
+    * [THRIFT-3470] - Sporadic timeouts with pipes
+    * [THRIFT-3465] - Go Code With Complex Const Initializer Compilation Depends On Struct Order
+    * [THRIFT-3464] - Fix several defects in c_glib code generator
+    * [THRIFT-3462] - Cocoa generates Incorrect #import header names
+    * [THRIFT-3453] - remove rat_exclude
+    * [THRIFT-3418] - Use of ciphers in ssl.wrap_socket() breaks python 2.6 compatibility
+    * [THRIFT-3417] - "namespace xsd" is not really working
+    * [THRIFT-3413] - Thrift code generation bug in Go when extending service
+    * [THRIFT-3420] - C++: TSSLSockets are not interruptable
+    * [THRIFT-3415] - include unistd.h conditionally
+    * [THRIFT-3414] - #include <pwd.h> in THeaderTransport.h breaks windows build
+    * [THRIFT-3411] - Go generates remotes with wrong package qualifiers when including
+    * [THRIFT-3430] - Go THttpClient does not read HTTP response body to completion when closing
+    * [THRIFT-3423] - First call to thrift_transport:read_exact fails to dispatch correct function
+    * [THRIFT-3422] - Go TServerSocket doesn't close on Interrupt
+    * [THRIFT-3421] - rebar as dependency instead of bundling (was:  rebar fails if PWD contains Unicode)
+    * [THRIFT-3428] - Go test fails when running make check
+    * [THRIFT-3445] - Throwable messages are hidden from JVM stack trace output
+    * [THRIFT-3443] - Thrift include can generate uncompilable code
+    * [THRIFT-3444] - Large 64 bit Integer does not preserve value through Node.js JSONProtocol 
+    * [THRIFT-3436] - misc. cross test issues with UTF-8 path names
+    * [THRIFT-3435] - Put generated Java code for fullcamel tests in a separate package/namespace
+    * [THRIFT-3433] - Doubles aren't interpreted correctly
+    * [THRIFT-3437] - Mingw-w64 build fail
+    * [THRIFT-3434] - Dart generator produces empty name in pubspec.yaml for includes without namespaces
+    * [THRIFT-3408] - JSON generator emits incorrect types
+    * [THRIFT-3406] - Cocoa client should not schedule streams on main runloop
+    * [THRIFT-3404] - JSON String reader doesn't recognize UTF-16 surrogate pair
+    * [THRIFT-3636] - Double precision is not fully preserved in C++ TJSONProtocol
+    * [THRIFT-3632] - c_glib testserialization fails with glib assertion
+    * [THRIFT-3619] - Using Thrift 0.9.3 with googletest on Linux gcc 4.9 / C++11
+    * [THRIFT-3617] - CMake does not build gv/xml generators
+    * [THRIFT-3615] - Fix Python SSL client resource leak on connection failure
+    * [THRIFT-3616] - lib/py/test/test_sslsocket.py is flaky
+    * [THRIFT-3643] - Perl SSL server crushes if a client disconnect without handshake
+    * [THRIFT-3639] - C# Thrift library forces TLS 1.0, thwarting TLS 1.2 usage
+    * [THRIFT-3633] - Travis "C C++ - GCC" build was using clang
+    * [THRIFT-3634] - Fix Python TSocket resource leak on connection failure
+    * [THRIFT-3630] - Debian/Ubuntu install docs need an update
+    * [THRIFT-3629] - Parser sets exitcode on errors, but generator does not
+    * [THRIFT-3608] - lib/cpp/test/SecurityTest is flaky in jenkins Thrift-precommit build.
+    * [THRIFT-3601] - Better conformance to PEP8 for generated code
+    * [THRIFT-3599] - Validate client IP address against cert's SubjectAltName
+    * [THRIFT-3598] - TBufferedTransport doesn't instantiate client connection
+    * [THRIFT-3597] - `make check` hangs in go tests
+    * [THRIFT-3589] - Dart generator uses wrong name in constructor for uppercase arguments with defaults
+    * [THRIFT-3588] - Using TypeScript with --noImplicitAny fails
+    * [THRIFT-3584] - boolean false value cannot be transferred
+    * [THRIFT-3578] - Make THeaderTransport detect TCompact framed and unframed
+    * [THRIFT-3323] - Python library does not handle escaped forward slash ("/") in JSON
+    * [THRIFT-3322] - CMake generated "make check" failes on python_test
+    * [THRIFT-3321] - Thrift can't be added as a subdirectory of another CMake-based project
+    * [THRIFT-3314] - Dots in file names of includes causes dots in javascript variable names
+    * [THRIFT-3307] - Segfault in Ruby serializer
+    * [THRIFT-3309] - Missing TConstant.php in /lib/php/Makefile.am
+    * [THRIFT-3810] - unresolved external symbol public: virtual void __cdecl apache::thrift::server::TServerFramework::serve(void)
+    * [THRIFT-3736] - C++ library build fails if OpenSSL does not surrpot SSLv3
+    * [THRIFT-3878] - Compile error in TSSLSocket.cpp with new OpenSSL [CRYPTO_num_locks]
+    * [THRIFT-3949] - missing make dist entry for compiler/cpp/test
+    * [THRIFT-449] - The wire format of the JSON Protocol may not always be valid JSON if it contains non-UTF8 encoded strings
+    * [THRIFT-162] - Thrift structures are unhashable, preventing them from being used as set elements
+    * [THRIFT-3961] - TConnectedClient does not terminate the connection to the client if an exception while processing the received message occures.
+    * [THRIFT-3881] - Travis CI builds are failing due to docker failures (three retries, and gives up)
+    * [THRIFT-3937] - Cannot compile 0.10.0 development tip with gcc-4.6.x
+    * [THRIFT-3964] - Unsupported mechanism type ????? due to dependency on default OS-dependent charset
+    * [THRIFT-3038] - Use of volatile in cpp library
+    * [THRIFT-3301] - Java generated code uses imports that can lead to class name collisions with IDL defined types
+    * [THRIFT-3348] - PHP TCompactProtocol bool&int64 readvalue bug
+    * [THRIFT-3955] - TThreadedServer Memory Leak
+    * [THRIFT-3829] - Thrift does not install Python Libraries if Twisted is not installed
+    * [THRIFT-3932] - C++ ThreadManager has a rare termination race
+    * [THRIFT-3828] - cmake fails when Boost_INCLUDE_DIRS (and other variables passed to include_directories()) is empty 
+    * [THRIFT-3958] - CMake WITH_MT option for windows static runtime linking does not support the cmake build type RelWithDebInfo
+    * [THRIFT-3957] - TConnectedClient does not disconnect from clients when their timeout is reached.
+    * [THRIFT-3953] - TSSLSocket::close should handle exceptions from waitForEvent because it is called by the destructor.
+    * [THRIFT-3977] - PHP extension creates undefined values when deserializing sets
+    * [THRIFT-3947] - sockaddr type isn't always large enough for the return of getsockname
+    * [THRIFT-2755] - ThreadSanitizer reports data race in ThreadManager::Impl::addWorker
+    * [THRIFT-3948] - errno is not the correct method of getting the error in windows
+    * [THRIFT-4008] - broken ci due to upstream dependency versioning break
+    * [THRIFT-3999] - Fix Debian & Ubuntu package dependencies
+    * [THRIFT-3886] - PHP cross test client returns 0 even when failing
+    * [THRIFT-3997] - building thrift libs does not support new openssl
+
+## Documentation
+    * [THRIFT-3867] - Specify BinaryProtocol and CompactProtocol
+
+## Epic
+    * [THRIFT-3049] - As an iOS developer, I want a generator and library that produces Swift code
+    * [THRIFT-2336] - UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+
+## Improvement
+    * [THRIFT-1867] - Python client/server should support client-side certificates.
+    * [THRIFT-1313] - c_glib compact support
+    * [THRIFT-1385] - make install doesn't install java library in the setted folder
+    * [THRIFT-1437] - Update RPM spec
+    * [THRIFT-847] - Test Framework harmonization across all languages
+    * [THRIFT-819] - add Enumeration for protocol, transport and server types
+    * [THRIFT-3927] - Emit an error instead of throw an error in the async callback
+    * [THRIFT-3931] - TSimpleServer: If process request encounter UNKNOWN_METHOD, don't close transport.
+    * [THRIFT-3934] - Automatically resolve OpenSSL binary version on Windows CI
+    * [THRIFT-3918] - Run subset of make cross
+    * [THRIFT-3908] - Remove redundant dependencies from Dockerfile
+    * [THRIFT-3907] - Skip Docker image build on CI when unchanged
+    * [THRIFT-3868] - Java struct equals should do identity check before field comparison
+    * [THRIFT-3849] - Port Go serializer and deserializer to dart
+    * [THRIFT-2989] - Complete CMake build for Apache Thrift
+    * [THRIFT-2980] - ThriftMemoryBuffer doesn't have a constructor option to take an existing buffer
+    * [THRIFT-2856] - refactor erlang basic transports and unify interfaces
+    * [THRIFT-2877] - Optimize generated hashCode
+    * [THRIFT-2869] - JSON: run schema validation from tests
+    * [THRIFT-3112] - [Java] AsyncMethodCallback should be typed in generated AsyncIface
+    * [THRIFT-3263] - PHP jsonSerialize() should cast scalar types
+    * [THRIFT-2905] - Cocoa compiler should have option to produce "modern" Objective-C
+    * [THRIFT-2821] - Enable the use of custom HTTP-Header in the Transport
+    * [THRIFT-2093] - added the ability to set compression level in C++ zlib transport
+    * [THRIFT-2089] - Compiler ignores duplicate typenames
+    * [THRIFT-2056] - Moved all #include config.h statements to #include <thrift/config.h>
+    * [THRIFT-2031] - Make SO_KEEPALIVE configurable for C++ lib
+    * [THRIFT-2021] - Improve large binary protocol string performance
+    * [THRIFT-2028] - Cleanup threading headers / libraries
+    * [THRIFT-2014] - Change C++ lib includes to use <namespace/> style throughout
+    * [THRIFT-2312] - travis.yml: build everything
+    * [THRIFT-1915] - Multiplexing Services
+    * [THRIFT-1736] - Visual Studio top level project files within msvc
+    * [THRIFT-1735] - integrate tutorial into regular build
+    * [THRIFT-1533] - Make TTransport should be Closeable
+    * [THRIFT-35] - Move language tests into their appropriate library directory
+    * [THRIFT-1079] - Support i64 in AS3
+    * [THRIFT-1108] - SSL support for the Ruby library 
+    * [THRIFT-3856] - update debian package deependencies
+    * [THRIFT-3833] - haxe http server implementation (by embeding into php web server)
+    * [THRIFT-3839] - Performance issue with big message deserialization using php extension
+    * [THRIFT-3820] - Erlang: Detect OTP >= 18 to use new time correction
+    * [THRIFT-3816] - Reduce docker build duration on Travis-CI
+    * [THRIFT-3815] - Put appveyor dependency versions to one place
+    * [THRIFT-3788] - Compatibility improvements and Win64 support
+    * [THRIFT-3792] - Timeouts for anonymous pipes should be configurable
+    * [THRIFT-3794] - Split Delphi application, protocol and transport exception subtypes into separate exceptions
+    * [THRIFT-3774] - The generated code should have exception_names meta info
+    * [THRIFT-3762] - Fix build warnings for deprecated Thrift "byte" fields
+    * [THRIFT-3756] - Improve requiredness documentation
+    * [THRIFT-3761] - Add debian package for Python3
+    * [THRIFT-3742] - haxe php cli support
+    * [THRIFT-3733] - Socket timeout improvements
+    * [THRIFT-3728] - http transport for thrift-lua
+    * [THRIFT-3905] - Dart compiler does not initialize bool, int, and double properties
+    * [THRIFT-3911] - Loosen Ruby dev dependency version requirements
+    * [THRIFT-3906] - Run C# tests with make check
+    * [THRIFT-3900] - Add Python SSL flags
+    * [THRIFT-3897] - Provide meaningful exception type based on WebExceptionStatus in case of timeout
+    * [THRIFT-3808] - Missing `DOUBLE` in thrift type enumeration
+    * [THRIFT-3803] - Remove "file" attribute from XML generator
+    * [THRIFT-3660] - Add V4 mapped address to test client cert's altname
+    * [THRIFT-3661] - Use https to download meck in erlang test build
+    * [THRIFT-3659] - Check configure result of CMake on CI
+    * [THRIFT-3667] - Add TLS SNI support to clients
+    * [THRIFT-3651] - Make backports.match_hostname and ipaddress optional
+    * [THRIFT-3666] - Build D tutorial as part of Autotools build
+    * [THRIFT-3665] - Add D libevent and OpenSSL to docker images
+    * [THRIFT-3664] - Remove md5.c
+    * [THRIFT-3662] - Add Haskell to debian docker image
+    * [THRIFT-3711] - Add D to cross language test
+    * [THRIFT-3691] - Run flake8 Python style check on Travis-CI
+    * [THRIFT-3692] - (Re)enable Appveyor C++ and Python build
+    * [THRIFT-3677] - Improve CMake Java build
+    * [THRIFT-3679] - Add stdout log to testBinary in Java test server
+    * [THRIFT-3718] - Reduce size of docker image for build environment
+    * [THRIFT-3698] - [Travis-CI] Introduce retry to apt commands
+    * [THRIFT-3127] - switch -recurse to --recurse and reserve -r
+    * [THRIFT-3087] - Pass on errors like "connection closed"
+    * [THRIFT-3240] - Thrift Python client should support subjectAltName and wildcard certs in TSSLSocket
+    * [THRIFT-3213] - make cross should indicate when it skips a known failing test
+    * [THRIFT-3208] - Fix Visual Studio solution build failure due to missing source
+    * [THRIFT-3186] - Add TServerHTTP to Go library
+    * [THRIFT-2342] - Add __FILE__ and __LINE__ to Thrift C++ excpetions
+    * [THRIFT-3372] - Add dart generator to Visual Studio project
+    * [THRIFT-3366] - ThriftTest to implement standard return values 
+    * [THRIFT-3402] - Provide a perl Unix Socket implementation
+    * [THRIFT-3361] - Improve C# library
+    * [THRIFT-3393] - Introduce i8 to provide consistent set of Thrift IDL integer types
+    * [THRIFT-3339] - Support for database/sql
+    * [THRIFT-3565] - C++: T[Async]Processor::getEventHandler() should be declared as const member functions
+    * [THRIFT-3563] - C++/Qt: removed usage of macro QT_PREPEND_NAMESPACE as it isn't consequently used for all references to Qt types.
+    * [THRIFT-3562] - Removed unused TAsyncProcessor::getAsyncServer()
+    * [THRIFT-3561] - C++/Qt: make use of Q_DISABLE_COPY() to get rid of copy ctor and assignment operator
+    * [THRIFT-3556] - c_glib file descriptor transport
+    * [THRIFT-3544] - Make cross test fail when server process died unexpectedly
+    * [THRIFT-3540] - Make python tutorial more in line with PEP8
+    * [THRIFT-3535] - Dart generator argument to produce a file structure usable in parent library
+    * [THRIFT-3505] - Enhance Python TSSLSocket
+    * [THRIFT-3506] - Eliminate old style classes from library code
+    * [THRIFT-3503] - Enable py:utf8string by default
+    * [THRIFT-3499] - Add package_prefix to python generator
+    * [THRIFT-3495] - Minor enhancements and fixes for cross test
+    * [THRIFT-3486] - Java generated `getFieldValue` is incompatible with `setFieldValue` for binary values.
+    * [THRIFT-3484] - Consolidate temporary buffers in Java's TCompactProtocol
+    * [THRIFT-3516] - Add feature test for THeader TBinaryProtocol interop
+    * [THRIFT-3515] - Python 2.6 compatibility and test on CI
+    * [THRIFT-3514] - PHP 7 compatible version of binary protocol
+    * [THRIFT-3469] - Docker: Debian support
+    * [THRIFT-3416] - Retire old "xxx_namespace" declarations from the IDL
+    * [THRIFT-3426] - Align autogen comment in XSD
+    * [THRIFT-3424] - Add CMake android build option
+    * [THRIFT-3439] - Run make cross using Python3 when available
+    * [THRIFT-3440] - Python make check takes too much time
+    * [THRIFT-3441] - Stabilize Travis-CI builds
+    * [THRIFT-3431] - Avoid "schemes" HashMap lookups during struct reads/writes
+    * [THRIFT-3432] - Add a TByteBuffer transport to the Java library
+    * [THRIFT-3438] - Enable py:new_style by default
+    * [THRIFT-3405] - Go THttpClient misuses http.Client objects
+    * [THRIFT-3614] - Improve logging of test_sslsocket.py
+    * [THRIFT-3647] - Fix php extension build warnings
+    * [THRIFT-3642] - Speed up cross test runner
+    * [THRIFT-3637] - Implement compact protocol for dart
+    * [THRIFT-3613] - Port Python C extension to Python 3
+    * [THRIFT-3612] - Add Python C extension for compact protocol
+    * [THRIFT-3611] - Add --regex filter to cross test runner
+    * [THRIFT-3631] - JSON protocol implementation for Lua
+    * [THRIFT-3609] - Remove or replace TestPortFixture.h
+    * [THRIFT-3605] - Have the compiler complain about invalid arguments and options
+    * [THRIFT-3596] - Better conformance to PEP8
+    * [THRIFT-3585] - Compact protocol implementation for Lua
+    * [THRIFT-3582] - Erlang libraries should have service metadata
+    * [THRIFT-3579] - Introduce retry to make cross
+    * [THRIFT-3306] - Java: TBinaryProtocol: Use 1 temp buffer instead of allocating 8
+    * [THRIFT-3910] - Do not invoke pip as part of build process
+    * [THRIFT-1857] - Python 3.X Support
+    * [THRIFT-1944] - Binding to zero port
+    * [THRIFT-3954] - Enable the usage of structs called "Object" in Java
+    * [THRIFT-3981] - Enable analyzer strong mode in Dart library
+    * [THRIFT-3998] - Document ability to add custom tags to thrift structs
+    * [THRIFT-4006] - Add a removeEventListener method on TSocket
+
+## New Feature
+    * [THRIFT-640] - Support deprecation
+    * [THRIFT-948] - SSL socket support for PHP
+    * [THRIFT-764] - add Support for Vala language
+    * [THRIFT-3046] - Allow PSR4 class loading for generated classes (PHP)
+    * [THRIFT-2113] - Erlang SSL Socket Support
+    * [THRIFT-1482] - Unix domain socket support under PHP
+    * [THRIFT-519] - Support collections of types without having to explicitly define it
+    * [THRIFT-468] - Rack Middleware Application for Rails
+    * [THRIFT-1708] - Add event handlers for processor events
+    * [THRIFT-3834] - Erlang namespacing and exception metadata
+    * [THRIFT-2510] - Implement TNonblockingServer's ability to listen on unix domain sockets
+    * [THRIFT-3397] - Implement TProcessorFactory in C# to enable per-client processors
+    * [THRIFT-3523] - XML Generator
+    * [THRIFT-3510] - Add HttpTaskAsyncHandler implementation
+    * [THRIFT-3318] - PHP: SimpleJSONProtocol Implementation
+    * [THRIFT-3299] - Dart language bindings in Thrift
+    * [THRIFT-2835] - Add possibility to distribute generators separately from thrift core, and load them dynamically
+    * [THRIFT-184] - Add OSGi Manifest headers to the libthrift java library to be able to use Thrift in the OSGi runtime
+    * [THRIFT-141] - If a required field is not present on serialization, throw an exception
+    * [THRIFT-1891] - Add Windows ALPC transport which is right counterpart of Unix domain sockets
+
+## Question
+    * [THRIFT-1808] - The Thrift struct should be considered self-contained?
+    * [THRIFT-2895] - Tutorial cpp
+    * [THRIFT-3860] - Elephant-bird application Test fails for Thrift
+    * [THRIFT-3811] - HTTPS Support for C++ applications
+    * [THRIFT-3509] - "make check" error
+
+## Story
+    * [THRIFT-3452] - .travis.yml: Migrating from legacy to container-based infrastructure
+
+## Sub-task
+    * [THRIFT-1811] - ruby tutorial as part of the regular build
+    * [THRIFT-2779] - PHP TJSONProtocol encode unicode into UCS-4LE which can't be parsed by other language bindings
+    * [THRIFT-2110] - Erlang: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-3852] - A Travis-CI job fails with "write error"
+    * [THRIFT-3740] - Fix haxelib.json classpath 
+    * [THRIFT-3653] - incorrect union serialization
+    * [THRIFT-3652] - incorrect serialization of optionals
+    * [THRIFT-3655] - incorrect union serialization
+    * [THRIFT-3654] - incorrect serialization of optionals
+    * [THRIFT-3656] - incorrect serialization of optionals
+    * [THRIFT-3699] - Fix integer limit symbol includes in Python C extension
+    * [THRIFT-3693] - Fix include issue in C++ TSSLSocketInterruptTest on Windows
+    * [THRIFT-3694] - [Windows] Disable tests of a few servers that are not supported
+    * [THRIFT-3696] - Install pip to CentOS Docker images to fix Python builds
+    * [THRIFT-3638] - Fix haxelib.json
+    * [THRIFT-3251] - Add http transport for server to Go lib
+    * [THRIFT-2424] - Recursive Types
+    * [THRIFT-2423] - THeader
+    * [THRIFT-2413] - Python: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2409] - Java: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2412] - D: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2411] - C++: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2410] - JavaMe: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2668] - TestSuite: detailed result on passed tests by feature
+    * [THRIFT-2659] - python Test Server fails when throwing TException
+    * [THRIFT-3398] - Add CMake build  for Haskell library and tests
+    * [THRIFT-3396] - DART: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-3364] -   Fix ruby binary field encoding in TJSONProtocol
+    * [THRIFT-3381] - Fix for misc. codegen issues with THRIFT-2905
+    * [THRIFT-3573] - No rule to make target `../../../test/c_glib/src/.deps/testthrifttest-thrift_test_handler.Po'.
+    * [THRIFT-3572] - "Unable to determine the behavior of a signed right shift"
+    * [THRIFT-3542] - Add length limit support to Java test server
+    * [THRIFT-3537] - Remove the (now obsolete) csharp:asyncctp flag 
+    * [THRIFT-3532] - Add configurable string and container read size limit to Python protocols
+    * [THRIFT-3531] - Create cross lang feature test for string and container read length limit
+    * [THRIFT-3482] - Haskell JSON protocol does not encode binary field as Base64
+    * [THRIFT-3425] - Minor fixes + simplification for CentOS Dockerfile
+    * [THRIFT-3442] - Run CMake tests on Appveyor
+    * [THRIFT-3409] - NodeJS binary field issues
+    * [THRIFT-3621] - Fix lib/cpp/test/SecurityTest.cpp to use ephemeral ports
+    * [THRIFT-3628] - Fix lib/cpp/test/TServerIntegrationTest.cpp to use ephemeral ports
+    * [THRIFT-3625] - Kill unused #include "TestPortFixture.h" in lib/cpp/test/TServerTransportTest.cpp.
+    * [THRIFT-3646] - Fix Python extension build warnings
+    * [THRIFT-3626] - Fix lib/cpp/test/TSocketInterruptTest.cpp to use ephemeral ports.
+    * [THRIFT-3624] - Fix lib/cpp/test/TServerSocketTest.cpp to use ephemeral ports
+    * [THRIFT-3623] - Fix Fix cpp/lib/test/TSSLSocketInterruptTest.cpp to use ephemeral ports
+    * [THRIFT-3592] - Add basic test client
+    * [THRIFT-3980] - add TExtendedBinaryProtocol.java
+
+## Task
+    * [THRIFT-1801] - Sync up TApplicationException codes across languages and thrift implementations
+    * [THRIFT-1259] - Automate versioning 
+
+## Test
+    * [THRIFT-3400] - Add Erlang to cross test
+    * [THRIFT-3504] - Fix FastbinaryTest.py
+
+## Wish
+    * [THRIFT-3923] - Maybe remove Aereo from the "Powered by" list
+    * [THRIFT-2149] - Add an option to disable the generation of default operators
+
+
+
+Thrift 0.9.3
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-2441] - Cannot shutdown TThreadedServer when clients are still connected
+    * [THRIFT-2465] - TBinaryProtocolT breaks if copied/moved
+    * [THRIFT-2474] - thrift.h causes a compile failure
+    * [THRIFT-2540] - Running configure from outside the source directory fails
+    * [THRIFT-2598] - Add check for minimum Go version to configure.ac
+    * [THRIFT-2647] - compiler-hs: don't decapitalize field names, do decapitalize argument bindings
+    * [THRIFT-2773] - Generated Java code for 'oneway' methods is incorrect.
+    * [THRIFT-2789] - TNonblockingServer leaks socket FD's under load
+    * [THRIFT-2682] - TThreadedServer leaks per-thread memory
+    * [THRIFT-2674] - JavaScript: declare Accept: and Content-Type: in request
+    * [THRIFT-3078] - TNonblockingServerSocket's logger is not named after TNonblockingServerSocket
+    * [THRIFT-3077] - C++ TFileTransport ignores return code from ftruncate
+    * [THRIFT-3067] - C++ cppcheck performance related warnings
+    * [THRIFT-3066] - C++ TDenseProtocol assert modifies instead of checks
+    * [THRIFT-3071] - bootstrap.sh on Ubuntu 12.04 (Precise) automake error
+    * [THRIFT-3069] - C++ TServerSocket leaks socket on fcntl get or set flags error
+    * [THRIFT-3079] - TNonblockingServerSocket's logger is not named after TNonblockingServerSocket
+    * [THRIFT-3080] - C++ TNonblockingServer connection leak while accept huge number connections.
+    * [THRIFT-3086] - C++ Valgrind Error Cleanup
+    * [THRIFT-3085] - thrift_reconnecting_client never try to reconnect
+    * [THRIFT-3123] - Missing include in compiler/cpp/src/main.h breaks build in some environments
+    * [THRIFT-3125] - Fix the list of exported headers in automake input
+    * [THRIFT-3126] - PHP JSON serializer converts empty or int-indexed maps to lists
+    * [THRIFT-3132] - Properly format date in Java @Generated annotations
+    * [THRIFT-3137] - Travis build hangs after failure
+    * [THRIFT-3138] - "make check" parallel execution is underministic
+    * [THRIFT-3139] - JS library test is flaky
+    * [THRIFT-3140] - ConcurrentModificationException is thrown by JavaScript test server
+    * [THRIFT-3124] - Some signed/unsigned warnings while building compiler
+    * [THRIFT-3128] - Go generated code produces name collisions between services
+    * [THRIFT-3146] - Graphviz generates function name collisions between services
+    * [THRIFT-3147] - Segfault while receiving data
+    * [THRIFT-3148] - Markdown links to coding_standards are dead
+    * [THRIFT-3090] - cmake build is broken on MacOSX
+    * [THRIFT-3097] - cmake targets unconditionally depend on optional libraries
+    * [THRIFT-3094] - master as of 2015-APR-13 fails -DBOOST_THREADS cmake build
+    * [THRIFT-3099] - cmake build is broken on FreeBSD
+    * [THRIFT-3089] - Assigning default ENUM values results in non-compilable java code if java namespace is not defined
+    * [THRIFT-3093] - mingw compile fixes for c++ library 0.9.2
+    * [THRIFT-3098] - Thrift does not pretty print binary typedefs the way it does binary fields
+    * [THRIFT-3091] - c_glib service method should return result from handler method
+    * [THRIFT-3088] - TThreadPoolServer with Sasl auth may leak CLOSE_WAIT socket
+    * [THRIFT-3109] - Cross test log file cannot be browsed when served in HTTP server
+    * [THRIFT-3113] - m4 C++11 macro issue
+    * [THRIFT-3105] - C++ libthriftnb library on Windows build failure
+    * [THRIFT-3115] - Uncompileable code due to name collision with predefined used types
+    * [THRIFT-3117] - Java TSSLTransportFactory can't load certificates within JAR archive
+    * [THRIFT-3102] - could not make check for Go Library
+    * [THRIFT-3120] - Minor spelling errors and an outdated URL
+    * [THRIFT-3121] - Librt does not exist on OS X
+    * [THRIFT-3152] - Compiler error on Mac OSX (missing #include <cstdlib>)
+    * [THRIFT-3162] - make fails for dmd 2.067
+    * [THRIFT-3164] - Thrift C++ library SSL socket by default allows for unsecure SSLv3 negotiation
+    * [THRIFT-3168] - Fix Maven POM
+    * [THRIFT-3170] - Initialism code in the Go compiler causes chaos
+    * [THRIFT-3169] - Do not export thrift.TestStruct and thrift.TestEnum in thrift Go library 
+    * [THRIFT-3191] - Perl compiler does not add support for unexpected exception handling
+    * [THRIFT-3178] - glib C does not compile
+    * [THRIFT-3189] - Perl ServerSocket should allow a specific interface to be listened to
+    * [THRIFT-3252] - Missing TConcurrentClientSyncInfo.h in cpp Makefile, so doesn't install
+    * [THRIFT-3255] - Thrift generator doesn't exclude 'package' keyword for thrift property names breaking java builds
+    * [THRIFT-3260] - multiple warnings in c_glib tutorial
+    * [THRIFT-3256] - Some D test timings are too aggressive for slow machines
+    * [THRIFT-3257] - warning: extra tokens at end of #endif directive
+    * [THRIFT-3184] - Thrift Go leaves file descriptors open
+    * [THRIFT-3203] - DOAP - please fix "Ocaml" => "OCaml"
+    * [THRIFT-3210] - (uncompileable) code generated for server events while are events not enabled
+    * [THRIFT-3215] - TJSONProtocol '(c++) uses "throw new" to throw exceptions instead of "throw"
+    * [THRIFT-3202] - Allow HSHAServer to configure min and max worker threads separately.
+    * [THRIFT-3205] - TCompactProtocol return a wrong error when the io.EOF happens
+    * [THRIFT-3209] - LGPL mentioned in license file
+    * [THRIFT-3197] - keepAliveTime is hard coded as 60 sec in TThreadPoolServer
+    * [THRIFT-3196] - Misspelling in lua TBinaryProtocol (stirctWrite => strictWrite)
+    * [THRIFT-3198] - Allow construction of TTransportFactory with a specified maxLength
+    * [THRIFT-3192] - Go import paths changed in 1.4, and expired June 1
+    * [THRIFT-3271] - Could not find or load main class configtest_ax_javac_and_java on some non-english systems
+    * [THRIFT-3273] - c_glib: Generated code tries to convert between function and void pointers
+    * [THRIFT-3264] - Fix Erlang 16 namespaced types
+    * [THRIFT-3270] - reusing TNonblockingServer::TConnection cause dirty TSocket
+    * [THRIFT-3267] - c_glib: "Critical" failure during unit tests
+    * [THRIFT-3277] - THttpClient leaks connections if it's used for multiple requests
+    * [THRIFT-3278] - NodeJS: Fix exception stack traces and names
+    * [THRIFT-3279] - Fix a bug in retry_max_delay (NodeJS)
+    * [THRIFT-3280] - Initialize retry variables on construction
+    * [THRIFT-3283] - c_glib: Tutorial server always exits with warning
+    * [THRIFT-3284] - c_glib: Empty service produces unused-variable warning
+    * [THRIFT-1925] - c_glib generated code does not compile
+    * [THRIFT-1849] - after transport->open() opens isOpen returns true and next open() goes thru when it shall not
+    * [THRIFT-1866] - java compiler generates non-compiling code with const's defined in a thrift when name includes non-identifier chars
+    * [THRIFT-1938] - FunctionRunner.h -- uses wrong path for Thread.h when installed
+    * [THRIFT-1844] - Password string not cleared
+    * [THRIFT-2004] - Thrift::Union violates :== method contract and crashes
+    * [THRIFT-2073] - Thrift C++ THttpClient error: cannot refill buffer
+    * [THRIFT-2127] - Autoconf scripting does not properly account for cross-compile
+    * [THRIFT-2180] - Integer types issues in Cocoa lib on ARM64
+    * [THRIFT-2189] - Go needs "isset" to fully support "union" type (and optionals)
+    * [THRIFT-2192] - autotools on Redhat based systems
+    * [THRIFT-2546] - cross language tests fails at 'TestMultiException' when using nodejs server
+    * [THRIFT-2547] - nodejs servers and clients fails to connect with cpp using compact protocol
+    * [THRIFT-2548] - Nodejs servers and clients does not work properly with  -ssl
+    * [THRIFT-1471] - toString() does not print ByteBuffer values when nested in a List
+    * [THRIFT-1201] - getaddrinfo resource leak
+    * [THRIFT-615] - TThreadPoolServer doesn't call task_done after pulling tasks from it's clients queue
+    * [THRIFT-162] - Thrift structures are unhashable, preventing them from being used as set elements
+    * [THRIFT-810] - Crashed client on TSocket::close under loads
+    * [THRIFT-557] - charset problem with file Autogenerated by Thrift
+    * [THRIFT-233] - IDL doesn't support negative hex literals
+    * [THRIFT-1649] - contrib/zeromq does not build in 0.8.0
+    * [THRIFT-1642] - Miscalculation lead to throw unexpected "TTransportException::TIMED_OUT"(or called "EAGAIN (timed out)") exception
+    * [THRIFT-1587] - TSocket::setRecvTimeout error
+    * [THRIFT-1248] - pointer subtraction in TMemoryBuffer relies on undefined behavior
+    * [THRIFT-1774] - Sasl Transport client would hang when trying to connect non-sasl transport server
+    * [THRIFT-1754] - RangeError in buffer handling
+    * [THRIFT-1618] - static structMap in FieldMetaData is not thread safe and can lead to deadlocks
+    * [THRIFT-2335] - thrift incompatibility with py:tornado as server, java as client
+    * [THRIFT-2803] - TCP_DEFER_ACCEPT not supported with domain sockets
+    * [THRIFT-2799] - Build Problem(s): ld: library not found for -l:libboost_unit_test_framework.a
+    * [THRIFT-2801] - C++ test suite compilation warnings
+    * [THRIFT-2802] - C++ tutorial compilation warnings
+    * [THRIFT-2795] - thrift_binary_protocol.c: 'dereferencing type-punned pointer will break strict-aliasing rules'
+    * [THRIFT-2817] - TSimpleJSONProtocol reads beyond end of message
+    * [THRIFT-2826] - html:standalone sometimes ignored
+    * [THRIFT-2829] - Support haxelib installation via github
+    * [THRIFT-2828] - slightly wrong help screen indent
+    * [THRIFT-2831] - Removes dead code in web_server.js introduced in THRIFT-2819
+    * [THRIFT-2823] - All JS-tests are failing when run with grunt test
+    * [THRIFT-2827] - Thrift 0.9.2 fails to compile on Yosemite due to tr1/functional include in ProcessorTest.cpp
+    * [THRIFT-2843] - Automake configure.ac has possible typo related to Java
+    * [THRIFT-2813] - multiple haxe library fixes/improvements
+    * [THRIFT-2825] - Supplying unicode to python Thrift client can cause next request arguments to get overwritten
+    * [THRIFT-2840] - Cabal file points to LICENSE file outside the path of the Haskell project.
+    * [THRIFT-2818] - Trailing commas in array
+    * [THRIFT-2830] - Clean up ant warnings in tutorial dir
+    * [THRIFT-2842] - Erlang thrift client has infinite timeout
+    * [THRIFT-2810] - Do not leave the underlying ServerSocket open if construction of TServerSocket fails
+    * [THRIFT-2812] - Go server adding redundant buffering layer
+    * [THRIFT-2839] - TFramedTransport read bug
+    * [THRIFT-2844] - Nodejs support broken when running under Browserify
+    * [THRIFT-2814] - args/result classes not found when no namespace is set
+    * [THRIFT-2847] - function IfValue() is a duplicate of System.StrUtils.IfThen
+    * [THRIFT-2848] - certain Delphi tests do not build if TypeRegistry is used
+    * [THRIFT-2854] - Go Struct writer and reader looses important error information
+    * [THRIFT-2858] - Enable header field case insensitive match in THttpServer
+    * [THRIFT-2857] - C# generator creates uncompilable code for struct constants
+    * [THRIFT-2860] - Delphi server closes connection on unexpected exceptions
+    * [THRIFT-2868] - Enhance error handling in the Go client 
+    * [THRIFT-2879] - TMemoryBuffer: using lua string in wrong way
+    * [THRIFT-2851] - Remove strange public Peek() from Go transports
+    * [THRIFT-2852] - Better Open/IsOpen/Close behavior for StreamTransport.
+    * [THRIFT-2871] - Missing semicolon in thrift.js
+    * [THRIFT-2872] - ThreadManager deadlock for task expiration
+    * [THRIFT-2881] - Handle errors from Accept() correctly
+    * [THRIFT-2849] - Spell errors reported by codespell tool
+    * [THRIFT-2870] - C++ TJSONProtocol using locale dependent formatting
+    * [THRIFT-2882] - Lua Generator: using string.len funtion to get struct(map,list,set) size
+    * [THRIFT-2864] - JSON generator missing from Visual Studio build project 
+    * [THRIFT-2878] - Go validation support of required fields
+    * [THRIFT-2873] - TPipe and TPipeServer don't compile on Windows with UNICODE enabled
+    * [THRIFT-2888] - import of <limits> is missing in JSON generator
+    * [THRIFT-2900] - Python THttpClient does not reset socket timeout on exception
+    * [THRIFT-2907] - 'ntohll' macro redefined
+    * [THRIFT-2884] - Map does not serialize correctly for JSON protocol in Go library
+    * [THRIFT-2887] - --with-openssl configure flag is ignored
+    * [THRIFT-2894] - PHP json serializer skips maps with int/bool keys
+    * [THRIFT-2904] - json_protocol_test.go fails
+    * [THRIFT-2906] - library not found for -l:libboost_unit_test_framework.a
+    * [THRIFT-2890] - binary data may lose bytes with JSON transport under specific circumstances
+    * [THRIFT-2891] - binary data may cause a failure with JSON transport under specific circumstances
+    * [THRIFT-2901] - Fix for generated TypeScript functions + indentation of JavaScript maps
+    * [THRIFT-2916] - make check fails for D language
+    * [THRIFT-2918] - Race condition in Python TProcessPoolServer test
+    * [THRIFT-2920] - Erlang Thrift test uses wrong IDL file
+    * [THRIFT-2922] - $TRIAL is used with Python tests but not tested accordingly
+    * [THRIFT-2912] - Autotool build for C++ Qt library is invalid
+    * [THRIFT-2914] - explicit dependency to Lua5.2 fails on some systems
+    * [THRIFT-2910] - libevent is not really optional
+    * [THRIFT-2911] - fix c++ version zeromq transport, the old version cannot work
+    * [THRIFT-2915] - Lua generator missing from Visual Studio build project
+    * [THRIFT-2917] - "make clean" breaks test/c_glib
+    * [THRIFT-2919] - Haxe test server timeout too large
+    * [THRIFT-2923] - JavaScript client assumes a message being written
+    * [THRIFT-2924] - TNonblockingServer crashes when user-provided event_base is used
+    * [THRIFT-2925] - CMake build does not work with OpenSSL nor anything installed in non-system location
+    * [THRIFT-2931] - Access to undeclared static property: Thrift\Protocol\TProtocol::$TBINARYPROTOCOLACCELERATED
+    * [THRIFT-2893] - CMake build fails with boost thread or std thread
+    * [THRIFT-2902] - Generated c_glib code does not compile with clang
+    * [THRIFT-2903] - Qt4 library built with CMake does not work
+    * [THRIFT-2942] - CSharp generate invalid code for property named read or write
+    * [THRIFT-2932] - Node.js Thrift connection libraries throw Exceptions into event emitter
+    * [THRIFT-2933] - v0.9.2: doubles encoded in node with compact protocol cannot be decoded by python
+    * [THRIFT-2934] - createServer signature mismatch
+    * [THRIFT-2981] - IDL with no namespace produces unparsable PHP
+    * [THRIFT-2999] - Addition of .gitattributes text auto in THRIFT-2724 causes modified files on checkout
+    * [THRIFT-2949] - typo in compiler/cpp/README.md
+    * [THRIFT-2957] - warning: source file %s is in a subdirectory, but option 'subdir-objects' is disabled
+    * [THRIFT-2953] - TNamedPipeServerTransport is not Stop()able
+    * [THRIFT-2962] - Docker Thrift env for development and testing
+    * [THRIFT-2971] - C++ test and tutorial parallel build is unstable
+    * [THRIFT-2972] - Missing backslash in lib/cpp/test/Makefile.am
+    * [THRIFT-2951] - Fix Erlang name conflict test
+    * [THRIFT-2955] - Using list of typedefs does not compile on Go
+    * [THRIFT-2960] - namespace regression for Ruby
+    * [THRIFT-2959] - nodejs: fix binary unit tests
+    * [THRIFT-2966] - nodejs: Fix bad references to TProtocolException and TProtocolExceptionType
+    * [THRIFT-2970] - grunt-jsdoc fails due to dependency issues
+    * [THRIFT-3001] - C# Equals fails for binary fields (byte[])
+    * [THRIFT-3003] - Missing LICENSE file prevents package from being installed
+    * [THRIFT-3008] - Node.js server does not fully support exception
+    * [THRIFT-3007] - Travis build is broken because of directory conflict
+    * [THRIFT-3009] - TSSLSocket does not use the correct hostname (breaks certificate checks)
+    * [THRIFT-3011] - C# test server testException() not implemented according to specs
+    * [THRIFT-3012] - Timing problems in NamedPipe implementation due to unnecessary open/close
+    * [THRIFT-3019] - Golang generator missing docstring for structs
+    * [THRIFT-3021] - Service remote tool does not import stub package with package prefix
+    * [THRIFT-3026] - TMultiplexedProcessor does not have a constructor
+    * [THRIFT-3028] - Regression caused by THRIFT-2180
+    * [THRIFT-3017] - order of map key/value types incorrect for one CTOR
+    * [THRIFT-3020] - Cannot compile thrift as C++03
+    * [THRIFT-3024] - User-Agent "BattleNet" used in some Thrift library files
+    * [THRIFT-3047] - Uneven calls to indent_up and indent_down in Cocoa generator
+    * [THRIFT-3048] - NodeJS decoding of I64 is inconsistent across protocols
+    * [THRIFT-3043] - go compiler generator uses non C++98 code
+    * [THRIFT-3044] - Docker README.md paths to Dockerfiles are incorrect
+    * [THRIFT-3040] - bower.json wrong "main" path
+    * [THRIFT-3051] - Go Thrift generator creates bad go code
+    * [THRIFT-3057] - Java compiler build is broken
+    * [THRIFT-3061] - C++ TSSLSocket shutdown delay/vulnerability
+    * [THRIFT-3062] - C++ TServerSocket invalid port number (over 999999) causes stack corruption
+    * [THRIFT-3065] - Update libthrift dependencies (slf4j, httpcore, httpclient)
+    * [THRIFT-3244] - TypeScript: fix namespace of included types
+    * [THRIFT-3246] - Reduce the number of trivial warnings in Windows C++ CMake builds
+    * [THRIFT-3224] - Fix TNamedPipeServer unpredictable behavior on accept
+    * [THRIFT-3230] - Python compiler generates wrong code if there is function throwing a typedef of exception with another namespace
+    * [THRIFT-3236] - MaxSkipDepth never checked
+    * [THRIFT-3239] - Limit recursion depth
+    * [THRIFT-3241] - fatal error: runtime: cannot map pages in arena address space
+    * [THRIFT-3242] - OSGi Import-Package directive is missing the Apache HTTP packages
+    * [THRIFT-3234] - Limit recursion depth
+    * [THRIFT-3222] - TypeScript: Generated Enums are quoted
+    * [THRIFT-3229] - unexpected Timeout exception when desired bytes are only partially available
+    * [THRIFT-3231] - CPP: Limit recursion depth to 64
+    * [THRIFT-3235] - Limit recursion depth
+    * [THRIFT-3175] - fastbinary.c python deserialize can cause huge allocations from garbage
+    * [THRIFT-3176] - Union incorrectly implements ==
+    * [THRIFT-3177] - Fails to run rake test
+    * [THRIFT-3180] - lua plugin: framed transport do not work
+    * [THRIFT-3179] - lua plugin cant connect to remote server because function l_socket_create_and_connect always bind socket to localhost
+    * [THRIFT-3248] - TypeScript: additional comma in method signature without parameters
+    * [THRIFT-3302] - Go JSON protocol should encode Thrift byte type as signed integer string
+    * [THRIFT-3297] - c_glib: an abstract base class is not generated
+    * [THRIFT-3294] - TZlibTransport for Java does not write data correctly
+    * [THRIFT-3296] - Go cross test does not conform to spec
+    * [THRIFT-3295] - C# library does not build on Mono 4.0.2.5 or later
+    * [THRIFT-3293] - JavaScript: null values turn into empty structs in constructor
+    * [THRIFT-3310] - lib/erl/README.md has incorrect formatting
+    * [THRIFT-3319] - CSharp tutorial will not build using the *.sln
+    * [THRIFT-3335] - Ruby server does not handle processor exception
+    * [THRIFT-3338] - Stray underscore in generated go when service name starts with "New"
+    * [THRIFT-3324] - Update Go Docs for pulling all packages
+    * [THRIFT-3345] - Clients blocked indefinitely when a java.lang.Error is thrown
+    * [THRIFT-3332] - make dist fails on clean build
+    * [THRIFT-3326] - Tests do not compile under *BSD
+    * [THRIFT-3334] - Markdown notation of protocol spec is malformed
+    * [THRIFT-3331] - warning: ‘etype’ may be used uninitialized in this function
+    * [THRIFT-3349] - Python server does not handle processor exception
+    * [THRIFT-3343] - Fix haskell README
+    * [THRIFT-3340] - Python: enable json tests again
+    * [THRIFT-3311] - Top level README.md has incorrect formmating
+    * [THRIFT-2936] - Minor memory leak in SSL
+    * [THRIFT-3290] - Using from in variable names causes the generated Python code to have errors
+    * [THRIFT-3225] - Fix TPipeServer unpredictable behavior on interrupt()
+    * [THRIFT-3354] - Fix word-extraction substr bug in initialism code
+    * [THRIFT-2006] - TBinaryProtocol message header call name length is not validated and can be used to core the server
+    * [THRIFT-3329] - C++ library unit tests don't compile against the new boost-1.59 unit test framework
+    * [THRIFT-2630] - windows7 64bit pc. ipv4 and ipv6 pc.can't use
+    * [THRIFT-3336] - Thrift generated streaming operators added in 0.9.2 cannot be overridden
+    * [THRIFT-2681] - Core of unwind_cleanup
+    * [THRIFT-3317] - cpp namespace org.apache issue appears in 0.9
+
+## Documentation
+    * [THRIFT-3286] - Apache Ant is a necessary dependency
+
+## Improvement
+    * [THRIFT-227] - Byte[] in collections aren't pretty printed like regular binary fields
+    * [THRIFT-2744] - Vagrantfile for Centos 6.5
+    * [THRIFT-2644] - Haxe support
+    * [THRIFT-2756] - register Media Type @ IANA
+    * [THRIFT-3076] - Compatibility with Haxe 3.2.0
+    * [THRIFT-3081] - C++ Consolidate client processing loops in TServers
+    * [THRIFT-3083] - C++ Consolidate server processing loops in TSimpleServer, TThreadedServer, TThreadPoolServer
+    * [THRIFT-3084] - C++ add concurrent client limit to threaded servers
+    * [THRIFT-3074] -     Add compiler/cpp/lex.yythriftl.cc to gitignore.
+    * [THRIFT-3134] - Remove use of deprecated "phantom.args"
+    * [THRIFT-3133] - Allow "make cross" and "make precross" to run without building all languages
+    * [THRIFT-3142] - Make JavaScript use downloaded libraries
+    * [THRIFT-3141] - Improve logging of JavaScript test
+    * [THRIFT-3144] - Proposal: make String representation of enums in generated go code less verbose
+    * [THRIFT-3130] - Remove the last vestiges of THRIFT_OVERLOAD_IF from THRIFT-1316
+    * [THRIFT-3131] - Consolidate suggested import path for go thrift library to git.apache.org in docs and code
+    * [THRIFT-3092] - Generated Haskell types should derive Generic
+    * [THRIFT-3110] -  Print error log after cross test failures on Travis
+    * [THRIFT-3114] - Using local temp variables to not pollute the global table
+    * [THRIFT-3106] - CMake summary should give more information why a library is set to off
+    * [THRIFT-3119] - Java's TThreadedSelectorServer has indistinguishable log messages in run()
+    * [THRIFT-3122] - Javascript struct constructor should properly initialize struct and container members from plain js arguments
+    * [THRIFT-3151] - Fix links to git-wip* - should be git.apache.org
+    * [THRIFT-3167] - Windows build from source instructions need to be revised
+    * [THRIFT-3155] - move contrib/mingw32-toolchain.cmake to build/cmake/
+    * [THRIFT-3160] - Make generated go enums implement TextMarshaller and TextUnmarshaller interfaces
+    * [THRIFT-3150] - Add an option to thrift go generator to make Read and Write methods private
+    * [THRIFT-3149] - Make ReadFieldN methods in generated Go code private
+    * [THRIFT-3172] - Add tutorial to Thrift web site
+    * [THRIFT-3214] - Add Erlang option for using maps instead of dicts
+    * [THRIFT-3201] - Capture github test artifacts for failed builds
+    * [THRIFT-3266] - c_glib: Multiple compiler warnings building unit tests
+    * [THRIFT-3285] - c_glib: Build library with all warnings enabled, no warnings generated
+    * [THRIFT-1954] - Allow for a separate connection timeout value 
+    * [THRIFT-2098] - Add support for Qt5+
+    * [THRIFT-2199] - Remove Dense protocol (was: move to Contrib)
+    * [THRIFT-406] - C++ Test suite cleanup
+    * [THRIFT-902] - socket and connect timeout in TSocket should be distinguished
+    * [THRIFT-388] - Use a separate wire format for async calls
+    * [THRIFT-727] - support native C++ language specific exception message
+    * [THRIFT-1784] - pep-3110 compliance for exception handling 
+    * [THRIFT-1025] - C++ ServerSocket should inherit from Socket with the necessary Ctor to listen on connections from a specific host
+    * [THRIFT-2269] - Can deploy libthrift-source.jar to maven center repository
+    * [THRIFT-2804] - Pull an interface out of TBaseAsyncProcessor
+    * [THRIFT-2806] - more whitespace fixups
+    * [THRIFT-2811] - Make remote socket address accessible
+    * [THRIFT-2809] - .gitignore update for compiler's visual project
+    * [THRIFT-2846] - Expose ciphers parameter from ssl.wrap_socket()
+    * [THRIFT-2859] - JSON generator: output complete descriptors
+    * [THRIFT-2861] - add buffered transport
+    * [THRIFT-2865] - Test case for Go: SeqId out of sequence
+    * [THRIFT-2866] - Go generator source code is hard to read and maintain
+    * [THRIFT-2880] - Read the network address from the listener if available.
+    * [THRIFT-2875] - Typo in TDenseProtocol.h comment
+    * [THRIFT-2874] - TBinaryProtocol  member variable "string_buf_" is never used.
+    * [THRIFT-2855] - Move contributing.md to the root of the repository
+    * [THRIFT-2862] - Enable RTTI and/or build macros for generated code
+    * [THRIFT-2876] -  Add test for THRIFT-2526 Assignment operators and copy constructors in c++ don't copy the __isset struct
+    * [THRIFT-2897] - Generate -isEqual: and -hash methods
+    * [THRIFT-2909] - Improve travis build
+    * [THRIFT-2921] - Make Erlang impl ready for OTP 18 release (dict/0 and set/0 are deprecated)
+    * [THRIFT-2928] - Rename the erlang test_server module
+    * [THRIFT-2940] - Allow installing Thrift from git as NPM module by providing package.json in top level directory
+    * [THRIFT-2937] - Allow setting a maximum frame size in TFramedTransport
+    * [THRIFT-2976] - nodejs: xhr and websocket support for browserify
+    * [THRIFT-2996] - Test for Haxe 3.1.3 or better 
+    * [THRIFT-2969] - nodejs: DRY up library tests
+    * [THRIFT-2973] - Update Haxe lib readme regarding Haxe 3.1.3
+    * [THRIFT-2952] - Improve handling of Server.Stop() 
+    * [THRIFT-2964] - nodejs: move protocols and transports into separate files
+    * [THRIFT-2963] - nodejs - add test coverage
+    * [THRIFT-3006] - Attach 'omitempty' json tag for optional fields in Go
+    * [THRIFT-3027] - Go compiler does not ensure common initialisms have consistent case
+    * [THRIFT-3030] - TThreadedServer: Property for number of clientThreads
+    * [THRIFT-3023] - Go compiler is a little overly conservative with names of attributes
+    * [THRIFT-3018] - Compact protocol for Delphi
+    * [THRIFT-3025] - Change pure Int constants into @enums (where possible)
+    * [THRIFT-3031] - migrate "shouldStop" flag to TServer
+    * [THRIFT-3022] - Compact protocol for Haxe
+    * [THRIFT-3041] - Generate asynchronous clients for Cocoa
+    * [THRIFT-3053] - Perl SSL Socket Support (Encryption)
+    * [THRIFT-3247] - Generate a C++ thread-safe client
+    * [THRIFT-3217] - Provide a little endian variant of the binary protocol in C++
+    * [THRIFT-3223] - TypeScript: Add initial support for Enum Maps
+    * [THRIFT-3220] - Option to suppress @Generated Annotation entirely
+    * [THRIFT-3300] - Reimplement TZlibTransport in Java using streams
+    * [THRIFT-3288] - c_glib: Build unit tests with all warnings enabled, no warnings generated
+    * [THRIFT-3347] - Improve cross test servers and clients
+    * [THRIFT-3342] - Improve ruby cross test client and server compatibility
+    * [THRIFT-2296] - Add C++ Base class for service
+    * [THRIFT-3337] - Add testBool method to cross tests
+    * [THRIFT-3303] - Disable concurrent cabal jobs on Travis to avoid GHC crash
+    * [THRIFT-2623] - Docker container for Thrift
+    * [THRIFT-3298] - thrift endian converters may conflict with other libraries
+    * [THRIFT-1559] - Provide memory pool for TBinaryProtocol to eliminate memory fragmentation
+    * [THRIFT-424] - Steal ProtocolBuffers' VarInt implementation for C++
+
+## New Feature
+    * [THRIFT-3070] - Add ability to set the LocalCertificateSelectionCallback
+    * [THRIFT-1909] - Java: Add compiler flag to use the "option pattern" for optional fields
+    * [THRIFT-2099] - Stop TThreadPoolServer with alive connections.
+    * [THRIFT-123] - implement TZlibTransport in Java
+    * [THRIFT-2368] - New option: reuse-objects for Java generator
+    * [THRIFT-2836] - Optionally generate C++11 MoveConstructible types
+    * [THRIFT-2824] - Flag to disable html escaping doctext
+    * [THRIFT-2819] - Add WebsSocket client to node.js
+    * [THRIFT-3050] - Client certificate authentication for non-http TLS in C#
+    * [THRIFT-3292] - Implement TZlibTransport in Go
+
+## Question
+    * [THRIFT-2583] - Thrift on xPC target (SpeedGoat)
+    * [THRIFT-2592] - thrift server using c_glib
+    * [THRIFT-2832] - c_glib: Handle string lists correctly
+    * [THRIFT-3136] - thrift installation problem on mac
+    * [THRIFT-3346] - c_glib: Tutorials example crashes saying Calculator.ping implementation returned FALSE but did not set an error
+
+## Sub-task
+    * [THRIFT-2578] - Moving 'make cross' from test.sh to test.py
+    * [THRIFT-2734] - Go coding standards
+    * [THRIFT-2748] - Add Vagrantfile for Centos 6.5
+    * [THRIFT-2753] - Misc. Haxe improvements
+    * [THRIFT-2640] - Compact Protocol in Cocoa
+    * [THRIFT-3262] - warning: overflow in implicit constant conversion in DenseProtoTest.cpp
+    * [THRIFT-3194] - Can't build with go enabled.  gomock SCC path incorrect.
+    * [THRIFT-3275] - c_glib tutorial warnings in generated code
+    * [THRIFT-1125] - Multiplexing support for the Ruby Library
+    * [THRIFT-2807] - PHP Code Style
+    * [THRIFT-2841] - Add comprehensive integration tests for the whole Go stack
+    * [THRIFT-2815] - Haxe: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-2886] - Integrate binary type in standard Thrift cross test
+    * [THRIFT-2946] - Enhance usability of cross test framework
+    * [THRIFT-2967] - Add .editorconfig to root
+    * [THRIFT-3033] - Perl: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-3174] - Initialism code in the Go compiler doesn't check first word
+    * [THRIFT-3193] - Option to supress date value in @Generated annotation
+    * [THRIFT-3305] - Missing dist files for 0.9.3 release candidate
+    * [THRIFT-3341] - Add testBool methods
+    * [THRIFT-3308] - Fix broken test cases for 0.9.3 release candidate
+
+## Task
+    * [THRIFT-2834] - Remove semi-colons from python code generator
+    * [THRIFT-2853] - Adjust comments not applying anymore after THRIFT-2852
+
+## Test
+    * [THRIFT-3211] - Add make cross support for php TCompactProtocol
+
+## Wish
+    * [THRIFT-2838] - TNonblockingServer can bind to port 0 (i.e., get an OS-assigned port) but there is no way to get the port number
+
+
+
+Thrift 0.9.2
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-2793] - Go compiler produces uncompilable code
+    * [THRIFT-1481] - Unix domain sockets in C++ do not support the abstract namespace
+    * [THRIFT-1455] - TBinaryProtocolT<Transport_>::writeString casts from size_t to uint32_t, which is not safe on 64-bit platforms
+    * [THRIFT-1579] - PHP Extention - function thrift_protocol_read_binary not working from TBinarySerializer::deserialize
+    * [THRIFT-1584] - Error: could not SetMinThreads in ThreadPool on single-core machines
+    * [THRIFT-1614] - Thrift build from svn repo sources fails with automake-1.12
+    * [THRIFT-1047] - rb_thrift_memory_buffer_write treats arg as string without check, segfaults if you pass non-string
+    * [THRIFT-1639] - Java/Python: Serialization/Deserialization of double type using CompactProtocol
+    * [THRIFT-1647] - NodeJS BufferedTransport does not work beyond the hello-world example
+    * [THRIFT-2130] - Thrift's D library/test: parts of "make check" code do not compile with recent dmd-2.062 through dmd-2.064alpha
+    * [THRIFT-2140] - Error compiling cpp tutorials
+    * [THRIFT-2139] - MSVC 2012 Error - Cannot compile due to BoostThreadFactory
+    * [THRIFT-2138] - pkgconfig file created with wrong include path
+    * [THRIFT-2160] - Warning in thrift.h when compiling with -Wunused and NDEBUG
+    * [THRIFT-2158] - Compact, JSON, and SimpleJSON protocols are not working correctly
+    * [THRIFT-2167] - nodejs lib throws error if options argument isn't passed
+    * [THRIFT-2288] - Go impl of Thrift JSON protocol wrongly writes/expects true/false for bools
+    * [THRIFT-2147] - Thrift IDL grammar allows for dotted identifier names
+    * [THRIFT-2145] - Rack and Thin are not just development dependencies
+    * [THRIFT-2267] - Should be able to choose socket family in Python TSocket
+    * [THRIFT-2276] - java path in spec file needs updating
+    * [THRIFT-2281] - Generated send/recv code ignores errors returned by the underlying protocol
+    * [THRIFT-2280] - TJSONProtocol.Flush() does not really flush the transport
+    * [THRIFT-2274] - TNonblockingServer and TThreadedSelectorServer do not close their channel selectors on exit and leak file descriptors
+    * [THRIFT-2265] - php library doesn't build
+    * [THRIFT-2232] - IsSet* broken in Go
+    * [THRIFT-2246] - Unset enum value is printed by ToString()
+    * [THRIFT-2240] - thrift.vim (contrib) does not correctly handle 'union'
+    * [THRIFT-2243] - TNonblockingServer in thrift crashes when TFramedTransport opens
+    * [THRIFT-2230] - Cannot Build on RHEL/Centos/Amazon Linux 6.x
+    * [THRIFT-2247] - Go generator doesn't deal well with map keys of type binary
+    * [THRIFT-2253] - Python Tornado TTornadoServer base class change
+    * [THRIFT-2261] - java: error: unmappable character for encoding ASCII
+    * [THRIFT-2259] - C#: unexpected null logDelegate() pointer causes AV in TServer.serve()
+    * [THRIFT-2225] - SSLContext destroy before cleanupOpenSSL
+    * [THRIFT-2224] - TSSLSocket.h and TSSLServerSocket.h should use the platfromsocket too
+    * [THRIFT-2229] - thrift failed to build on OSX 10.9 GM
+    * [THRIFT-2227] - Thrift compiler generates spurious warnings with Xlint
+    * [THRIFT-2219] - Thrift gem fails to build on OS X Mavericks with 1.9.3 rubies
+    * [THRIFT-2226] - TServerSocket - keepAlive wrong initialization order
+    * [THRIFT-2285] - TJsonProtocol implementation for Java doesn't allow a slash (/) to be escaped (\/)
+    * [THRIFT-2216] - Extraneous semicolon in TProtocolUtil.h makes clang mad
+    * [THRIFT-2215] - Generated HTML/Graphviz lists referenced enum identifiers as UNKNOWN.
+    * [THRIFT-2211] - Exception constructor does not contain namespace prefix.
+    * [THRIFT-2210] - lib/java TSimpleJSONProtocol can emit invalid JSON
+    * [THRIFT-2209] - Ruby generator -- please namespace classes
+    * [THRIFT-2202] - Delphi TServerImpl.DefaultLogDelegate may stop the server with I/O-Error 105
+    * [THRIFT-2201] - Ternary operator returns different types (build error for some compilers)
+    * [THRIFT-2200] - nested structs cause generate_fingerprint() to slow down at excessive CPU load
+    * [THRIFT-2197] - fix jar output directory in rpm spec file
+    * [THRIFT-2196] - Fix invalid dependency in Makefile.am
+    * [THRIFT-2194] - Node: Not actually prepending residual data in TFramedTransport.receiver
+    * [THRIFT-2193] - Java code generator emits spurious semicolon when deep copying binary data
+    * [THRIFT-2191] - Fix charp JSONProtocol.ReadJSONDouble (specify InvariantCulture)
+    * [THRIFT-2214] - System header sys/param.h is included inside the Thrift namespace
+    * [THRIFT-2178] - Thrift generator returns error exit code on --version
+    * [THRIFT-2171] - NodeJS implementation has extremely low test coverage
+    * [THRIFT-2183] - gem install fails on zsh
+    * [THRIFT-2182] - segfault in regression tests (GC bug in rb_thrift_memory_buffer_write)
+    * [THRIFT-2181] - oneway calls don't work in NodeJS
+    * [THRIFT-2169] - JavaME Thrift Library causes "java.io.IOException: No Response Entries Available" after using the Thrift client for some time
+    * [THRIFT-2168] - Node.js appears broken (at least, examples don't work as intended)
+    * [THRIFT-2293] - TSSLTransportFactory.createSSLContext() leaves files open
+    * [THRIFT-2279] - TSerializer only returns the first 1024 bytes serialized
+    * [THRIFT-2278] - Buffered transport doesn't support writes > buffer size
+    * [THRIFT-2275] - Fix memory leak in golang compact_protocol.
+    * [THRIFT-2282] - Incorect code generated for some typedefs
+    * [THRIFT-2009] - Go redeclaration error
+    * [THRIFT-1964] - 'Isset' causes problems with C#/.NET serializers
+    * [THRIFT-2026] - Fix TCompactProtocol 64 bit builds
+    * [THRIFT-2108] - Fix TAsyncClientManager timeout race
+    * [THRIFT-2068] - Multiple calls from same connection are not processed in node
+    * [THRIFT-1750] - Make compiler build cleanly under visual studio 10
+    * [THRIFT-1755] - Comment parsing bug
+    * [THRIFT-1771] - "make check" fails on x64 for libboost_unit_test_framework.a
+    * [THRIFT-1841] - NodeJS Thrift incorrectly parses non-UTF8-string types
+    * [THRIFT-1908] - Using php thrift_protocol accelerated transfer causes core dump
+    * [THRIFT-1892] - Socket timeouts are declared in milli-seconds, but are actually set in micro-seconds
+    * [THRIFT-2303] - TBufferredTransport not properly closing underlying transport
+    * [THRIFT-2313] - nodejs server crash after processing the first request when using MultiplexedProcessor/FramedBuffer/BinaryProtocol
+    * [THRIFT-2311] - Go: invalid code generated when exception name is a go keyword
+    * [THRIFT-2308] - node: TJSONProtocol parse error when reading from buffered message
+    * [THRIFT-2316] - ccp: TFileTransportTest
+    * [THRIFT-2352] - msvc failed to compile thrift tests
+    * [THRIFT-2337] - Golang does not report TIMED_OUT exceptions
+    * [THRIFT-2340] - Generated server implementation does not send response type EXCEPTION on the Thrift.TApplicationExceptionType.UNKNOWN_METHOD exception
+    * [THRIFT-2354] - Connection errors can lead to case_clause exceptions
+    * [THRIFT-2339] - Uncaught exception in thrift c# driver
+    * [THRIFT-2356] - c++ thrift client not working with ssl (SSL_connect hangs)
+    * [THRIFT-2331] - Missing call to ReadStructBegin() in TApplicationException.Read()
+    * [THRIFT-2323] - Uncompileable Delphi code generated for typedef'd structs
+    * [THRIFT-2322] - Correctly show the number of times ExecutorService (java) has rejected the client.
+    * [THRIFT-2389] - namespaces handled wrongly in acrionscript 3.0 implementation
+    * [THRIFT-2388] - GoLang - Fix data races in simple_server and server_socket
+    * [THRIFT-2386] - Thrift refuses to link yylex
+    * [THRIFT-2375] - Excessive <br>'s in generated HTML
+    * [THRIFT-2373] - warning CS0414 in THttpClient.cs: private field 'Thrift.Transport.THttpClient.connection' assigned but never used
+    * [THRIFT-2372] - thrift/json_protocol.go:160: function ends without a return statement
+    * [THRIFT-2371] - ruby bundler version fails on ~1.3.1, remove and take latest avail
+    * [THRIFT-2370] - Compiler SEGFAULTs generating HTML documentation for complex strucre
+    * [THRIFT-2384] - Binary map keys produce uncompilable code in go
+    * [THRIFT-2380] - unreachable code (CID 1174546, CID 1174679)
+    * [THRIFT-2378] - service method arguments of binary type lead to uncompileable Go code
+    * [THRIFT-2363] - Issue with character encoding of Success returned from Login using Thrift Proxy and NodeJS
+    * [THRIFT-2359] - TBufferedTransport doesn't clear it's buffer on a failed flush call
+    * [THRIFT-2428] - Python 3 setup.py support
+    * [THRIFT-2367] - Build failure: stdlib and boost both define uint64_t
+    * [THRIFT-2365] - C# decodes too many binary bytes from JSON
+    * [THRIFT-2402] - byte count of FrameBuffer in AWAITING_CLOSE state is not subtracted from readBufferBytesAllocated
+    * [THRIFT-2396] - Build Error on MacOSX
+    * [THRIFT-2395] - thrift Ruby gem requires development dependency 'thin' regardless of environment
+    * [THRIFT-2414] - c_glib fix several bug.
+    * [THRIFT-2420] - Go argument parser for methods without arguments does not skip fields
+    * [THRIFT-2439] - Bug in TProtocolDecorator Class causes parsing errors
+    * [THRIFT-2419] - golang - Fix fmt.Errorf in generated code
+    * [THRIFT-2418] - Go handler function panics on internal error
+    * [THRIFT-2405] - Node.js Multiplexer tests fail (silently)
+    * [THRIFT-2581] - TFDTransport destructor should not throw
+    * [THRIFT-2575] - Thrift includes siginfo_t within apache::thrift::protocol namespace
+    * [THRIFT-2577] - TFileTransport  missuse of closesocket on windows platform
+    * [THRIFT-2576] - Implement Thrift.Protocol.prototype.skip method in JavaScript library
+    * [THRIFT-2588] - Thrift compiler is not buildable in Visual Studio 2010
+    * [THRIFT-2594] - JS Compiler: Single quotes are not being escaped in constants.
+    * [THRIFT-2591] - TFramedTransport does not handle payloads split across packets correctly
+    * [THRIFT-2599] - Uncompileable Delphi code due to naming conflicts with IDL
+    * [THRIFT-2590] - C++ Visual Studio solution doesn't include Multiplexing support
+    * [THRIFT-2595] - Node.js: Fix global leaks and copy-paste errors
+    * [THRIFT-2565] - autoconf fails to find mingw-g++ cross compiler on travis CI
+    * [THRIFT-2555] - excessive "unused field" comments
+    * [THRIFT-2554] - double initialization in generated Read() method
+    * [THRIFT-2551] - OutOfMemoryError "unable to create new native thread" kills serve thread
+    * [THRIFT-2543] - Generated enum type in haskell should be qualified
+    * [THRIFT-2560] - Thrift compiler generator tries to concat ints with strings using +
+    * [THRIFT-2559] - Centos 6.5 unable to "make" with Thrift 0.9.1
+    * [THRIFT-2526] - Assignment operators and copy constructors in c++ don't copy the __isset struct
+    * [THRIFT-2454] - c_glib: There is no gethostbyname_r() in some OS.
+    * [THRIFT-2451] - Do not use pointers for optional fields with defaults. Do not write such fields if its value set to default. Also, do not use pointers for any optional fields mapped to go map or slice. generate Get accessors
+    * [THRIFT-2450] - include HowToContribute in the src repo
+    * [THRIFT-2448] - thrift/test/test.sh has incorrect Node.js test path
+    * [THRIFT-2460] - unopened socket fd must be less than zero.
+    * [THRIFT-2459] - --version should not exit 1
+    * [THRIFT-2468] - Timestamp handling
+    * [THRIFT-2467] - Unable to build contrib/fb303 on OSX 10.9.2
+    * [THRIFT-2466] - Improper error handling for SSL/TLS connections that don't complete a handshake
+    * [THRIFT-2463] - test/py/RunClientServer.py fails sometimes
+    * [THRIFT-2458] - Generated golang server code for "oneway" methods is incorrect
+    * [THRIFT-2456] - THttpClient fails when using async support outside Silverlight
+    * [THRIFT-2524] - Visual Studio project is missing TThreadedServer files
+    * [THRIFT-2523] - Visual Studio project is missing OverlappedSubmissionThread files
+    * [THRIFT-2520] - cpp:cob_style generates incorrect .tcc file
+    * [THRIFT-2508] - Uncompileable C# code due to language keywords in IDL
+    * [THRIFT-2506] - Update TProtocolException error codes to be used consistently throughout the library
+    * [THRIFT-2505] - go: struct should always be a pointer to avoid copying of potentially size-unbounded structs
+    * [THRIFT-2515] - TLS Method error during make
+    * [THRIFT-2503] - C++: Fix name collision when a struct has a member named "val"
+    * [THRIFT-2477] - thrift --help text with misplaced comma
+    * [THRIFT-2492] - test/cpp does not compile on mac
+    * [THRIFT-2500] - sending random data crashes thrift(golang) service
+    * [THRIFT-2475] - c_glib: buffered_transport_write function return always TRUE.
+    * [THRIFT-2495] - JavaScript/Node string constants lack proper escaping
+    * [THRIFT-2491] - unable to import generated ThriftTest service
+    * [THRIFT-2490] - c_glib: if fail to read a exception from server, client may be occurred double free
+    * [THRIFT-2470] - THttpHandler swallows exceptions from processor
+    * [THRIFT-2533] - Boost version in requirements should be updated
+    * [THRIFT-2532] - Java version in installation requirements should be updated
+    * [THRIFT-2529] - TBufferedTransport split  Tcp data bug in nodeJs
+    * [THRIFT-2537] - Path for "go get" does not work (pull request 115)
+    * [THRIFT-2443] - Node fails cross lang tests
+    * [THRIFT-2437] - Author fields in Python setup.py must be strings not lists.
+    * [THRIFT-2435] - Java compiler doesn't like struct member names that are identical to an existing enum or struct type
+    * [THRIFT-2434] - Missing namespace import for php TMultiplexedProcessor implementation
+    * [THRIFT-2432] - Flaky parallel build
+    * [THRIFT-2430] - Crash during TThreadPoolServer shutdown
+    * [THRIFT-667] - Period should not be allowed in identifier names
+    * [THRIFT-1212] - Members capital case conflict
+    * [THRIFT-2584] - Error handler not listened on javascript client
+    * [THRIFT-2294] - Incorrect Makefile generation
+    * [THRIFT-2601] - Fix vagrant to work again for builds again
+    * [THRIFT-2092] - TNonblocking server should release handler as soon as connection closes
+    * [THRIFT-2557] - CS0542 member names cannot be the same as their enclosing type
+    * [THRIFT-2605] - TSocket warning on gcc 4.8.3
+    * [THRIFT-2607] - ThreadManager.cpp warning on clang++ 3.4
+    * [THRIFT-1998] - TCompactProtocol.tcc - one more warning on Visual 2010
+    * [THRIFT-2610] - MSVC warning in TSocket.cpp
+    * [THRIFT-2614] - TNonblockingServer.cpp warnings on MSVC
+    * [THRIFT-2608] - TNonblockingServer.cpp warnings on clang 3.4
+    * [THRIFT-2606] - ThreadManager.h warning in clang++ 3.4
+    * [THRIFT-2609] - TFileTransport.h unused field warning (clang 3.4)
+    * [THRIFT-2416] - Cannot use TCompactProtocol with MSVC
+    * [THRIFT-1803] - Ruby Thrift 0.9.0 tries to encode UUID to UTF8 and crashes
+    * [THRIFT-2385] - Problem with gethostbyname2 during make check
+    * [THRIFT-2262] - thrift server 'MutateRow' operation gives no indication of success / failure
+    * [THRIFT-2048] - Prefer boolean context to nullptr_t conversion
+    * [THRIFT-2528] - Thrift Erlang Library: Multiple thrift applications in one bundle
+    * [THRIFT-1999] - warning on gcc 4.7 while compiling BoostMutex.cpp
+    * [THRIFT-2104] - Structs lose binary data when transferred from server to client in Java
+    * [THRIFT-2184] - undefined method rspec_verify for Thrift::MemoryBufferTransport
+    * [THRIFT-2351] - PHP TCompactProtocol has fails to decode messages
+    * [THRIFT-2016] - Resource Leak in thrift struct under compiler/cpp/src/parse/t_function.h
+    * [THRIFT-2273] - Please delete old releases from mirroring system
+    * [THRIFT-2270] - Faulty library version numbering at build or documentation
+    * [THRIFT-2203] - Tests keeping failing on Jenkins and Travis CI
+    * [THRIFT-2399] - thrift.el: recognize "//"-style comments in emacs thrift-mode
+    * [THRIFT-2582] - "FileTransport error" exception is raised when trying to use Java's TFileTransport
+    * [THRIFT-1682] - Multiple thread calling a Service function unsafely causes message corruption and terminates with Broken Pipe
+    * [THRIFT-2357] - recurse option has no effect when generating php
+    * [THRIFT-2248] - Go generator doesn't deal well with map keys of type binary
+    * [THRIFT-2426] - clarify IP rights and contributions from fbthrift
+    * [THRIFT-2041] - TNonblocking server compilation on windows (ARITHMETIC_RIGHT_SHIFT)
+    * [THRIFT-2400] - thrift.el: recognize "//"-style comments in emacs thrift-mode
+    * [THRIFT-1717] - Fix deb build in jenkins
+    * [THRIFT-2266] - ThreadManager.h:24:10: fatal error: 'tr1/functional' file not found on Mac 10.9 (Mavericks)
+    * [THRIFT-1300] - Test failures with parallel builds (make -j)
+    * [THRIFT-2487] - Tutorial requires two IDL files but only one is linked from the Thrift web site
+    * [THRIFT-2329] - missing release tags within git
+    * [THRIFT-2306] - concurent client calls with nodejs
+    * [THRIFT-2222] - ruby gem cannot be compiled on OS X mavericks
+    * [THRIFT-2381] - code which generated by thrift2/hbase.thrift compile error
+    * [THRIFT-2390] - no close event when connection lost
+    * [THRIFT-2146] - Unable to pass multiple "--gen" options to the thrift compiler
+    * [THRIFT-2438] - Unexpected readFieldEnd call causes JSON Parsing errors
+    * [THRIFT-2498] - Error message "Invalid method name" while trying to call HBase Thrift API
+    * [THRIFT-841] - Build cruft
+    * [THRIFT-2570] - Wrong URL given in http://thrift.apache.org/developers
+    * [THRIFT-2604] - Fix debian packaging
+    * [THRIFT-2618] - Unignore /aclocal files required for build
+    * [THRIFT-2562] - ./configure create MakeFile in lib/d with errors
+    * [THRIFT-2593] - Unable to build thrift on ubuntu-12.04 (Precise)
+    * [THRIFT-2461] - Can't install thrift-0.8.0 on OS X 10.9.2
+    * [THRIFT-2602] - Fix missing dist files
+    * [THRIFT-2620] - Fix python packaging
+    * [THRIFT-2545] - Test CPP fails to build (possibly typo)
+
+## Documentation
+    * [THRIFT-2155] - Adding one liner guide to rename the version.h.in and rename thrifty.cc.h
+    * [THRIFT-1991] - Add exceptions to examples
+    * [THRIFT-2334] - add a tutorial for node JS
+    * [THRIFT-2392] - Actionscript tutorial
+    * [THRIFT-2383] - contrib: sample for connecting Thrift with Rebus
+    * [THRIFT-2382] - contrib: sample for connecting Thrift with STOMP
+
+## Improvement
+    * [THRIFT-1457] - Capacity of TframedTransport write buffer is never reset
+    * [THRIFT-1135] - Node.js tutorial
+    * [THRIFT-1371] - Socket timeouts (SO_RCVTIMEO and SO_SNDTIMEO) not supported on Solaris
+    * [THRIFT-2142] - Minor tweaks to thrift.el for better emacs package compatibility
+    * [THRIFT-2268] - Modify TSaslTransport to ignore TCP health checks from loadbalancers
+    * [THRIFT-2264] - GitHub page incorrectly states that Thrift is still incubating
+    * [THRIFT-2263] - Always generate good hashCode for Java
+    * [THRIFT-2233] - Java compiler should defensively copy its binary inputs
+    * [THRIFT-2239] - Address FindBugs errors
+    * [THRIFT-2249] - Add SMP Build option to thrift.spec (and three config defines)
+    * [THRIFT-2254] - Exceptions generated by Go compiler should implement error interface
+    * [THRIFT-2260] - Thrift imposes unneeded dependency on commons-lang3
+    * [THRIFT-2258] - Add TLS v1.1/1.2 support to TSSLSocket.cpp
+    * [THRIFT-2205] - Node.js Test Server to support test.js JavaScript Browser test and sundry fixes
+    * [THRIFT-2204] - SSL client for the cocoa client
+    * [THRIFT-2172] - Java compiler allocates optionals array for every struct with an optional field
+    * [THRIFT-2185] - use cabal instead of runhaskell in haskell library
+    * [THRIFT-1926] - PHP Constant Generation Refactoring
+    * [THRIFT-2029] - Port C++ tests to Windows
+    * [THRIFT-2054] - TSimpleFileTransport - Java Lib has no straight forward TTransport based file transport
+    * [THRIFT-2040] - "uninitialized variable" warnings on MSVC/windows
+    * [THRIFT-2034] - Give developers' C++ code direct access to socket FDs on server side
+    * [THRIFT-2095] - Use print function for Python 3 compatiblity
+    * [THRIFT-1868] - Make the TPC backlog configurable in the Java servers
+    * [THRIFT-1813] - Add @Generated annotation to generated classes
+    * [THRIFT-1815] - Code generators line buffer output
+    * [THRIFT-2305] - TFramedTransport empty constructor should probably be private
+    * [THRIFT-2304] - Move client assignments from construtor in method
+    * [THRIFT-2309] - Ruby (gem) & PHP RPM subpackages
+    * [THRIFT-2318] - perl: dependency Class::Accessor not checked
+    * [THRIFT-2317] - exclude tutorial from build
+    * [THRIFT-2320] - Program level doctext does not get attached by parser
+    * [THRIFT-2349] - Golang - improve tutorial
+    * [THRIFT-2348] - PHP Generator: add array typehint to functions
+    * [THRIFT-2344] - configure.ac: compiler-only option
+    * [THRIFT-2343] - Golang - Return a single error for all exceptions instead of multiple return values
+    * [THRIFT-2341] - Enable generation of Delphi XMLDoc comments (a.k.a. "Help Insight")
+    * [THRIFT-2355] - Add SSL and Web Socket Support to Node and JavaScript
+    * [THRIFT-2350] - Add async calls to normal JavaScript
+    * [THRIFT-2330] - Generate PHPDoc comments
+    * [THRIFT-2332] - RPMBUILD: run bootstrap (if needed)
+    * [THRIFT-2391] - simple socket transport for actionscript 3.0
+    * [THRIFT-2376] - nodejs: allow Promise style calls for client and server
+    * [THRIFT-2369] - Add ssl support for nodejs implementation
+    * [THRIFT-2401] - Haskell tutorial compiles
+    * [THRIFT-2417] - C# Union classes are not partial
+    * [THRIFT-2415] - Named pipes server performance & message mode
+    * [THRIFT-2404] - emit warning on (typically inefficient) list<byte>
+    * [THRIFT-2398] - Improve Node Server Library
+    * [THRIFT-2397] - Add CORS and CSP support for JavaScript and Node.js libraries
+    * [THRIFT-2407] - use markdown (rename README => README.md)
+    * [THRIFT-2300] - D configure info output should follow same format as other languages
+    * [THRIFT-2579] - Windows CE support
+    * [THRIFT-2574] - Compiler option to generate namespace directories for Ruby
+    * [THRIFT-2571] - Simplify cross compilation using CMake
+    * [THRIFT-2569] - Introduce file to specify third party library locations on Windows
+    * [THRIFT-2568] - Implement own certificate handler
+    * [THRIFT-2552] - eliminate warning from configure.ac
+    * [THRIFT-2549] - Generate json tag for struct members. use go.tag annotation to override the default generated tag.
+    * [THRIFT-2544] - Add support for socket transport for c# library when using Windows Phone projects
+    * [THRIFT-2453] - haskell tutorial: fix up division by 0 example
+    * [THRIFT-2449] - Enhance typedef structure to distinguish between forwards and real typedefs
+    * [THRIFT-2446] - There is no way to handle server stream errors
+    * [THRIFT-2455] - Allow client certificates to be used with THttpClient
+    * [THRIFT-2511] - Node.js needs the compact protocol
+    * [THRIFT-2493] - Node.js lib needs HTTP client
+    * [THRIFT-2502] - Optimize go implementations of binary and compact protocols for speed
+    * [THRIFT-2494] - Add enum toString helper function in c_glib
+    * [THRIFT-2471] - Make cpp.ref annotation language agnostic
+    * [THRIFT-2497] - server and client for test/go, also several fixes and improvements
+    * [THRIFT-2535] - TJSONProtocol when serialized yields TField ids rather than names
+    * [THRIFT-2220] - Add a new struct structv?
+    * [THRIFT-1352] - Thrift server
+    * [THRIFT-989] - Push boost m4 macros upstream
+    * [THRIFT-1349] - Remove unnecessary print outs
+    * [THRIFT-2496] - server and client for test/go, also several fixes and improvements
+    * [THRIFT-1114] - Maven publish shouldn't require passwords hardcoded in settings.xml
+    * [THRIFT-2043] - visual 2010 warnings - unreachable code
+    * [THRIFT-1683] - Implement alternatives to Javascript Client side Transport protocol, just as NPAPI and WebSocket.
+    * [THRIFT-1746] - provide a SPDX file
+    * [THRIFT-1772] - Serialization does not check types of embedded structures.
+    * [THRIFT-2387] - nodejs: external imports should be centralized in index.js
+    * [THRIFT-2037] - More general macro THRIFT_UNUSED_VARIABLE
+
+## New Feature
+    * [THRIFT-1012] - Transport for DataInput DataOutput interface
+    * [THRIFT-2256] - Using c++11/c++0x std library  replace boost library
+    * [THRIFT-2250] - JSON and MemoryBuffer for JavaME
+    * [THRIFT-2114] - Python Service Remote SSL Option
+    * [THRIFT-1719] - SASL client support for Python
+    * [THRIFT-1894] - Thrift multi-threaded async Java Server using Java 7 AsynchronousChannelGroup
+    * [THRIFT-1893] - HTTP/JSON server/client for node js
+    * [THRIFT-2347] - C# TLS Transport based on THRIFT-181
+    * [THRIFT-2377] - Allow addition of custom HTTP Headers to an HTTP Transport
+    * [THRIFT-2408] - Named Pipe Transport Option for C#
+    * [THRIFT-2572] - Add string/collection length limit checks (from C++) to java protocol readers
+    * [THRIFT-2469] - "java:fullcamel" option to automatically camel-case underscored attribute names
+    * [THRIFT-795] - Importing service functions (simulation multiple inheritance)
+    * [THRIFT-2164] - Add a Get/Post Http Server to Node along with examples
+    * [THRIFT-2255] - add Parent Class for generated Struct class
+
+## Question
+    * [THRIFT-2539] - Tsocket.cpp addrinfo ai_flags = AI_ADDRCONFIG
+    * [THRIFT-2440] - how to connect as3 to java by thrift ,
+    * [THRIFT-2379] - Memmory leaking while using multithreading in C++ server.
+    * [THRIFT-2277] - Thrift: installing fb303 error
+    * [THRIFT-2567] - Csharp slow ?
+    * [THRIFT-2573] - thrift 0.9.2 release
+
+## Sub-task
+    * [THRIFT-981] - cocoa: add version Info to the library
+    * [THRIFT-2132] - Go: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-2299] - TJsonProtocol implementation for Ruby does not allow for both possible slash (solidus) encodings
+    * [THRIFT-2298] - TJsonProtocol implementation for C# does not allow for both possible slash (solidus) encodings
+    * [THRIFT-2297] - TJsonProtocol implementation for Delphi does not allow for both possible slash (solidus) encodings
+    * [THRIFT-2271] - JavaScript: Support for Multiplexing Services
+    * [THRIFT-2251] - go test for compact protocol is not running
+    * [THRIFT-2195] - Delphi: Add event handlers for server and processing events
+    * [THRIFT-2176] - TSimpleJSONProtocol.ReadFieldBegin() does not return field type and ID
+    * [THRIFT-2175] - Wrong field type set for binary
+    * [THRIFT-2174] - Deserializing JSON fails in specific cases
+    * [THRIFT-2053] - NodeJS: Support for Multiplexing Services
+    * [THRIFT-1914] - Python: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-1810] - add ruby to test/test.sh
+    * [THRIFT-2310] - PHP: Client-side support for Multiplexing Services
+    * [THRIFT-2346] - C#: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2345] - Delphi: UTF-8 sent by PHP as JSON is not understood by TJsonProtocol
+    * [THRIFT-2338] - First doctext wrongly interpreted as program doctext in some cases
+    * [THRIFT-2325] - SSL test certificates
+    * [THRIFT-2358] - C++: add compact protocol to cross language test suite
+    * [THRIFT-2425] - PHP: Server-side support for Multiplexing Services
+    * [THRIFT-2421] - Tree/Recursive struct support in thrift
+    * [THRIFT-2290] - Update Go tutorial to align with THRIFT-2232
+    * [THRIFT-2558] - CSharp compiler generator tries to concat ints with strings using +
+    * [THRIFT-2507] - Additional LUA TProtocolException error code needed?
+    * [THRIFT-2499] - Compiler: allow annotations without "= value"
+    * [THRIFT-2534] - Cross language test results should recorded to a status.md or status.html file automatically
+    * [THRIFT-66] - Java: Allow multiplexing multiple services over a single TCP connection
+    * [THRIFT-1681] - Add Lua Support
+    * [THRIFT-1727] - Ruby-1.9: data loss: "binary" fields are re-encoded
+    * [THRIFT-1726] - Ruby-1.9: "binary" fields are represented by string whose encoding is "UTF-8"
+    * [THRIFT-988] - perl: add version Info to the library via configure
+    * [THRIFT-334] - Compact Protocol for PHP
+    * [THRIFT-2444] - pull request 88: thrift: clean up enum value assignment
+
+## Task
+    * [THRIFT-2223] - Spam links on wiki
+    * [THRIFT-2566] - Please create a DOAP file for your TLP
+    * [THRIFT-2237] - Update archive to contain all versions
+    * [THRIFT-962] - Tutorial page on our website is really unhelpful
+
+## Test
+    * [THRIFT-2327] - nodejs: nodejs test suite should be bundled with the library
+    * [THRIFT-2445] - THRIFT-2384 (code generation for go maps with binary keys) should be tested
+    * [THRIFT-2501] - C# The test parameters from the TestServer and TestClient are different from the http://thrift.apache.org/test/
+
+## Wish
+    * [THRIFT-2190] - Add the JavaScript thrift.js lib to the Bower registry
+    * [THRIFT-2076] - boost::optional instead of __isset
+
+
+
+Thrift 0.9.1
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1440] - debian packaging: minor-ish policy problems
+    * [THRIFT-1402] - Generated Y_types.js does not require() X_types.js when an include in the IDL file was used
+    * [THRIFT-1551] - 2 thrift file define only struct (no service), one include another, the gen nodejs file didn't have "requires" at the top
+    * [THRIFT-1264] - TSocketClient is queried by run loop after deallocation in Cocoa
+    * [THRIFT-1600] - Thrift Go Compiler and Library out of date with Go 1 Release.
+    * [THRIFT-1603] - Thrift IDL allows for multiple exceptions, args or struct member names to be the same
+    * [THRIFT-1062] - Problems with python tutorials
+    * [THRIFT-864] - default value fails if identifier is a struct
+    * [THRIFT-930] - Ruby and Haskell bindings don't properly support DESTDIR (makes packaging painful)
+    * [THRIFT-820] - The readLength attribute of TBinaryProtocol is used as an instance variable and is decremented on each call of checkReadLength
+    * [THRIFT-1640] - None of the tutorials linked on the website contain content
+    * [THRIFT-1637] - NPM registry does not include version 0.8
+    * [THRIFT-1648] - NodeJS clients always receive 0 for 'double' values.
+    * [THRIFT-1660] - Python Thrift library can be installed with pip but not easy_install
+    * [THRIFT-1657] - Chrome browser sending OPTIONS method before POST in xmlHttpRequest
+    * [THRIFT-2118] - Certificate error handling still incorrect
+    * [THRIFT-2137] - Ruby test lib fails jenkins build #864
+    * [THRIFT-2136] - Vagrant build not compiling java, ruby, php, go libs due to missing dependencies
+    * [THRIFT-2135] - GO lib leaves behind test files that are auto generated
+    * [THRIFT-2134] - mingw-cross-compile script failing with strip errors
+    * [THRIFT-2133] - java TestTBinaryProtocol.java test failing
+    * [THRIFT-2126] - lib/cpp/src/thrift/concurrency/STD* files missing from DIST
+    * [THRIFT-2125] - debian missing from DIST
+    * [THRIFT-2124] - .o, .so, .la, .deps, .libs, gen-* files left tutorials, test and lib/cpp when making DIST
+    * [THRIFT-2123] - GO lib missing files in DIST build
+    * [THRIFT-2121] - Compilation bug for Node.js
+    * [THRIFT-2129] - php ext missing from dist
+    * [THRIFT-2128] - lib GO tests fail with funct ends without a return statement
+    * [THRIFT-2286] - Failed to compile Thrift0.9.1 with boost1.55 by VS2010 if select Debug-mt&x64 mode.
+    * [THRIFT-1973] - TCompactProtocol in C# lib does not serialize and deserialize negative int32 and int64 number correctly
+    * [THRIFT-1992] - casts in TCompactProtocol.tcc causing "dereferencing type-punned pointer will break strict-aliasing rules" warnings from gcc
+    * [THRIFT-1930] - C# generates unsigned byte for Thrift "byte" type
+    * [THRIFT-1929] - Update website to use Mirrors for downloads
+    * [THRIFT-1928] - Race may still exist in TFileTransport::flush()
+    * [THRIFT-1934] - Tabs in Example section on main page are not working
+    * [THRIFT-1933] - Delphi generator crashes when a typedef references another typedef from an included file
+    * [THRIFT-1942] - Binary accelerated cpp extension does not use Thrift namespaces for Exceptions
+    * [THRIFT-1959] - C#: Add Union TMemoryBuffer support
+    * [THRIFT-1958] - C#: Use static Object.Equals instead of .Equals() calls in equals
+    * [THRIFT-1957] - NodeJS TFramedTransport and TBufferedTransport read bytes as unsigned
+    * [THRIFT-1955] - Union Type writer generated in C# does not WriteStructBegin
+    * [THRIFT-1952] - Travis CI
+    * [THRIFT-1949] - WP7 build broken
+    * [THRIFT-1943] - docstrings for enum values are ignored
+    * [THRIFT-2070] - Improper `HexChar' and 'HexVal' implementation in TJSONProtocol.cs
+    * [THRIFT-2017] - Resource Leak in thrift struct under compiler/cpp/src/parse/t_program.h
+    * [THRIFT-2032] - C# client leaks sockets/handles
+    * [THRIFT-1996] - JavaME Constants generation is broken / inconsistent with regular Java generation
+    * [THRIFT-2002] - Haskell: Test use Data.Maybe instead of Maybe
+    * [THRIFT-2051] - Vagrant fails to build erlang
+    * [THRIFT-2050] - Vagrant C# lib compile fails with TException missing
+    * [THRIFT-1978] - Ruby: Thrift should allow for the SSL verify mode to be set
+    * [THRIFT-1984] - namespace collision in python bindings
+    * [THRIFT-1988] - When trying to build a debian package it fails as the file NEWS doesn't exist
+    * [THRIFT-1975] - TBinaryProtocol CheckLength can't be used for a client
+    * [THRIFT-1995] - '.' allowed at end of identifier generates non-compilable code
+    * [THRIFT-2112] - Error in Go generator when using typedefs in map keys
+    * [THRIFT-2088] - Typos in Thrift compiler help text
+    * [THRIFT-2080] - C# multiplex processor does not catch IOException
+    * [THRIFT-2082] - Executing "gmake clean" is broken
+    * [THRIFT-2102] - constants are not referencing to correct type when included from another thrift file
+    * [THRIFT-2100] - typedefs are not correctly referenced when including from other thrift files
+    * [THRIFT-2066] - 'make install' does not install two headers required for C++ bindings
+    * [THRIFT-2065] - Not valid constants filename in Java
+    * [THRIFT-2047] - Thrift.Protocol.TCompactProtocol, intToZigZag data lost (TCompactProtocol.cs)
+    * [THRIFT-2036] - Thrift gem warns about class variable access from top level
+    * [THRIFT-2057] - Vagrant fails on php tests
+    * [THRIFT-2105] - Generated code for default values of collections ignores t_field::T_REQUIRED
+    * [THRIFT-2091] - Unnecessary 'friend' declaration causes warning in TWinsockSingleton
+    * [THRIFT-2090] - Go generator, fix including of other thrift files
+    * [THRIFT-2106] - Fix support for namespaces in GO generator
+    * [THRIFT-1783] - C# doesn't handle required fields correctly
+    * [THRIFT-1782] - async only defined in silverlight
+    * [THRIFT-1779] - Missing process_XXXX method in generated TProcessor implementation for all 'oneway' service functions
+    * [THRIFT-1692] - SO_REUSEADDR allows for socket hijacking on Windows
+    * [THRIFT-1720] - JRuby times out on successful connection
+    * [THRIFT-1713] - Named and Anonymous Pipe transport (Delphi)
+    * [THRIFT-1699] - Native Union#read has extra read_field_end call
+    * [THRIFT-1749] - Python TSSLSocket error handling obscures actual error
+    * [THRIFT-1748] - Guard and RWGuard macros defined in global namespace
+    * [THRIFT-1734] - Front webpage is still advertising v0.8 as current release
+    * [THRIFT-1729] - C glib refactor left empty folders in svn
+    * [THRIFT-1767] - unions can't have required fields (Delphi)
+    * [THRIFT-1765] - Incorrect error message printed for null or negative keys
+    * [THRIFT-1778] - Configure requires manual intervention due to tar failure
+    * [THRIFT-1777] - TPipeServer is UNSTOPPABLE
+    * [THRIFT-1753] - Multiple C++ Windows, OSX, and iOS portability issues
+    * [THRIFT-1756] - 'make -j 8' fails with "unterminated #ifdef" error
+    * [THRIFT-1773] - Python library should run on python 2.4
+    * [THRIFT-1769] - unions can't have required fields (C++)
+    * [THRIFT-1768] - unions can't have required fields (Compiler)
+    * [THRIFT-1666] - htonll usage in TBinaryProtocol.tcc generates warning with MSVC2010
+    * [THRIFT-1919] - libthrift depends on httpcore-4.1.3 (directly) and httpcore-4.1.4 (transitively)
+    * [THRIFT-1864] - implement event handler for non-blocking server
+    * [THRIFT-1859] - Generated error c++ code with -out and include_prefix param
+    * [THRIFT-1869] - TThreadPoolServer (java) dies when threadpool is consumed
+    * [THRIFT-1842] - Memory leak with Pipes
+    * [THRIFT-1838] - Can't build compiler on OS X because of missing thrifty.h
+    * [THRIFT-1846] - Restore socket.h header to support builds with Android NDK
+    * [THRIFT-1850] - make check hangs on TSocket tests in TransportTest.cpp
+    * [THRIFT-1873] - Binary protocol factory ignores struct read/write flags
+    * [THRIFT-1872] - issues with TBufferedTransport buffer
+    * [THRIFT-1904] - Incorrect code is generated for typedefs which use included types
+    * [THRIFT-1903] - PHP namespaces cause binary protocols to not be used
+    * [THRIFT-1895] - Delphi: reserved variable name "result" not detected properly
+    * [THRIFT-1881] - TNonblockingServer does not release open connections or threads on shutdown
+    * [THRIFT-1888] - Java Thrift client can't connect to Python Thrift server on same host
+    * [THRIFT-1831] - Bug in list deserializer
+    * [THRIFT-1824] - many compile warning, becase Thread.h includes config.h
+    * [THRIFT-1823] - Missing parenthesis breaks "IS_..." macro in generated code
+    * [THRIFT-1806] - Python generation always truncates __init__.py files
+    * [THRIFT-1795] - Race condition in TThreadedServerPool java implementation
+    * [THRIFT-1794] - C# asyncctp broken
+    * [THRIFT-1804] - Binary+compact protocol single byte error in Ruby library (ARM architecture): caused by different char signedness
+    * [THRIFT-1800] - Documentation text not always escaped correctly when rendered to HTML
+    * [THRIFT-1788] - C#: Constants static constructor does not compile
+    * [THRIFT-1816] - Need "require" included thrift files in "xxx_types.js"
+    * [THRIFT-1907] - Compiling namespace and sub-namespace directives for unrecognized generators should only be a warning
+    * [THRIFT-1913] - skipping unknown fields in java unions
+    * [THRIFT-2553] - C++ linker error - transport/TSocket
+    * [THRIFT-274] - Towards a working release/versioning process
+
+## Documentation
+    * [THRIFT-1971] - [Graphviz] Adds tutorial/general description documentation
+    * [THRIFT-2001] - http://thrift.apache.org/ Example "C++ Server" tab is broken
+
+## Improvement
+    * [THRIFT-1574] - Apache project branding requirements: DOAP file [PATCH]
+    * [THRIFT-1347] - Unify the exceptions returned in generated Go code
+    * [THRIFT-1353] - Switch to performance branch, get rid of BinaryParser
+    * [THRIFT-1629] - Ruby 1.9 Compatibility during Thrift configure, make, install
+    * [THRIFT-991] - Refactor Haskell code and generator
+    * [THRIFT-990] - Sanify gettimeofday usage codebase-wide
+    * [THRIFT-791] - Let C++ TSimpleServer be driven by an external main loop
+    * [THRIFT-2117] - Cocoa TBinaryProtocol strictWrite should be set to true by default
+    * [THRIFT-2014] - Change C++ lib includes to use <namespace/> style throughout
+    * [THRIFT-1972] - Add support for async processors
+    * [THRIFT-1970] - [Graphviz] Adds option to render exceptions relationships
+    * [THRIFT-1966] - Support different files for SSL certificates and keys
+    * [THRIFT-1965] - Adds Graphviz (graph description language) generator
+    * [THRIFT-1956] - Switch to Apache Commons Lang 3
+    * [THRIFT-1962] - Multiplex processor should send any TApplicationException back to client
+    * [THRIFT-1960] - main() declares 22 unused gen bools
+    * [THRIFT-1951] - libthrift.jar has source files in it
+    * [THRIFT-1997] - Add accept backlog configuration method to  TServerSocket
+    * [THRIFT-2003] - Deprecate senum
+    * [THRIFT-2052] - Vagrant machine image defaults to only 384MB of RAM
+    * [THRIFT-1980] - Modernize Go tooling, fix go client libary.
+    * [THRIFT-1977] - C# compiler should generate constant files prefixed with thrift file name
+    * [THRIFT-1985] - add a Vagrantfile to build and test Apache Thrift fully reproducable
+    * [THRIFT-1994] - Deprecate slist
+    * [THRIFT-1993] - Factory to create instances from known (generated) interface types with Delphi
+    * [THRIFT-2081] - Specified timeout should be used in TSocket.Open()
+    * [THRIFT-2084] - Delphi: Ability to create entity Thrift-generated instances based on TypeInfo
+    * [THRIFT-2083] - Improve the go lib: buffered Transport, save memory allocation, handle concurrent request
+    * [THRIFT-2109] - Secure connections should be supported in Go
+    * [THRIFT-2107] - minor Go generator fixes
+    * [THRIFT-1695] - allow warning-free compilation in VS 2012 and GNU 4.6
+    * [THRIFT-1735] - integrate tutorial into regular build
+    * [THRIFT-1716] - max allowed connections should be PIPE_UNLIMITED_INSTANCES
+    * [THRIFT-1715] - Allow excluding python parts when building contrib/fb303
+    * [THRIFT-1733] - Fix RPM build issues on RHEL6/OL6 systems
+    * [THRIFT-1728] - Upgradation of httpcomponents
+    * [THRIFT-1876] - Use enum names instead of casted integers in assignments
+    * [THRIFT-1874] - timeout for the server-side end of a named pipe
+    * [THRIFT-1897] - Support validation of required fields
+    * [THRIFT-1896] - Add TBase protocol for Cocoa
+    * [THRIFT-1880] - Make named pipes server work asynchronously (overlapped) to allow for clean server stops
+    * [THRIFT-1878] - Add the possibility to send custom headers
+    * [THRIFT-1882] - Use single include
+    * [THRIFT-1793] - C#: Use static read instead of instance read
+    * [THRIFT-1799] - Option to generate HTML in "standalone mode"
+    * [THRIFT-1815] - Code generators line buffer output
+    * [THRIFT-1890] - C++: Make named pipes server work asynchronously
+    * [THRIFT-474] - Generating Ruby on Rails friendly code
+
+## New Feature
+    * [THRIFT-801] - Provide an interactive shell (irb) when generating ruby bindings
+    * [THRIFT-2292] - Android Library Project
+    * [THRIFT-2012] - Modernizing Go
+    * [THRIFT-1969] - C#: Tests not properly linked from the solution
+    * [THRIFT-1785] - C#: Add TMemoryBuffer serializer/deserializer
+    * [THRIFT-1780] - Add option to generate nullable values
+    * [THRIFT-1786] - C# Union Typing
+    * [THRIFT-591] - Make the C++ runtime library be compatible with Windows and Visual Studio
+    * [THRIFT-514] - Add option to configure compiler output directory
+
+## Question
+    * [THRIFT-1764] - how to get the context of client when on a rpc call in server side?
+    * [THRIFT-1791] - thrift's namespace directive when generating haskell code
+
+## Sub-task
+    * [THRIFT-1594] - Java test clients should have a return codes that reflect whether it succeeds or not.
+    * [THRIFT-1595] - Java test server should follow the documented behavior as of THRIFT-1590
+    * [THRIFT-986] - st: add version Info to the library
+    * [THRIFT-985] - php: add version Info to the library
+    * [THRIFT-984] - ocaml: add version Info to the library
+    * [THRIFT-1924] - Delphi: Inconsistency in serialization of optional fields
+    * [THRIFT-1922] - C#: Inconsistency in serialization of optional fields
+    * [THRIFT-1961] - C# tests should be in lib/csharp/test/...
+    * [THRIFT-1822] - PHP unit test does not work
+    * [THRIFT-1902] - C++: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-1901] - C#: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-1899] - Delphi: Support for Multiplexing Services on any Transport, Protocol and Server
+    * [THRIFT-563] - Support for Multiplexing Services on any Transport, Protocol and Server
+
+
+
+Thrift 0.9
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1438] - lib/cpp/src/windows/config.h should read version from configure.ac rather than a #define
+    * [THRIFT-1446] - Compile error with Delphi 2009 in constant initializer
+    * [THRIFT-1450] - Problems building thrift 0.8.0 for Python and Ruby
+    * [THRIFT-1449] - Ruby client does not work on solaris (?)
+    * [THRIFT-1447] - NullpointerException in ProcessFunction.class :in "oneway" method
+    * [THRIFT-1433] - TServerSocket fix for MSVC
+    * [THRIFT-1429] - The nonblocking servers is supposed to use TransportFactory to read the data
+    * [THRIFT-1427] - PHP library uses non-multibyte safe functions with mbstring function overloading
+    * [THRIFT-1421] - Debian Packages can not be built
+    * [THRIFT-1394] - Treatment of optional fields is not consistent between C++ and Java
+    * [THRIFT-1511] - Server with oneway support ( JAVA )
+    * [THRIFT-1496] - PHP compiler not namespacing enums
+    * [THRIFT-1495] - PHP TestClient fatals on missing class
+    * [THRIFT-1508] - TServerSocket does not allow for the user to specify the IP address to bind to
+    * [THRIFT-1504] - Cocoa Generator should use local file imports for base Thrift headers
+    * [THRIFT-1512] - Thrift socket support for Windows XP
+    * [THRIFT-1502] - TSimpleServer::serve(): Do not print out error message if server was stopped.
+    * [THRIFT-1501] - PHP old namespaces not generated for enums
+    * [THRIFT-1483] - java compiler does not generate type parameters for services in extended clauses
+    * [THRIFT-1479] - Compiled PHP process functions missing writeMessageEnd()
+    * [THRIFT-1492] - enabling c_glib render thrift unusable (even for C++ code)
+    * [THRIFT-1491] - Uninitialize processorFactory_ member in TServer.h
+    * [THRIFT-1475] - Incomplete records generation for Erlang
+    * [THRIFT-1486] - Javascript manual testserver not returning content types
+    * [THRIFT-1488] - src/concurrency/Thread.h:91:58: error: invalid conversion from 'pthread_t {aka _opaque_pthread_t*}' to 'apache::thrift::concurrency::Thread::id_t {aka long long unsigned int}' [-fpermissive]
+    * [THRIFT-1490] - Windows-specific header files - fixes & tweaks
+    * [THRIFT-1526] - Union TupleSchemeFactory returns StandardSchemes
+    * [THRIFT-1527] - Generated implementation of tupleReadStruct in unions return null when the setfield is unrecognized
+    * [THRIFT-1524] - TNonBlockingServer does not compile in Visual Studio 2010
+    * [THRIFT-1529] - TupleProtocol can unintentionally include an extra byte in bit vectors when number of optional fields is an integral of 8
+    * [THRIFT-1473] - JSON context stack may be left in an incorrect state when an exception is thrown during read or write operations
+    * [THRIFT-1456] - System.Net.HttpWebRequest' does not contain a definition for 'Proxy'
+    * [THRIFT-1468] - Memory leak in TSaslServerTransport
+    * [THRIFT-1461] - Recent TNonblockingServer changes broke --enable-boostthreads=yes, Windows
+    * [THRIFT-1460] - why not add unicode strings support to python directly?
+    * [THRIFT-1464] - AbstractNonblockingServer.FrameBuffer TNonblockingTransport accessor changed from public to private
+    * [THRIFT-1467] - Possible AV with empty strings when using JSON protocol
+    * [THRIFT-1523] - clientTimeout not worked as expected in TServerSocket created by TSSLTransportFactory
+    * [THRIFT-1537] - TFramedTransport issues
+    * [THRIFT-1519] - Thirft Build Failure referencing rb_intern2 symbol
+    * [THRIFT-1518] - Generated C++ code only sends the first optional field in the write() function for a struct.
+    * [THRIFT-1515] - NameError: global name 'TApplicationException' is not defined
+    * [THRIFT-1554] - Inherited service methods are not resolved in derived service implementations
+    * [THRIFT-1553] - thrift nodejs service side can't read map structure, key as enum, value as Object
+    * [THRIFT-1575] - Typo in server/TThreadPoolServer.h
+    * [THRIFT-1327] - Fix Spec Suite under Ruby-1.8.7 (works for MRI Ruby-1.9.2)
+    * [THRIFT-1326] - on some platforms, #include <stdint.h> is necessary to be included in Thrift.h
+    * [THRIFT-1159] - THttpClient->Flush() issue (connection thru proxy)
+    * [THRIFT-1277] - Node.js serializes false booleans as null
+    * [THRIFT-1224] - Cannot insert UTF-8 text
+    * [THRIFT-1267] - Node.js can't throw exceptions.
+    * [THRIFT-1338] - Do not use an unpatched autoconf 2.65 to generate release tarball
+    * [THRIFT-1128] - MAC OS X: thrift.h incompatibility with Thrift.h
+    * [THRIFT-1631] - Fix C++ server constructor typos
+    * [THRIFT-1602] - PHP C Extension is not Compatible with PHP 5.4
+    * [THRIFT-1610] - IWebProxy not available on WP7 platform
+    * [THRIFT-1606] - Race condition in BoostThreadFactory.cpp
+    * [THRIFT-1604] - Python exception handeling for changes from PEP 3110
+    * [THRIFT-1607] - Incorrect file modes for several source files
+    * [THRIFT-1583] - c_glib leaks memory
+    * [THRIFT-1582] - Bad includes of nested thrift files in c_glib
+    * [THRIFT-1578] - C_GLib generated code does not compile
+    * [THRIFT-1597] - TJSONProtocol.php is missing from Makefile.am
+    * [THRIFT-1591] - Enable TCP_NODELAY for ruby gem
+    * [THRIFT-1624] - Isset Generated differently on different platforms
+    * [THRIFT-1622] - Incorrect size returned on read
+    * [THRIFT-1621] - Memory leaks
+    * [THRIFT-1612] - Base64 encoding is broken
+    * [THRIFT-1627] - compiler built using compilers.vcxproj cannot be used to build some test .thrift files
+    * [THRIFT-1571] - Update Ruby HTTP transport for recent Ruby versions
+    * [THRIFT-1023] - Thrift encoding  (UTF-8) issue with Ruby 1.9.2
+    * [THRIFT-1090] - Document the generation of a file called "Constants.java"
+    * [THRIFT-1082] - Thrift::FramedTransport sometimes calls close() on an undefined value
+    * [THRIFT-956] - Python module's version meta-data should be updated
+    * [THRIFT-973] - Cocoa library won't compile using clang
+    * [THRIFT-1632] - ruby: data corruption in thrift_native implementation of MemoryBufferTransport
+    * [THRIFT-1665] - TBinaryProtocol: exceeded message length raises generic TException
+    * [THRIFT-1664] - Reference to non-existing variable in build script
+    * [THRIFT-1663] - Java Thrift server is not throwing exceptions
+    * [THRIFT-1662] - "removeObject:" should be "removeObserver:" in [-TSocketServer dealloc]?
+    * [THRIFT-1643] - Denial of Service attack in TBinaryProtocol.readString
+    * [THRIFT-1674] - Update Thrift D library to be compatible with 2.060
+    * [THRIFT-1673] - Ruby compile flags for extension for multi arch builds (os x)
+    * [THRIFT-1655] - Configure still trying to use thrift_generators in output
+    * [THRIFT-1654] - c_glib thrift_socket_read() returns corrupted data
+    * [THRIFT-1653] - TThreadedSelectorServer leaks CLOSE_WAIT sockets
+    * [THRIFT-1658] - Java thrift server is not throwing TApplicationException
+    * [THRIFT-1656] - Setting proper headers in THttpServer.cpp so that "Cross-Origin Resource Sharing" on js client can work.
+    * [THRIFT-1652] - TSaslTransport does not log the error when kerberos auth fails
+    * [THRIFT-2272] - CLONE - Denial of Service attack in TBinaryProtocol.readString
+    * [THRIFT-2086] - Invalid generated code for Node.JS when using namespaces
+    * [THRIFT-1686] - t_php_generator.cc uses "and" instead of "&&", and causes compiler errors with Visual Studio
+    * [THRIFT-1693] - libthrift has dependency on two different versions of httpcore
+    * [THRIFT-1689] - don't exit(-1) in TNonblockingServer
+    * [THRIFT-1679] - NodeJS: protocol readString() should treat string as utf8, not binary
+    * [THRIFT-1721] - Dist broken due to 0.8.0 to 0.9.0 changes
+    * [THRIFT-1710] - Minor issues in test case code
+    * [THRIFT-1709] - Warning "Bitwise-or operator used on a sign-extended operand; consider casting to a smaller unsigned type first" in TBinaryProtocol.cs at ReadInt64()
+    * [THRIFT-1707] - [ruby] Adjust server_spec.rb for RSpec 2.11.x and Ruby 1.9.3
+    * [THRIFT-1671] - Cocoa code generator does not put keywords into generated method calls
+    * [THRIFT-1670] - Incompatibilities between different versions of a Thrift interface
+    * [THRIFT-1669] - NameError: global name 'TApplicationException' is not defined
+    * [THRIFT-1668] - Compile error in contrib/fb303, thrift/TDispatchProcessor.h: No such file or directory
+    * [THRIFT-1845] - Fix compiler warning caused by implicit string conversion with Xcode 4.6
+    * [THRIFT-304] - Building the Python library requires development headers
+    * [THRIFT-369] - sets and maps break equality
+    * [THRIFT-556] - Ruby compiler does not correctly referred to top-level modules when a submodule masks the top-level name
+    * [THRIFT-481] - indentation of ruby classes is off by a few
+
+## Improvement
+    * [THRIFT-1498] - Allow TThreadedPoolServer.Args to pass a ExecutorService
+    * [THRIFT-1444] - FunctionRunner - add syntactic sugar to create shared_ptrs
+    * [THRIFT-1443] - define a TProcessor helper class to implement process()
+    * [THRIFT-1441] - Generate constructor with parameters for exception class to let it update message property automatically.
+    * [THRIFT-1520] - Embed version number in erlang .app file
+    * [THRIFT-1480] - python: remove tabs, adjust whitespace and address PEP8 warnings
+    * [THRIFT-1485] - Performance: pass large and/or refcounted arguments as "const"
+    * [THRIFT-1484] - Introduce phpunit test suite
+    * [THRIFT-1532] - The type specifications in the generated Erlang code should include "undefined" where it's used as a default value
+    * [THRIFT-1534] - Required fields in the Delphi code generator.
+    * [THRIFT-1469] - Java isset space optimization
+    * [THRIFT-1465] - Visibility of methods in generated java code
+    * [THRIFT-1453] - Don't change types of arguments when serializing with thrift php extension
+    * [THRIFT-1452] - generate a swap() method for all generated structs
+    * [THRIFT-1451] - FramedTransport: Prevent infinite loop when writing
+    * [THRIFT-1521] - Two patches for more Performance
+    * [THRIFT-1555] - Delphi version of the tutorial code
+    * [THRIFT-1535] - Why thrift don't use wrapped class for optional fields ?
+    * [THRIFT-1204] - Ruby autogenerated files should require 'thrift' gem
+    * [THRIFT-1344] - Using the httpc module directly rather than the deprecated http layer
+    * [THRIFT-1343] - no_auto_import min/2 to avoid compile warning
+    * [THRIFT-1340] - Add support of ARC to Objective-C
+    * [THRIFT-1611] - Improved code generation for typedefs
+    * [THRIFT-1593] - Pass on errors like "connection closed" to the handler module
+    * [THRIFT-1615] - PHP Namespace
+    * [THRIFT-1567] - Thrift/cpp: Allow alternate classes to be used for
+    * [THRIFT-1072] - Missing - (id) initWithSharedProcessor in TSharedProcessorFactory.h
+    * [THRIFT-1650] - [ruby] Update clean items and svn:ignore entries for OS X artifacts
+    * [THRIFT-1661] - [PATCH] Add --with-qt4 configure option
+    * [THRIFT-1675] - Do we have any plan to support scala?
+    * [THRIFT-1645] - Replace Object#tee with more conventional Object#tap in specs
+    * [THRIFT-1644] - Upgrade RSpec to 2.10.x and refactor specs as needed
+    * [THRIFT-1672] - MonoTouch (and Mono for Android) compatibility
+    * [THRIFT-1702] - a thrift manual
+    * [THRIFT-1694] - Re-Enable serialization for WP7 Silverlight
+    * [THRIFT-1691] - Serializer/deserializer support for Delphi
+    * [THRIFT-1688] - Update IDL page markup
+    * [THRIFT-1725] - Tutorial web pages for Delphi and C#
+    * [THRIFT-1714] - [ruby] Explicitly add CWD to Ruby test_suites.rb
+    * [THRIFT-317] - Issues with Java struct validation
+    * [THRIFT-164] - Build web tutorial on Incubator web site
+    * [THRIFT-541] - Cocoa code generator doesn't put keywords before all arguments.
+    * [THRIFT-681] - The HTML generator does not handle JavaDoc style comments very well
+
+## New Feature
+    * [THRIFT-1500] - D programming language support
+    * [THRIFT-1510] - There should be an implementation of the JsonProtocol for ruby
+    * [THRIFT-1115] - python TBase class for dynamic (de)serialization, and __slots__ option for memory savings
+    * [THRIFT-1953] - support for asp.net mvc 3
+
+## Question
+    * [THRIFT-1235] - How could I use THttpServerTransportFactory withTNonBlockingServer
+    * [THRIFT-1368] - TNonblockingServer usage
+    * [THRIFT-1061] - Read an invalid frame size of 0. Are you using TFramedTransport on the client side?
+    * [THRIFT-491] - Ripping raw pthreads out of TFileTransport and associated test issues
+
+## Sub-task
+    * [THRIFT-1596] - Delphi: Test clients should have a return codes that reflect whether they succeeded or not
+    * [THRIFT-982] - javame: add version Info to the library
+    * [THRIFT-1722] - C# WP7 Assembly addition beaks mono build
+    * [THRIFT-336] - Compact Protocol in C#
+
+## Test
+    * [THRIFT-1613] - Add code back into empty source file ToStringTest.java
+    * [THRIFT-1718] - Incorrect check in TFileTransportTest
+
+## Wish
+    * [THRIFT-1463] - Decouple Thrift IDL from generators
+    * [THRIFT-1466] - Proper Documentation for Thrift C Glib
+    * [THRIFT-1539] - Build and distribute the fb303 python libraries along with thrift
+    * [THRIFT-1685] - Please add "aereo.com" to "Powered by Apache Thrift" list in about page
+    * [THRIFT-330] - TProcessor - additional method to called when connection is broken
+
+
+
+Thrift 0.8
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1436] - pip install thrift fails on Windows with "Unable to find vcvarsall.bat"
+    * [THRIFT-1432] - Javascript struct constants declared in the same file as their struct definition will cause an error
+    * [THRIFT-1428] - shared.thrft does not include namespace for php, so thrift compiler generate incorrect name
+    * [THRIFT-1426] - Dist package missing files for release 0.8
+    * [THRIFT-1425] - The Node package is incompatible with latest node (0.6) & npm (1.0.27)
+    * [THRIFT-1416] - Python Unit test is broken on ci
+    * [THRIFT-1419] - AbstractNonBlockingServer does not catch errors when invoking the processor
+    * [THRIFT-1424] - Ruby specs fail when run with rake
+    * [THRIFT-1420] - Nonblocking and HsHa server should make sure to close all their socket connections when the selector exits
+    * [THRIFT-1413] - Generated code does not read MapEnd / ListEnd / SetEnd
+    * [THRIFT-1409] - Name conflict check does not work properly for exception object(Delphi).
+    * [THRIFT-1408] - Delphi Test Server: Exception test case fails due to naming conflict with e.message
+    * [THRIFT-1407] - Typo in Python socket server causes Thrift to fail when we enable a global socket timout
+    * [THRIFT-1397] - CI server fails during build due to unused parameters in delphi generator
+    * [THRIFT-1404] - Delphi compiler generates struct reader code with problem.
+    * [THRIFT-1400] - Ruby native extension aborts with __stack_chk_fail in OSX
+    * [THRIFT-1399] - One of the TServerImpl.Create CTORs lacks implementation
+    * [THRIFT-1390] - Debian packages build fix for Squeeze (build from the official  0.7.0 tarball)
+    * [THRIFT-1393] - TTransportException's thrown from THttpClient contain superfluous slashes in the Exception message
+    * [THRIFT-1392] - Enabling both namespaces and autoloading in generated PHP code won't work.
+    * [THRIFT-1406] - Build error after applying THRIFT-1395
+    * [THRIFT-1405] - Delphi compiler does not generates container serializer properly.
+    * [THRIFT-1411] - java generator does not provide type parameter for TBaseProcessor
+    * [THRIFT-1473] - JSON context stack may be left in an incorrect state when an exception is thrown during read or write operations
+    * [THRIFT-1331] - Ruby library deserializes an empty map to nil
+    * [THRIFT-1330] - PHP Namespaces no longer generated
+    * [THRIFT-1328] - TBaseHelper.toString(...) appends ByteBuffer data outside of valid buffer range
+    * [THRIFT-1322] - OCaml lib fail to compile: Thrift.ml line 305, int vs int32 mismatch
+    * [THRIFT-1143] - Build doesn't detect correct architecture type on 64bit osx
+    * [THRIFT-1205] - port server unduly fragile with arbitrary input
+    * [THRIFT-1279] - type set is handled incorrectly when writing object
+    * [THRIFT-1298] - Standard scheme doesn't read or write metadata along with field values
+    * [THRIFT-1265] - C++ container deserialize
+    * [THRIFT-1263] - publish ruby client to rubygems
+    * [THRIFT-1384] - Java help menu missing newline near javame flag
+    * [THRIFT-1382] - Bundle install doesnot work because thrift crashes
+    * [THRIFT-1381] - Thrift C++ libs have incorrectly versioned names
+    * [THRIFT-1350] - Go library code does not build as of r60 (most recent release)
+    * [THRIFT-1365] - TupleProtocol#writeBitSet unintentionally writes a variable length byte array
+    * [THRIFT-1359] - --gen-cob cpp:cob_style does not compile anymore
+    * [THRIFT-1319] - Mismatch between how a union reads and writes a container
+    * [THRIFT-1309] - libfb303-0.7.0.jar missing in maven repository
+    * [THRIFT-1238] - Thrift JS client cannot read map of structures
+    * [THRIFT-1254] - Code can't be compiled against a regular JRE: Object.clone() override has a different return type
+    * [THRIFT-1367] - Mac OSX build fails with "no such file to load -- spec/rake/spectask"
+    * [THRIFT-1355] - Running make in lib/rb doesn't build the native extensions
+    * [THRIFT-1370] - Debian packaging should Build-Depend on libglib2.0-dev
+    * [THRIFT-1342] - Compilation problem on Windows of fastbinary.c
+    * [THRIFT-1341] - TProtocol.h endian detection wrong with boost
+    * [THRIFT-1583] - c_glib leaks memory
+    * [THRIFT-1582] - Bad includes of nested thrift files in c_glib
+    * [THRIFT-1578] - C_GLib generated code does not compile
+    * [THRIFT-1027] - 'make -j 16' fails with "unterminated #ifdef" error
+    * [THRIFT-1121] - Java server performance regression in 0.6
+    * [THRIFT-857] - tests run by "make install" fail if generators are disabled
+    * [THRIFT-380] - Use setuptools for python build
+
+## Dependency upgrade
+    * [THRIFT-1257] - thrift's dependency scope on javax.servlet:servlet-api should be 'provided'
+
+## Improvement
+    * [THRIFT-1445] - minor C++ generator variable cleanup
+    * [THRIFT-1435] - make TException.Message property conformant to the usual expectations
+    * [THRIFT-1431] - Rename 'sys' module to 'util'
+    * [THRIFT-1396] - Dephi generator has dependacy on boost 1.42 later.
+    * [THRIFT-1395] - Patch to prevent warnings for integer types in some cases
+    * [THRIFT-1275] -  thrift: always prefix namespaces with " ::"
+    * [THRIFT-1274] -  thrift: fail compilation if an unexpected token is
+    * [THRIFT-1271] -  thrift: fix missing namespace in generated local
+    * [THRIFT-1270] -  thrift: add --allow-neg-keys argument to allow
+    * [THRIFT-1345] - Allow building without tests
+    * [THRIFT-1286] - Modernize the Thrift Ruby Library Dev Environment
+    * [THRIFT-1284] -  thrift: fix processor inheritance
+    * [THRIFT-1283] -  thrift: wrap t_cpp_generator::generate_process_function() to 80
+    * [THRIFT-1282] - Upgrade httpclient to 4.1.2 (from 4.0.1)
+    * [THRIFT-1281] -  add @generated to the docblock
+    * [THRIFT-1280] -  Thrift: Improve Monitor exception-free interfaces
+    * [THRIFT-1278] - javadoc warnings - compilation
+    * [THRIFT-1227] - Erlang implementation of thrift JSON protocol
+    * [THRIFT-1295] - Duplicate include in TSocket.cpp
+    * [THRIFT-1294] -  thrift: fix log message typos in TSimpleServer
+    * [THRIFT-1293] -  thrift: improve handling of exceptions thrown by
+    * [THRIFT-1292] -  thrift: silence log spew from TThreadedServer
+    * [THRIFT-1288] -  Allow typedefed exceptions in throws clauses
+    * [THRIFT-1290] -  thrift: TNonblockingServer: clean up state in the
+    * [THRIFT-1287] -  thrift: start refactoring some of the C++ processor
+    * [THRIFT-1289] -  thrift: implement TNonblockingServer::stop()
+    * [THRIFT-1305] -  thrift: make TConnection a private inner class of
+    * [THRIFT-1304] -  TNonblockingServer: pass in the connection context to
+    * [THRIFT-1302] -  thrift: raise an exception if send() times out in
+    * [THRIFT-1301] -  thrift: consolidate common code in TNonblockingServer
+    * [THRIFT-1377] - abort PHP deserialization on unknown field type
+    * [THRIFT-1379] - fix uninitialized enum values in thrift C++ objects
+    * [THRIFT-1376] - Make port specification option in thrift remote
+    * [THRIFT-1375] - fixed a hex char conversion bug in TJSONProtocol
+    * [THRIFT-1373] - Fix user-defined exception generation in thrift (python)
+    * [THRIFT-1361] - Optional replacement of pthread by boost::thread
+    * [THRIFT-1320] - Consistency of configure generated config.h
+    * [THRIFT-1317] -  Remove copy constructibility from
+    * [THRIFT-1316] -  thrift: update server classes to accept
+    * [THRIFT-1315] -  thrift: generate server interface factory classes
+    * [THRIFT-1314] -  thrift: add TProcessorFactory
+    * [THRIFT-1335] -  Add accept timeout to TServerSocket
+    * [THRIFT-1334] -  Add more info to IllegalStateException
+    * [THRIFT-1333] -  Make RWGuard not copyable
+    * [THRIFT-1332] - TSSLTransportParameters class uses hard coded value keyManagerType: SunX509
+    * [THRIFT-1251] - Generated java code should indicate which fields are required and which are optional
+    * [THRIFT-1387] - Build MSVC libraries with Boost Threads instead of Pthreads
+    * [THRIFT-1339] - Extend Tuple Protocol to TUnions
+    * [THRIFT-1031] - Patch to compile Thrift for vc++ 9.0 and 10.0
+    * [THRIFT-1130] - Add the ability to specify symbolic default value for optional boolean
+    * [THRIFT-1123] - Patch to compile Thrift server and client for vc++ 9.0 and 10.0
+    * [THRIFT-386] - Make it possible to build the Python library without the extension
+
+## New Feature
+    * [THRIFT-1401] - JSON-protocol for Delphi XE Libraries
+    * [THRIFT-1167] - Java nonblocking server with more than one thread for select and handling IO
+    * [THRIFT-1366] - Delphi generator, lirbrary and unit test.
+    * [THRIFT-1354] - Add rake task to build just the gem file
+    * [THRIFT-769] - Pluggable Serializers
+
+## Sub-task
+    * [THRIFT-1415] - delphi: add version Info to the library
+    * [THRIFT-1391] - Improved Delphi XE test cases
+
+
+
+Thrift 0.7
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1140] - Framed Transport Client using C (Glib) Library hangs when connecting to Ruby Server
+    * [THRIFT-1154] - HttpClient does not specify the connection close parameter
+    * [THRIFT-1153] - HttpClient does not specify the connection close parameter
+    * [THRIFT-1149] - Nonblocking server fails when client connection is reset
+    * [THRIFT-1146] - Android Incompatibility : in Android < 2.3 java.io.IOException doesn't support for Throwable parameter in constructor
+    * [THRIFT-1133] - Java and JavaScript tutorial is broken since we have Java maven deployment
+    * [THRIFT-1132] - Deserialization error in TApplicationException C#
+    * [THRIFT-1131] - C# JSON Protocol is unable to decode escaped characters in string
+    * [THRIFT-1208] - python TCompactProtocol.py writeBool and readBool not follow the compact-proto-spec-2.txt spec for CONTAINER_WRITE, CONTAINER_READ
+    * [THRIFT-1200] - JS compiler generates code that clobbers existing namespaces
+    * [THRIFT-1183] - Pure-ruby CompactProtocol raises ArgumentError when deserializing under Ruby 1.9
+    * [THRIFT-1182] - Native deserializer segfaults on incorrect list element type
+    * [THRIFT-1181] - AS3 compiler generates incorrect code for setting default values in constructor
+    * [THRIFT-1234] - thrift --help is missing doc on py:utf8strings
+    * [THRIFT-1180] - AS3 compiler generates uncompilable code for binary types.
+    * [THRIFT-1194] - Java lib does not install artifacts to local dir correctly
+    * [THRIFT-1193] - Potential infinite loop in nonblocking_server
+    * [THRIFT-1192] - Typo: TProtocol.h tests for HAVE_SYS_PARAM_H_
+    * [THRIFT-1190] - readBufferBytesAllocated in TNonblockingServer.java should be AtomicLong to fix FD leakage and general server malfunction
+    * [THRIFT-1187] - nonblocking_server shutdown race under Ruby 1.9
+    * [THRIFT-1178] - Java: TBase signature should be T extends TBase<?,?>
+    * [THRIFT-1164] - Segmentation fault on NULL pointer in t_js_generator::generate_const
+    * [THRIFT-1171] - Perl write/readDouble assumes little-endian platform
+    * [THRIFT-1222] - Unhandled exception for TEvhttpServer request
+    * [THRIFT-1220] - TProcessor::process never returns false
+    * [THRIFT-1285] - Stable 0.7.0 Windows compiler exe available on the webside is not the good one
+    * [THRIFT-1218] - c_glib uses wrong name in pkg-config
+    * [THRIFT-1215] - Undefined property Thirft in lib/js/thrift.js
+    * [THRIFT-1211] - When using THttpClient, non 200 responses leave the connection open
+    * [THRIFT-1228] - The php accelerator module calls flush incorrectly
+    * [THRIFT-1308] - libfb303-0.7.0.jar missing in maven repository
+    * [THRIFT-1255] - Mismatch of method name between JavaME's lib and generated code (compareTo/compareObjects)
+    * [THRIFT-1253] - Code generated for maps is not compiling
+    * [THRIFT-1252] - Segfault in Ruby deserializer
+    * [THRIFT-1094] - bug in TCompactProto python readMessageEnd method and updated test cases
+    * [THRIFT-1093] - several bugs in python TCompactProtocol
+    * [THRIFT-1092] - generated validate() method has wrong indentation
+    * [THRIFT-1011] - Error generating package imports when using classes from other packages
+    * [THRIFT-1050] - Declaring an argument named "manager" to a service method produces code that fails compile due to name conflicts with protected ivars in TAsyncClient
+    * [THRIFT-1074] - .keystore and .truststore are missing from the 0.6.0 distribution
+    * [THRIFT-1067] - Tons of bugs in php implementation
+    * [THRIFT-1065] - Unexpected exceptions not proper handled on JS
+    * [THRIFT-1076] - Erlang Thrift socket server has a bug that causes java thrift client of framed binary client to throw "out of sequence" exception
+    * [THRIFT-1057] - casts in TBinaryProtocol.tcc causing "dereferencing type-punned pointer will break strict-aliasing rules" warnings from gcc
+    * [THRIFT-1055] - csharp TServerSocket and TSocket do not disable Nagle via Socket.NoDelay = true like cpp and java do
+    * [THRIFT-1054] - explicit call to PKG_PROG_PKG_CONFIG is missing and first use of PKG_CHECK_MODULES may not happen, causes mono detection to fail
+    * [THRIFT-1117] - JavaScript Unit Test does not work anymore because libthrift*.jar where moved by Maven Deployment
+    * [THRIFT-1111] - The HTML generator does not distinguish between string and binary types
+    * [THRIFT-1032] - "make dist" fails due to c_glib problem
+    * [THRIFT-1036] - Auto-generated C++ code fails to compile with "-Werror -Wextra -Wall" g++ compiler flags
+    * [THRIFT-1041] - TDeserializer holds onto a reference of the array it reads after it is done deserializing
+    * [THRIFT-1106] - C++ code TAsyncProtocolProcessor.h & TAsyncBufferProcessor.h dont have virtual functions but no virtual destructor. Causes warnings on -Wall
+    * [THRIFT-1105] - OCaml generator does not prefix methods of included structs with their type
+    * [THRIFT-1104] - INSTALLDIRS should be included in configure script
+    * [THRIFT-1102] - typo in configure.ac: "==" operator in 'test' (instead of"'=")
+    * [THRIFT-1101] - bytebuffer length calculation in TBinaryProtocol writeBinary
+    * [THRIFT-1098] - Undefined properties in TBinaryProtocolFactory
+    * [THRIFT-1081] - PHP tests broken and somewhat incomplete
+    * [THRIFT-1080] - erlang test's 'make' fails on Mac OSX
+    * [THRIFT-1078] - ThriftTest.thrift generates invalid PHP library
+    * [THRIFT-1120] - proto.WriteListEnd being called in the wrong place
+    * [THRIFT-1119] - TJSONProtocol fails to UTF8 decode strings
+    * [THRIFT-867] - PHP accelerator module's output transport is incompatible with TFramedTransport
+    * [THRIFT-826] - PHP TSocket Write Timeout
+    * [THRIFT-835] - Bad AS3 syntax in constructors that set default values
+    * [THRIFT-788] - thrift_protocol.so: multiget/multiget_slice does not handle more than 17 keys correctly
+    * [THRIFT-125] - OCaml libraries don't compile with 32-bit ocaml
+    * [THRIFT-342] - PHP: can't have sets of complex types
+    * [THRIFT-731] - configure doesn't check for ant >= 1.7
+    * [THRIFT-690] - Update TApplicationException codes
+    * [THRIFT-638] - BufferedTransport + C extensions block until recv timeout is reached on last fread call
+
+## Dependency upgrade
+    * [THRIFT-1177] - Update thrift to reflect changes in Go's networking libraries
+
+## Improvement
+    * [THRIFT-1155] - Remove log4j dependency from java client
+    * [THRIFT-1151] - Produce more informative runtime error in case of schema and data mismatch during serialization
+    * [THRIFT-1207] - Support DESTDIR on "make install" of ruby libs
+    * [THRIFT-1199] - Union structs should have generated methods to test whether a specific field is currently set
+    * [THRIFT-1233] - Remove unused include in generated C++ code
+    * [THRIFT-1189] - Ruby deserializer speed improvements
+    * [THRIFT-1170] - Thrift Generated Code and Java 5
+    * [THRIFT-1174] - Publish as3 client implementation via Maven for use by flex-mojos users
+    * [THRIFT-1225] - TCompactProtocol for PHP
+    * [THRIFT-1221] - Remove SimpleCallback.h
+    * [THRIFT-1217] - Use evutil_socketpair instead of pipe (Windows port)
+    * [THRIFT-1216] - build Java Library behind a proxy
+    * [THRIFT-1231] - Remove bogus include
+    * [THRIFT-1213] - Membuffer should provide a way to get back the buffer
+    * [THRIFT-1237] - Java fb303 missing some methods
+    * [THRIFT-1063] - Fix Erlang Tutorial Files
+    * [THRIFT-1053] - Make remote client's IP address available for all socket related transports
+    * [THRIFT-1109] - Deploy fb303 along side libthrift to maven repo
+    * [THRIFT-1107] - improvement for compiler-generated python for 'None' object comparisons
+    * [THRIFT-1069] - Add command line option to prevent thrift from inserting gen-* directories
+    * [THRIFT-1049] - Allow for TServerSocket python library to bind to a specific host
+    * [THRIFT-1126] - Extending struct_info for erlang bindings
+    * [THRIFT-1100] - python TSSLSocket improvements, including certificate validation
+    * [THRIFT-994] - Don't try to invoke phpize if we don't have it
+    * [THRIFT-993] - Some improvements in C++ stubs for oneway operations
+    * [THRIFT-997] - Using valueOf for base types in getFieldValue
+    * [THRIFT-418] - Don't do runtime sorting of struct fields
+    * [THRIFT-151] - TSSLServerSocket and TSSLSocket implementation
+    * [THRIFT-27] - Generated erlang types don't contain default values for records
+    * [THRIFT-113] - to-string methods should omit optional null fields from output
+    * [THRIFT-363] - Maven Deploy
+    * [THRIFT-447] - Make an abstract base Client class so we can generate less code
+    * [THRIFT-627] - should c++ have setters for optional fields?
+
+## New Feature
+    * [THRIFT-1236] - Erlang Reconnecting Thrift Client
+    * [THRIFT-1021] - Framed transport support for OCaml
+    * [THRIFT-1068] - Python SSL Socket Support
+    * [THRIFT-1103] - TZlibTransport for python, a zlib compressed transport
+    * [THRIFT-1083] - Preforking python process pool server
+    * [THRIFT-999] - Add TForkingServer
+
+## Sub-task
+    * [THRIFT-1152] - Attributes from private to protected
+    * [THRIFT-1038] - Generated Java code for structures containing binary fields (or collections thereof) are not serializable (in the Java sense) even though they implement java.io.Serializable
+
+## Task
+    * [THRIFT-892] - Refactor erlang build system with rebar
+
+## Wish
+    * [THRIFT-625] - Add support for 'Go'
+
+
+
+Thrift 0.6.1
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1133] - Java and JavaScript tutorial is broken since we have Java maven deployment
+    * [THRIFT-1131] - C# JSON Protocol is unable to decode escaped characters in string
+    * [THRIFT-1074] - .keystore and .truststore are missing from the 0.6.0 distribution
+
+## Improvement
+    * [THRIFT-1109] - Deploy fb303 along side libthrift to maven repo
+    * [THRIFT-363] - Maven Deploy
+
+## Question
+    * [THRIFT-1206] - did the THRIFT 0.6.1 merge THRIFT-563 ?
+
+## Sub-task
+    * [THRIFT-1163] - How can i use multi service in one program?
+
+## Task
+    * [THRIFT-1112] - Apply THRIFT-363 to 0.6 branch
+    * [THRIFT-1113] - Apply THRIFT-1074 to 0.6 branch
+
+
+
+Thrift 0.6
+--------------------------------------------------------------------------------
+## Bug
+    * [THRIFT-1020] - OCaml compiler generates invalid OCaml
+    * [THRIFT-1015] - TUnion does not handle ByteBuffer in toString
+    * [THRIFT-1013] - generated java code may have name clashes with thrift library
+    * [THRIFT-1009] - TUnion does not correctly deep copy a ByteBuffer
+    * [THRIFT-1032] - "make dist" fails due to c_glib problem
+    * [THRIFT-868] - Referencing constant values doesn't work with with typedef types
+    * [THRIFT-971] - java module can't be compiled without ivy and network connection
+    * [THRIFT-970] - Under heavy load, THttpClient may fail with "too many open files"
+    * [THRIFT-969] - Java Tutorial broken, move CalculatorHandler to a separate file
+    * [THRIFT-807] - JavaScript: Initialization of Base Types with 0 instead of null
+    * [THRIFT-955] - Thrift compiler for Windows uses lowercase names and directories which is inconsistent with compiling on other platforms
+    * [THRIFT-992] - Naming convention in C# constructor is not consistent with other fields causes compile errors
+    * [THRIFT-1008] - byte[] accessors throw NPE on unset field
+    * [THRIFT-1006] - Impossible to correctly qualify an enum constant in an external thrift file
+    * [THRIFT-950] - Haskell bindings treat 'byte' as unsigned 8-bit int (Data.Word.Word8), java/cpp as signed (byte/int8_t).
+    * [THRIFT-975] - lib/c_glib/README is missing => breaks make dist
+    * [THRIFT-944] - Support all version-4s of base
+    * [THRIFT-939] - optional binary fields throw NPE on default byte[] getters
+    * [THRIFT-935] - PHP Extension aborts the build if php-config is not installed
+    * [THRIFT-933] - Haskell's Thrift.cabal has warnings
+    * [THRIFT-932] - Haskell tests need to be run through 'make check' (and probably 'cabal check') too
+    * [THRIFT-904] - C# TSocket should disable nagle and linger
+    * [THRIFT-941] - Make PHP C Extension use the defined Protocol writeMessageBegin function
+    * [THRIFT-940] - 'make check' fails if boost is not in the std include and link paths
+    * [THRIFT-924] - Fix generated php structure constants
+    * [THRIFT-979] - ruby bindings used to work on jruby
+    * [THRIFT-977] - Hex Conversion Bug in C++ TJSONProtocol
+    * [THRIFT-347] - PHP TSocket Timeout Issues
+    * [THRIFT-517] - TExceptions thrown by server result in cryptic error message on client - Tried to read 4 bytes, but only got 0 bytes
+
+## Improvement
+    * [THRIFT-1024] - Add Python Twisted example to the Tutorial
+    * [THRIFT-958] - Change accessmodifer on trans_ field in the FrameBuffer class to public.
+    * [THRIFT-957] - THsHaServer: Change access modifier of the invoker field.
+    * [THRIFT-1002] - CodeStyle: t_c_glib_generator.cc
+    * [THRIFT-1005] - Give unions byte[] signature methods to go along with their ByteBuffer counterparts
+    * [THRIFT-951] - Add a new isServing() method to TServer
+    * [THRIFT-943] - Silly readme typo fix.
+    * [THRIFT-961] - JavaScript TestSuite using ant/ivy and Java's ServerTestBase Handler
+    * [THRIFT-960] - add TestServer, TestNonblockingServer and TestClient again
+    * [THRIFT-949] - Modify the TEnum interface so it defines a method similar to findByValue
+    * [THRIFT-946] - Augment FieldValueMetaData so it differentiates 'string' and 'binary' fields.
+    * [THRIFT-903] - custom ThreadFactory in THsHaServer
+    * [THRIFT-913] - Test Case for Url encoded strings + simple enhancement to lib/js/test/RunTestServer.sh
+    * [THRIFT-926] - Miscellaneous C++ improvements
+    * [THRIFT-929] - Improvements to the C++ test suite
+    * [THRIFT-893] - add JavaScript to the tutorial examples
+    * [THRIFT-1003] - Polishing c_glib code
+    * [THRIFT-71] - Debian packaging for thrift
+
+## New Feature
+    * [THRIFT-1033] - Node.js language target
+    * [THRIFT-947] - Provide a helper method to determine the TProtocol used to serialize some data.
+    * [THRIFT-928] - Make more statistics available in C++ servers
+    * [THRIFT-922] - Templatized [de]serialization code for C++
+    * [THRIFT-923] - Event-driven client and server support for C++
+    * [THRIFT-925] - Provide name<->value map for enums in C++
+    * [THRIFT-927] - Add option to modify the PHP include path
+    * [THRIFT-377] - TFileTransport port in Java
+    * [THRIFT-106] - TSSLServerSocket
+    * [THRIFT-582] - C implementation of Thrift
+    * [THRIFT-745] - Make it easier to instantiate servers
+
+## Sub-task
+    * [THRIFT-1038] - Generated Java code for structures containing binary fields (or collections thereof) are not serializable (in the Java sense) even though they implement java.io.Serializable
+
+## Task
+    * [THRIFT-862] - Async client issues / improvements
+
+## Test
+    * [THRIFT-581] - Add a testsuite for txThrift (Twisted)
+
+
+
+Thrift 0.5.0 - Incubating
+--------------------------------------------------------------------------------
+THRIFT-505   Build                Make configure give a summary of the enabled components (David Reiss)
+THRIFT-506   Build                Allow Thrift to be built without the C++ library (David Reiss)
+THRIFT-844   Build                Build Requirements state autoconf 2.59+ is required, but 2.60+ is needed (Harlan Lieberman-Berg)
+THRIFT-850   Build                Perl runtime requires Bit::Vector which may not be installed by default, but configure does not fail (Michael Lum)
+THRIFT-854   Build                Provide configure option and make rules to build/install php extension (Anthony Molinaro)
+THRIFT-858   Build                Have bootstrap.sh check for a suitable autoconf version before running (David Reiss)
+THRIFT-871   Build                Thrift compiler for WIndows (binary distribution) (David Reiss)
+THRIFT-323   C#                   TJSONProtocol (Roger Meier)
+THRIFT-634   C#                   C# Compiler Generates Incorrect Code For Fields which begin with an uppercase letter (Jon S Akhtar)
+THRIFT-881   C#                   add csharp to the tutorial (Roger Meier)
+THRIFT-856   C++                  Building cpp library fails on OS X with malloc and free not being declared in scope (James Clarke)
+THRIFT-865   C++                  C++ compiler build depends on libfl even when flex/lex not detected (David Reiss)
+THRIFT-900   C++                  Unix domain socket (Roger Meier)
+THRIFT-920   C++                  C++ Test and Tutorial does not compile anymore due to the change within Enum handling (Roger Meier)
+THRIFT-567   C++                  Can't immediately stop a TSimpleServer thread that is idle (Rush Manbert)
+THRIFT-756   C++                  Exposing TSocket(int) constructor to public (Rajat Goel)
+THRIFT-798   C++                  TNonblockingServer leaks resources when destroyed (David Reiss)
+THRIFT-812   C++, Python          Demo of Thrift over ZeroMQ (David Reiss)
+THRIFT-629   Cocoa                Unused Field In TSocketServer Appears To Break iPhone Build (Jon S Akhtar)
+THRIFT-838   Cocoa                Generated Cocoa classes have useless @dynamic declarations (Kevin Ballard)
+THRIFT-805   Cocoa                Don't generate process_XXXX methods for oneway methods (Brad Taylor)
+THRIFT-507   Compiler             Remove the compiler's dependency on Boost (David Reiss)
+THRIFT-895   Compiler (General)   Thrift compiler does not allow two different enumerations to have the same key name for one of the enum values (David Reiss)
+THRIFT-852   Compiler (General)   Missing newline causes many compiler warnings (Anthony Molinaro)
+THRIFT-877   Compiler (General)   smalltalk namespace doesn't work (Bruce Lowekamp)
+THRIFT-897   Compiler (General)   Don't allow unqualified constant access to enum values (Bryan Duxbury)
+THRIFT-9     Compiler (General)   Add a default namespace declaration for all languages (David Reiss)
+THRIFT-599   Erlang               Don't use unnecessary processes in the Erlang transports and clients (David Reiss)
+THRIFT-646   Erlang               Erlang library is missing install target (David Reiss)
+THRIFT-698   Erlang               Generated module list should contain atoms, not strings (Anthony Molinaro)
+THRIFT-866   Erlang               term() in spec definitions seems to not work in erlang R12 (Anthony Molinaro)
+THRIFT-886   Erlang               Dialyzer warning (Anthony Molinaro)
+THRIFT-785   Erlang               Framed transport server problems (Anthony Molinaro)
+THRIFT-884   HTML                 HTML Generator: add Key attribute to the Data Types Tables (Roger Meier)
+THRIFT-652   Haskell              Generated field name for strut is not capitalized correctly (Christian Lavoie)
+THRIFT-743   Haskell              compile error with GHC 6.12.1 (Christian Lavoie)
+THRIFT-901   Haskell              Allow the bindings to compile without -fglasgow-exts and with -Wall -Werror (Christian Lavoie)
+THRIFT-905   Haskell              Make haskell thrift bindings use automake to compile and install (Christian Lavoie)
+THRIFT-906   Haskell              Improve type mappings (Christian Lavoie)
+THRIFT-914   Haskell              Make haskell bindings 'easily' compilable (Christian Lavoie)
+THRIFT-918   Haskell              Make haskell tests run again (Christian Lavoie)
+THRIFT-919   Haskell              Update Haskell bindings README (Christian Lavoie)
+THRIFT-787   Haskell              Enums are not read correctly (Christian Lavoie)
+THRIFT-250   Java                 ExecutorService as a constructor parameter for TServer (Ed Ceaser)
+THRIFT-693   Java                 Thrift compiler generated java code that throws compiler warnings about deprecated methods. (Bryan Duxbury)
+THRIFT-843   Java                 TNonblockingSocket connects without a timeout (Bryan Duxbury)
+THRIFT-845   Java                 async client does not respect timeout (Ning Liang)
+THRIFT-870   Java                 Java constants don't get Javadoc comments (Bryan Duxbury)
+THRIFT-873   Java                 Java tests fail due to Too many open files (Todd Lipcon)
+THRIFT-876   Java                 Add SASL support (Aaron T. Myers)
+THRIFT-879   Java                 Remove @Override from TUnion.clear (Dave Engberg)
+THRIFT-882   Java                 deep copy of binary fields does not copy ByteBuffer characteristics (arrayOffset, position) (Bryan Duxbury)
+THRIFT-888   Java                 async client should also have nonblocking connect (Eric Jensen)
+THRIFT-890   Java                 Java tutorial doesn't work (Todd Lipcon)
+THRIFT-894   Java                 Make default accessors for binary fields return byte[]; provide new accessors to get ByteBuffer version (Bryan Duxbury)
+THRIFT-896   Java                 TNonblockingSocket.isOpen() returns true even after close() (Eric Jensen)
+THRIFT-907   Java                 libfb303 doesn't compile in 0.4.0 (Todd Lipcon)
+THRIFT-912   Java                 Improvements and bug fixes to SASL implementation (Todd Lipcon)
+THRIFT-917   Java                 THsHaServer should not accept an ExecutorService without catching RejectedExecutionException (Ed Ceaser)
+THRIFT-931   Java                 Use log4j for Java tests (Todd Lipcon)
+THRIFT-880   JavaME               JavaME code generator and runtime library (Dave Engberg)
+THRIFT-846   JavaScript           JavaScript Test Framwork: extended Testcases (Roger Meier)
+THRIFT-885   JavaScript           Url encoded strings never get decoded? How do we fix this? (T Jake Luciani)
+THRIFT-911   JavaScript           (JavaScript compiler) Const structs, maps, sets, and lists generate a trailing comma (T Jake Luciani)
+THRIFT-860   OCaml                copy method and reset method (Lev Walkin)
+THRIFT-682   PHP                  PHP extension doesn't compile on Mac OS X (Bryan Duxbury)
+THRIFT-851   PHP                  php extension fails to compile on centos 5.x (Todd Lipcon)
+THRIFT-840   Perl                 Perl protocol handler could be more robust against unrecognised types (Conrad Hughes)
+THRIFT-758   Perl                 incorrect deference in exception handling (Yann Kerherve)
+THRIFT-257   Python               Support validation of required fields (Esteve Fernandez)
+THRIFT-335   Python               Compact Protocol for Python (David Reiss)
+THRIFT-596   Python               Make Python's TBufferedTransport use a configurable input buffer (David Reiss)
+THRIFT-597   Python               Python THttpServer performance improvements (David Reiss)
+THRIFT-598   Python               Allow Python's threading servers to use daemon threads (David Reiss)
+THRIFT-666   Python               Allow the handler to override HTTP responses in THttpServer (David Reiss)
+THRIFT-673   Python               Generated Python code has whitespace issues (Ian Eure)
+THRIFT-721   Python               THttpClient ignores url parameters (Thomas Kho)
+THRIFT-824   Python               TApplicationException.__str__() refers to class constants as globals (Peter Schuller)
+THRIFT-855   Python               Include optimized compiled python objects in install (Anthony Molinaro)
+THRIFT-859   Python               Allow py:twisted to be generated in different namespace than py (Bruce Lowekamp)
+THRIFT-869   Python               TSocket.py on Mac (and FreeBSD) doesn't handle ECONNRESET from recv() (Steven Knight)
+THRIFT-875   Python               Include python setup.cfg in dist (Anthony Molinaro)
+THRIFT-610   Ruby                 binary_protocol.rb segfaults [line 86] (Unassigned)
+THRIFT-899   Ruby                 Ruby read timeouts can sometimes be 2x what they should be (Ryan King)
+THRIFT-909   Ruby                 allow block argument to struct constructor (Michael Stockton)
+THRIFT-456   Test Suite           Bad IP address string in test/cpp/src/main.cpp (Rush Manbert)
+
+
+Thrift 0.4.0 - Incubating
+--------------------------------------------------------------------------------
+THRIFT-650   Build        Make Check fails on Centos/OSX with 0.2.0 tarball (Anthony Molinaro)
+THRIFT-770   Build        Get 'make dist' to work without first compiling source code (Anthony Molinaro)
+THRIFT-160   C#           Created THttpTransport for the C# library based on WebHttpRequest (Michael Greene)
+THRIFT-834   C#           THttpClient resends contents of message after transport errors (Anatoly Fayngelerin)
+THRIFT-247   C++          THttpServer Transport (Unassigned)
+THRIFT-676   C++          Change C++ code generator so that generated classes can be wrapped with SWIG (Unassigned)
+THRIFT-570   Compiler     Thrift compiler does not error when duplicate method names are present (Bruce Simpson)
+THRIFT-808   Compiler     Segfault when constant declaration references a struct field that doesn't exist (Bryan Duxbury)
+THRIFT-646   Erlang       Erlang library is missing install target (Anthony Molinaro)
+THRIFT-544   General      multiple enums with the same key generate invalid code (Ben Taitelbaum)
+THRIFT-434   General      ruby compiler should warn when a reserved word is used (Michael Stockton)
+THRIFT-799   General      Files missing proper Apache license header (Bryan Duxbury)
+THRIFT-832   HTML         HTML generator shows unspecified struct fields as 'required' (Bryan Duxbury)
+THRIFT-226   Java         Collections with binary keys or values break equals() (Bryan Duxbury)
+THRIFT-484   Java         Ability to use a slice of a buffer instead of a direct byte[] for binary fields (Bryan Duxbury)
+THRIFT-714   Java         maxWorkerThreads parameter to THsHaServer has no effect (Bryan Duxbury)
+THRIFT-751   Java         Add clear() method to TBase (Bryan Duxbury)
+THRIFT-765   Java         Improved string encoding and decoding performance (Bryan Duxbury)
+THRIFT-768   Java         Async client for Java (Bryan Duxbury)
+THRIFT-774   Java         TDeserializer should provide a partialDeserialize method for primitive types (Piotr Kozikowski)
+THRIFT-783   Java         .equals java method is broken on structs containing binary-type fields (Unassigned)
+THRIFT-804   Java         CompareTo is broken for unions set to map, set, or list (Bryan Duxbury)
+THRIFT-814   Java         Include a TServlet in the standard Thrift distribution (Mathias Herberts)
+THRIFT-818   Java         Async client doesn't send method args (Bryan Duxbury)
+THRIFT-830   Java         Switch binary field implementation from byte[] to ByteBuffer (Bryan Duxbury)
+THRIFT-831   Java         FramedTransport implementation that reuses its buffers (Bryan Duxbury)
+THRIFT-833   Java         build.xml in lib/java is missing a classpathref attribute for the javadoc task (Bryan Duxbury)
+THRIFT-836   Java         Race condition causes CancelledKeyException in TAsyncClientManager (Bryan Duxbury)
+THRIFT-842   Java         Upgrade to current version of commons-lang (2.5 instead of 2.4) and/or change dependency in ivy.xml to not be exact (Bryan Duxbury)
+THRIFT-815   JavaScript   Deserialization of lists is critically broken. (T Jake Luciani)
+THRIFT-827   OCaml        OCaml generator to take default values into account (Lev Walkin)
+THRIFT-647   PHP          PHP library is missing install target (Anthony Molinaro)
+THRIFT-682   PHP          PHP extension doesn't compile on Mac OS X (Bryan Duxbury)
+THRIFT-718   PHP          Thrift PHP library includes closing tags and extraneous whitespace (Nicholas Telford)
+THRIFT-778   PHP          PHP socket listening server (Nick Jones)
+THRIFT-780   PHP          PHP extension sometimes causes an abort with two exceptions at the same time (David Reiss)
+THRIFT-837   PHP          PHP accelerator bug for writes > 8k (Thomas Kho)
+THRIFT-782   Perl         Perl code for writing containers doesn't count length of write*Begin or write*End (Conrad Hughes)
+THRIFT-395   Python       Python library + compiler does not support unicode strings (Unassigned)
+THRIFT-133   Ruby         'namespace ruby' should error out, or be an alias to 'namespace rb' (Bryan Duxbury)
+THRIFT-664   Ruby         Ruby extension fails to build with Ruby 1.9.1 (Rajesh Malepati)
+THRIFT-699   Ruby         Excise unused "native protocol method table" stuff from thrift_native (Bryan Duxbury)
+THRIFT-767   Ruby         ruby compiler does not keep comments for enum values (Bryan Duxbury)
+THRIFT-811   Ruby         http_client_transport.rb: allow custom http headers (Tony Kamenick)
+THRIFT-459   Ruby         Ruby installation always tries to write to /Library/Ruby/site (Matthieu Imbert)
+
+
+Thrift 0.1.0 - Incubating (not released)
+--------------------------------------------------------------------------------
+Compatibility Breaking Changes:
+  C++:
+    * It's quite possible that regenerating code and rebuilding will be
+      required.  Make sure your headers match your libs!
+
+  Java:
+
+  Python:
+
+  Ruby:
+    * Generated files now have underscored names [THRIFT-421]
+    * The library has been rearranged to be more Ruby-like [THRIFT-276]
+
+  Erlang:
+    * Generated code will have to be regenerated, and the new code will
+      have to be deployed atomically with the new library code [THRIFT-136]
+
+New Features and Bug Fixes:
+  C++:
+    * Support for TCompactProtocol [THRIFT-333]
+
+  Java:
+    * Support for TCompactProtocol [THRIFT-110]
+
+  Python:
+    * Support for Twisted [THRIFT-148]
+
+  Ruby:
+    * Support for TCompactProtocol [THRIFT-332]
+

+ 117 - 0
vendor/github.com/apache/thrift/CMakeLists.txt

@@ -0,0 +1,117 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+cmake_minimum_required(VERSION 2.8.12)
+
+project("Apache Thrift")
+
+set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake")
+
+# TODO: add `git rev-parse --short HEAD`
+# Read the version information from the Autoconf file
+file (STRINGS "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" CONFIGURE_AC REGEX "AC_INIT\\(.*\\)" )
+
+# The following variable is used in the version.h.in file
+string(REGEX REPLACE "AC_INIT\\(\\[.*\\], \\[([0-9]+\\.[0-9]+\\.[0-9]+(-dev)?)\\]\\)" "\\1" PACKAGE_VERSION ${CONFIGURE_AC})
+message(STATUS "Parsed Thrift package version: ${PACKAGE_VERSION}")
+
+# These are internal to CMake
+string(REGEX REPLACE "([0-9]+\\.[0-9]+\\.[0-9]+)(-dev)?" "\\1" thrift_VERSION ${PACKAGE_VERSION})
+string(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" thrift_VERSION_MAJOR ${thrift_VERSION})
+string(REGEX REPLACE "[0-9]+\\.([0-9])+\\.[0-9]+" "\\1" thrift_VERSION_MINOR ${thrift_VERSION})
+string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" thrift_VERSION_PATCH ${thrift_VERSION})
+message(STATUS "Parsed Thrift version: ${thrift_VERSION} (${thrift_VERSION_MAJOR}.${thrift_VERSION_MINOR}.${thrift_VERSION_PATCH})")
+
+# Some default settings
+include(DefineCMakeDefaults)
+
+# Build time options are defined here
+include(DefineOptions)
+include(DefineInstallationPaths)
+
+# Based on the options set some platform specifics
+include(DefinePlatformSpecifc)
+
+# Generate the config.h file
+include(ConfigureChecks)
+
+# Package it
+include(CPackConfig)
+
+
+find_package(Threads)
+
+include(CTest)
+if(BUILD_TESTING)
+  message(STATUS "Building with unittests")
+
+  enable_testing()
+  # Define "make check" as alias for "make test"
+  add_custom_target(check COMMAND ctest)
+else ()
+  message(STATUS "Building without tests")
+endif ()
+
+if(BUILD_COMPILER)
+    if(NOT EXISTS ${THRIFT_COMPILER})
+        set(THRIFT_COMPILER $<TARGET_FILE:thrift-compiler>)
+    endif()
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/compiler/cpp)
+elseif(EXISTS ${THRIFT_COMPILER})
+    add_executable(thrift-compiler IMPORTED)
+    set_property(TARGET thrift-compiler PROPERTY IMPORTED_LOCATION ${THRIFT_COMPILER})
+endif()
+
+if(BUILD_CPP)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/cpp)
+    if(BUILD_TUTORIALS)
+        add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/tutorial/cpp)
+    endif()
+    if(BUILD_TESTING)
+        if(WITH_LIBEVENT AND WITH_ZLIB AND WITH_OPENSSL)
+            add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/cpp)
+        else()
+            message(WARNING "libevent and/or ZLIB and/or OpenSSL not found or disabled; will not build some tests")
+        endif()
+    endif()
+endif()
+
+if(BUILD_C_GLIB)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/c_glib)
+endif()
+
+if(BUILD_JAVA)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/java)
+endif()
+
+if(BUILD_PYTHON)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/py)
+    if(BUILD_TESTING)
+        add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/py)
+    endif()
+endif()
+
+if(BUILD_HASKELL)
+    add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/lib/hs)
+    if(BUILD_TESTING)
+        add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/test/hs)
+    endif()
+endif()
+
+PRINT_CONFIG_SUMMARY()

+ 49 - 0
vendor/github.com/apache/thrift/CONTRIBUTING.md

@@ -0,0 +1,49 @@
+## How to contribute
+ 1. Help to review and verify existing patches
+ 1. Make sure your issue is not all ready in the [Jira issue tracker](http://issues.apache.org/jira/browse/THRIFT)
+ 1. If not, create a ticket describing the change you're proposing in the [Jira issue tracker](http://issues.apache.org/jira/browse/THRIFT)
+ 1. Contribute your patch using one of the two methods below
+
+### Contributing via a patch
+
+1. Check out the latest version of the source code
+
+  * git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift
+
+1. Modify the source to include the improvement/bugfix
+
+  * Remember to provide *tests* for all submited changes
+  * When bugfixing: add test that will isolate bug *before* applying change that fixes it
+  * Verify that you follow [Thrift Coding Standards](/docs/coding_standards) (you can run 'make style', which ensures proper format for some languages)
+
+1. Create a patch from project root directory (e.g. you@dev:~/thrift $ ):
+
+  * git diff > ../thrift-XXX-my-new-feature.patch
+
+1. Attach the newly generated patch to the issue
+1. Wait for other contributors or committers to review your new addition
+1. Wait for a committer to commit your patch
+
+### Contributing via GitHub pull requests
+
+1. Create a fork for http://github.com/apache/thrift
+1. Create a branch for your changes(best practice is issue as branch name, e.g. THRIFT-9999)
+1. Modify the source to include the improvement/bugfix
+
+  * Remember to provide *tests* for all submited changes
+  * When bugfixing: add test that will isolate bug *before* applying change that fixes it
+  * Verify that you follow [Thrift Coding Standards](/docs/coding_standards) (you can run 'make style', which ensures proper format for some languages)
+  * Verify that your change works on other platforms by adding a GitHub service hook to [Travis CI](http://docs.travis-ci.com/user/getting-started/#Step-one%3A-Sign-in) and [AppVeyor](http://www.appveyor.com/docs)
+
+1. Commit and push changes to your branch (please use issue name and description as commit title, e.g. THRIFT-9999 make it perfect)
+1. Issue a pull request with the jira ticket number you are working on in it's name
+1. Wait for other contributors or committers to review your new addition
+1. Wait for a committer to commit your patch
+
+### More info
+
+ Plenty of information on why and how to contribute is available on the Apache Software Foundation (ASF) web site. In particular, we recommend the following:
+
+ * [Contributors Tech Guide](http://www.apache.org/dev/contributors)
+ * [Get involved!](http://www.apache.org/foundation/getinvolved.html)
+ * [Legal aspects on Submission of Contributions (Patches)](http://www.apache.org/licenses/LICENSE-2.0.html#contributions)

+ 61 - 0
vendor/github.com/apache/thrift/Dockerfile

@@ -0,0 +1,61 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+# Goal: provide a thrift-compiler Docker image
+#
+# Usage:
+#   docker run -v "${PWD}:/data" thrift/thrift-compiler  -gen cpp -o /data/ /data/test/ThriftTest.thrift
+#
+# further details on docker for thrift is here build/docker/
+#
+# TODO: push to apache/thrift-compiler instead of thrift/thrift-compiler
+
+FROM debian:jessie
+MAINTAINER Apache Thrift <dev@thrift.apache.org>
+
+ENV DEBIAN_FRONTEND noninteractive
+
+ADD . /thrift
+
+RUN buildDeps=" \
+        flex \
+        bison \
+        g++ \
+        make \
+        cmake \
+        curl \
+        "; \
+    apt-get update && apt-get install -y --no-install-recommends $buildDeps \
+    && mkdir /tmp/cmake-build && cd /tmp/cmake-build \
+    && cmake \
+       -DBUILD_COMPILER=ON \
+       -DBUILD_LIBRARIES=OFF \
+       -DBUILD_TESTING=OFF \
+       -DBUILD_EXAMPLES=OFF \
+       /thrift \
+    && cmake --build . --config Release \
+    && make install \
+    && curl -k -sSL "https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz" -o /tmp/go.tar.gz \
+    && tar xzf /tmp/go.tar.gz -C /tmp \
+    && cp /tmp/go/bin/gofmt /usr/bin/gofmt \
+    && apt-get purge -y --auto-remove $buildDeps \
+    && apt-get clean \
+    && rm -rf /tmp/* \
+    && rm -rf /var/lib/apt/lists/*
+
+ENTRYPOINT ["thrift"]

+ 131 - 0
vendor/github.com/apache/thrift/Makefile.am

@@ -0,0 +1,131 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+ACLOCAL_AMFLAGS = -I ./aclocal
+
+if WITH_PLUGIN
+# To enable bootstrap, build order is lib/cpp -> compiler -> others
+SUBDIRS = lib/cpp compiler/cpp lib
+if WITH_TESTS
+SUBDIRS += lib/cpp/test
+endif
+else
+SUBDIRS = compiler/cpp lib
+endif
+
+if WITH_TESTS
+SUBDIRS += test
+endif
+
+if WITH_TUTORIAL
+SUBDIRS += tutorial
+endif
+
+dist-hook:
+	find $(distdir) -type f \( -iname ".DS_Store" -or -iname "._*" -or -iname ".gitignore" \) | xargs rm -rf
+	find $(distdir) -type d \( -iname ".deps" -or -iname ".libs" \) | xargs rm -rf
+	find $(distdir) -type d \( -iname ".svn" -or -iname ".git" \) | xargs rm -rf
+
+print-version:
+	@echo $(VERSION)
+
+.PHONY: precross cross
+precross-%: all
+	$(MAKE) -C $* precross
+precross: all precross-test precross-lib
+
+empty :=
+space := $(empty) $(empty)
+comma := ,
+
+CROSS_LANGS = @MAYBE_CPP@ @MAYBE_C_GLIB@ @MAYBE_D@ @MAYBE_JAVA@ @MAYBE_CSHARP@ @MAYBE_PYTHON@ @MAYBE_PY3@ @MAYBE_RUBY@ @MAYBE_HASKELL@ @MAYBE_PERL@ @MAYBE_PHP@ @MAYBE_GO@ @MAYBE_NODEJS@ @MAYBE_DART@ @MAYBE_ERLANG@ @MAYBE_LUA@
+CROSS_LANGS_COMMA_SEPARATED = $(subst $(space),$(comma),$(CROSS_LANGS))
+
+if WITH_PY3
+CROSS_PY=$(PYTHON3)
+else
+CROSS_PY=$(PYTHON)
+endif
+
+if WITH_PYTHON
+crossfeature: precross
+	$(CROSS_PY) test/test.py --retry-count 3 --features .* --skip-known-failures --server $(CROSS_LANGS_COMMA_SEPARATED)
+else
+# feature test needs python build
+crossfeature:
+endif
+
+cross-%: precross crossfeature
+	$(CROSS_PY) test/test.py --retry-count 3 --skip-known-failures --server $(CROSS_LANGS_COMMA_SEPARATED) --client $(CROSS_LANGS_COMMA_SEPARATED) --regex "$*"
+
+cross: cross-.*
+
+TIMES = 1 2 3
+fail: precross
+	$(CROSS_PY) test/test.py || true
+	$(CROSS_PY) test/test.py --update-expected-failures=overwrite
+	$(foreach var,$(TIMES),test/test.py -s || true;test/test.py --update-expected-failures=merge;)
+
+codespell_skip_files = \
+	*.jar \
+	*.class \
+	*.so \
+	*.a \
+	*.la \
+	*.o \
+	*.p12 \
+	*OCamlMakefile \
+	.keystore \
+	.truststore \
+	CHANGES \
+	config.sub \
+	configure \
+	depcomp \
+	libtool.m4 \
+	output.* \
+	rebar \
+	thrift
+
+skipped_files = $(subst $(space),$(comma),$(codespell_skip_files))
+
+style-local:
+	codespell --write-changes --skip=$(skipped_files) --disable-colors
+
+EXTRA_DIST = \
+	.clang-format \
+	.editorconfig \
+	.travis.yml \
+	appveyor.yml \
+	bower.json \
+	build \
+	CMakeLists.txt \
+	composer.json \
+	contrib \
+	CONTRIBUTING.md \
+	debian \
+	doc \
+	doap.rdf \
+	package.json \
+	sonar-project.properties \
+	Dockerfile \
+	LICENSE \
+	CHANGES \
+	NOTICE \
+	README.md \
+	Thrift.podspec

+ 166 - 0
vendor/github.com/apache/thrift/README.md

@@ -0,0 +1,166 @@
+Apache Thrift
+=============
+
++[![Build Status](https://travis-ci.org/apache/thrift.svg?branch=master)](https://travis-ci.org/apache/thrift)
+-		+[![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/e2qks7enyp9gw7ma?svg=true)](https://ci.appveyor.com/project/apache/thrift)
+
+
+Introduction
+============
+
+Thrift is a lightweight, language-independent software stack with an
+associated code generation mechanism for RPC. Thrift provides clean
+abstractions for data transport, data serialization, and application
+level processing. The code generation system takes a simple definition
+language as its input and generates code across programming languages that
+uses the abstracted stack to build interoperable RPC clients and servers.
+
+Thrift is specifically designed to support non-atomic version changes
+across client and server code.
+
+For more details on Thrift's design and implementation, take a gander at
+the Thrift whitepaper included in this distribution or at the README.md files
+in your particular subdirectory of interest.
+
+Hierarchy
+=========
+
+thrift/
+
+  compiler/
+
+    Contains the Thrift compiler, implemented in C++.
+
+  lib/
+
+    Contains the Thrift software library implementation, subdivided by
+    language of implementation.
+
+    cpp/
+    go/
+    java/
+    php/
+    py/
+    rb/
+
+  test/
+
+    Contains sample Thrift files and test code across the target programming
+    languages.
+
+  tutorial/
+
+    Contains a basic tutorial that will teach you how to develop software
+    using Thrift.
+
+Requirements
+============
+
+See http://thrift.apache.org/docs/install for an up-to-date list of build requirements.
+
+Resources
+=========
+
+More information about Thrift can be obtained on the Thrift webpage at:
+
+     http://thrift.apache.org
+
+Acknowledgments
+===============
+
+Thrift was inspired by pillar, a lightweight RPC tool written by Adam D'Angelo,
+and also by Google's protocol buffers.
+
+Installation
+============
+
+If you are building from the first time out of the source repository, you will
+need to generate the configure scripts.  (This is not necessary if you
+downloaded a tarball.)  From the top directory, do:
+
+    ./bootstrap.sh
+
+Once the configure scripts are generated, thrift can be configured.
+From the top directory, do:
+
+    ./configure
+
+You may need to specify the location of the boost files explicitly.
+If you installed boost in /usr/local, you would run configure as follows:
+
+    ./configure --with-boost=/usr/local
+
+Note that by default the thrift C++ library is typically built with debugging
+symbols included. If you want to customize these options you should use the
+CXXFLAGS option in configure, as such:
+
+    ./configure CXXFLAGS='-g -O2'
+    ./configure CFLAGS='-g -O2'
+    ./configure CPPFLAGS='-DDEBUG_MY_FEATURE'
+
+To enable gcov required options -fprofile-arcs -ftest-coverage enable them:
+
+    ./configure  --enable-coverage
+
+Run ./configure --help to see other configuration options
+
+Please be aware that the Python library will ignore the --prefix option
+and just install wherever Python's distutils puts it (usually along
+the lines of /usr/lib/pythonX.Y/site-packages/).  If you need to control
+where the Python modules are installed, set the PY_PREFIX variable.
+(DESTDIR is respected for Python and C++.)
+
+Make thrift:
+
+	make
+
+From the top directory, become superuser and do:
+
+	make install
+
+Note that some language packages must be installed manually using build tools
+better suited to those languages (at the time of this writing, this applies
+to Java, Ruby, PHP).
+
+Look for the README.md file in the lib/<language>/ folder for more details on the
+installation of each language library package.
+
+Testing
+=======
+
+There are a large number of client library tests that can all be run
+from the top-level directory.
+
+          make -k check
+
+This will make all of the libraries (as necessary), and run through
+the unit tests defined in each of the client libraries. If a single
+language fails, the make check will continue on and provide a synopsis
+at the end.
+
+To run the cross-language test suite, please run:
+
+          make cross
+
+This will run a set of tests that use different language clients and
+servers.
+
+License
+=======
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.

+ 18 - 0
vendor/github.com/apache/thrift/Thrift.podspec

@@ -0,0 +1,18 @@
+Pod::Spec.new do |s|
+  s.name          = "Thrift"
+  s.version       = "0.10.0"
+  s.summary       = "Apache Thrift is a lightweight, language-independent software stack with an associated code generation mechanism for RPC."
+  s.description   = <<-DESC
+The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
+                    DESC
+  s.homepage      = "http://thrift.apache.org"
+  s.license       = { :type => 'Apache License, Version 2.0', :url => 'https://raw.github.com/apache/thrift/thrift-0.9.0/LICENSE' }
+  s.author        = { "The Apache Software Foundation" => "apache@apache.org" }
+  s.requires_arc  = true
+  s.ios.deployment_target = '7.0'
+  s.osx.deployment_target = '10.8'
+  s.ios.framework = 'CFNetwork'
+  s.osx.framework = 'CoreServices'
+  s.source        = { :git => "https://github.com/apache/thrift.git", :tag => "thrift-0.10.0" }
+  s.source_files  = 'lib/cocoa/src/**/*.{h,m,swift}'
+end

+ 54 - 0
vendor/github.com/apache/thrift/bootstrap.sh

@@ -0,0 +1,54 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+./cleanup.sh
+if test -d lib/php/src/ext/thrift_protocol ; then
+    if phpize -v >/dev/null 2>/dev/null ; then
+        (cd lib/php/src/ext/thrift_protocol && phpize)
+    fi
+fi
+
+set -e
+
+# libtoolize is called "glibtoolize" on OSX.
+if libtoolize --version 1 >/dev/null 2>/dev/null; then
+  LIBTOOLIZE=libtoolize
+elif glibtoolize --version 1 >/dev/null 2>/dev/null; then
+  LIBTOOLIZE=glibtoolize
+else
+  echo >&2 "Couldn't find libtoolize!"
+  exit 1
+fi
+
+# we require automake 1.13 or later
+# check must happen externally due to use of newer macro
+AUTOMAKE_VERSION=`automake --version | grep automake | egrep -o '([0-9]{1,}\.)+[0-9]{1,}'`
+if [ "$AUTOMAKE_VERSION" \< "1.13" ]; then
+  echo >&2 "automake version $AUTOMAKE_VERSION is too old (need 1.13 or later)"
+  exit 1
+fi
+
+autoscan
+$LIBTOOLIZE --copy --automake
+aclocal -I ./aclocal
+autoheader
+autoconf
+automake --copy --add-missing --foreign

+ 16 - 0
vendor/github.com/apache/thrift/bower.json

@@ -0,0 +1,16 @@
+{
+  "name": "thrift",
+  "version": "0.10.0",
+  "homepage": "https://git-wip-us.apache.org/repos/asf/thrift.git",
+  "authors": [
+    "Apache Thrift <dev@thrift.apache.org>"
+  ],
+  "description": "Apache Thrift",
+  "main": "lib/js/src/thrift.js",
+  "keywords": [
+    "thrift"
+  ],
+  "license": "Apache v2",
+  "ignore": [
+  ]
+}

+ 89 - 0
vendor/github.com/apache/thrift/cleanup.sh

@@ -0,0 +1,89 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+topsrcdir="`dirname $0`"
+cd "$topsrcdir"
+
+make -k clean >/dev/null 2>&1
+make -k distclean >/dev/null 2>&1
+find . -name Makefile.in -exec rm -f {} \;
+rm -rf \
+AUTHORS \
+ChangeLog \
+INSTALL \
+Makefile \
+Makefile.in \
+Makefile.orig \
+aclocal/libtool.m4 \
+aclocal/ltoptions.m4 \
+aclocal/ltsugar.m4 \
+aclocal/ltversion.m4 \
+aclocal/lt~obsolete.m4 \
+aclocal.m4 \
+autom4te.cache \
+autoscan.log \
+config.guess \
+config.h \
+config.hin \
+config.hin~ \
+config.log \
+config.status \
+config.status.lineno \
+config.sub \
+configure \
+configure.lineno \
+configure.scan \
+depcomp \
+.deps \
+install-sh \
+.libs \
+libtool \
+ltmain.sh \
+missing \
+ylwrap \
+if/gen-* \
+test/gen-* \
+lib/php/src/ext/thrift_protocol/.deps \
+lib/php/src/ext/thrift_protocol/Makefile \
+lib/php/src/ext/thrift_protocol/Makefile.fragments \
+lib/php/src/ext/thrift_protocol/Makefile.global \
+lib/php/src/ext/thrift_protocol/Makefile.objects \
+lib/php/src/ext/thrift_protocol/acinclude.m4 \
+lib/php/src/ext/thrift_protocol/aclocal.m4 \
+lib/php/src/ext/thrift_protocol/autom4te.cache \
+lib/php/src/ext/thrift_protocol/build \
+lib/php/src/ext/thrift_protocol/config.guess \
+lib/php/src/ext/thrift_protocol/config.h \
+lib/php/src/ext/thrift_protocol/config.h.in \
+lib/php/src/ext/thrift_protocol/config.log \
+lib/php/src/ext/thrift_protocol/config.nice \
+lib/php/src/ext/thrift_protocol/config.status \
+lib/php/src/ext/thrift_protocol/config.sub \
+lib/php/src/ext/thrift_protocol/configure \
+lib/php/src/ext/thrift_protocol/configure.in \
+lib/php/src/ext/thrift_protocol/include \
+lib/php/src/ext/thrift_protocol/install-sh \
+lib/php/src/ext/thrift_protocol/libtool \
+lib/php/src/ext/thrift_protocol/ltmain.sh \
+lib/php/src/ext/thrift_protocol/missing \
+lib/php/src/ext/thrift_protocol/mkinstalldirs \
+lib/php/src/ext/thrift_protocol/modules \
+lib/php/src/ext/thrift_protocol/run-tests.php

+ 30 - 0
vendor/github.com/apache/thrift/composer.json

@@ -0,0 +1,30 @@
+{
+    "name": "apache/thrift",
+    "description": "Apache Thrift RPC system",
+    "homepage": "http://thrift.apache.org/",
+    "type": "library",
+    "license": "Apache-2.0",
+    "authors": [
+        {
+            "name": "Apache Thrift Developers",
+            "email": "dev@thrift.apache.org",
+            "homepage": "http://thrift.apache.org"
+        }
+    ],
+    "support": {
+        "email": "dev@thrift.apache.org",
+        "issues": "https://issues.apache.org/jira/browse/THRIFT"
+    },
+    "require": {
+        "php": ">=5.3.0"
+    },
+    "autoload": {
+        "psr-0": {"Thrift": "lib/php/lib/"}
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "0.10.0"
+        }
+    }
+}

+ 959 - 0
vendor/github.com/apache/thrift/configure.ac

@@ -0,0 +1,959 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+AC_PREREQ(2.65)
+AC_CONFIG_MACRO_DIR([./aclocal])
+
+AC_INIT([thrift], [0.10.0])
+
+AC_CONFIG_AUX_DIR([.])
+
+AM_INIT_AUTOMAKE([1.13 subdir-objects tar-ustar])
+PKG_PROG_PKG_CONFIG
+
+AC_ARG_VAR([PY_PREFIX], [Prefix for installing Python modules.
+                         (Normal --prefix is ignored for Python because
+                         Python has different conventions.)
+                         Default = "/usr"])
+AS_IF([test "x$PY_PREFIX" = x], [PY_PREFIX="/usr"])
+
+AC_ARG_VAR([JAVA_PREFIX], [Prefix for installing the Java lib jar.
+                           Default = "/usr/local/lib"])
+AS_IF([test "x$JAVA_PREFIX" != x], [JAVA_PREFIX="$JAVA_PREFIX/usr/local/lib"],
+      [test "x$PREFIX" != x], [JAVA_PREFIX="$PREFIX/usr/local/lib"],
+      [JAVA_PREFIX="/usr/local/lib"])
+
+AC_ARG_VAR([RUBY_PREFIX], [Prefix for installing Ruby modules.
+                           (Normal --prefix is ignored for Ruby because
+                           Ruby has different conventions.)
+                           Default = none, let ruby setup decide])
+
+AC_ARG_VAR([PHP_PREFIX], [Prefix for installing PHP modules.
+                         (Normal --prefix is ignored for PHP because
+                         PHP has different conventions.)
+                         Default = "/usr/lib/php"])
+AS_IF([test "x$PHP_PREFIX" = x], [PHP_PREFIX="/usr/lib/php"])
+
+AC_ARG_VAR([PHP_CONFIG_PREFIX],
+           [Prefix for installing PHP extension module .ini file.
+            (Normal --prefix is ignored for PHP because PHP has
+             different conventions.)
+           Default = "/etc/php.d"])
+AS_IF([test "x$PHP_CONFIG_PREFIX" = x], [PHP_CONFIG_PREFIX="/etc/php.d"])
+
+AC_ARG_VAR([INSTALLDIRS], [When installing Perl modules, specifies which
+                           of the sets of installation directories
+                           to choose: perl, site or vendor.
+                           Default = "vendor"])
+AS_IF([test "x$INSTALLDIRS" = x], [INSTALLDIRS="vendor"])
+
+AC_ARG_VAR([PERL_PREFIX], [Prefix for installing Perl modules.
+                           (Normal --prefix is ignored for Perl because
+                           Perl has different conventions.)
+                           Ignored, when INSTALLDIRS set to site or vendor.
+                           Default = "/usr/local/lib"])
+AS_IF([test "x$PERL_PREFIX" = x], [PERL_PREFIX="/usr/local"])
+
+AC_ARG_VAR([CABAL_CONFIGURE_FLAGS],
+           [Extra flags to pass to cabal: "cabal Setup.lhs configure $CABAL_CONFIGURE_FLAGS".
+            (Typically used to set --user or force --global.)])
+
+AC_SUBST(CABAL_CONFIGURE_FLAGS)
+
+AC_ARG_VAR([D_IMPORT_PREFIX], [Prefix for installing D modules.
+                           [INCLUDEDIR/d2]])
+AS_IF([test "x$D_IMPORT_PREFIX" = x], [D_IMPORT_PREFIX="${includedir}/d2"])
+
+AC_ARG_VAR([DMD_LIBEVENT_FLAGS], [DMD flags for linking libevent (auto-detected if not set).])
+AC_ARG_VAR([DMD_OPENSSL_FLAGS], [DMD flags for linking OpenSSL (auto-detected if not set).])
+
+AC_PROG_CC
+AC_PROG_CPP
+AC_PROG_CXX
+AC_PROG_INSTALL
+AC_PROG_LIBTOOL
+AC_PROG_MAKE_SET
+AC_PROG_BISON(2.5)
+AC_PROG_YACC
+AC_PROG_LEX
+AM_PROG_LEX
+AC_PROG_LN_S
+AC_PROG_MKDIR_P
+AC_PROG_AWK
+AC_PROG_RANLIB
+
+AC_LANG([C++])
+AX_CXX_COMPILE_STDCXX_11([noext], [optional])
+
+AM_EXTRA_RECURSIVE_TARGETS([style])
+AC_SUBST(CPPSTYLE_CMD, 'find . -type f \( -iname "*.h" -or -iname "*.cpp" -or -iname "*.cc" -or -iname "*.tcc" \) -printf "Reformatting: %h/%f\n" -exec clang-format -i {} \;')
+
+AC_ARG_ENABLE([libs],
+  AS_HELP_STRING([--enable-libs], [build the Apache Thrift libraries [default=yes]]),
+  [], enable_libs=yes
+)
+have_libs=yes
+if test "$enable_libs" = "no"; then
+  have_libs="no"
+  with_cpp="no"
+  with_c_glib="no"
+  with_java="no"
+  with_csharp="no"
+  with_python="no"
+  with_ruby="no"
+  with_haskell="no"
+  with_haxe="no"
+  with_perl="no"
+  with_php="no"
+  with_php_extension="no"
+  with_dart="no"
+  with_erlang="no"
+  with_go="no"
+  with_d="no"
+  with_nodejs="no"
+  with_lua="no"
+fi
+
+
+AX_THRIFT_LIB(cpp, [C++], yes)
+have_cpp=no
+if test "$with_cpp" = "yes";  then
+  AX_BOOST_BASE([1.53.0])
+  if test "x$succeeded" = "xyes" ; then
+    AC_SUBST([BOOST_LIB_DIR], [$(echo "$BOOST_LDFLAGS" | sed -e 's/^\-L//')])
+    AC_SUBST([BOOST_CHRONO_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_chrono.a")])
+    AC_SUBST([BOOST_FILESYSTEM_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_filesystem.a")])
+    AC_SUBST([BOOST_SYSTEM_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_system.a")])
+    AC_SUBST([BOOST_TEST_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_unit_test_framework.a")])
+    AC_SUBST([BOOST_THREAD_LDADD], [$(echo "$BOOST_LIB_DIR/libboost_thread.a")])
+    have_cpp="yes"
+  fi
+
+  AX_CHECK_OPENSSL()
+
+  AX_LIB_EVENT([1.0])
+  have_libevent=$success
+
+  AX_LIB_ZLIB([1.2.3])
+  have_zlib=$success
+
+  AX_THRIFT_LIB(qt4, [Qt], yes)
+  have_qt=no
+  if test "$with_qt4" = "yes";  then
+    PKG_CHECK_MODULES([QT], [QtCore >= 4.3, QtNetwork >= 4.3], have_qt=yes, have_qt=no)
+  fi
+  if test "$have_qt" = "yes"; then
+    AC_PATH_PROGS([QT_MOC], [moc-qt4 moc], "fail")
+    if test "$QT_MOC" = "fail"; then
+      have_qt=no
+    fi
+  fi
+
+  AX_THRIFT_LIB(qt5, [Qt5], yes)
+  have_qt5=no
+  qt_reduce_reloc=""
+  if test "$with_qt5" = "yes";  then
+    PKG_CHECK_MODULES([QT5], [Qt5Core >= 5.0, Qt5Network >= 5.0],
+                      [have_qt5=yes;qt_reduce_reloc=`$PKG_CONFIG --variable=qt_config Qt5Core | grep "reduce_relocations"`],
+                      [have_qt5=no])
+  fi
+  if test "$have_qt5" = "yes"; then
+    AC_PATH_PROGS([QT5_MOC], [moc-qt5 moc], "fail")
+    if test "$QT5_MOC" = "fail"; then
+      have_qt5=no
+    fi
+  fi
+fi
+AM_CONDITIONAL([WITH_CPP], [test "$have_cpp" = "yes"])
+AM_CONDITIONAL([AMX_HAVE_LIBEVENT], [test "$have_libevent" = "yes"])
+AM_CONDITIONAL([AMX_HAVE_ZLIB], [test "$have_zlib" = "yes"])
+AM_CONDITIONAL([AMX_HAVE_QT], [test "$have_qt" = "yes"])
+AM_CONDITIONAL([AMX_HAVE_QT5], [test "$have_qt5" = "yes"])
+AM_CONDITIONAL([QT5_REDUCE_RELOCATIONS], [test "x$qt_reduce_reloc" != "x"])
+
+AX_THRIFT_LIB(c_glib, [C (GLib)], yes)
+if test "$with_c_glib" = "yes"; then
+  PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.0], have_glib2=yes, have_glib2=no)
+  PKG_CHECK_MODULES([GOBJECT], [gobject-2.0 >= 2.0], have_gobject2=yes, have_gobject2=no)
+  if test "$have_glib2" = "yes" -a "$have_gobject2" = "yes" ; then
+    have_c_glib="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_C_GLIB, [test "$have_glib2" = "yes" -a "$have_gobject2" = "yes"])
+
+AX_THRIFT_LIB(csharp, [C#], yes)
+if test "$with_csharp" = "yes";  then
+  PKG_CHECK_MODULES(MONO, mono >= 2.11.0, mono_2_11=yes, mono_2_11=no)
+  if test "$mono_2_11" == "yes"; then
+    AC_PATH_PROG([MCS], [mcs])
+    if test "x$MCS" != "x"; then
+      mono_mcs="yes"
+    fi
+  fi
+  PKG_CHECK_MODULES(MONO, mono >= 2.0.0, net_3_5=yes, net_3_5=no)
+  PKG_CHECK_MODULES(MONO, mono >= 1.2.4, have_mono=yes, have_mono=no)
+  if test "$have_mono" = "yes" ; then
+    have_csharp="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_MONO, [test "$have_csharp" = "yes"])
+AM_CONDITIONAL(NET_2_0, [test "$net_3_5" = "no"])
+AM_CONDITIONAL(MONO_MCS, [test "$mono_mcs" = "yes"])
+
+AX_THRIFT_LIB(java, [Java], yes)
+if test "$with_java" = "yes";  then
+  AX_JAVAC_AND_JAVA
+  AC_PATH_PROG([ANT], [ant])
+  AX_CHECK_ANT_VERSION($ANT, 1.7)
+  AC_SUBST(CLASSPATH)
+  AC_SUBST(ANT_FLAGS)
+  if test "x$JAVA" != "x" && test "x$JAVAC" != "x" && test "x$ANT" != "x" ; then
+    have_java="yes"
+  fi
+fi
+AM_CONDITIONAL([WITH_JAVA], [test "$have_java" = "yes"])
+
+AX_THRIFT_LIB(erlang, [Erlang], yes)
+if test "$with_erlang" = "yes";  then
+  AC_ERLANG_PATH_ERL
+  AC_ERLANG_PATH_ERLC
+  AC_PATH_PROG([REBAR], [rebar])
+  if test -n "$ERLC" ; then
+    AC_ERLANG_SUBST_LIB_DIR
+    # Install into the detected Erlang directory instead of $libdir/erlang/lib
+    ERLANG_INSTALL_LIB_DIR="$ERLANG_LIB_DIR"
+    AC_ERLANG_SUBST_INSTALL_LIB_SUBDIR(AC_PACKAGE_NAME, AC_PACKAGE_VERSION)
+  fi
+  if test -n "$ERL" -a -n "$ERLC" && test "x$REBAR" != "x" ; then
+    have_erlang="yes"
+
+    # otp_release is simply a number (like "17") for OTP17+ while "R16..." for OTP16 or less.
+    # OTP version is currently only used for running tests.
+    if $ERL -eval 'erlang:display(erlang:system_info(otp_release)),halt().' -noshell | grep "^\"R" >/dev/null; then
+      erlang_otp16_or_less="yes"
+    fi
+  fi
+fi
+AM_CONDITIONAL(WITH_ERLANG, [test "$have_erlang" = "yes"])
+AM_CONDITIONAL(ERLANG_OTP16, [test "$erlang_otp16_or_less" = "yes"])
+
+AX_THRIFT_LIB(nodejs, [Nodejs], yes)
+have_nodejs=no
+if test "$with_nodejs" = "yes"; then
+  AC_PATH_PROGS([NODEJS], [nodejs node])
+  AC_PATH_PROG([NPM], [npm])
+  if test "x$NODEJS" != "x" -a "x$NPM" != "x"; then
+    have_nodejs="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_NODEJS, [test "$have_nodejs" = "yes"])
+AM_CONDITIONAL(HAVE_NPM, [test "x$NPM" != "x"])
+
+AX_THRIFT_LIB(lua, [Lua], yes)
+have_lua=no
+if test "$with_lua" = "yes"; then
+  AX_PROG_LUA(5.2,, have_lua="yes", have_lua="no")
+  if test "$have_lua" = "yes"; then
+    AX_LUA_HEADERS(, have_lua="no")
+    AX_LUA_LIBS(, have_lua="no")
+  fi
+fi
+AM_CONDITIONAL(WITH_LUA, [test "$have_lua" = "yes"])
+
+# Find python regardless of with_python value, because it's needed by make cross
+AM_PATH_PYTHON(2.6,, :)
+AX_THRIFT_LIB(python, [Python], yes)
+if test "$with_python" = "yes";  then
+  if test -n "$PYTHON"; then
+    have_python="yes"
+  fi
+  AC_PATH_PROG([TRIAL], [trial])
+  if test -n "$TRIAL"; then
+    have_trial="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_PYTHON, [test "$have_python" = "yes"])
+AM_CONDITIONAL(WITH_TWISTED_TEST, [test "$have_trial" = "yes"])
+
+# Find "python3" executable.
+# It's distro specific and far from ideal but needed to cross test py2-3 at once.
+# TODO: find "python2" if it's 3.x
+if python --version 2>&1 | grep -q "Python 2"; then
+  AC_PATH_PROGS([PYTHON3], [python3 python3.5 python35 python3.4 python34])
+  if test -n "$PYTHON3"; then
+    have_py3="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_PY3, [test "$have_py3" = "yes"])
+
+AX_THRIFT_LIB(perl, [Perl], yes)
+if test "$with_perl" = "yes"; then
+  AC_PATH_PROG([PERL], [perl])
+  if test -n "$PERL" ; then
+    AC_PROG_PERL_MODULES([Bit::Vector], success="yes", success="no")
+    have_perl_bit_vector="$success"
+    AC_PROG_PERL_MODULES([Class::Accessor], success="yes", success="no")
+    have_perl_class_accessor="$success"
+  fi
+  if test -n "$PERL" -a "$have_perl_bit_vector" = "yes" ; then
+    if test -n "$PERL" -a "$have_perl_class_accessor" = "yes" ; then
+      have_perl="yes"
+    fi
+  fi
+fi
+AM_CONDITIONAL(WITH_PERL, [test "$have_perl" = "yes"])
+
+AX_THRIFT_LIB(php, [PHP], yes)
+if test "$with_php" = "yes"; then
+  AC_PATH_PROG([PHP], [php])
+  if test -n "$PHP" ; then
+    have_php="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_PHP, [test "$have_php" = "yes"])
+
+AX_THRIFT_LIB(php_extension, [PHP_EXTENSION], yes)
+if test "$with_php_extension" = "yes"; then
+  if test -f "lib/php/src/ext/thrift_protocol/configure"; then
+    AC_PATH_PROG([PHP_CONFIG], [php-config])
+    if test -n "$PHP_CONFIG" ; then
+      AC_CONFIG_SUBDIRS([lib/php/src/ext/thrift_protocol])
+      have_php_extension="yes"
+    fi
+  fi
+fi
+AM_CONDITIONAL(WITH_PHP_EXTENSION, [test "$have_php_extension" = "yes"])
+
+AC_PATH_PROG([PHPUNIT], [phpunit])
+AM_CONDITIONAL(HAVE_PHPUNIT, [test "x$PHPUNIT" != "x"])
+
+AX_THRIFT_LIB(dart, [DART], yes)
+if test "$with_dart" = "yes"; then
+  AC_PATH_PROG([DART], [dart])
+  AC_PATH_PROG([DARTPUB], [pub])
+  if test "x$DART" != "x" -a "x$DARTPUB" != "x"; then
+    have_dart="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_DART, [test "$have_dart" = "yes"])
+
+AX_THRIFT_LIB(ruby, [Ruby], yes)
+have_ruby=no
+if test "$with_ruby" = "yes"; then
+  AC_PATH_PROG([RUBY], [ruby])
+  AC_PATH_PROG([BUNDLER], [bundle])
+  if test "x$RUBY" != "x" -a "x$BUNDLER" != "x"; then
+    have_ruby="yes"
+  fi
+fi
+AM_CONDITIONAL(WITH_RUBY, [test "$have_ruby" = "yes"])
+AM_CONDITIONAL(HAVE_BUNDLER, [test "x$BUNDLER" != "x"])
+
+AX_THRIFT_LIB(haskell, [Haskell], yes)
+have_haskell=no
+RUNHASKELL=true
+CABAL=true
+if test "$with_haskell" = "yes"; then
+  AC_PATH_PROG([CABAL], [cabal])
+  AC_PATH_PROG([RUNHASKELL], [runhaskell])
+  if test "x$CABAL" != "x" -a "x$RUNHASKELL" != "x"; then
+    have_haskell="yes"
+  else
+    RUNHASKELL=true
+    CABAL=true
+  fi
+fi
+AC_SUBST(CABAL)
+AC_SUBST(RUNHASKELL)
+AM_CONDITIONAL(WITH_HASKELL, [test "$have_haskell" = "yes"])
+
+AX_THRIFT_LIB(go, [Go], yes)
+if test "$with_go" = "yes";  then
+  AC_PATH_PROG([GO], [go])
+  if [[ -x "$GO" ]] ; then
+    AS_IF([test -n "$GO"],[
+      ax_go_version="1.4"
+
+      AC_MSG_CHECKING([for Go version])
+      golang_version=`$GO version 2>&1 | $SED -e 's/\(go \)\(version \)\(go\)\(@<:@0-9@:>@.@<:@0-9@:>@.@<:@0-9@:>@\)\(@<:@\*@:>@*\).*/\4/'`
+      AC_MSG_RESULT($golang_version)
+      AC_SUBST([golang_version],[$golang_version])
+      AX_COMPARE_VERSION([$ax_go_version],[le],[$golang_version],[
+      :
+        have_go="yes"
+      ],[
+      :
+        have_go="no"
+      ])
+    ],[
+      AC_MSG_WARN([could not find Go ])
+      have_go="no"
+    ])
+  fi
+fi
+AM_CONDITIONAL(WITH_GO, [test "$have_go" = "yes"])
+
+
+AX_THRIFT_LIB(haxe, [Haxe], yes)
+if test "$with_haxe" = "yes";  then
+  AC_PATH_PROG([HAXE], [haxe])
+  if [[ -x "$HAXE" ]] ; then
+    AX_PROG_HAXE_VERSION( [3.1.3], have_haxe="yes", have_haxe="no")
+  fi
+fi
+AM_CONDITIONAL(WITH_HAXE, [test "$have_haxe" = "yes"])
+
+
+AX_THRIFT_LIB(d, [D], yes)
+if test "$with_d" = "yes";  then
+  AX_DMD
+  AC_SUBST(DMD)
+  if test "x$DMD" != "x"; then
+    have_d="yes"
+  fi
+fi
+
+# Determine actual name of the generated D library for use in the command line
+# when compiling tests. This is needed because the -l<lib> syntax doesn't work
+# with OPTLINK (Windows).
+lib_prefix=lib
+lib_suffix=a
+case "$host_os" in
+  cygwin* | mingw* | pw32* | cegcc*)
+    lib_prefix=""
+    lib_suffix=lib
+    ;;
+esac
+D_LIB_NAME="${lib_prefix}thriftd.${lib_suffix}"
+AC_SUBST(D_LIB_NAME)
+D_EVENT_LIB_NAME="${lib_prefix}thriftd-event.${lib_suffix}"
+AC_SUBST(D_EVENT_LIB_NAME)
+D_SSL_LIB_NAME="${lib_prefix}thriftd-ssl.${lib_suffix}"
+AC_SUBST(D_SSL_LIB_NAME)
+
+if test "$have_d" = "yes"; then
+  AX_CHECK_D_MODULE(deimos.event2.event)
+  have_deimos_event2=$success
+
+  with_d_event_tests="no"
+  if test "$have_deimos_event2" = "yes"; then
+    if test "x$DMD_LIBEVENT_FLAGS" = "x"; then
+      if test "$dmd_optlink" = "yes"; then
+        AC_MSG_WARN([D libevent interface found, but cannot auto-detect \
+linker flags for OPTLINK. Please set DMD_LIBEVENT_FLAGS manually.])
+      else
+        AX_LIB_EVENT([2.0])
+        if test "$success" = "yes"; then
+          DMD_LIBEVENT_FLAGS=$(echo "$LIBEVENT_LDFLAGS $LIBEVENT_LIBS" | \
+            sed -e 's/^ *//g;s/ *$//g;s/^\(.\)/-L\1/g;s/  */ -L/g')
+          with_d_event_tests="yes"
+        else
+          AC_MSG_WARN([D libevent interface present, but libevent library not found.])
+        fi
+      fi
+    else
+      with_d_event_tests="yes"
+    fi
+  fi
+
+  AX_CHECK_D_MODULE(deimos.openssl.ssl)
+  have_deimos_openssl=$success
+
+  with_d_ssl_tests="no"
+  if test "$have_deimos_openssl" = "yes"; then
+    if test "x$DMD_OPENSSL_FLAGS" = "x"; then
+      if test "$dmd_optlink" = "yes"; then
+        AC_MSG_WARN([D OpenSSL interface found, but cannot auto-detect \
+linker flags for OPTLINK. Please set DMD_OPENSSL_FLAGS manually.])
+      else
+        AX_CHECK_OPENSSL([with_d_ssl_tests="yes"])
+        if test "$with_d_ssl_tests" = "yes"; then
+          DMD_OPENSSL_FLAGS=$(echo "$OPENSSL_LDFLAGS $OPENSSL_LIBS" | \
+            sed -e 's/^ *//g;s/ *$//g;s/^\(.\)/-L\1/g;s/  */ -L/g')
+        else
+          AC_MSG_WARN([D OpenSSL interface present, but OpenSSL library not found.])
+        fi
+      fi
+    else
+      with_d_ssl_tests="yes"
+    fi
+  fi
+fi
+
+AM_CONDITIONAL(WITH_D, [test "$have_d" = "yes"])
+AM_CONDITIONAL(DMD_OPTLINK, [test "$dmd_optlink" = "yes"])
+AC_SUBST(DMD_OF_DIRSEP, "$dmd_of_dirsep")
+AM_CONDITIONAL(HAVE_DEIMOS_EVENT2, [test "$have_deimos_event2" = "yes"])
+AM_CONDITIONAL(WITH_D_EVENT_TESTS, [test "$with_d_event_tests" = "yes"])
+AC_SUBST(DMD_LIBEVENT_FLAGS)
+AM_CONDITIONAL(HAVE_DEIMOS_OPENSSL, [test "$have_deimos_openssl" = "yes"])
+AM_CONDITIONAL(WITH_D_SSL_TESTS, [test "$with_d_ssl_tests" = "yes"])
+AC_SUBST(DMD_OPENSSL_FLAGS)
+
+AC_ARG_ENABLE([tests],
+  AS_HELP_STRING([--enable-tests], [build tests [default=yes]]),
+  [], enable_tests=yes
+)
+have_tests=yes
+if test "$enable_tests" = "no"; then
+  have_tests="no"
+fi
+AM_CONDITIONAL(WITH_TESTS, [test "$have_tests" = "yes"])
+
+AC_ARG_ENABLE([plugin],
+  AS_HELP_STRING([--enable-plugin], [build compiler plugin support [default=yes]]),
+  [], enable_plugin=yes
+)
+have_plugin=yes
+if test "$have_cpp" = "no" ; then
+  have_plugin="no"
+fi
+if test "$enable_plugin" = "no"; then
+  have_plugin="no"
+fi
+if test "$have_plugin" = "yes" ; then
+  AC_CONFIG_LINKS([compiler/cpp/test/plugin/t_cpp_generator.cc:compiler/cpp/src/thrift/generate/t_cpp_generator.cc])
+fi
+AM_CONDITIONAL(WITH_PLUGIN, [test "$have_plugin" = "yes"])
+
+AC_ARG_ENABLE([tutorial],
+  AS_HELP_STRING([--enable-tutorial], [build tutorial [default=yes]]),
+  [], enable_tutorial=yes
+)
+have_tutorial=yes
+if test "$enable_tutorial" = "no"; then
+  have_tutorial="no"
+fi
+AM_CONDITIONAL(WITH_TUTORIAL, [test "$have_tutorial" = "yes"])
+
+AM_CONDITIONAL(MINGW, false)
+case "${host_os}" in
+*mingw*)
+  mingw32_support="yes"
+  AC_CHECK_HEADER(windows.h)
+  AM_CONDITIONAL(MINGW, true)
+  ;;
+*)
+  AC_ISC_POSIX
+  ;;
+esac
+
+AC_C_CONST
+AC_C_INLINE
+AC_C_VOLATILE
+
+AC_HEADER_STDBOOL
+AC_HEADER_STDC
+AC_HEADER_TIME
+AC_HEADER_SYS_WAIT
+AC_TYPE_SIGNAL
+AC_CHECK_HEADERS([arpa/inet.h])
+AC_CHECK_HEADERS([sys/param.h])
+AC_CHECK_HEADERS([fcntl.h])
+AC_CHECK_HEADERS([inttypes.h])
+AC_CHECK_HEADERS([limits.h])
+AC_CHECK_HEADERS([netdb.h])
+AC_CHECK_HEADERS([netinet/in.h])
+AC_CHECK_HEADERS([pthread.h])
+AC_CHECK_HEADERS([stddef.h])
+AC_CHECK_HEADERS([stdlib.h])
+AC_CHECK_HEADERS([sys/socket.h])
+AC_CHECK_HEADERS([sys/time.h])
+AC_CHECK_HEADERS([sys/un.h])
+AC_CHECK_HEADERS([sys/poll.h])
+AC_CHECK_HEADERS([sys/resource.h])
+AC_CHECK_HEADERS([unistd.h])
+AC_CHECK_HEADERS([libintl.h])
+AC_CHECK_HEADERS([malloc.h])
+AC_CHECK_HEADERS([openssl/ssl.h])
+AC_CHECK_HEADERS([openssl/rand.h])
+AC_CHECK_HEADERS([openssl/x509v3.h])
+AC_CHECK_HEADERS([sched.h])
+AC_CHECK_HEADERS([wchar.h])
+
+AC_CHECK_LIB(pthread, pthread_create)
+dnl NOTE(dreiss): I haven't been able to find any really solid docs
+dnl on what librt is and how it fits into various Unix systems.
+dnl My best guess is that it is where glibc stashes its implementation
+dnl of the POSIX Real-Time Extensions.  This seems necessary on Linux,
+dnl and we haven't yet found a system where this is a problem.
+AC_CHECK_LIB(rt, clock_gettime)
+AC_CHECK_LIB(socket, setsockopt)
+
+AC_TYPE_INT16_T
+AC_TYPE_INT32_T
+AC_TYPE_INT64_T
+AC_TYPE_INT8_T
+AC_TYPE_MODE_T
+AC_TYPE_OFF_T
+AC_TYPE_SIZE_T
+AC_TYPE_SSIZE_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT64_T
+AC_TYPE_UINT8_T
+AC_CHECK_TYPES([ptrdiff_t], [], [exit 1])
+
+AC_STRUCT_TM
+
+dnl NOTE(dreiss): AI_ADDRCONFIG is not defined on OpenBSD.
+AC_CHECK_DECL([AI_ADDRCONFIG], [],
+              [AC_DEFINE([AI_ADDRCONFIG], 0,
+                         [Define if the AI_ADDRCONFIG symbol is unavailable])],
+              [
+  #include <sys/types.h>
+  #include <sys/socket.h>
+  #include <netdb.h>
+])
+
+AC_FUNC_ALLOCA
+AC_FUNC_FORK
+AC_FUNC_MALLOC
+AC_FUNC_MEMCMP
+AC_FUNC_REALLOC
+AC_FUNC_SELECT_ARGTYPES
+AC_FUNC_STAT
+AC_FUNC_STRERROR_R
+AC_FUNC_STRFTIME
+AC_FUNC_VPRINTF
+AC_CHECK_FUNCS([strtoul])
+AC_CHECK_FUNCS([bzero])
+AC_CHECK_FUNCS([ftruncate])
+AC_CHECK_FUNCS([gethostbyname])
+AC_CHECK_FUNCS([gethostbyname_r])
+AC_CHECK_FUNCS([gettimeofday])
+AC_CHECK_FUNCS([memmove])
+AC_CHECK_FUNCS([memset])
+AC_CHECK_FUNCS([mkdir])
+AC_CHECK_FUNCS([realpath])
+AC_CHECK_FUNCS([select])
+AC_CHECK_FUNCS([setlocale])
+AC_CHECK_FUNCS([socket])
+AC_CHECK_FUNCS([strchr])
+AC_CHECK_FUNCS([strdup])
+AC_CHECK_FUNCS([strerror])
+AC_CHECK_FUNCS([strstr])
+AC_CHECK_FUNCS([strtol])
+AC_CHECK_FUNCS([sqrt])
+dnl The following functions are optional.
+AC_CHECK_FUNCS([alarm])
+AC_CHECK_FUNCS([clock_gettime])
+AC_CHECK_FUNCS([sched_get_priority_min])
+AC_CHECK_FUNCS([sched_get_priority_max])
+AC_CHECK_FUNCS([inet_ntoa])
+AC_CHECK_FUNCS([pow])
+
+if test "$cross_compiling" = "no" ; then
+  AX_SIGNED_RIGHT_SHIFT
+fi
+
+dnl autoscan thinks we need this macro because we have a member function
+dnl called "error".  Invoke the macro but don't run the check so autoscan
+dnl thinks we are in the clear.  It's highly unlikely that we will ever
+dnl actually use the function that this checks for.
+if false ; then
+  AC_FUNC_ERROR_AT_LINE
+fi
+
+# --- Coverage hooks ---
+
+AC_ARG_ENABLE(coverage,
+              [  --enable-coverage      turn on -fprofile-arcs -ftest-coverage],
+              [case "${enableval}" in
+                yes) ENABLE_COVERAGE=1 ;;
+                no) ENABLE_COVERAGE=0 ;;
+                *) AC_MSG_ERROR(bad value ${enableval} for --enable-cov) ;;
+              esac],
+              [ENABLE_COVERAGE=2])
+
+if test "x[$]ENABLE_COVERAGE" = "x1"; then
+  AC_MSG_WARN(enable coverage)
+  GCOV_CFLAGS="`echo \"[$]CFLAGS\" | perl -pe 's/-O\d+//g;'` -fprofile-arcs -ftest-coverage"
+  GCOV_CXXFLAGS="`echo \"[$]CXXFLAGS\" | perl -pe 's/-O\d+//g;'` -fprofile-arcs -ftest-coverage"
+  GCOV_LDFLAGS="-XCClinker -fprofile-arcs -XCClinker -ftest-coverage"
+fi
+
+AC_SUBST(ENABLE_COVERAGE)
+AC_SUBST(GCOV_CFLAGS)
+AC_SUBST(GCOV_CXXFLAGS)
+AC_SUBST(GCOV_LDFLAGS)
+
+AC_ARG_ENABLE(boostthreads,
+              [  --enable-boostthreads      use boost threads, instead of POSIX pthread (experimental) ],
+              [case "${enableval}" in
+                yes) ENABLE_BOOSTTHREADS=1 ;;
+                no) ENABLE_BOOSTTHREADS=0 ;;
+                *) AC_MSG_ERROR(bad value ${enableval} for --enable-cov) ;;
+              esac],
+              [ENABLE_BOOSTTHREADS=2])
+
+
+if test "x[$]ENABLE_BOOSTTHREADS" = "x1"; then
+  AC_MSG_WARN(enable boostthreads)
+  AC_DEFINE([USE_BOOST_THREAD], [1], [experimental --enable-boostthreads that replaces POSIX pthread by boost::thread])
+  LIBS="-lboost_thread $LIBS"
+fi
+
+AM_CONDITIONAL([WITH_BOOSTTHREADS], [test "x[$]ENABLE_BOOSTTHREADS" = "x1"])
+
+AC_CONFIG_HEADERS(config.h:config.hin)
+AC_CONFIG_HEADERS(lib/cpp/src/thrift/config.h:config.hin)
+AC_CONFIG_HEADERS(lib/c_glib/src/thrift/config.h:config.hin)
+# gruard against pre defined config.h
+AH_TOP([
+#ifndef CONFIG_H
+#define CONFIG_H
+])
+AH_BOTTOM([
+#endif
+])
+
+
+AC_CONFIG_FILES([
+  Makefile
+  compiler/cpp/Makefile
+  compiler/cpp/src/Makefile
+  compiler/cpp/src/thrift/plugin/Makefile
+  compiler/cpp/test/Makefile
+  compiler/cpp/src/thrift/version.h
+  lib/Makefile
+  lib/cpp/Makefile
+  lib/cpp/test/Makefile
+  lib/cpp/thrift-nb.pc
+  lib/cpp/thrift-z.pc
+  lib/cpp/thrift-qt.pc
+  lib/cpp/thrift-qt5.pc
+  lib/cpp/thrift.pc
+  lib/c_glib/Makefile
+  lib/c_glib/thrift_c_glib.pc
+  lib/c_glib/test/Makefile
+  lib/csharp/Makefile
+  lib/csharp/test/Multiplex/Makefile
+  lib/d/Makefile
+  lib/d/test/Makefile
+  lib/erl/Makefile
+  lib/go/Makefile
+  lib/go/test/Makefile
+  lib/haxe/test/Makefile
+  lib/hs/Makefile
+  lib/java/Makefile
+  lib/js/Makefile
+  lib/js/test/Makefile
+  lib/json/Makefile
+  lib/json/test/Makefile
+  lib/nodejs/Makefile
+  lib/perl/Makefile
+  lib/perl/test/Makefile
+  lib/php/Makefile
+  lib/php/test/Makefile
+  lib/dart/Makefile
+  lib/py/Makefile
+  lib/rb/Makefile
+  lib/lua/Makefile
+  lib/xml/Makefile
+  lib/xml/test/Makefile
+  test/Makefile
+  test/features/Makefile
+  test/c_glib/Makefile
+  test/cpp/Makefile
+  test/csharp/Makefile
+  test/erl/Makefile
+  test/go/Makefile
+  test/haxe/Makefile
+  test/hs/Makefile
+  test/lua/Makefile
+  test/php/Makefile
+  test/dart/Makefile
+  test/perl/Makefile
+  test/py/Makefile
+  test/py.twisted/Makefile
+  test/py.tornado/Makefile
+  test/rb/Makefile
+  tutorial/Makefile
+  tutorial/c_glib/Makefile
+  tutorial/cpp/Makefile
+  tutorial/d/Makefile
+  tutorial/go/Makefile
+  tutorial/haxe/Makefile
+  tutorial/hs/Makefile
+  tutorial/java/Makefile
+  tutorial/js/Makefile
+  tutorial/nodejs/Makefile
+  tutorial/dart/Makefile
+  tutorial/py/Makefile
+  tutorial/py.twisted/Makefile
+  tutorial/py.tornado/Makefile
+  tutorial/rb/Makefile
+])
+
+if test "$have_cpp" = "yes" ; then MAYBE_CPP="cpp" ; else MAYBE_CPP="" ; fi
+AC_SUBST([MAYBE_CPP])
+if test "$have_c_glib" = "yes" ; then MAYBE_C_GLIB="c_glib" ; else MAYBE_C_GLIB="" ; fi
+AC_SUBST([MAYBE_C_GLIB])
+if test "$have_d" = "yes" -a "$have_deimos_event2" = "yes" -a "$have_deimos_openssl" = "yes"; then MAYBE_D="d" ; else MAYBE_D="" ; fi
+AC_SUBST([MAYBE_D])
+if test "$have_java" = "yes" ; then MAYBE_JAVA="java" ; else MAYBE_JAVA="" ; fi
+AC_SUBST([MAYBE_JAVA])
+if test "$have_csharp" = "yes" ; then MAYBE_CSHARP="csharp" ; else MAYBE_CSHARP="" ; fi
+AC_SUBST([MAYBE_CSHARP])
+if test "$have_python" = "yes" ; then MAYBE_PYTHON="py" ; else MAYBE_PYTHON="" ; fi
+AC_SUBST([MAYBE_PYTHON])
+if test "$have_py3" = "yes" ; then MAYBE_PY3="py3" ; else MAYBE_PY3="" ; fi
+AC_SUBST([MAYBE_PY3])
+if test "$have_ruby" = "yes" ; then MAYBE_RUBY="rb" ; else MAYBE_RUBY="" ; fi
+AC_SUBST([MAYBE_RUBY])
+if test "$have_haskell" = "yes" ; then MAYBE_HASKELL="hs" ; else MAYBE_HASKELL="" ; fi
+AC_SUBST([MAYBE_HASKELL])
+if test "$have_perl" = "yes" ; then MAYBE_PERL="perl" ; else MAYBE_PERL="" ; fi
+AC_SUBST([MAYBE_PERL])
+if test "$have_php" = "yes" ; then MAYBE_PHP="php" ; else MAYBE_PHP="" ; fi
+AC_SUBST([MAYBE_PHP])
+if test "$have_dart" = "yes" ; then MAYBE_DART="dart" ; else MAYBE_DART="" ; fi
+AC_SUBST([MAYBE_DART])
+if test "$have_go" = "yes" ; then MAYBE_GO="go" ; else MAYBE_GO="" ; fi
+AC_SUBST([MAYBE_GO])
+if test "$have_nodejs" = "yes" ; then MAYBE_NODEJS="nodejs" ; else MAYBE_NODEJS="" ; fi
+AC_SUBST([MAYBE_NODEJS])
+if test "$have_erlang" = "yes" ; then MAYBE_ERLANG="erl" ; else MAYBE_ERLANG="" ; fi
+AC_SUBST([MAYBE_ERLANG])
+if test "$have_lua" = "yes" ; then MAYBE_LUA="lua" ; else MAYBE_LUA="" ; fi
+AC_SUBST([MAYBE_LUA])
+
+AC_OUTPUT
+
+
+echo
+echo "$PACKAGE $VERSION"
+echo
+echo "Building Plugin Support ...... : $have_plugin"
+echo "Building C++ Library ......... : $have_cpp"
+echo "Building C (GLib) Library .... : $have_c_glib"
+echo "Building Java Library ........ : $have_java"
+echo "Building C# Library .......... : $have_csharp"
+echo "Building Python Library ...... : $have_python"
+echo "Building Ruby Library ........ : $have_ruby"
+echo "Building Haxe Library ........ : $have_haxe"
+echo "Building Haskell Library ..... : $have_haskell"
+echo "Building Perl Library ........ : $have_perl"
+echo "Building PHP Library ......... : $have_php"
+echo "Building Dart Library ........ : $have_dart"
+echo "Building Erlang Library ...... : $have_erlang"
+echo "Building Go Library .......... : $have_go"
+echo "Building D Library ........... : $have_d"
+echo "Building NodeJS Library ...... : $have_nodejs"
+echo "Building Lua Library ......... : $have_lua"
+
+if test "$have_cpp" = "yes" ; then
+  echo
+  echo "C++ Library:"
+  echo "   Build TZlibTransport ...... : $have_zlib"
+  echo "   Build TNonblockingServer .. : $have_libevent"
+  echo "   Build TQTcpServer (Qt4) .... : $have_qt"
+  echo "   Build TQTcpServer (Qt5) .... : $have_qt5"
+fi
+if test "$have_java" = "yes" ; then
+  echo
+  echo "Java Library:"
+  echo "   Using javac ............... : $JAVAC"
+  echo "   Using java ................ : $JAVA"
+  echo "   Using ant ................. : $ANT"
+fi
+if test "$have_csharp" = "yes" ; then
+  echo
+  echo "C# Library:"
+  echo "   Using .NET 3.5 ............ : $net_3_5"
+fi
+if test "$have_python" = "yes" ; then
+  echo
+  echo "Python Library:"
+  echo "   Using Python .............. : $PYTHON"
+  if test "$have_py3" = "yes" ; then
+  echo "   Using Python3 ............. : $PYTHON3"
+  fi
+  if test "$have_trial" = "yes"; then
+  echo "   Using trial ............... : $TRIAL"
+  fi
+fi
+if test "$have_php" = "yes" ; then
+  echo
+  echo "PHP Library:"
+  echo "   Using php-config .......... : $PHP_CONFIG"
+fi
+if test "$have_dart" = "yes" ; then
+  echo
+  echo "Dart Library:"
+  echo "   Using Dart ................ : $DART"
+  echo "   Using Pub ................. : $DARTPUB"
+fi
+if test "$have_ruby" = "yes" ; then
+  echo
+  echo "Ruby Library:"
+  echo "   Using Ruby ................ : $RUBY"
+fi
+if test "$have_haskell" = "yes" ; then
+  echo
+  echo "Haskell Library:"
+  echo "   Using Haskell ............. : $RUNHASKELL"
+  echo "   Using Cabal ............... : $CABAL"
+fi
+if test "$have_haxe" = "yes" ; then
+  echo
+  echo "Haxe Library:"
+  echo "   Using Haxe ................ : $HAXE"
+  echo "   Using Haxe version ........ : $HAXE_VERSION"
+fi
+if test "$have_perl" = "yes" ; then
+  echo
+  echo "Perl Library:"
+  echo "   Using Perl ................ : $PERL"
+fi
+if test "$have_erlang" = "yes" ; then
+  echo
+  echo "Erlang Library:"
+  echo "   Using erlc ................ : $ERLC"
+  echo "   Using rebar ............... : $REBAR"
+fi
+if test "$have_go" = "yes" ; then
+  echo
+  echo "Go Library:"
+  echo "   Using Go................... : $GO"
+  echo "   Using Go version........... : $($GO version)"
+fi
+if test "$have_d" = "yes" ; then
+  echo
+  echo "D Library:"
+  echo "   Using D Compiler .......... : $DMD"
+  echo "   Building D libevent tests . : $with_d_event_tests"
+  echo "   Building D SSL tests ...... : $with_d_ssl_tests"
+fi
+if test "$have_nodejs" = "yes" ; then
+  echo
+  echo "NodeJS Library:"
+  echo "   Using NodeJS .............. : $NODEJS"
+  echo "   Using NodeJS version....... : $($NODEJS --version)"
+fi
+if test "$have_lua" = "yes" ; then
+  echo
+  echo "Lua Library:"
+  echo "   Using Lua .............. : $LUA"
+fi
+echo
+echo "If something is missing that you think should be present,"
+echo "please skim the output of configure to find the missing"
+echo "component.  Details are present in config.log."

+ 132 - 0
vendor/github.com/apache/thrift/doap.rdf

@@ -0,0 +1,132 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl"?>
+<rdf:RDF xml:lang="en"
+         xmlns="http://usefulinc.com/ns/doap#"
+         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+         xmlns:asfext="http://projects.apache.org/ns/asfext#"
+         xmlns:foaf="http://xmlns.com/foaf/0.1/">
+<!--
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You 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.
+-->
+  <Project rdf:about="http://thrift.apache.org">
+    <created>2012-04-14</created>
+    <license rdf:resource="http://usefulinc.com/doap/licenses/asl20" />
+    <name>Apache Thrift</name>
+    <homepage rdf:resource="http://thrift.apache.org" />
+    <asfext:pmc rdf:resource="http://thrift.apache.org" />
+    <shortdesc>Apache Thrift software provides a framework for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages. </shortdesc>
+    <description>Apache Thrift allows you to define data types and service interfaces in a simple definition file. Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages. Instead of writing a load of boilerplate code to serialize and transport your objects and invoke remote methods, you can get right down to business. </description>
+    <bug-database rdf:resource="https://issues.apache.org/jira/browse/THRIFT" />
+    <mailing-list rdf:resource="http://thrift.apache.org/mailing/" />
+    <download-page rdf:resource="http://thrift.apache.org/download/" />
+    <programming-language>ActionScript</programming-language>
+    <programming-language>C</programming-language>
+    <programming-language>C#</programming-language>
+    <programming-language>C++</programming-language>
+    <programming-language>Cocoa</programming-language>
+    <programming-language>D</programming-language>
+    <programming-language>Delphi</programming-language>
+    <programming-language>Erlang</programming-language>
+    <programming-language>Go</programming-language>
+    <programming-language>Haskell</programming-language>
+    <programming-language>Java</programming-language>
+    <programming-language>JavaScript</programming-language>
+    <programming-language>node.js</programming-language>
+    <programming-language>OCaml</programming-language>
+    <programming-language>Perl</programming-language>
+    <programming-language>PHP</programming-language>
+    <programming-language>Python</programming-language>
+    <programming-language>SmallTalk</programming-language>
+    <category rdf:resource="http://projects.apache.org/category/http" />
+    <category rdf:resource="http://projects.apache.org/category/library" />
+    <category rdf:resource="http://projects.apache.org/category/network-client" />
+    <category rdf:resource="http://projects.apache.org/category/network-server" />
+    <release rdf:parseType="Collection">
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2015-09-25</created>
+        <revision>0.9.3</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2014-11-05</created>
+        <revision>0.9.2</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2013-08-22</created>
+        <revision>0.9.1</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2012-10-15</created>
+        <revision>0.9.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2011-11-29</created>
+        <revision>0.8.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2011-08-13</created>
+        <revision>0.7.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2011-04-25</created>
+        <revision>0.6.1</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift</name>
+        <created>2011-02-08</created>
+        <revision>0.6.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift (incubating)</name>
+        <created>2010-10-07</created>
+        <revision>0.5.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift (incubating)</name>
+        <created>2010-08-23</created>
+        <revision>0.4.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift (incubating)</name>
+        <created>2010-08-04</created>
+        <revision>0.3.0</revision>
+      </Version>
+      <Version>
+        <name>Apache Thrift (incubating)</name>
+        <created>2009-12-11</created>
+        <revision>0.2.0</revision>
+      </Version>
+    </release>
+    <repository>
+      <GitRepository>
+        <location rdf:resource="https://git-wip-us.apache.org/repos/asf/thrift.git"/>
+        <browse rdf:resource="https://git-wip-us.apache.org/repos/asf?p=thrift.git"/>
+      </GitRepository>
+    </repository>
+    <maintainer>
+      <foaf:Person>
+        <foaf:name>Apache Thrift PMC</foaf:name>
+          <foaf:mbox rdf:resource="mailto:dev@thrift.apache.org"/>
+      </foaf:Person>
+    </maintainer>
+  </Project>
+</rdf:RDF>

+ 109 - 0
vendor/github.com/apache/thrift/lib/Makefile.am

@@ -0,0 +1,109 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+SUBDIRS = json xml
+PRECROSS_TARGET =
+
+if WITH_CPP
+# cpp dir is picked directly by plugin build
+if !WITH_PLUGIN
+SUBDIRS += cpp
+endif
+endif
+
+if WITH_C_GLIB
+SUBDIRS += c_glib
+endif
+
+if WITH_MONO
+SUBDIRS += csharp
+endif
+
+if WITH_JAVA
+SUBDIRS += java
+PRECROSS_TARGET += precross-java
+# JavaScript unit test depends on java
+# so test only if java, ant & co is available
+SUBDIRS += js
+endif
+
+if WITH_PYTHON
+SUBDIRS += py
+endif
+
+if WITH_ERLANG
+SUBDIRS += erl
+endif
+
+if WITH_RUBY
+SUBDIRS += rb
+endif
+
+if WITH_HASKELL
+SUBDIRS += hs
+endif
+
+if WITH_PERL
+SUBDIRS += perl
+endif
+
+if WITH_PHP
+SUBDIRS += php
+endif
+
+if WITH_DART
+SUBDIRS += dart
+endif
+
+if WITH_GO
+SUBDIRS += go
+endif
+
+if WITH_D
+SUBDIRS += d
+PRECROSS_TARGET += precross-d
+endif
+
+if WITH_NODEJS
+SUBDIRS += nodejs
+PRECROSS_TARGET += precross-nodejs
+endif
+
+if WITH_LUA
+SUBDIRS += lua
+endif
+
+# All of the libs that don't use Automake need to go in here
+# so they will end up in our release tarballs.
+EXTRA_DIST = \
+	as3 \
+	cocoa \
+	d \
+	dart \
+	delphi \
+	haxe \
+	javame \
+	js \
+	ocaml \
+	st \
+	ts
+
+precross-%:
+	$(MAKE) -C $* precross
+precross: $(PRECROSS_TARGET)

+ 42 - 0
vendor/github.com/apache/thrift/lib/go/Makefile.am

@@ -0,0 +1,42 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you 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.
+#
+
+SUBDIRS = .
+
+if WITH_TESTS
+SUBDIRS += test
+endif
+
+install:
+	@echo '##############################################################'
+	@echo '##############################################################'
+	@echo 'The Go client library should be installed via "go get", please see /lib/go/README.md'
+	@echo '##############################################################'
+	@echo '##############################################################'
+
+check-local:
+	$(GO) test ./thrift
+
+all-local:
+	$(GO) build ./thrift
+
+EXTRA_DIST = \
+	thrift \
+	coding_standards.md \
+	README.md

+ 81 - 0
vendor/github.com/apache/thrift/lib/go/README.md

@@ -0,0 +1,81 @@
+Thrift Go Software Library
+
+License
+=======
+
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+
+
+Using Thrift with Go
+====================
+
+In following Go conventions, we recommend you use the 'go' tool to install
+Thrift for go.
+
+    $ go get git.apache.org/thrift.git/lib/go/thrift/...
+
+Will retrieve and install the most recent version of the package.
+
+
+A note about optional fields
+============================
+
+The thrift-to-Go compiler tries to represent thrift IDL structs as Go structs.
+We must be able to distinguish between optional fields that are set to their
+default value and optional values which are actually unset, so the generated
+code represents optional fields via pointers.
+
+This is generally intuitive and works well much of the time, but Go does not
+have a syntax for creating a pointer to a constant in a single expression. That
+is, given a struct like
+
+    struct SomeIDLType {
+    	OptionalField *int32
+    }
+
+, the following will not compile:
+
+    x := &SomeIDLType{
+    	OptionalField: &(3),
+    }
+
+(Nor is there any other syntax that's built in to the language)
+
+As such, we provide some helpers that do just this under lib/go/thrift/. E.g.,
+
+    x := &SomeIDLType{
+    	OptionalField: thrift.Int32Ptr(3),
+    }
+
+And so on. The code generator also creates analogous helpers for user-defined
+typedefs and enums.
+
+Adding custom tags to generated Thrift structs
+==============================================
+
+You can add tags to the auto-generated thrift structs using the following format:
+
+    struct foo {
+      1: required string Bar (go.tag = "some_tag:\"some_tag_value\"")
+    }
+    
+which will generate:
+
+    type Foo struct {
+      Bar string `thrift:"bar,1,required" some_tag:"some_tag_value"`
+    }

+ 1 - 0
vendor/github.com/apache/thrift/lib/go/coding_standards.md

@@ -0,0 +1 @@
+Please follow [General Coding Standards](/doc/coding_standards.md)

+ 54 - 0
vendor/github.com/apache/thrift/package.json

@@ -0,0 +1,54 @@
+{
+  "name": "thrift",
+  "description": "node.js bindings for the Apache Thrift RPC system",
+  "homepage": "http://thrift.apache.org/",
+  "repository": {
+    "type": "git",
+    "url": "https://git-wip-us.apache.org/repos/asf/thrift.git"
+  },
+  "version": "0.10.0",
+  "author": {
+    "name": "Apache Thrift Developers",
+    "email": "dev@thrift.apache.org",
+    "url": "http://thrift.apache.org"
+  },
+  "license": "Apache-2.0",
+  "licenses": [
+    {
+      "type": "Apache-2.0",
+      "url": "http://www.apache.org/licenses/LICENSE-2.0"
+    }
+  ],
+  "bugs": {
+    "mail": "dev@thrift.apache.org",
+    "url": "https://issues.apache.org/jira/browse/THRIFT"
+  },
+  "files": [
+    "lib/nodejs/lib/thrift",
+    "lib/nodejs/README.md"
+  ],
+  "directories": {
+    "lib": "./lib/nodejs/lib/thrift"
+  },
+  "main": "./lib/nodejs/lib/thrift",
+  "engines": {
+    "node": ">= 0.2.4"
+  },
+  "dependencies": {
+    "node-int64": "~0.3.0",
+    "q": "1.0.x",
+    "ws": "~0.4.32"
+  },
+  "devDependencies": {
+    "buffer-equals": "^1.0.3",
+    "commander": "2.1.x",
+    "connect": "2.7.x",
+    "istanbul": "^0.3.5",
+    "run-browser": "^2.0.1",
+    "tape": "~3.5.0"
+  },
+  "scripts": {
+    "cover": "lib/nodejs/test/testAll.sh COVER",
+    "test": "lib/nodejs/test/testAll.sh"
+  }
+}

+ 140 - 0
vendor/github.com/apache/thrift/sonar-project.properties

@@ -0,0 +1,140 @@
+# Apache Thrift © The Apache Software Foundation
+# http://www.apache.org/licenses/LICENSE-2.0
+# SPDX-License-Identifier: Apache-2.0
+
+# File: sonar-project.properties
+# Apache Thrift configuration file for Sonar https://analysis.apache.org/
+# Sonar is an open platform to manage code quality http://www.sonarsource.org/
+
+
+# required metadata
+sonar.projectKey=org.apache.thrift
+sonar.projectName=Apache Thrift
+sonar.projectDescription=
+The Apache Thrift software framework, for scalable cross-language services
+development, combines a software stack with a code generation engine to build
+services that work efficiently and seamlessly between all major languages.
+
+# Apache Thrift Version
+sonar.projectVersion=0.10.0
+# use this to set another version string
+# $ sonar-runner -D sonar.projectVersion=`git rev-parse HEAD`
+# set projectDate in combination with projectVersion for imports of old releases
+#sonar.projectDate=yyyy-MM-dd
+
+# TODO add website (sonar.projectUrl does not work)
+#sonar.XXXX=http//thrift.apache.org
+
+# Some properties that will be inherited by the modules
+sonar.sources=src
+sonar.language=java,js,c++,py,c
+sonar.sourceEncoding=UTF-8
+
+# scm
+sonar.scm.url=scm:git:https://git-wip-us.apache.org/repos/asf/thrift
+
+# cppcheck -q --error-exitcode=0 --xml . 2> cppcheck-result.xml
+sonar.cxx.cppcheck.reportPath=cppcheck-result.xml
+
+# List of the module identifiers
+sonar.modules=module1,module3,module4,module5,module6,module7,module8,module9,module10,module11,module12,module14
+
+
+
+# we need sonar-runner 2.1 for this, see http://jira.codehaus.org/browse/SONARPLUGINS-2421
+#sonar.modules=module2
+
+# delph plugin is broken
+#sonar.modules=module13
+
+# phpunit plugin is broken
+#sonar.modules=module15
+
+module1.sonar.projectName=Apache Thrift - Java Library
+module1.sonar.projectBaseDir=lib/java
+module1.sonar.sources=src
+module1.sonar.tests=test
+module1.sonar.binaries=build/libthrift-0.10.0.jar
+module1.sonar.libraries=build/lib/*.jar
+module1.sonar.language=java
+
+module2.sonar.projectName=Apache Thrift - Java Tutorial
+module2.sonar.projectBaseDir=.
+module2.sonar.sources=tutorial/java/src, tutorial/java/gen-java
+module2.sonar.binaries=tutorial/java/tutorial.jar
+module2.sonar.libraries=lib/java/build/lib/*.jar,lib/java/build/libthrift-1.0.0.jar
+module2.sonar.language=java
+
+module3.sonar.projectName=Apache Thrift - JavaScript Library
+module3.sonar.projectBaseDir=lib/js
+module3.sonar.sources=.
+module3.sonar.exclusions=test/**/*
+module3.sonar.language=js
+
+module4.sonar.projectName=Apache Thrift - JavaScript Tutorial
+module4.sonar.projectBaseDir=tutorial/js
+module4.sonar.sources=.
+module4.sonar.language=web
+
+module5.sonar.projectName=Apache Thrift - C++ Library
+module5.sonar.projectBaseDir=lib/cpp
+module5.sonar.sources=src
+module5.sonar.tests=test
+module5.sonar.language=c++
+
+module6.sonar.projectName=Apache Thrift - C++ Tutorial
+module6.sonar.projectBaseDir=tutorial/cpp
+module6.sonar.sources=.
+module6.sonar.exclusions=gen-cpp/**/*
+module6.sonar.language=c++
+
+module7.sonar.projectName=Apache Thrift - C++ Cross Language Test
+module7.sonar.projectBaseDir=test/cpp
+module7.sonar.sources=src
+module7.sonar.language=c++
+
+module8.sonar.projectName=Apache Thrift - Compiler
+module8.sonar.projectBaseDir=compiler/cpp
+module8.sonar.sources=src
+module8.sonar.language=c++
+
+module9.sonar.projectName=Apache Thrift - Python Library
+module9.sonar.projectBaseDir=lib/py
+module9.sonar.sources=src
+module9.sonar.language=py
+
+module10.sonar.projectName=Apache Thrift - Python Tutorial
+module10.sonar.projectBaseDir=tutorial/py
+module10.sonar.sources=.
+module10.sonar.exclusions=gen-py/**/*
+module10.sonar.language=py
+
+module11.sonar.projectName=Apache Thrift - Python Cross Language Test
+module11.sonar.projectBaseDir=test/py
+module11.sonar.sources=.
+module11.sonar.exclusions=gen-*/**/*
+module11.sonar.language=py
+
+module12.sonar.projectName=Apache Thrift - c_glib Library
+module12.sonar.projectBaseDir=lib/c_glib
+module12.sonar.sources=src
+module12.sonar.language=c
+
+module13.sonar.projectName=Apache Thrift - Delphi Library
+module13.sonar.projectBaseDir=lib/delphi
+module13.sonar.sources=src
+module13.sonar.tests=test
+module13.sonar.language=delph
+
+module14.sonar.projectName=Apache Thrift - Flex (as3) Library
+module14.sonar.projectBaseDir=lib/as3
+module14.sonar.sources=src
+module14.sonar.language=flex
+
+module15.sonar.projectName=Apache Thrift - PHP Library
+module15.sonar.projectBaseDir=lib/php
+module15.sonar.sources=src
+module15.sonar.language=php
+
+# TODO add some more languages here
+

+ 11 - 0
vendor/github.com/aws/aws-sdk-go/.gitignore

@@ -0,0 +1,11 @@
+dist
+/doc
+/doc-staging
+.yardoc
+Gemfile.lock
+awstesting/integration/smoke/**/importmarker__.go
+awstesting/integration/smoke/_test/
+/vendor/bin/
+/vendor/pkg/
+/vendor/src/
+/private/model/cli/gen-api/gen-api

+ 14 - 0
vendor/github.com/aws/aws-sdk-go/.godoc_config

@@ -0,0 +1,14 @@
+{
+	"PkgHandler": {
+		"Pattern":          "/sdk-for-go/api/",
+		"StripPrefix":     "/sdk-for-go/api",
+		"Include":         ["/src/github.com/aws/aws-sdk-go/aws", "/src/github.com/aws/aws-sdk-go/service"],
+		"Exclude":         ["/src/cmd", "/src/github.com/aws/aws-sdk-go/awstesting", "/src/github.com/aws/aws-sdk-go/awsmigrate"],
+		"IgnoredSuffixes": ["iface"]
+	},
+	"Github": {
+		"Tag": "master",
+		"Repo": "/aws/aws-sdk-go",
+		"UseGithub": true
+	}
+}

+ 1107 - 0
vendor/github.com/aws/aws-sdk-go/CHANGELOG.md

@@ -1,3 +1,1110 @@
+Release v1.12.65 (2018-01-18)
+===
+
+### Service Client Updates
+* `service/sagemaker`: Updates service API and documentation
+  * CreateTrainingJob and CreateEndpointConfig now supports KMS Key for volume encryption.
+
+Release v1.12.64 (2018-01-17)
+===
+
+### Service Client Updates
+* `service/autoscaling-plans`: Updates service documentation
+* `service/ec2`: Updates service documentation
+  * Documentation updates for EC2
+
+Release v1.12.63 (2018-01-17)
+===
+
+### Service Client Updates
+* `service/application-autoscaling`: Updates service API and documentation
+* `service/autoscaling-plans`: Adds new service
+* `service/rds`: Updates service API and documentation
+  * With this release you can now integrate RDS DB instances with CloudWatch Logs. We have added parameters to the operations for creating and modifying DB instances (for example CreateDBInstance) to allow you to take advantage of this capability through the CLI and API. Once you enable this feature, a stream of log events will publish to CloudWatch Logs for each log type you enable.
+
+Release v1.12.62 (2018-01-15)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/lambda`: Updates service API and documentation
+  * Support for creating Lambda Functions using 'dotnetcore2.0' and 'go1.x'.
+
+Release v1.12.61 (2018-01-12)
+===
+
+### Service Client Updates
+* `service/glue`: Updates service API and documentation
+  * Support is added to generate ETL scripts in Scala which can now be run by  AWS Glue ETL jobs. In addition, the trigger API now supports firing when any conditions are met (in addition to all conditions). Also, jobs can be triggered based on a "failed" or "stopped" job run (in addition to a "succeeded" job run).
+
+Release v1.12.60 (2018-01-11)
+===
+
+### Service Client Updates
+* `service/elasticloadbalancing`: Updates service API and documentation
+* `service/elasticloadbalancingv2`: Updates service API and documentation
+* `service/rds`: Updates service API and documentation
+  * Read Replicas for Amazon RDS for MySQL, MariaDB, and PostgreSQL now support Multi-AZ deployments.Amazon RDS Read Replicas enable you to create one or more read-only copies of your database instance within the same AWS Region or in a different AWS Region. Updates made to the source database are asynchronously copied to the Read Replicas. In addition to providing scalability for read-heavy workloads, you can choose to promote a Read Replica to become standalone a DB instance when needed.Amazon RDS Multi-AZ Deployments provide enhanced availability for database instances within a single AWS Region. With Multi-AZ, your data is synchronously replicated to a standby in a different Availability Zone (AZ). In case of an infrastructure failure, Amazon RDS performs an automatic failover to the standby, minimizing disruption to your applications.You can now combine Read Replicas with Multi-AZ as part of a disaster recovery strategy for your production databases. A well-designed and tested plan is critical for maintaining business continuity after a disaster. Since Read Replicas can also be created in different regions than the source database, your Read Replica can be promoted to become the new production database in case of a regional disruption.You can also combine Read Replicas with Multi-AZ for your database engine upgrade process. You can create a Read Replica of your production database instance and upgrade it to a new database engine version. When the upgrade is complete, you can stop applications, promote the Read Replica to a standalone database instance and switch over your applications. Since the database instance is already a Multi-AZ deployment, no additional steps are needed.For more information, see the Amazon RDS User Guide.
+* `service/ssm`: Updates service documentation
+  * Updates documentation for the HierarchyLevelLimitExceededException error.
+
+Release v1.12.59 (2018-01-09)
+===
+
+### Service Client Updates
+* `service/kms`: Updates service documentation
+  * Documentation updates for AWS KMS
+
+Release v1.12.58 (2018-01-09)
+===
+
+### Service Client Updates
+* `service/ds`: Updates service API and documentation
+  * On October 24 we introduced AWS Directory Service for Microsoft Active Directory (Standard Edition), also known as AWS Microsoft AD (Standard Edition), which is a managed Microsoft Active Directory (AD) that is optimized for small and midsize businesses (SMBs). With this SDK release, you can now create an AWS Microsoft AD directory using API. This enables you to run typical SMB workloads using a cost-effective, highly available, and managed Microsoft AD in the AWS Cloud.
+
+Release v1.12.57 (2018-01-08)
+===
+
+### Service Client Updates
+* `service/codedeploy`: Updates service API and documentation
+  * The AWS CodeDeploy API was updated to support DeleteGitHubAccountToken, a new method that deletes a GitHub account connection.
+* `service/discovery`: Updates service API and documentation
+  * Documentation updates for AWS Application Discovery Service.
+* `service/route53`: Updates service API and documentation
+  * This release adds an exception to the CreateTrafficPolicyVersion API operation.
+
+Release v1.12.56 (2018-01-05)
+===
+
+### Service Client Updates
+* `service/inspector`: Updates service API, documentation, and examples
+  * Added 2 new attributes to the DescribeAssessmentTemplate response, indicating the total number of assessment runs and last assessment run ARN (if present.)
+* `service/snowball`: Updates service documentation
+  * Documentation updates for snowball
+* `service/ssm`: Updates service documentation
+  * Documentation updates for ssm
+
+Release v1.12.55 (2018-01-02)
+===
+
+### Service Client Updates
+* `service/rds`: Updates service documentation
+  * Documentation updates for rds
+
+Release v1.12.54 (2017-12-29)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/workspaces`: Updates service API and documentation
+  * Modify WorkSpaces have been updated with flexible storage and switching of hardware bundles feature. The following configurations have been added to ModifyWorkSpacesProperties: storage and compute. This update provides the capability to configure the storage of a WorkSpace. It also adds the capability of switching hardware bundle of a WorkSpace by specifying an eligible compute (Value, Standard, Performance, Power).
+
+Release v1.12.53 (2017-12-22)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API
+  * This release fixes an issue with tags not showing in DescribeAddresses responses.
+* `service/ecs`: Updates service API and documentation
+  * Amazon ECS users can now set a health check initialization wait period of their ECS services, the services that are associated with an Elastic Load Balancer (ELB) will wait for a period of time before the ELB become healthy. You can now configure this in Create and Update Service.
+* `service/inspector`: Updates service API and documentation
+  * PreviewAgents API now returns additional fields within the AgentPreview data type. The API now shows the agent health and availability status for all instances included in the assessment target. This allows users to check the health status of Inspector Agents before running an assessment. In addition, it shows the instance ID, hostname, and IP address of the targeted instances.
+* `service/sagemaker`: Updates service API and documentation
+  * SageMaker Models no longer support SupplementalContainers.  API's that have been affected are CreateModel and DescribeModel.
+
+Release v1.12.52 (2017-12-21)
+===
+
+### Service Client Updates
+* `service/codebuild`: Updates service API and documentation
+  * Adding support allowing AWS CodeBuild customers to select specific curated image versions.
+* `service/ec2`: Updates service API and documentation
+  * Elastic IP tagging enables you to add key and value metadata to your Elastic IPs so that you can search, filter, and organize them according to your organization's needs.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/kinesisanalytics`: Updates service API and documentation
+  * Kinesis Analytics now supports AWS Lambda functions as output.
+
+Release v1.12.51 (2017-12-21)
+===
+
+### Service Client Updates
+* `service/config`: Updates service API
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/iot`: Updates service API and documentation
+  * This release adds support for code signed Over-the-air update functionality for Amazon FreeRTOS. Users can now create and schedule Over-the-air updates to their Amazon FreeRTOS devices using these new APIs.
+
+Release v1.12.50 (2017-12-19)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service API and documentation
+  * API Gateway now adds support for calling API with compressed payloads using one of the supported content codings, tagging an API stage for cost allocation, and returning API keys from a custom authorizer for use with a usage plan.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/mediastore-data`: Updates service documentation
+* `service/route53`: Updates service API and documentation
+  * Route 53 added support for a new China (Ningxia) region, cn-northwest-1. You can now specify cn-northwest-1 as the region for latency-based or geoproximity routing. Route 53 also added support for a new EU (Paris) region, eu-west-3. You can now associate VPCs in eu-west-3 with private hosted zones and create alias records that route traffic to resources in eu-west-3.
+
+Release v1.12.49 (2017-12-19)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/monitoring`: Updates service documentation
+  * Documentation updates for monitoring
+
+Release v1.12.48 (2017-12-15)
+===
+
+### Service Client Updates
+* `service/appstream`: Updates service API and documentation
+  * This API update is to enable customers to add tags to their Amazon AppStream 2.0 resources
+
+Release v1.12.47 (2017-12-14)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service API and documentation
+  * Adds support for Cognito Authorizer scopes at the API method level.
+* `service/email`: Updates service documentation
+  * Added information about the maximum number of transactions per second for the SendCustomVerificationEmail operation.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.46 (2017-12-12)
+===
+
+### Service Client Updates
+* `service/workmail`: Adds new service
+  * Today, Amazon WorkMail released an administrative SDK and enabled AWS CloudTrail integration. With the administrative SDK, you can natively integrate WorkMail with your existing services. The SDK enables programmatic user, resource, and group management through API calls. This means your existing IT tools and workflows can now automate WorkMail management, and third party applications can streamline WorkMail migrations and account actions.
+
+Release v1.12.45 (2017-12-11)
+===
+
+### Service Client Updates
+* `service/cognito-idp`: Updates service API and documentation
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/lex-models`: Updates service API and documentation
+* `service/sagemaker`: Updates service API
+  * CreateModel API Update:  The request parameter 'ExecutionRoleArn' has changed from optional to required.
+
+Release v1.12.44 (2017-12-08)
+===
+
+### Service Client Updates
+* `service/appstream`: Updates service API and documentation
+  * This API update is to support the feature that allows customers to automatically consume the latest Amazon AppStream 2.0 agent as and when published by AWS.
+* `service/ecs`: Updates service documentation
+  * Documentation updates for Windows containers.
+* `service/monitoring`: Updates service API and documentation
+  * With this launch, you can now create a CloudWatch alarm that alerts you when M out of N datapoints of a metric are breaching your predefined threshold, such as three out of five times in any given five minutes interval or two out of six times in a thirty minutes interval. When M out of N datapoints are not breaching your threshold in an interval, the alarm will be in OK state. Please note that the M datapoints out of N datapoints in an interval can be of any order and does not need to be consecutive. Consequently, you can now get alerted even when the spikes in your metrics are intermittent over an interval.
+
+Release v1.12.43 (2017-12-07)
+===
+
+### Service Client Updates
+* `service/email`: Updates service API, documentation, and paginators
+  * Customers can customize the emails that Amazon SES sends when verifying new identities. This feature is helpful for developers whose applications send email through Amazon SES on behalf of their customers.
+* `service/es`: Updates service API and documentation
+  * Added support for encryption of data at rest on Amazon Elasticsearch Service using AWS KMS
+
+### SDK Bugs
+* `models/apis` Fixes removes colliding sagemaker models folders ([#1686](https://github.com/aws/aws-sdk-go/pull/1686))
+  * Fixes Release v1.12.42's SageMaker vs sagemaker model folders.
+Release v1.12.42 (2017-12-06)
+===
+
+### Service Client Updates
+* `service/clouddirectory`: Updates service API and documentation
+  * Amazon Cloud Directory makes it easier for you to apply schema changes across your directories with in-place schema upgrades. Your directories now remain available while backward-compatible schema changes are being applied, such as the addition of new fields. You also can view the history of your schema changes in Cloud Directory by using both major and minor version identifiers, which can help you track and audit schema versions across directories.
+* `service/elasticbeanstalk`: Updates service documentation
+  * Documentation updates for AWS Elastic Beanstalk.
+* `service/sagemaker`: Adds new service
+  * Initial waiters for common SageMaker workflows.
+
+Release v1.12.41 (2017-12-05)
+===
+
+### Service Client Updates
+* `service/iot`: Updates service API and documentation
+  * Add error action API for RulesEngine.
+* `service/servicecatalog`: Updates service API and documentation
+  * ServiceCatalog has two distinct personas for its use, an "admin" persona (who creates sets of products with different versions and prescribes who has access to them) and an "end-user" persona (who can launch cloud resources based on the configuration data their admins have given them access to).  This API update will allow admin users to deactivate/activate product versions, end-user will only be able to access and launch active product versions.
+* `service/servicediscovery`: Adds new service
+  * Amazon Route 53 Auto Naming lets you configure public or private namespaces that your microservice applications run in. When instances of the service become available, you can call the Auto Naming API to register the instance, and Amazon Route 53 automatically creates up to five DNS records and an optional health check. Clients that submit DNS queries for the service receive an answer that contains up to eight healthy records.
+
+Release v1.12.40 (2017-12-04)
+===
+
+### Service Client Updates
+* `service/budgets`: Updates service API and documentation
+  * Add additional costTypes to support finer control for different charges included in a cost budget.
+* `service/ecs`: Updates service documentation
+  * Documentation updates for ecs
+
+Release v1.12.39 (2017-12-01)
+===
+
+### Service Client Updates
+* `service/SageMaker`: Updates service waiters
+
+Release v1.12.38 (2017-11-30)
+===
+
+### Service Client Updates
+* `service/AWSMoneypenny`: Adds new service
+* `service/Cloud9`: Adds new service
+* `service/Serverless Registry`: Adds new service
+* `service/apigateway`: Updates service API, documentation, and paginators
+  * Added support Private Integration and VPC Link features in API Gateway. This allows to create an API with the API Gateway private integration, thus providing clients access to HTTP/HTTPS resources in an Amazon VPC from outside of the VPC through a VpcLink resource.
+* `service/ec2`: Updates service API and documentation
+  * Adds the following updates: 1. Spread Placement ensures that instances are placed on distinct hardware in order to reduce correlated failures. 2. Inter-region VPC Peering allows customers to peer VPCs across different AWS regions without requiring additional gateways, VPN connections or physical hardware
+* `service/lambda`: Updates service API and documentation
+  * AWS Lambda now supports the ability to set the concurrency limits for individual functions, and increasing memory to 3008 MB.
+
+Release v1.12.37 (2017-11-30)
+===
+
+### Service Client Updates
+* `service/Ardi`: Adds new service
+* `service/autoscaling`: Updates service API and documentation
+  * You can now use Auto Scaling with EC2 Launch Templates via the CreateAutoScalingGroup and UpdateAutoScalingGroup APIs.
+* `service/ec2`: Updates service API and documentation
+  * Adds the following updates: 1. T2 Unlimited enables high CPU performance for any period of time whenever required 2. You are now able to create and launch EC2 m5 and h1 instances
+* `service/lightsail`: Updates service API and documentation
+  * This release adds support for load balancer and TLS/SSL certificate management. This set of APIs allows customers to create, manage, and scale secure load balanced applications on Lightsail infrastructure. To provide support for customers who manage their DNS on Lightsail, we've added the ability create an Alias A type record which can point to a load balancer DNS name via the CreateDomainEntry API http://docs.aws.amazon.com/lightsail/2016-11-28/api-reference/API_CreateDomainEntry.html.
+* `service/ssm`: Updates service API and documentation
+  * This release updates AWS Systems Manager APIs to enable executing automations at controlled rate, target resources in a resource groups and execute entire automation at once or single step at a time. It is now also possible to use YAML, in addition to JSON, when creating Systems Manager documents.
+* `service/waf`: Updates service API and documentation
+  * This release adds support for rule group and managed rule group. Rule group is a container of rules that customers can create, put rules in it and associate the rule group to a WebACL. All rules in a rule group will function identically as they would if each rule was individually associated to the WebACL. Managed rule group is a pre-configured rule group composed by our security partners and made available via the AWS Marketplace. Customers can subscribe to these managed rule groups, associate the managed rule group to their WebACL and start using them immediately to protect their resources.
+* `service/waf-regional`: Updates service API and documentation
+
+Release v1.12.36 (2017-11-29)
+===
+
+### Service Client Updates
+* `service/DeepInsight`: Adds new service
+* `service/IronmanRuntime`: Adds new service
+* `service/Orchestra - Laser`: Adds new service
+* `service/SageMaker`: Adds new service
+* `service/Shine`: Adds new service
+* `service/archived.kinesisvideo`: Adds new service
+* `service/data.kinesisvideo`: Adds new service
+* `service/dynamodb`: Updates service API and documentation
+  * Amazon DynamoDB now supports the following features: Global Table and On-Demand Backup. Global Table is a fully-managed, multi-region, multi-master database. DynamoDB customers can now write anywhere and read anywhere with single-digit millisecond latency by performing database operations closest to where end users reside. Global Table also enables customers to disaster-proof their applications, keeping them running and data accessible even in the face of natural disasters or region disruptions. Customers can set up Global Table with just a few clicks in the AWS Management Console-no application rewrites required. On-Demand Backup capability is to protect data from loss due to application errors, and meet customers' archival needs for compliance and regulatory reasons. Customers can backup and restore their DynamoDB table data anytime, with a single-click in the AWS management console or a single API call. Backup and restore actions execute with zero impact on table performance or availability. For more information, see the Amazon DynamoDB Developer Guide.
+* `service/ecs`: Updates service API and documentation
+  * Amazon Elastic Container Service (Amazon ECS) released a new launch type for running containers on a serverless infrastructure. The Fargate launch type allows you to run your containerized applications without the need to provision and manage the backend infrastructure. Just register your task definition and Fargate launches the container for you.
+* `service/glacier`: Updates service API and documentation
+  * This release includes support for Glacier Select, a new feature that allows you to filter and analyze your Glacier archives and store the results in a user-specified S3 location.
+* `service/greengrass`: Updates service API and documentation
+  * Greengrass OTA feature allows updating Greengrass Core and Greengrass OTA Agent. Local Resource Access feature allows Greengrass Lambdas to access local resources such as peripheral devices and volumes.
+* `service/iot`: Updates service API and documentation
+  * This release adds support for a number of new IoT features, including AWS IoT Device Management (Jobs, Fleet Index and Thing Registration), Thing Groups, Policies on Thing Groups, Registry & Job Events, JSON Logs, Fine-Grained Logging Controls, Custom Authorization and AWS Service Authentication Using X.509 Certificates.
+* `service/kinesisvideo`: Adds new service
+  * Announcing Amazon Kinesis Video Streams, a fully managed video ingestion and storage service. Kinesis Video Streams makes it easy to securely stream video from connected devices to AWS for machine learning, analytics, and processing. You can also stream other time-encoded data like RADAR and LIDAR signals using Kinesis Video Streams.
+* `service/rekognition`: Updates service API, documentation, and paginators
+  * This release introduces Amazon Rekognition support for video analysis.
+* `service/s3`: Updates service API and documentation
+  * This release includes support for Glacier Select, a new feature that allows you to filter and analyze your Glacier storage class objects and store the results in a user-specified S3 location.
+
+Release v1.12.35 (2017-11-29)
+===
+
+### Service Client Updates
+* `service/AmazonMQ`: Adds new service
+* `service/GuardDuty`: Adds new service
+* `service/apigateway`: Updates service API and documentation
+  * Changes related to CanaryReleaseDeployment feature. Enables API developer to create a deployment as canary deployment and test API changes with percentage of customers before promoting changes to all customers.
+* `service/batch`: Updates service API and documentation
+  * Add support for Array Jobs which allow users to easily submit many copies of a job with a single API call. This change also enhances the job dependency model to support N_TO_N and sequential dependency chains. The ListJobs and DescribeJobs APIs now have the ability to list or describe the status of entire Array Jobs or individual elements within the array.
+* `service/cognito-idp`: Updates service API and documentation
+* `service/deepdish`: Adds new service
+  * AWS AppSync is an enterprise-level, fully managed GraphQL service with real-time data synchronization and offline programming features.
+* `service/ec2`: Updates service API and documentation
+  * Adds the following updates: 1. You are now able to host a service powered by AWS PrivateLink to provide private connectivity to other VPCs. You are now also able to create endpoints to other services powered by PrivateLink including AWS services, Marketplace Seller services or custom services created by yourself or other AWS VPC customers. 2. You are now able to save launch parameters in a single template that can be used with Auto Scaling, Spot Fleet, Spot, and On Demand instances. 3. You are now able to launch Spot instances via the RunInstances API, using a single additional parameter. RunInstances will response synchronously with an instance ID should capacity be available for your Spot request. 4. A simplified Spot pricing model which delivers low, predictable prices that adjust gradually, based on long-term trends in supply and demand. 5. Amazon EC2 Spot can now hibernate Amazon EBS-backed instances in the event of an interruption, so your workloads pick up from where they left off. Spot can fulfill your request by resuming instances from a hibernated state when capacity is available.
+* `service/lambda`: Updates service API and documentation
+  * Lambda aliases can now shift traffic between two function versions, based on preassigned weights.
+
+Release v1.12.34 (2017-11-27)
+===
+
+### Service Client Updates
+* `service/data.mediastore`: Adds new service
+* `service/mediaconvert`: Adds new service
+  * AWS Elemental MediaConvert is a file-based video conversion service that transforms media into formats required for traditional broadcast and for internet streaming to multi-screen devices.
+* `service/medialive`: Adds new service
+  * AWS Elemental MediaLive is a video service that lets you easily create live outputs for broadcast and streaming delivery.
+* `service/mediapackage`: Adds new service
+  * AWS Elemental MediaPackage is a just-in-time video packaging and origination service that lets you format highly secure and reliable live outputs for a variety of devices.
+* `service/mediastore`: Adds new service
+  * AWS Elemental MediaStore is an AWS storage service optimized for media. It gives you the performance, consistency, and low latency required to deliver live and on-demand video content. AWS Elemental MediaStore acts as the origin store in your video workflow.
+
+Release v1.12.33 (2017-11-22)
+===
+
+### Service Client Updates
+* `service/acm`: Updates service API and documentation
+  * AWS Certificate Manager now supports the ability to import domainless certs and additional Key Types as well as an additional validation method for DNS.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.32 (2017-11-22)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service API and documentation
+  * Add support for Access logs and customizable integration timeouts
+* `service/cloudformation`: Updates service API and documentation
+  * 1) Instance-level parameter overrides (CloudFormation-StackSet feature): This feature will allow the customers to override the template parameters on specific stackInstances. Customers will also have ability to update their existing instances with/without parameter-overrides using a new API "UpdateStackInstances"                                                                                                                                                                                                                                                         2) Add support for SSM parameters in CloudFormation - This feature will allow the customers to use Systems Manager parameters in CloudFormation templates. They will be able to see values for these parameters in Describe APIs.
+* `service/codebuild`: Updates service API and documentation
+  * Adding support for accessing Amazon VPC resources from AWS CodeBuild, dependency caching and build badges.
+* `service/elasticmapreduce`: Updates service API and documentation
+  * Enable Kerberos on Amazon EMR.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/rekognition`: Updates service API and documentation
+  * This release includes updates to Amazon Rekognition for the following APIs. The new DetectText API allows you to recognize and extract textual content from images. Face Model Versioning has been added to operations that deal with face detection.
+* `service/shield`: Updates service API, documentation, and paginators
+  * The AWS Shield SDK has been updated in order to support Elastic IP address protections, the addition of AttackProperties objects in DescribeAttack responses, and a new GetSubscriptionState operation.
+* `service/storagegateway`: Updates service API and documentation
+  * AWS Storage Gateway now enables you to get notification when all your files written to your NFS file share have been uploaded to Amazon S3. Storage Gateway also enables guessing of the MIME type for uploaded objects based on file extensions.
+* `service/xray`: Updates service API, documentation, and paginators
+  * Added automatic pagination support for AWS X-Ray APIs in the SDKs that support this feature.
+
+Release v1.12.31 (2017-11-20)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service documentation
+  * Documentation updates for Apigateway
+* `service/codecommit`: Updates service API, documentation, and paginators
+  * AWS CodeCommit now supports pull requests. You can use pull requests to collaboratively review code changes for minor changes or fixes, major feature additions, or new versions of your released software.
+* `service/firehose`: Updates service API and documentation
+  * This release includes a new Kinesis Firehose feature that supports Splunk as Kinesis Firehose delivery destination. You can now use Kinesis Firehose to ingest real-time data to Splunk in a serverless, reliable, and salable manner. This release also includes a new feature that allows you to configure Lambda buffer size in Kinesis Firehose data transformation feature. You can now customize the data buffer size before invoking Lambda function in Kinesis Firehose for data transformation. This feature allows you to flexibly trade-off processing and delivery latency with cost and efficiency based on your specific use cases and requirements.
+* `service/iis`: Adds new service
+  * The AWS Cost Explorer API gives customers programmatic access to AWS cost and usage information, allowing them to perform adhoc queries and build interactive cost management applications that leverage this dataset.
+* `service/kinesis`: Updates service API and documentation
+  * Customers can now obtain the important characteristics of their stream with DescribeStreamSummary. The response will not include the shard list for the stream but will have the number of open shards, and all the other fields included in the DescribeStream response.
+* `service/workdocs`: Updates service API and documentation
+  * DescribeGroups API and miscellaneous enhancements
+
+### SDK Bugs
+* `aws/client`: Retry delays for throttled exception were not limited to 5 mintues [#1654](https://github.com/aws/aws-sdk-go/pull/1654)
+  * Fixes [#1653](https://github.com/aws/aws-sdk-go/issues/1653)
+Release v1.12.30 (2017-11-17)
+===
+
+### Service Client Updates
+* `service/application-autoscaling`: Updates service API and documentation
+* `service/dms`: Updates service API, documentation, and paginators
+  * Support for migration task assessment. Support for data validation after the migration.
+* `service/elasticloadbalancingv2`: Updates service API and documentation
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/rds`: Updates service API and documentation
+  * Amazon RDS now supports importing MySQL databases by using backup files from Amazon S3.
+* `service/s3`: Updates service API
+  * Added ORC to the supported S3 Inventory formats.
+
+### SDK Bugs
+* `private/protocol/restjson`: Define JSONValue marshaling for body and querystring ([#1640](https://github.com/aws/aws-sdk-go/pull/1640))
+  * Adds support for APIs which use JSONValue for body and querystring targets.
+  * Fixes [#1636](https://github.com/aws/aws-sdk-go/issues/1636)
+Release v1.12.29 (2017-11-16)
+===
+
+### Service Client Updates
+* `service/application-autoscaling`: Updates service API and documentation
+* `service/ec2`: Updates service API
+  * You are now able to create and launch EC2 x1e smaller instance sizes
+* `service/glue`: Updates service API and documentation
+  * API update for AWS Glue. New crawler configuration attribute enables customers to specify crawler behavior. New XML classifier enables classification of XML data.
+* `service/opsworkscm`: Updates service API, documentation, and waiters
+  * Documentation updates for OpsWorks-cm: a new feature, OpsWorks for Puppet Enterprise, that allows users to create and manage OpsWorks-hosted Puppet Enterprise servers.
+* `service/organizations`: Updates service API, documentation, and paginators
+  * This release adds APIs that you can use to enable and disable integration with AWS services designed to work with AWS Organizations. This integration allows the AWS service to perform operations on your behalf on all of the accounts in your organization. Although you can use these APIs yourself, we recommend that you instead use the commands provided in the other AWS service to enable integration with AWS Organizations.
+* `service/route53`: Updates service API and documentation
+  * You can use Route 53's GetAccountLimit/GetHostedZoneLimit/GetReusableDelegationSetLimit APIs to view your current limits (including custom set limits) on Route 53 resources such as hosted zones and health checks. These APIs also return the number of each resource you're currently using to enable comparison against your current limits.
+
+Release v1.12.28 (2017-11-15)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service API and documentation
+  * 1. Extended GetDocumentationParts operation to support retrieving documentation parts resources without contents.  2. Added hosted zone ID in the custom domain response.
+* `service/email`: Updates service API, documentation, and examples
+  * SES launches Configuration Set Reputation Metrics and Email Pausing Today, two features that build upon the capabilities of the reputation dashboard. The first is the ability to export reputation metrics for individual configuration sets. The second is the ability to temporarily pause email sending, either at the configuration set level, or across your entire Amazon SES account.
+* `service/polly`: Updates service API
+  * Amazon Polly adds Korean language support with new female voice - "Seoyeon" and new Indian English female voice - "Aditi"
+* `service/states`: Updates service API and documentation
+  * You can now use the UpdateStateMachine API to update your state machine definition and role ARN. Existing executions will continue to use the previous definition and role ARN. You can use the DescribeStateMachineForExecution API to determine which state machine definition and role ARN is associated with an execution
+
+Release v1.12.27 (2017-11-14)
+===
+
+### Service Client Updates
+* `service/ecs`: Updates service API and documentation
+  * Added new mode for Task Networking in ECS, called awsvpc mode. Mode configuration parameters to be passed in via awsvpcConfiguration. Updated APIs now use/show this new mode - RegisterTaskDefinition, CreateService, UpdateService, RunTask, StartTask.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/lightsail`: Updates service API and documentation
+  * Lightsail now supports attached block storage, which allows you to scale your applications and protect application data with additional SSD-backed storage disks. This feature allows Lightsail customers to attach secure storage disks to their Lightsail instances and manage their attached disks, including creating and deleting disks, attaching and detaching disks from instances, and backing up disks via snapshot.
+* `service/route53`: Updates service API and documentation
+  * When a Route 53 health check or hosted zone is created by a linked AWS service, the object now includes information about the service that created it. Hosted zones or health checks that are created by a linked service can't be updated or deleted using Route 53.
+* `service/ssm`: Updates service API and documentation
+  * EC2 Systems Manager GetInventory API adds support for aggregation.
+
+### SDK Enhancements
+* `aws/request`: Remove default port from HTTP host header ([#1618](https://github.com/aws/aws-sdk-go/pull/1618))
+  * Updates the SDK to automatically remove default ports based on the URL's scheme when setting the HTTP Host header's value.
+  * Fixes [#1537](https://github.com/aws/aws-sdk-go/issues/1537)
+
+Release v1.12.26 (2017-11-09)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API and documentation
+  * Introduces the following features: 1. Create a default subnet in an Availability Zone if no default subnet exists. 2. Spot Fleet integrates with Elastic Load Balancing to enable you to attach one or more load balancers to a Spot Fleet request. When you attach the load balancer, it automatically registers the instance in the Spot Fleet to the load balancers which distributes incoming traffic across the instances.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.25 (2017-11-08)
+===
+
+### Service Client Updates
+* `service/application-autoscaling`: Updates service API and documentation
+* `service/batch`: Updates service documentation
+  * Documentation updates for AWS Batch.
+* `service/ec2`: Updates service API and documentation
+  * AWS PrivateLink for Amazon Services - Customers can now privately access Amazon services from their Amazon Virtual Private Cloud (VPC), without using public IPs, and without requiring the traffic to traverse across the Internet.
+* `service/elasticache`: Updates service API and documentation
+  * This release adds online resharding for ElastiCache for Redis offering, providing the ability to add and remove shards from a running cluster. Developers can now dynamically scale-out or scale-in their Redis cluster workloads to adapt to changes in demand. ElastiCache will resize the cluster by adding or removing shards and redistribute hash slots uniformly across the new shard configuration, all while the cluster continues to stay online and serves requests.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.24 (2017-11-07)
+===
+
+### Service Client Updates
+* `service/elasticloadbalancingv2`: Updates service documentation
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/rds`: Updates service API and documentation
+  * DescribeOrderableDBInstanceOptions now returns the minimum and maximum allowed values for storage size, total provisioned IOPS, and provisioned IOPS per GiB for a DB instance.
+* `service/s3`: Updates service API, documentation, and examples
+  * This releases adds support for 4 features: 1. Default encryption for S3 Bucket, 2. Encryption status in inventory and Encryption support for inventory.  3. Cross region replication of KMS-encrypted objects, and 4. ownership overwrite for CRR.
+
+Release v1.12.23 (2017-11-07)
+===
+
+### Service Client Updates
+* `service/api.pricing`: Adds new service
+* `service/ec2`: Updates service API
+  * You are now able to create and launch EC2 C5 instances, the next generation of EC2's compute-optimized instances, in us-east-1, us-west-2 and eu-west-1. C5 instances offer up to 72 vCPUs, 144 GiB of DDR4 instance memory, 25 Gbps in Network bandwidth and improved EBS and Networking bandwidth on smaller instance sizes to deliver improved performance for compute-intensive workloads.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/kms`: Updates service API, documentation, and examples
+  * Documentation updates for AWS KMS.
+* `service/organizations`: Updates service documentation
+  * This release updates permission statements for several API operations, and corrects some other minor errors.
+* `service/states`: Updates service API, documentation, and paginators
+  * Documentation update.
+
+Release v1.12.22 (2017-11-03)
+===
+
+### Service Client Updates
+* `service/ecs`: Updates service API and documentation
+  * Amazon ECS users can now add devices to their containers and enable init process in containers through the use of docker's 'devices' and 'init' features. These fields can be specified under linuxParameters in ContainerDefinition in the Task Definition Template.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.21 (2017-11-02)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service API and documentation
+  * This release supports creating and managing Regional and Edge-Optimized API endpoints.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+### SDK Bugs
+* `aws/request`: Fix bug in request presign creating invalide URL ([#1624](https://github.com/aws/aws-sdk-go/pull/1624))
+  * Fixes a bug the Request Presign and PresignRequest methods that would allow a invalid expire duration as input. A expire time of 0 would be interpreted by the SDK to generate a normal request signature, not a presigned URL. This caused the returned URL unusable.
+  * Fixes [#1617](https://github.com/aws/aws-sdk-go/issues/1617)
+Release v1.12.20 (2017-11-01)
+===
+
+### Service Client Updates
+* `service/acm`: Updates service documentation
+  * Documentation updates for ACM
+* `service/cloudhsmv2`: Updates service documentation
+  * Minor documentation update for AWS CloudHSM (cloudhsmv2).
+* `service/directconnect`: Updates service API and documentation
+  * AWS DirectConnect now provides support for Global Access for Virtual Private Cloud (VPC) via a new feature called Direct Connect Gateway. A Direct Connect Gateway will allow you to group multiple Direct Connect Private Virtual Interfaces (DX-VIF) and Private Virtual Gateways (VGW) from different AWS regions (but belonging to the same AWS Account) and pass traffic from any DX-VIF to any VPC in the grouping.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+### SDK Enhancements
+* `aws/client`: Adding status code 429 to throttlable status codes in default retryer (#1621)
+
+Release v1.12.19 (2017-10-26)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.18 (2017-10-26)
+===
+
+### Service Client Updates
+* `service/cloudfront`: Updates service API and documentation
+  * You can now specify additional options for MinimumProtocolVersion, which controls the SSL/TLS protocol that CloudFront uses to communicate with viewers. The minimum protocol version that you choose also determines the ciphers that CloudFront uses to encrypt the content that it returns to viewers.
+* `service/ec2`: Updates service API
+  * You are now able to create and launch EC2 P3 instance, next generation GPU instances, optimized for machine learning and high performance computing applications. With up to eight NVIDIA Tesla V100 GPUs, P3 instances provide up to one petaflop of mixed-precision, 125 teraflops of single-precision, and 62 teraflops of double-precision floating point performance, as well as a 300 GB/s second-generation NVLink interconnect that enables high-speed, low-latency GPU-to-GPU communication. P3 instances also feature up to 64 vCPUs based on custom Intel Xeon E5 (Broadwell) processors, 488 GB of DRAM, and 25 Gbps of dedicated aggregate network bandwidth using the Elastic Network Adapter (ENA).
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.17 (2017-10-24)
+===
+
+### Service Client Updates
+* `service/config`: Updates service API
+* `service/elasticache`: Updates service API, documentation, and examples
+  * Amazon ElastiCache for Redis today announced support for data encryption both for data in-transit and data at-rest. The new encryption in-transit functionality enables ElastiCache for Redis customers to encrypt data for all communication between clients and Redis engine, and all intra-cluster Redis communication. The encryption at-rest functionality allows customers to encrypt their S3 based backups. Customers can begin using the new functionality by simply enabling this functionality via AWS console, and a small configuration change in their Redis clients. The ElastiCache for Redis service automatically manages life cycle of the certificates required for encryption, including the issuance, renewal and expiration of certificates. Additionally, as part of this launch, customers will gain the ability to start using the Redis AUTH command that provides an added level of authentication.
+* `service/glue`: Adds new service
+  * AWS Glue: Adding a new API, BatchStopJobRun, to stop one or more job runs for a specified Job.
+* `service/pinpoint`: Updates service API and documentation
+  * Added support for APNs VoIP messages. Added support for collapsible IDs, message priority, and TTL for APNs and FCM/GCM.
+
+Release v1.12.16 (2017-10-23)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/organizations`: Updates service API and documentation
+  * This release supports integrating other AWS services with AWS Organizations through the use of an IAM service-linked role called AWSServiceRoleForOrganizations. Certain operations automatically create that role if it does not already exist.
+
+Release v1.12.15 (2017-10-20)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API and documentation
+  * Adding pagination support for DescribeSecurityGroups for EC2 Classic and VPC Security Groups
+
+Release v1.12.14 (2017-10-19)
+===
+
+### Service Client Updates
+* `service/sqs`: Updates service API and documentation
+  * Added support for tracking cost allocation by adding, updating, removing, and listing the metadata tags of Amazon SQS queues.
+* `service/ssm`: Updates service API and documentation
+  * EC2 Systems Manager versioning support for Parameter Store. Also support for referencing parameter versions in SSM Documents.
+
+Release v1.12.13 (2017-10-18)
+===
+
+### Service Client Updates
+* `service/lightsail`: Updates service API and documentation
+  * This release adds support for Windows Server-based Lightsail instances. The GetInstanceAccessDetails API now returns the password of your Windows Server-based instance when using the default key pair. GetInstanceAccessDetails also returns a PasswordData object for Windows Server instances containing the ciphertext and keyPairName. The Blueprint data type now includes a list of platform values (LINUX_UNIX or WINDOWS). The Bundle data type now includes a list of SupportedPlatforms values (LINUX_UNIX or WINDOWS).
+
+Release v1.12.12 (2017-10-17)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/es`: Updates service API and documentation
+  * This release adds support for VPC access to Amazon Elasticsearch Service.
+  * This release adds support for VPC access to Amazon Elasticsearch Service.
+
+Release v1.12.11 (2017-10-16)
+===
+
+### Service Client Updates
+* `service/cloudhsm`: Updates service API and documentation
+  * Documentation updates for AWS CloudHSM Classic.
+* `service/ec2`: Updates service API and documentation
+  * You can now change the tenancy of your VPC from dedicated to default with a single API operation. For more details refer to the documentation for changing VPC tenancy.
+* `service/es`: Updates service API and documentation
+  * AWS Elasticsearch adds support for enabling slow log publishing. Using slow log publishing options customers can configure and enable index/query slow log publishing of their domain to preferred AWS Cloudwatch log group.
+* `service/rds`: Updates service API and waiters
+  * Adds waiters for DBSnapshotAvailable and DBSnapshotDeleted.
+* `service/waf`: Updates service API and documentation
+  * This release adds support for regular expressions as match conditions in rules, and support for geographical location by country of request IP address as a match condition in rules.
+* `service/waf-regional`: Updates service API and documentation
+
+Release v1.12.10 (2017-10-12)
+===
+
+### Service Client Updates
+* `service/codecommit`: Updates service API and documentation
+  * This release includes the DeleteBranch API and a change to the contents of a Commit object.
+* `service/dms`: Updates service API and documentation
+  * This change includes addition of new optional parameter to an existing API
+* `service/elasticbeanstalk`: Updates service API and documentation
+  * Added the ability to add, delete or update Tags
+* `service/polly`: Updates service API
+  * Amazon Polly exposes two new voices: "Matthew" (US English) and "Takumi" (Japanese)
+* `service/rds`: Updates service API and documentation
+  * You can now call DescribeValidDBInstanceModifications to learn what modifications you can make to your DB instance. You can use this information when you call ModifyDBInstance.
+
+Release v1.12.9 (2017-10-11)
+===
+
+### Service Client Updates
+* `service/ecr`: Updates service API, documentation, and paginators
+  * Adds support for new API set used to manage Amazon ECR repository lifecycle policies. Amazon ECR lifecycle policies enable you to specify the lifecycle management of images in a repository. The configuration is a set of one or more rules, where each rule defines an action for Amazon ECR to apply to an image. This allows the automation of cleaning up unused images, for example expiring images based on age or status. A lifecycle policy preview API is provided as well, which allows you to see the impact of a lifecycle policy on an image repository before you execute it
+* `service/email`: Updates service API and documentation
+  * Added content related to email template management and templated email sending operations.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.12.8 (2017-10-10)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API and documentation
+  * This release includes updates to AWS Virtual Private Gateway.
+* `service/elasticloadbalancingv2`: Updates service API and documentation
+* `service/opsworkscm`: Updates service API and documentation
+  * Provide engine specific information for node associations.
+
+Release v1.12.7 (2017-10-06)
+===
+
+### Service Client Updates
+* `service/sqs`: Updates service documentation
+  * Documentation updates regarding availability of FIFO queues and miscellaneous corrections.
+
+Release v1.12.6 (2017-10-05)
+===
+
+### Service Client Updates
+* `service/redshift`: Updates service API and documentation
+  * DescribeEventSubscriptions API supports tag keys and tag values as request parameters.
+
+Release v1.12.5 (2017-10-04)
+===
+
+### Service Client Updates
+* `service/kinesisanalytics`: Updates service API and documentation
+  * Kinesis Analytics now supports schema discovery on objects in S3. Additionally, Kinesis Analytics now supports input data preprocessing through Lambda.
+* `service/route53domains`: Updates service API and documentation
+  * Added a new API that checks whether a domain name can be transferred to Amazon Route 53.
+
+### SDK Bugs
+* `service/s3/s3crypto`: Correct PutObjectRequest documentation ([#1568](https://github.com/aws/aws-sdk-go/pull/1568))
+  * s3Crypto's PutObjectRequest docstring example was using an incorrect value. Corrected the type used in the example.
+Release v1.12.4 (2017-10-03)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API, documentation, and waiters
+  * This release includes service updates to AWS VPN.
+* `service/ssm`: Updates service API and documentation
+  * EC2 Systems Manager support for tagging SSM Documents. Also support for tag-based permissions to restrict access to SSM Documents based on these tags.
+
+Release v1.12.3 (2017-10-02)
+===
+
+### Service Client Updates
+* `service/cloudhsm`: Updates service documentation and paginators
+  * Documentation updates for CloudHSM
+
+Release v1.12.2 (2017-09-29)
+===
+
+### Service Client Updates
+* `service/appstream`: Updates service API and documentation
+  * Includes APIs for managing and accessing image builders, and deleting images.
+* `service/codebuild`: Updates service API and documentation
+  * Adding support for Building GitHub Pull Requests in AWS CodeBuild
+* `service/mturk-requester`: Updates service API and documentation
+* `service/organizations`: Updates service API and documentation
+  * This release flags the HandshakeParty structure's Type and Id fields as 'required'. They effectively were required in the past, as you received an error if you did not include them. This is now reflected at the API definition level.
+* `service/route53`: Updates service API and documentation
+  * This change allows customers to reset elements of health check.
+
+### SDK Bugs
+* `private/protocol/query`: Fix query protocol handling of nested byte slices ([#1557](https://github.com/aws/aws-sdk-go/issues/1557))
+  * Fixes the query protocol to correctly marshal nested []byte values of API operations.
+* `service/s3`: Fix PutObject and UploadPart API to include ContentMD5 field ([#1559](https://github.com/aws/aws-sdk-go/pull/1559))
+  * Fixes the SDK's S3 PutObject and UploadPart API code generation to correctly render the ContentMD5 field into the associated input types for these two API operations.
+  * Fixes [#1553](https://github.com/aws/aws-sdk-go/pull/1553)
+Release v1.12.1 (2017-09-27)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/pinpoint`: Updates service API and documentation
+  * Added two new push notification channels: Amazon Device Messaging (ADM) and, for push notification support in China, Baidu Cloud Push. Added support for APNs auth via .p8 key file. Added operation for direct message deliveries to user IDs, enabling you to message an individual user on multiple endpoints.
+
+Release v1.12.0 (2017-09-26)
+===
+
+### SDK Bugs
+* `API Marshaler`: Revert REST JSON and XML protocol marshaler improvements
+  * Bug [#1550](https://github.com/aws/aws-sdk-go/issues/1550) identified a missed condition in the Amazon Route 53 RESTXML protocol marshaling causing requests to that service to fail. Reverting the marshaler improvements until the bug can be fixed.
+
+Release v1.11.0 (2017-09-26)
+===
+
+### Service Client Updates
+* `service/cloudformation`: Updates service API and documentation
+  * You can now prevent a stack from being accidentally deleted by enabling termination protection on the stack. If you attempt to delete a stack with termination protection enabled, the deletion fails and the stack, including its status, remains unchanged. You can enable termination protection on a stack when you create it. Termination protection on stacks is disabled by default. After creation, you can set termination protection on a stack whose status is CREATE_COMPLETE, UPDATE_COMPLETE, or UPDATE_ROLLBACK_COMPLETE.
+
+### SDK Features
+* Add dep Go dependency management metadata files (#1544)
+  * Adds the Go `dep` dependency management metadata files to the SDK.
+  * Fixes [#1451](https://github.com/aws/aws-sdk-go/issues/1451)
+  * Fixes [#634](https://github.com/aws/aws-sdk-go/issues/634)
+* `service/dynamodb/expression`: Add expression building utility for DynamoDB ([#1527](https://github.com/aws/aws-sdk-go/pull/1527))
+  * Adds a new package, expression, to the SDK providing builder utilities to create DynamoDB expressions safely taking advantage of type safety.
+* `API Marshaler`: Add generated marshalers for RESTXML protocol ([#1409](https://github.com/aws/aws-sdk-go/pull/1409))
+  * Updates the RESTXML protocol marshaler to use generated code instead of reflection for REST XML based services.
+* `API Marshaler`: Add generated marshalers for RESTJSON protocol ([#1547](https://github.com/aws/aws-sdk-go/pull/1547))
+  * Updates the RESTJSON protocol marshaler to use generated code instead of reflection for REST JSON based services.
+
+### SDK Enhancements
+* `private/protocol`: Update format of REST JSON and XMl benchmarks ([#1546](https://github.com/aws/aws-sdk-go/pull/1546))
+  * Updates the format of the REST JSON and XML benchmarks to be readable. RESTJSON benchmarks were updated to more accurately bench building of the protocol.
+
+Release v1.10.51 (2017-09-22)
+===
+
+### Service Client Updates
+* `service/config`: Updates service API and documentation
+* `service/ecs`: Updates service API and documentation
+  * Amazon ECS users can now add and drop Linux capabilities to their containers through the use of docker's cap-add and cap-drop features. Customers can specify the capabilities they wish to add or drop for each container in their task definition.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/rds`: Updates service documentation
+  * Documentation updates for rds
+
+Release v1.10.50 (2017-09-21)
+===
+
+### Service Client Updates
+* `service/budgets`: Updates service API
+  * Including "DuplicateRecordException" in UpdateNotification and UpdateSubscriber.
+* `service/ec2`: Updates service API and documentation
+  * Add EC2 APIs to copy Amazon FPGA Images (AFIs) within the same region and across multiple regions, delete AFIs, and modify AFI attributes. AFI attributes include name, description and granting/denying other AWS accounts to load the AFI.
+* `service/logs`: Updates service API and documentation
+  * Adds support for associating LogGroups with KMS Keys.
+
+### SDK Bugs
+* Fix greengrass service model being duplicated with different casing. ([#1541](https://github.com/aws/aws-sdk-go/pull/1541))
+  * Fixes [#1540](https://github.com/aws/aws-sdk-go/issues/1540)
+  * Fixes [#1539](https://github.com/aws/aws-sdk-go/issues/1539)
+Release v1.10.49 (2017-09-20)
+===
+
+### Service Client Updates
+* `service/Greengrass`: Adds new service
+* `service/appstream`: Updates service API and documentation
+  * API updates for supporting On-Demand fleets.
+* `service/codepipeline`: Updates service API and documentation
+  * This change includes a PipelineMetadata object that is part of the output from the GetPipeline API that includes the Pipeline ARN, created, and updated timestamp.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/rds`: Updates service API and documentation
+  * Introduces the --option-group-name parameter to the ModifyDBSnapshot CLI command. You can specify this parameter when you upgrade an Oracle DB snapshot. The same option group considerations apply when upgrading a DB snapshot as when upgrading a DB instance.  For more information, see http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_UpgradeDBInstance.Oracle.html#USER_UpgradeDBInstance.Oracle.OGPG.OG
+* `service/runtime.lex`: Updates service API and documentation
+
+Release v1.10.48 (2017-09-19)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API
+  * Fixed bug in EC2 clients preventing ElasticGpuSet from being set.
+
+### SDK Enhancements
+* `aws/credentials`: Add EnvProviderName constant. ([#1531](https://github.com/aws/aws-sdk-go/issues/1531))
+  * Adds the "EnvConfigCredentials" string literal as EnvProviderName constant.
+  * Fixes [#1444](https://github.com/aws/aws-sdk-go/issues/1444)
+
+Release v1.10.47 (2017-09-18)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API and documentation
+  * Amazon EC2 now lets you opt for Spot instances to be stopped in the event of an interruption instead of being terminated.  Your Spot request can be fulfilled again by restarting instances from a previously stopped state, subject to availability of capacity at or below your preferred price.  When you submit a persistent Spot request, you can choose from "terminate" or "stop" as the instance interruption behavior.  Choosing "stop" will shutdown your Spot instances so you can continue from this stopped state later on.  This feature is only available for instances with Amazon EBS volume as their root device.
+* `service/email`: Updates service API and documentation
+  * Amazon Simple Email Service (Amazon SES) now lets you customize the domains used for tracking open and click events. Previously, open and click tracking links referred to destinations hosted on domains operated by Amazon SES. With this feature, you can use your own branded domains for capturing open and click events.
+* `service/iam`: Updates service API and documentation
+  * A new API, DeleteServiceLinkedRole, submits a service-linked role deletion request and returns a DeletionTaskId, which you can use to check the status of the deletion.
+
+Release v1.10.46 (2017-09-15)
+===
+
+### Service Client Updates
+* `service/apigateway`: Updates service API and documentation
+  * Add a new enum "REQUEST" to '--type <value>' field in the current create-authorizer API, and make "identitySource" optional.
+
+Release v1.10.45 (2017-09-14)
+===
+
+### Service Client Updates
+* `service/codebuild`: Updates service API and documentation
+  * Supporting Parameter Store in environment variables for AWS CodeBuild
+* `service/organizations`: Updates service documentation
+  * Documentation updates for AWS Organizations
+* `service/servicecatalog`: Updates service API, documentation, and paginators
+  * This release of Service Catalog adds API support to copy products.
+
+Release v1.10.44 (2017-09-13)
+===
+
+### Service Client Updates
+* `service/autoscaling`: Updates service API and documentation
+  * Customers can create Life Cycle Hooks at the time of creating Auto Scaling Groups through the CreateAutoScalingGroup API
+* `service/batch`: Updates service documentation and examples
+  * Documentation updates for batch
+* `service/ec2`: Updates service API
+  * You are now able to create and launch EC2 x1e.32xlarge instance, a new EC2 instance in the X1 family, in us-east-1, us-west-2, eu-west-1, and ap-northeast-1. x1e.32xlarge offers 128 vCPUs, 3,904 GiB of DDR4 instance memory, high memory bandwidth, large L3 caches, and leading reliability capabilities to boost the performance and reliability of in-memory applications.
+* `service/events`: Updates service API and documentation
+  * Exposes ConcurrentModificationException as one of the valid exceptions for PutPermission and RemovePermission operation.
+
+### SDK Enhancements
+* `service/autoscaling`: Fix documentation for PutScalingPolicy.AutoScalingGroupName [#1522](https://github.com/aws/aws-sdk-go/pull/1522)
+* `service/s3/s3manager`: Clarify S3 Upload manager Concurrency config [#1521](https://github.com/aws/aws-sdk-go/pull/1521)
+  * Fixes [#1458](https://github.com/aws/aws-sdk-go/issues/1458)
+* `service/dynamodb/dynamodbattribute`: Add support for time alias. [#1520](https://github.com/aws/aws-sdk-go/pull/1520)
+  * Related to [#1505](https://github.com/aws/aws-sdk-go/pull/1505)
+
+Release v1.10.43 (2017-09-12)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API
+  * Fixed bug in EC2 clients preventing HostOfferingSet from being set
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.10.42 (2017-09-12)
+===
+
+### Service Client Updates
+* `service/devicefarm`: Updates service API and documentation
+  * DeviceFarm has added support for two features - RemoteDebugging and Customer Artifacts. Customers  can now do remote Debugging on their Private Devices and can now retrieve custom files generated by their tests on the device and the device host (execution environment) on both public and private devices.
+
+Release v1.10.41 (2017-09-08)
+===
+
+### Service Client Updates
+* `service/logs`: Updates service API and documentation
+  * Adds support for the PutResourcePolicy, DescribeResourcePolicy and DeleteResourcePolicy APIs.
+
+Release v1.10.40 (2017-09-07)
+===
+
+### Service Client Updates
+* `service/application-autoscaling`: Updates service documentation
+* `service/ec2`: Updates service API and documentation
+  * With Tagging support, you can add Key and Value metadata to search, filter and organize your NAT Gateways according to your organization's needs.
+* `service/elasticloadbalancingv2`: Updates service API and documentation
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/lex-models`: Updates service API and documentation
+* `service/route53`: Updates service API and documentation
+  * You can configure Amazon Route 53 to log information about the DNS queries that Amazon Route 53 receives for your domains and subdomains. When you configure query logging, Amazon Route 53 starts to send logs to CloudWatch Logs. You can use various tools, including the AWS console, to access the query logs.
+
+Release v1.10.39 (2017-09-06)
+===
+
+### Service Client Updates
+* `service/budgets`: Updates service API and documentation
+  * Add an optional "thresholdType" to notifications to support percentage or absolute value thresholds.
+
+Release v1.10.38 (2017-09-05)
+===
+
+### Service Client Updates
+* `service/codestar`: Updates service API and documentation
+  * Added support to tag CodeStar projects. Tags can be used to organize and find CodeStar projects on key-value pairs that you can choose. For example, you could add a tag with a key of "Release" and a value of "Beta" to projects your organization is working on for an upcoming beta release.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.10.37 (2017-09-01)
+===
+
+### Service Client Updates
+* `service/MobileHub`: Adds new service
+* `service/gamelift`: Updates service API and documentation
+  * GameLift VPC resources can be peered with any other AWS VPC. R4 memory-optimized instances now available to deploy.
+* `service/ssm`: Updates service API and documentation
+  * Adding KMS encryption support to SSM Inventory Resource Data Sync. Exposes the ClientToken parameter on SSM StartAutomationExecution to provide idempotent execution requests.
+
+Release v1.10.36 (2017-08-31)
+===
+
+### Service Client Updates
+* `service/codebuild`: Updates service API, documentation, and examples
+  * The AWS CodeBuild HTTP API now provides the BatchDeleteBuilds operation, which enables you to delete existing builds.
+* `service/ec2`: Updates service API and documentation
+  * Descriptions for Security Group Rules enables customers to be able to define a description for ingress and egress security group rules . The Descriptions for Security Group Rules feature supports one description field per Security Group rule for both ingress and egress rules . Descriptions for Security Group Rules provides a simple way to describe the purpose or function of a Security Group Rule allowing for easier customer identification of configuration elements .      Prior to the release of Descriptions for Security Group Rules , customers had to maintain a separate system outside of AWS if they wanted to track Security Group Rule mapping and their purpose for being implemented. If a security group rule has already been created and you would like to update or change your description for that security group rule you can use the UpdateSecurityGroupRuleDescription API.
+* `service/elasticloadbalancingv2`: Updates service API and documentation
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/lex-models`: Updates service API and documentation
+
+### SDK Bugs
+* `aws/signer/v4`: Revert [#1491](https://github.com/aws/aws-sdk-go/issues/1491) as change conflicts with an undocumented AWS v4 signature test case.
+  * Related to: [#1495](https://github.com/aws/aws-sdk-go/issues/1495).
+Release v1.10.35 (2017-08-30)
+===
+
+### Service Client Updates
+* `service/application-autoscaling`: Updates service API and documentation
+* `service/organizations`: Updates service API and documentation
+  * The exception ConstraintViolationException now contains a new reason subcode MASTERACCOUNT_MISSING_CONTACT_INFO to make it easier to understand why attempting to remove an account from an Organization can fail. We also improved several other of the text descriptions and examples.
+
+Release v1.10.34 (2017-08-29)
+===
+
+### Service Client Updates
+* `service/config`: Updates service API and documentation
+* `service/ec2`: Updates service API and documentation
+  * Provides capability to add secondary CIDR blocks to a VPC.
+
+### SDK Bugs
+* `aws/signer/v4`: Fix Signing Unordered Multi Value Query Parameters ([#1491](https://github.com/aws/aws-sdk-go/pull/1491))
+  * Removes sorting of query string values when calculating v4 signing as this is not part of the spec. The spec only requires the keys, not values, to be sorted which is achieved by Query.Encode().
+Release v1.10.33 (2017-08-25)
+===
+
+### Service Client Updates
+* `service/cloudformation`: Updates service API and documentation
+  * Rollback triggers enable you to have AWS CloudFormation monitor the state of your application during stack creation and updating, and to roll back that operation if the application breaches the threshold of any of the alarms you've specified.
+* `service/gamelift`: Updates service API
+  * Update spelling of MatchmakingTicket status values for internal consistency.
+* `service/rds`: Updates service API and documentation
+  * Option group options now contain additional properties that identify requirements for certain options. Check these properties to determine if your DB instance must be in a VPC or have auto minor upgrade turned on before you can use an option. Check to see if you can downgrade the version of an option after you have installed it.
+
+### SDK Enhancements
+* `example/service/ec2`: Add EC2 list instances example ([#1492](https://github.com/aws/aws-sdk-go/pull/1492))
+
+Release v1.10.32 (2017-08-25)
+===
+
+### Service Client Updates
+* `service/rekognition`: Updates service API, documentation, and examples
+  * Update the enum value of LandmarkType and GenderType to be consistent with service response
+
+Release v1.10.31 (2017-08-23)
+===
+
+### Service Client Updates
+* `service/appstream`: Updates service documentation
+  * Documentation updates for appstream
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.10.30 (2017-08-22)
+===
+
+### Service Client Updates
+* `service/ssm`: Updates service API and documentation
+  * Changes to associations in Systems Manager State Manager can now be recorded. Previously, when you edited associations, you could not go back and review older association settings. Now, associations are versioned, and can be named using human-readable strings, allowing you to see a trail of association changes. You can also perform rate-based scheduling, which allows you to schedule associations more granularly.
+
+Release v1.10.29 (2017-08-21)
+===
+
+### Service Client Updates
+* `service/firehose`: Updates service API, documentation, and paginators
+  * This change will allow customers to attach a Firehose delivery stream to an existing Kinesis stream directly. You no longer need a forwarder to move data from a Kinesis stream to a Firehose delivery stream. You can now run your streaming applications on your Kinesis stream and easily attach a Firehose delivery stream to it for data delivery to S3, Redshift, or Elasticsearch concurrently.
+* `service/route53`: Updates service API and documentation
+  * Amazon Route 53 now supports CAA resource record type. A CAA record controls which certificate authorities are allowed to issue certificates for the domain or subdomain.
+
+Release v1.10.28 (2017-08-18)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.10.27 (2017-08-16)
+===
+
+### Service Client Updates
+* `service/gamelift`: Updates service API and documentation
+  * The Matchmaking Grouping Service is a new feature that groups player match requests for a given game together into game sessions based on developer configured rules.
+
+### SDK Enhancements
+* `aws/arn`: aws/arn: Package for parsing and producing ARNs ([#1463](https://github.com/aws/aws-sdk-go/pull/1463))
+  * Adds the `arn` package for AWS ARN parsing and building. Use this package to build AWS ARNs for services such as outlined in the [documentation](http://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html).
+
+### SDK Bugs
+* `aws/signer/v4`: Correct V4 presign signature to include content sha25 in URL ([#1469](https://github.com/aws/aws-sdk-go/pull/1469))
+  * Updates the V4 signer so that when a Presign is generated the `X-Amz-Content-Sha256` header is added to the query string instead of being required to be in the header. This allows you to generate presigned URLs for GET requests, e.g S3.GetObject that do not require additional headers to be set by the downstream users of the presigned URL.
+  * Related To: [#1467](https://github.com/aws/aws-sdk-go/issues/1467)
+
+Release v1.10.26 (2017-08-15)
+===
+
+### Service Client Updates
+* `service/ec2`: Updates service API
+  * Fixed bug in EC2 clients preventing HostReservation from being set
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+
+Release v1.10.25 (2017-08-14)
+===
+
+### Service Client Updates
+* `service/AWS Glue`: Adds new service
+* `service/batch`: Updates service API and documentation
+  * This release enhances the DescribeJobs API to include the CloudWatch logStreamName attribute in ContainerDetail and ContainerDetailAttempt
+* `service/cloudhsmv2`: Adds new service
+  * CloudHSM provides hardware security modules for protecting sensitive data and cryptographic keys within an EC2 VPC, and enable the customer to maintain control over key access and use. This is a second-generation of the service that will improve security, lower cost and provide better customer usability.
+* `service/elasticfilesystem`: Updates service API, documentation, and paginators
+  * Customers can create encrypted EFS file systems and specify a KMS master key to encrypt it with.
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/mgh`: Adds new service
+  * AWS Migration Hub provides a single location to track migrations across multiple AWS and partner solutions. Using Migration Hub allows you to choose the AWS and partner migration tools that best fit your needs, while providing visibility into the status of your entire migration portfolio. Migration Hub also provides key metrics and progress for individual applications, regardless of which tools are being used to migrate them. For example, you might use AWS Database Migration Service, AWS Server Migration Service, and partner migration tools to migrate an application comprised of a database, virtualized web servers, and a bare metal server. Using Migration Hub will provide you with a single screen that shows the migration progress of all the resources in the application. This allows you to quickly get progress updates across all of your migrations, easily identify and troubleshoot any issues, and reduce the overall time and effort spent on your migration projects. Migration Hub is available to all AWS customers at no additional charge. You only pay for the cost of the migration tools you use, and any resources being consumed on AWS.
+* `service/ssm`: Updates service API and documentation
+  * Systems Manager Maintenance Windows include the following changes or enhancements: New task options using Systems Manager Automation, AWS Lambda, and AWS Step Functions; enhanced ability to edit the targets of a Maintenance Window, including specifying a target name and description, and ability to edit the owner field; enhanced ability to edits tasks; enhanced support for Run Command parameters; and you can now use a --safe flag when attempting to deregister a target. If this flag is enabled when you attempt to deregister a target, the system returns an error if the target is referenced by any task. Also, Systems Manager now includes Configuration Compliance to scan your fleet of managed instances for patch compliance and configuration inconsistencies. You can collect and aggregate data from multiple AWS accounts and Regions, and then drill down into specific resources that aren't compliant.
+* `service/storagegateway`: Updates service API and documentation
+  * Add optional field ForceDelete to DeleteFileShare api.
+
+Release v1.10.24 (2017-08-11)
+===
+
+### Service Client Updates
+* `service/codedeploy`: Updates service API and documentation
+  * Adds support for specifying Application Load Balancers in deployment groups, for both in-place and blue/green deployments.
+* `service/cognito-idp`: Updates service API and documentation
+* `service/ec2`: Updates service API and documentation
+  * Provides customers an opportunity to recover an EIP that was released
+
+Release v1.10.23 (2017-08-10)
+===
+
+### Service Client Updates
+* `service/clouddirectory`: Updates service API and documentation
+  * Enable BatchDetachPolicy
+* `service/codebuild`: Updates service API
+  * Supporting Bitbucket as source type in AWS CodeBuild.
+
+Release v1.10.22 (2017-08-09)
+===
+
+### Service Client Updates
+* `service/rds`: Updates service documentation
+  * Documentation updates for RDS.
+
+Release v1.10.21 (2017-08-09)
+===
+
+### Service Client Updates
+* `service/elasticbeanstalk`: Updates service API and documentation
+  * Add support for paginating the result of DescribeEnvironments     Include the ARN of described environments in DescribeEnvironments output
+
+### SDK Enhancements
+* `aws`: Add pointer conversion utilities to transform int64 to time.Time [#1433](https://github.com/aws/aws-sdk-go/pull/1433)
+  * Adds `SecondsTimeValue` and `MillisecondsTimeValue` utilities.
+
+Release v1.10.20 (2017-08-01)
+===
+
+### Service Client Updates
+* `service/codedeploy`: Updates service API and documentation
+  * AWS CodeDeploy now supports the use of multiple tag groups in a single deployment group (an intersection of tags) to identify the instances for a deployment. When you create or update a deployment group, use the new ec2TagSet and onPremisesTagSet structures to specify up to three groups of tags. Only instances that are identified by at least one tag in each of the tag groups are included in the deployment group.
+* `service/config`: Updates service API and documentation
+* `service/ec2`: Updates service waiters
+  * Ec2 SpotInstanceRequestFulfilled waiter update
+* `service/elasticloadbalancingv2`: Updates service waiters
+* `service/email`: Updates service API, documentation, paginators, and examples
+  * This update adds information about publishing email open and click events. This update also adds information about publishing email events to Amazon Simple Notification Service (Amazon SNS).
+* `service/pinpoint`: Updates service API and documentation
+  * This release of the Pinpoint SDK enables App management - create, delete, update operations, Raw Content delivery for APNs and GCM campaign messages and From Address override.
+
+Release v1.10.19 (2017-08-01)
+===
+
+### Service Client Updates
+* `aws/endpoints`: Updated Regions and Endpoints metadata.
+* `service/inspector`: Updates service API, documentation, and paginators
+  * Inspector's StopAssessmentRun API has been updated with a new input option - stopAction. This request parameter can be set to either START_EVALUATION or SKIP_EVALUATION. START_EVALUATION (the default value, and the previous behavior) stops the AWS agent data collection and begins the results evaluation for findings generation based on the data collected so far. SKIP_EVALUATION cancels the assessment run immediately, after which no findings are generated.
+* `service/ssm`: Updates service API and documentation
+  * Adds a SendAutomationSignal API to SSM Service. This API is used to send a signal to an automation execution to change the current behavior or status of the execution.
+
 Release v1.10.18 (2017-07-27)
 ===
 

+ 1 - 1
vendor/github.com/aws/aws-sdk-go/CONTRIBUTING.md

@@ -67,7 +67,7 @@ Please be aware of the following notes prior to opening a pull request:
 5. The JSON files under the SDK's `models` folder are sourced from outside the SDK.
    Such as `models/apis/ec2/2016-11-15/api.json`. We will not accept pull requests
    directly on these models. If you discover an issue with the models please
-   create a Github [issue](issues) describing the issue.
+   create a [GitHub issue][issues] describing the issue.
 
 ### Testing
 

+ 20 - 0
vendor/github.com/aws/aws-sdk-go/Gopkg.lock

@@ -0,0 +1,20 @@
+# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
+
+
+[[projects]]
+  name = "github.com/go-ini/ini"
+  packages = ["."]
+  revision = "300e940a926eb277d3901b20bdfcc54928ad3642"
+  version = "v1.25.4"
+
+[[projects]]
+  name = "github.com/jmespath/go-jmespath"
+  packages = ["."]
+  revision = "0b12d6b5"
+
+[solve-meta]
+  analyzer-name = "dep"
+  analyzer-version = 1
+  inputs-digest = "51a86a867df617990082dec6b868e4efe2fdb2ed0e02a3daa93cd30f962b5085"
+  solver-name = "gps-cdcl"
+  solver-version = 1

+ 48 - 0
vendor/github.com/aws/aws-sdk-go/Gopkg.toml

@@ -0,0 +1,48 @@
+
+# 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"
+
+ignored = [
+	# Testing/Example/Codegen dependencies
+	"github.com/stretchr/testify",
+	"github.com/stretchr/testify/assert",
+	"github.com/stretchr/testify/require",
+	"github.com/go-sql-driver/mysql",
+	"github.com/gucumber/gucumber",
+	"github.com/pkg/errors",
+	"golang.org/x/net",
+	"golang.org/x/net/html",
+	"golang.org/x/net/http2",
+	"golang.org/x/text",
+	"golang.org/x/text/html",
+	"golang.org/x/tools",
+	"golang.org/x/tools/go/loader",
+]
+
+
+[[constraint]]
+  name = "github.com/go-ini/ini"
+  version = "1.25.4"
+
+[[constraint]]
+  name = "github.com/jmespath/go-jmespath"
+  revision = "0b12d6b5"
+  #version = "0.2.2"

+ 8 - 1
vendor/github.com/aws/aws-sdk-go/Makefile

@@ -74,7 +74,7 @@ smoke-tests: get-deps-tests
 performance: get-deps-tests
 	AWS_TESTING_LOG_RESULTS=${log-detailed} AWS_TESTING_REGION=$(region) AWS_TESTING_DB_TABLE=$(table) gucumber -go-tags "integration" ./awstesting/performance
 
-sandbox-tests: sandbox-test-go15 sandbox-test-go15-novendorexp sandbox-test-go16 sandbox-test-go17 sandbox-test-go18 sandbox-test-gotip
+sandbox-tests: sandbox-test-go15 sandbox-test-go15-novendorexp sandbox-test-go16 sandbox-test-go17 sandbox-test-go18 sandbox-test-go19 sandbox-test-gotip
 
 sandbox-build-go15:
 	docker build -f ./awstesting/sandbox/Dockerfile.test.go1.5 -t "aws-sdk-go-1.5" .
@@ -111,6 +111,13 @@ sandbox-go18: sandbox-build-go18
 sandbox-test-go18: sandbox-build-go18
 	docker run -t aws-sdk-go-1.8
 
+sandbox-build-go19:
+	docker build -f ./awstesting/sandbox/Dockerfile.test.go1.8 -t "aws-sdk-go-1.9" .
+sandbox-go19: sandbox-build-go19
+	docker run -i -t aws-sdk-go-1.9 bash
+sandbox-test-go19: sandbox-build-go19
+	docker run -t aws-sdk-go-1.9
+
 sandbox-build-gotip:
 	@echo "Run make update-aws-golang-tip, if this test fails because missing aws-golang:tip container"
 	docker build -f ./awstesting/sandbox/Dockerfile.test.gotip -t "aws-sdk-go-tip" .

+ 5 - 3
vendor/github.com/aws/aws-sdk-go/README.md

@@ -6,6 +6,8 @@ aws-sdk-go is the official AWS SDK for the Go programming language.
 
 Checkout our [release notes](https://github.com/aws/aws-sdk-go/releases) for information about the latest bug fixes, updates, and features added to the SDK.
 
+We [announced](https://aws.amazon.com/blogs/developer/aws-sdk-for-go-2-0-developer-preview/) the Developer Preview for the [v2 AWS SDK for Go](). The v2 SDK is available at https://github.com/aws/aws-sdk-go-v2, and `go get github.com/aws/aws-sdk-go-v2` via `go get`. Check out the v2 SDK's [changes and updates](https://github.com/aws/aws-sdk-go-v2/blob/master/CHANGELOG.md), and let us know what you think. We want your feedback. 
+
 ## Installing
 
 If you are using Go 1.5 with the `GO15VENDOREXPERIMENT=1` vendoring flag, or 1.6 and higher you can use the following command to retrieve the SDK. The SDK's non-testing dependencies will be included and are vendored in the `vendor` folder.
@@ -167,7 +169,7 @@ and configures the S3 service client to use that role for API requests.
 
   // Create service client value configured for credentials
   // from assumed role.
-  svc := s3.New(sess, &aws.Config{Credentials: creds})/
+  svc := s3.New(sess, &aws.Config{Credentials: creds})
 ```
 
 See the [credentials][credentials_pkg] package documentation for more information on credential
@@ -185,7 +187,7 @@ Option's SharedConfigState parameter.
   }))
 ```
 
-[credentials_pkg]: ttps://docs.aws.amazon.com/sdk-for-go/api/aws/credentials
+[credentials_pkg]: https://docs.aws.amazon.com/sdk-for-go/api/aws/credentials
 
 ### Configuring AWS Region
 
@@ -305,7 +307,7 @@ documentation for the errors that could be returned.
   // will leak connections.
   defer result.Body.Close()
 
-  fmt.Println("Object Size:", aws.StringValue(result.ContentLength))
+  fmt.Println("Object Size:", aws.Int64Value(result.ContentLength))
 ```
 
 ### API Request Pagination and Resource Waiters

+ 50 - 8
vendor/github.com/aws/aws-sdk-go/aws/client/default_retryer.go

@@ -2,6 +2,7 @@ package client
 
 import (
 	"math/rand"
+	"strconv"
 	"sync"
 	"time"
 
@@ -38,14 +39,18 @@ func (d DefaultRetryer) RetryRules(r *request.Request) time.Duration {
 	minTime := 30
 	throttle := d.shouldThrottle(r)
 	if throttle {
+		if delay, ok := getRetryDelay(r); ok {
+			return delay
+		}
+
 		minTime = 500
 	}
 
 	retryCount := r.RetryCount
-	if retryCount > 13 {
-		retryCount = 13
-	} else if throttle && retryCount > 8 {
+	if throttle && retryCount > 8 {
 		retryCount = 8
+	} else if retryCount > 13 {
+		retryCount = 13
 	}
 
 	delay := (1 << uint(retryCount)) * (seededRand.Intn(minTime) + minTime)
@@ -68,12 +73,49 @@ func (d DefaultRetryer) ShouldRetry(r *request.Request) bool {
 
 // ShouldThrottle returns true if the request should be throttled.
 func (d DefaultRetryer) shouldThrottle(r *request.Request) bool {
-	if r.HTTPResponse.StatusCode == 502 ||
-		r.HTTPResponse.StatusCode == 503 ||
-		r.HTTPResponse.StatusCode == 504 {
-		return true
+	switch r.HTTPResponse.StatusCode {
+	case 429:
+	case 502:
+	case 503:
+	case 504:
+	default:
+		return r.IsErrorThrottle()
 	}
-	return r.IsErrorThrottle()
+
+	return true
+}
+
+// This will look in the Retry-After header, RFC 7231, for how long
+// it will wait before attempting another request
+func getRetryDelay(r *request.Request) (time.Duration, bool) {
+	if !canUseRetryAfterHeader(r) {
+		return 0, false
+	}
+
+	delayStr := r.HTTPResponse.Header.Get("Retry-After")
+	if len(delayStr) == 0 {
+		return 0, false
+	}
+
+	delay, err := strconv.Atoi(delayStr)
+	if err != nil {
+		return 0, false
+	}
+
+	return time.Duration(delay) * time.Second, true
+}
+
+// Will look at the status code to see if the retry header pertains to
+// the status code.
+func canUseRetryAfterHeader(r *request.Request) bool {
+	switch r.HTTPResponse.StatusCode {
+	case 429:
+	case 503:
+	default:
+		return false
+	}
+
+	return true
 }
 
 // lockedSource is a thread-safe implementation of rand.Source

+ 1 - 1
vendor/github.com/aws/aws-sdk-go/aws/config.go

@@ -168,7 +168,7 @@ type Config struct {
 	//
 	EC2MetadataDisableTimeoutOverride *bool
 
-	// Instructs the endpiont to be generated for a service client to
+	// Instructs the endpoint to be generated for a service client to
 	// be the dual stack endpoint. The dual stack endpoint will support
 	// both IPv4 and IPv6 addressing.
 	//

+ 3 - 3
vendor/github.com/aws/aws-sdk-go/aws/context_1_6.go

@@ -4,9 +4,9 @@ package aws
 
 import "time"
 
-// An emptyCtx is a copy of the the Go 1.7 context.emptyCtx type. This
-// is copied to provide a 1.6 and 1.5 safe version of context that is compatible
-// with Go 1.7's Context.
+// An emptyCtx is a copy of the Go 1.7 context.emptyCtx type. This is copied to
+// provide a 1.6 and 1.5 safe version of context that is compatible with Go
+// 1.7's Context.
 //
 // An emptyCtx is never canceled, has no values, and has no deadline. It is not
 // struct{}, since vars of this type must have distinct addresses.

+ 18 - 0
vendor/github.com/aws/aws-sdk-go/aws/convert_types.go

@@ -311,6 +311,24 @@ func TimeValue(v *time.Time) time.Time {
 	return time.Time{}
 }
 
+// SecondsTimeValue converts an int64 pointer to a time.Time value
+// representing seconds since Epoch or time.Time{} if the pointer is nil.
+func SecondsTimeValue(v *int64) time.Time {
+	if v != nil {
+		return time.Unix((*v / 1000), 0)
+	}
+	return time.Time{}
+}
+
+// MillisecondsTimeValue converts an int64 pointer to a time.Time value
+// representing milliseconds sinch Epoch or time.Time{} if the pointer is nil.
+func MillisecondsTimeValue(v *int64) time.Time {
+	if v != nil {
+		return time.Unix(0, (*v * 1000000))
+	}
+	return time.Time{}
+}
+
 // TimeUnixMilli returns a Unix timestamp in milliseconds from "January 1, 1970 UTC".
 // The result is undefined if the Unix time cannot be represented by an int64.
 // Which includes calling TimeUnixMilli on a zero Time is undefined.

+ 32 - 2
vendor/github.com/aws/aws-sdk-go/aws/defaults/defaults.go

@@ -9,6 +9,7 @@ package defaults
 
 import (
 	"fmt"
+	"net"
 	"net/http"
 	"net/url"
 	"os"
@@ -118,14 +119,43 @@ func RemoteCredProvider(cfg aws.Config, handlers request.Handlers) credentials.P
 	return ec2RoleProvider(cfg, handlers)
 }
 
+var lookupHostFn = net.LookupHost
+
+func isLoopbackHost(host string) (bool, error) {
+	ip := net.ParseIP(host)
+	if ip != nil {
+		return ip.IsLoopback(), nil
+	}
+
+	// Host is not an ip, perform lookup
+	addrs, err := lookupHostFn(host)
+	if err != nil {
+		return false, err
+	}
+	for _, addr := range addrs {
+		if !net.ParseIP(addr).IsLoopback() {
+			return false, nil
+		}
+	}
+
+	return true, nil
+}
+
 func localHTTPCredProvider(cfg aws.Config, handlers request.Handlers, u string) credentials.Provider {
 	var errMsg string
 
 	parsed, err := url.Parse(u)
 	if err != nil {
 		errMsg = fmt.Sprintf("invalid URL, %v", err)
-	} else if host := aws.URLHostname(parsed); !(host == "localhost" || host == "127.0.0.1") {
-		errMsg = fmt.Sprintf("invalid host address, %q, only localhost and 127.0.0.1 are valid.", host)
+	} else {
+		host := aws.URLHostname(parsed)
+		if len(host) == 0 {
+			errMsg = "unable to parse host from local HTTP cred provider URL"
+		} else if isLoopback, loopbackErr := isLoopbackHost(host); loopbackErr != nil {
+			errMsg = fmt.Sprintf("failed to resolve host %q, %v", host, loopbackErr)
+		} else if !isLoopback {
+			errMsg = fmt.Sprintf("invalid endpoint host, %q, only loopback hosts are allowed.", host)
+		}
 	}
 
 	if len(errMsg) > 0 {

File diff suppressed because it is too large
+ 270 - 38
vendor/github.com/aws/aws-sdk-go/aws/endpoints/defaults.go


+ 126 - 22
vendor/github.com/aws/aws-sdk-go/aws/request/request.go

@@ -24,10 +24,14 @@ const (
 	// ErrCodeRead is an error that is returned during HTTP reads.
 	ErrCodeRead = "ReadError"
 
-	// ErrCodeResponseTimeout is the connection timeout error that is recieved
+	// ErrCodeResponseTimeout is the connection timeout error that is received
 	// during body reads.
 	ErrCodeResponseTimeout = "ResponseTimeout"
 
+	// ErrCodeInvalidPresignExpire is returned when the expire time provided to
+	// presign is invalid
+	ErrCodeInvalidPresignExpire = "InvalidPresignExpireError"
+
 	// CanceledErrorCode is the error code that will be returned by an
 	// API request that was canceled. Requests given a aws.Context may
 	// return this error when canceled.
@@ -42,7 +46,6 @@ type Request struct {
 
 	Retryer
 	Time                   time.Time
-	ExpireTime             time.Duration
 	Operation              *Operation
 	HTTPRequest            *http.Request
 	HTTPResponse           *http.Response
@@ -60,6 +63,11 @@ type Request struct {
 	LastSignedAt           time.Time
 	DisableFollowRedirects bool
 
+	// A value greater than 0 instructs the request to be signed as Presigned URL
+	// You should not set this field directly. Instead use Request's
+	// Presign or PresignRequest methods.
+	ExpireTime time.Duration
+
 	context aws.Context
 
 	built bool
@@ -104,6 +112,8 @@ func New(cfg aws.Config, clientInfo metadata.ClientInfo, handlers Handlers,
 		err = awserr.New("InvalidEndpointURL", "invalid endpoint uri", err)
 	}
 
+	SanitizeHostForHeader(httpReq)
+
 	r := &Request{
 		Config:     cfg,
 		ClientInfo: clientInfo,
@@ -250,34 +260,59 @@ func (r *Request) SetReaderBody(reader io.ReadSeeker) {
 
 // Presign returns the request's signed URL. Error will be returned
 // if the signing fails.
-func (r *Request) Presign(expireTime time.Duration) (string, error) {
-	r.ExpireTime = expireTime
+//
+// It is invalid to create a presigned URL with a expire duration 0 or less. An
+// error is returned if expire duration is 0 or less.
+func (r *Request) Presign(expire time.Duration) (string, error) {
+	r = r.copy()
+
+	// Presign requires all headers be hoisted. There is no way to retrieve
+	// the signed headers not hoisted without this. Making the presigned URL
+	// useless.
 	r.NotHoist = false
 
+	u, _, err := getPresignedURL(r, expire)
+	return u, err
+}
+
+// PresignRequest behaves just like presign, with the addition of returning a
+// set of headers that were signed.
+//
+// It is invalid to create a presigned URL with a expire duration 0 or less. An
+// error is returned if expire duration is 0 or less.
+//
+// Returns the URL string for the API operation with signature in the query string,
+// and the HTTP headers that were included in the signature. These headers must
+// be included in any HTTP request made with the presigned URL.
+//
+// To prevent hoisting any headers to the query string set NotHoist to true on
+// this Request value prior to calling PresignRequest.
+func (r *Request) PresignRequest(expire time.Duration) (string, http.Header, error) {
+	r = r.copy()
+	return getPresignedURL(r, expire)
+}
+
+func getPresignedURL(r *Request, expire time.Duration) (string, http.Header, error) {
+	if expire <= 0 {
+		return "", nil, awserr.New(
+			ErrCodeInvalidPresignExpire,
+			"presigned URL requires an expire duration greater than 0",
+			nil,
+		)
+	}
+
+	r.ExpireTime = expire
+
 	if r.Operation.BeforePresignFn != nil {
-		r = r.copy()
-		err := r.Operation.BeforePresignFn(r)
-		if err != nil {
-			return "", err
+		if err := r.Operation.BeforePresignFn(r); err != nil {
+			return "", nil, err
 		}
 	}
 
-	r.Sign()
-	if r.Error != nil {
-		return "", r.Error
+	if err := r.Sign(); err != nil {
+		return "", nil, err
 	}
-	return r.HTTPRequest.URL.String(), nil
-}
 
-// PresignRequest behaves just like presign, but hoists all headers and signs them.
-// Also returns the signed hash back to the user
-func (r *Request) PresignRequest(expireTime time.Duration) (string, http.Header, error) {
-	r.ExpireTime = expireTime
-	r.NotHoist = true
-	r.Sign()
-	if r.Error != nil {
-		return "", nil, r.Error
-	}
 	return r.HTTPRequest.URL.String(), r.SignedHeaderVals, nil
 }
 
@@ -573,3 +608,72 @@ func shouldRetryCancel(r *Request) bool {
 			errStr != "net/http: request canceled while waiting for connection")
 
 }
+
+// SanitizeHostForHeader removes default port from host and updates request.Host
+func SanitizeHostForHeader(r *http.Request) {
+	host := getHost(r)
+	port := portOnly(host)
+	if port != "" && isDefaultPort(r.URL.Scheme, port) {
+		r.Host = stripPort(host)
+	}
+}
+
+// Returns host from request
+func getHost(r *http.Request) string {
+	if r.Host != "" {
+		return r.Host
+	}
+
+	return r.URL.Host
+}
+
+// Hostname returns u.Host, without any port number.
+//
+// If Host is an IPv6 literal with a port number, Hostname returns the
+// IPv6 literal without the square brackets. IPv6 literals may include
+// a zone identifier.
+//
+// Copied from the Go 1.8 standard library (net/url)
+func stripPort(hostport string) string {
+	colon := strings.IndexByte(hostport, ':')
+	if colon == -1 {
+		return hostport
+	}
+	if i := strings.IndexByte(hostport, ']'); i != -1 {
+		return strings.TrimPrefix(hostport[:i], "[")
+	}
+	return hostport[:colon]
+}
+
+// Port returns the port part of u.Host, without the leading colon.
+// If u.Host doesn't contain a port, Port returns an empty string.
+//
+// Copied from the Go 1.8 standard library (net/url)
+func portOnly(hostport string) string {
+	colon := strings.IndexByte(hostport, ':')
+	if colon == -1 {
+		return ""
+	}
+	if i := strings.Index(hostport, "]:"); i != -1 {
+		return hostport[i+len("]:"):]
+	}
+	if strings.Contains(hostport, "]") {
+		return ""
+	}
+	return hostport[colon+len(":"):]
+}
+
+// Returns true if the specified URI is using the standard port
+// (i.e. port 80 for HTTP URIs or 443 for HTTPS URIs)
+func isDefaultPort(scheme, port string) bool {
+	if port == "" {
+		return true
+	}
+
+	lowerCaseScheme := strings.ToLower(scheme)
+	if (lowerCaseScheme == "http" && port == "80") || (lowerCaseScheme == "https" && port == "443") {
+		return true
+	}
+
+	return false
+}

+ 2 - 2
vendor/github.com/aws/aws-sdk-go/aws/request/retryer.go

@@ -70,8 +70,8 @@ func isCodeExpiredCreds(code string) bool {
 }
 
 var validParentCodes = map[string]struct{}{
-	ErrCodeSerialization: struct{}{},
-	ErrCodeRead:          struct{}{},
+	ErrCodeSerialization: {},
+	ErrCodeRead:          {},
 }
 
 type temporaryError interface {

+ 5 - 2
vendor/github.com/aws/aws-sdk-go/aws/session/env_config.go

@@ -7,6 +7,9 @@ import (
 	"github.com/aws/aws-sdk-go/aws/credentials"
 )
 
+// EnvProviderName provides a name of the provider when config is loaded from environment.
+const EnvProviderName = "EnvConfigCredentials"
+
 // envConfig is a collection of environment values the SDK will read
 // setup config from. All environment values are optional. But some values
 // such as credentials require multiple values to be complete or the values
@@ -76,7 +79,7 @@ type envConfig struct {
 	SharedConfigFile string
 
 	// Sets the path to a custom Credentials Authroity (CA) Bundle PEM file
-	// that the SDK will use instead of the the system's root CA bundle.
+	// that the SDK will use instead of the system's root CA bundle.
 	// Only use this if you want to configure the SDK to use a custom set
 	// of CAs.
 	//
@@ -157,7 +160,7 @@ func envConfigLoad(enableSharedConfig bool) envConfig {
 	if len(cfg.Creds.AccessKeyID) == 0 || len(cfg.Creds.SecretAccessKey) == 0 {
 		cfg.Creds = credentials.Value{}
 	} else {
-		cfg.Creds.ProviderName = "EnvConfigCredentials"
+		cfg.Creds.ProviderName = EnvProviderName
 	}
 
 	regionKeys := regionEnvKeys

+ 0 - 60
vendor/github.com/aws/aws-sdk-go/aws/session/testdata/shared_config

@@ -1,60 +0,0 @@
-[default]
-s3 = 
-  unsupported_key=123
-  other_unsupported=abc
-
-region = default_region
-
-[profile alt_profile_name]
-region = alt_profile_name_region
-
-[short_profile_name_first]
-region = short_profile_name_first_short
-
-[profile short_profile_name_first]
-region = short_profile_name_first_alt
-
-[partial_creds]
-aws_access_key_id = partial_creds_akid
-
-[complete_creds]
-aws_access_key_id = complete_creds_akid
-aws_secret_access_key = complete_creds_secret
-
-[complete_creds_with_token]
-aws_access_key_id = complete_creds_with_token_akid
-aws_secret_access_key = complete_creds_with_token_secret
-aws_session_token = complete_creds_with_token_token
-
-[full_profile]
-aws_access_key_id = full_profile_akid
-aws_secret_access_key = full_profile_secret
-region = full_profile_region
-
-[config_file_load_order]
-region = shared_config_region
-aws_access_key_id = shared_config_akid
-aws_secret_access_key = shared_config_secret
-
-[partial_assume_role]
-role_arn = partial_assume_role_role_arn
-
-[assume_role]
-role_arn = assume_role_role_arn
-source_profile = complete_creds
-
-[assume_role_invalid_source_profile]
-role_arn = assume_role_invalid_source_profile_role_arn
-source_profile = profile_not_exists
-
-[assume_role_w_creds]
-role_arn = assume_role_w_creds_role_arn
-source_profile = assume_role_w_creds
-external_id = 1234
-role_session_name = assume_role_w_creds_session_name
-aws_access_key_id = assume_role_w_creds_akid
-aws_secret_access_key = assume_role_w_creds_secret
-
-[assume_role_wo_creds]
-role_arn = assume_role_wo_creds_role_arn
-source_profile = assume_role_wo_creds

+ 0 - 1
vendor/github.com/aws/aws-sdk-go/aws/session/testdata/shared_config_invalid_ini

@@ -1 +0,0 @@
-[profile_nam

+ 0 - 17
vendor/github.com/aws/aws-sdk-go/aws/session/testdata/shared_config_other

@@ -1,17 +0,0 @@
-[default]
-region = default_region
-
-[partial_creds]
-aws_access_key_id = AKID
-
-[profile alt_profile_name]
-region = alt_profile_name_region
-
-[creds_from_credentials]
-aws_access_key_id = creds_from_config_akid
-aws_secret_access_key = creds_from_config_secret
-
-[config_file_load_order]
-region = shared_config_other_region
-aws_access_key_id = shared_config_other_akid
-aws_secret_access_key = shared_config_other_secret

Some files were not shown because too many files changed in this diff